docs2mcp

docs2mcp turns your own documents into a source your MCP client can search and cite.

От сообщества: Добавлен пользователем или импортирован; проверьте владельца перед подключениемРаботаетБез входаГлобальныйБесплатноМожет изменять данные

Что умеет

  • Search Documents: Semantically search this organization's ingested documents. Reach for this whenever a question needs answering from the ingested sources rather than from general knowledge. That incl
  • Get Element: Fetch one element with the structure around it. Use this after search_documents when a hit looks structurally incomplete. Table cells are stored one element each, so a hit inside a table
  • List Documents: List this organization's ingested documents. Call this before any bulk task to discover what is actually available. An organization with nothing ingested gets an empty list, which is a

Какие данные видит

Нужен ли аккаунт

Не нужен: сервер работает без входа

docs2mcp turns your own documents into a source your MCP client can search and cite. Every answer carries the exact paragraph behind it, and one click opens the source document at the highlighted section.

Upload PDFs, Word documents, spreadsheets, presentations, CSV, text files or images once. Each file is converted, chunked and indexed, then stays available to every future conversation — nothing to re-upload, nothing to paste in.

Search the whole library at once, or scope it to one collection. Hand it an empty questionnaire or form and ask it to fill itself in. Every line it writes carries its own link back, down to the table row or the figure.

Five tools: search_documents, get_document, get_element, list_documents, list_collections.

Hosted and remote — Streamable HTTP with OAuth 2.1, so there is nothing to install or run. Read-only: it never edits, deletes or moves a document. Your library is visible to you alone.

Try it free, no registration needed, at docs2mcp.com.

Список инструментов сервера (5)

Технические названия из tools/list. Нужны только разработчикам.

search_documentsSemantically search this organization's ingested documents. Reach for this whenever a question needs answering from the ingested sources rather than from general knowledge. That includes filling in structured extraction templates: search once per distinct concept being extracted, not once per document. Results carry an element_id to pass to get_element when a hit looks structurally incomplete. Every result carries a source_url: a link that opens the source document in a browser at the exact page and region that result's text came from, so a claim drawn from the result can be checked against the page it came from. It is null when this deployment has no citation viewer configured. When documents or collections are named, the response also carries `coverage`: one entry per named target, with how many of the returned hits came from it. A target with 0 hits contributed nothing to these results -- it was searched and had nothing to say about this query, which is not the same as having been read. A question can name a scope without naming a document -- "on this job", "for the Trentbury bid". An unfiltered search covers the whole library, so where that holds more than one project it answers from whichever project writes most about the query's words, and nothing in the result says which project that was. Call list_collections or list_documents first to resolve a scope like that to ids, then pass collection_ids: a collection is the project boundary, where hand-picked document_ids are a guess at its contents. Search unfiltered when the scope cannot be resolved; every hit names its own document either way. Args: query: A natural-language or keyword description of the content to find. top_k: Maximum number of results (default 30). Leave it alone unless you have a reason -- indexed elements are small (a table cell averages 22 characters), so 30 hits is roughly 4 KB of text, and fewer retrieves imprecisely. document_ids: Restrict the search to these documents. Leave it unset for the whole library. Reach for it when the question names particular documents -- "how does each of these two policies handle retention" -- not as a default. Ids come from list_documents or a previous search. collection_ids: Restrict the search to the documents in these collections. Ids come from list_collections; do not guess one. Given together with document_ids, the two are a union: the search covers those documents plus everything in those collections. Returns: {"results": [{"text", "title", "document_id", "element_id", "element_type", "page_numbers", "score", "source_url"}, ...]} or {"error": str} if top_k is negative, a filter is an empty list, an id in a filter is malformed, or embedding the query failed. title is null when no title was extracted; call get_document for the filename in that case. A `library_status` string is also present when this organization has no documents at all: one sentence saying so and naming where documents are added. It is absent from every other response, including a search over a full library that matched nothing.
get_elementFetch one element with the structure around it. Use this after search_documents when a hit looks structurally incomplete. Table cells are stored one element each, so a hit inside a table returns a single cell -- this returns the whole row that cell belongs to, selected by its position on the page rather than by counting neighbours. Anything that is not a table cell returns the element plus `window` elements either side in reading order. Args: element_id: The element_id from a search_documents result. window: How many elements to include either side (default 2). Ignored for a table cell, whose row is selected geometrically. Returns: {"results": [{"text", "title", "document_id", "element_id", "element_type", "page_numbers", "bounding_boxes", "source_url"}, ...]} or {"error": str} if no such element is visible to this organization.
list_documentsList this organization's ingested documents. Call this before any bulk task to discover what is actually available. An organization with nothing ingested gets an empty list, which is an answer rather than an error. This finds a document by its name. search_documents finds content inside documents; if the question is about what a document says rather than which document it is, that is the tool. This answers "what do I have?" and returns only what names a document. For a document's metadata, page count or anything else about one of them, call get_document. viewer_url_template is a link with {document_id} left to substitute: filling in a row's document_id gives the URL that opens that document in a browser. It is returned once instead of a URL per row because a per-row link would repeat the id already in the row, not because the link matters less here. Args: limit: Maximum documents to return (default 100). total_count reports how many exist, so a truncated list is visible as truncated. Must not be negative -- there is no "everything" value. offset: How many documents to skip (default 0). Page a library larger than limit by calling again with offset=limit, then offset=2*limit, until offset reaches total_count. Must not be negative. collection_ids: Restrict the list to these collections. Ids come from list_collections; do not guess one. Documents at the top level are in no collection a filter can name -- leave this unset to include them. name_contains: Restrict the list to documents whose title or filename contains this text, case-insensitively. Must not be blank. Returns: {"total_count": int, "viewer_url_template": str | None, "results": [{"document_id", "title", "filename", "collection"}, ...]} or {"error": str} if limit or offset is negative, collection_ids is an empty list or holds a malformed id, or name_contains is blank. title is null when nothing was extracted -- it is never the filename. collection is the name of the collection the document is filed in, or null when it sits at the top level. A `library_status` string is also present when this organization has no documents at all: one sentence saying so and naming where documents are added. It is absent from every other response, including a filtered list over a full library that matched nothing.
get_documentEverything known about one document. Use this after list_documents when a document's details matter -- its extracted metadata, how many pages it has, or a link to open it. list_documents deliberately returns only what names a document, so this is where the rest lives. document_url is a link that opens this document in a browser, so a reader can open the source rather than go looking for it. It is null when this deployment has no citation viewer configured. A DOI, an ISBN or a publisher's identifier in the metadata names the work and leaves a reader to find a copy of it; document_url opens the copy that was actually read. Args: document_id: The document_id from a list_documents or search_documents result. Returns: {"document_id", "title", "filename", "collection", "page_count", "document_url", "metadata"} where collection is the name of the collection this document is filed in, or null when it sits at the top level, and metadata is an open key-value map whose keys depend entirely on what kind of document it is, or {"error": str} if no such document is visible to this organization.
list_collectionsThe collections this organization has organized its documents into. Call this when a question is scoped to somewhere in particular -- "our past RFPs", "the vendor contracts" -- and pass the matching collection_id to search_documents or list_documents. Call it once before bulk work over a named collection, rather than once per question. collection_id is the handle. A name is what a person says and what a reader recognises; an id is what the filters take, and it survives a rename. Nothing fuzzy-matches a name to a collection: a scope described in words that matches none of these has no collection_id, and an unfiltered search then covers the whole library rather than that scope. An organization that has made no collections gets an empty list, which is an answer rather than an error: every document then sits at the top level and an unfiltered search already covers all of them. Returns: {"results": [{"collection_id", "name", "document_count"}, ...]} ordered by name. document_count is 0 for a collection holding nothing. A `library_status` string is also present when this organization has no documents at all: one sentence saying so and naming where documents are added. It is absent from every other response, including an organization that holds documents but has made no collections to file them in.