Docling MCP
io.github.docling-project/docling-mcp
About Docling MCP
Docling MCP is an MCP server published by the GitHub account docling-project. Convert PDFs and other documents to structured formats via Docling, for AI applications.
It runs on your own machine: your AI client starts it from the PyPI package docling-mcp at version 3.4.0.
It asks for one secret: DOCLING_MCP_SERVICE_API_KEY. Give it a key with the least access that still works.
Version 3.4.0 was published on 27 October 2026, and the source code is public, so you can read it before installing.
Written from the registry entry. 9 automated checks on the registry entry and the package code: 7 pass, 0 warn, 0 fail, 2 info. How we check.
What it asks for
| Variable | Required | Secret | Description |
|---|---|---|---|
DOCLING_MCP_CONVERSION_MODE | No | No | Conversion mode: 'remote' (default) or 'local' (requires docling-mcp[local] extra). |
DOCLING_MCP_SERVICE_URL | No | No | Base URL of the Docling Serve instance. Required when conversion mode is remote. |
DOCLING_MCP_SERVICE_API_KEY | No | Yes | API key for authenticating with Docling Serve. |
DOCLING_MCP_SERVICE_TIMEOUT | No | No | Request timeout in seconds for the remote Docling Serve API. Default: 300.0. |
DOCLING_MCP_SERVICE_MAX_RETRIES | No | No | Maximum number of retry attempts for remote API requests. Default: 3. |
DOCLING_MCP_FALLBACK_TO_LOCAL | No | No | Set to 'true' to fall back to local conversion when Docling Serve is unreachable. |
DOCLING_MCP_KEEP_IMAGES | No | No | Set to 'true' to retain page images in converted documents. Default: false. |
DOCLING_MCP_IMAGES_SCALE | No | No | Image scale factor (e.g. 1.0, 2.0). Increase to avoid tensor batching errors. Default: 1.0. |
DOCLING_MCP_DO_OCR | No | No | Set to 'false' to disable the OCR pipeline. Default: true. |
DOCLING_MCP_DO_TABLE_STRUCTURE | No | No | Set to 'false' to disable table structure detection. Default: true. |
DOCLING_MCP_DO_PICTURE_DESCRIPTION | No | No | Set to 'true' to run a vision-language model to generate textual descriptions for figures and pictures. Requires a VLM to be available on the conversion backend. Default: false. |
DOCLING_MCP_PICTURE_DESCRIPTION_PRESET | No | No | Preset ID for the picture-description VLM (e.g. 'smolvlm', 'granite_vision'). When unset the backend default is used. Only applies when DOCLING_MCP_DO_PICTURE_DESCRIPTION=true. |
DOCLING_MCP_IMAGE_EXPORT_MODE | No | No | Controls how images are rendered when exporting to Markdown. Accepted values: 'placeholder' (default, emits <!-- image -->), 'embedded' (base64 data-URI), 'referenced' (file path / URL). |
DOCLING_MCP_CACHE_MAX_DOCUMENTS | No | No | Maximum number of documents to keep in the in-memory cache. Oldest (least-recently-used) documents are evicted when the limit is reached. Default: 10. |
Checks
| Check | Result | Detail |
|---|---|---|
| Source repository linked | Pass | https://github.com/docling-project/docling-mcp |
| Version pinned | Pass | Every package has an explicit version |
| Secrets requested | Info | Asks for 1 secret: DOCLING_MCP_SERVICE_API_KEY |
| Known package registry | Pass | All packages come from npm, PyPI, OCI, NuGet or MCPB |
| Namespace ownership | Info | Name verified via GitHub account docling-project |
| Registry text aimed at the AI | Pass | Description and settings contain no hidden characters or instructions to the AI |
| Install scripts | Pass | docling-mcp 3.4.0 has no setup.py; nothing runs at install |
| Code red flags | Pass | Read 33 files in docling-mcp 3.4.0: no obfuscation, encoded execution, credential reads or data-collection endpoints found |
| Text aimed at the AI | Pass | No hidden characters or instructions to the AI in 33 files, including comments and the README |
Code review: Pass, with notes
We read all 3,301 lines in 31 files of docling-mcp 3.4.0 on 2026-10-31, without running it.
Converts PDFs, Office files, web pages and images into structured documents your AI can read, search, edit and save. By default it sends each document to a Docling conversion service you must point it at. In local mode it converts on your machine but downloads AI models from Hugging Face first. Watch out: it can read any file or folder path the AI gives it. It also runs as a local web server on port 8000 unless you choose stdio.
What we found
- Note Conversion tools accept any local file or directory path, so the AI can read any file the user's account can read. This is the server's purpose, but it is reachable from prompt-injected content too.
docling_mcp/tools/conversion.py:116-192 - Note The default conversion mode is 'remote'. Once DOCLING_MCP_SERVICE_URL is set, documents (including local files) are uploaded to that docling-serve instance. Until it is set, conversion fails with a clear error. No default remote host is hard-coded.
docling_mcp/settings/service_client.py:41-61 + tools/converters/remote.py:28-50 - Note The default transport is streamable-http on localhost:8000, and the package adds no authentication. Any local process (and any page that gets past the SDK's DNS-rebinding protection) can call the file-reading tools. Use --transport stdio for single-client desktop use.
docling_mcp/servers/mcp_server.py:38-40 - Note In local mode, docling downloads its layout/OCR/table models (HuggingFace Hub) on first use and fetches http(s) source URLs from this machine. This is dependency behaviour, not package code.
docling_mcp/tools/converters/local.py:73-100 - Note With CACHE_DIR unset, saved files go to a _cache folder next to the installed package (inside the Python environment), which users may not expect.
docling_mcp/docling_cache.py:54-81 - Note The optional llama-index-rag group downloads an embedding model at import time and creates ./milvus_demo.db in the working directory with overwrite=True, wiping any previous file of that name.
docling_mcp/tools/llama_index/_shared.py:12-27 - Info Object-storage credentials are deliberately taken only from the provider's standard chain, never from MCP client config.
docling_mcp/tools/converters/sources.py:68-71 - Info update/delete tools only modify the in-memory cached copy (annotated destructiveHint=True); original files are never modified.
docling_mcp/tools/manipulation.py:259-353 - Info Line counts: the manifest counts the trailing newline as a line. All 31 files read in full, total 3301 matches the manifest.
package
| Talks to | DOCLING_MCP_SERVICE_URL (user-set docling-serve instance; default conversion mode is 'remote'): the document: local files are uploaded, http(s) URLs are passed for the service to fetch, object-storage bodies are uploaded from memory; plus DOCLING_MCP_SERVICE_API_KEY (when a conversion tool is called (health check + convert)) any http(s) URL given as 'source': an HTTP GET request for the document (convert tool in local mode (fetched by docling's DocumentConverter on this machine)) s3:// gs:// gcs:// abfs:// az:// object storage via fsspec: read requests signed with ambient cloud credentials (env/config files/instance roles) (convert tool with such a URI (optional extras)) HuggingFace Hub (docling layout/OCR/table models, optional VLM preset): model download requests (first local conversion; done by the docling library, not package code) huggingface.co (BAAI/bge-base-en-v1.5 embedding model): model download requests (at startup only if the optional llama-index-rag tool group is enabled) DOCLING_MCP_LI_API_BASE (default http://127.0.0.1:1234/v1, OpenAI-compatible LLM): the query plus retrieved document chunks (search_documents tool (optional llama-index-rag group)) DOCLING_MCP_LLS_URL (default http://localhost:8321, Llama Stack): document chunks or the full document markdown plus the extraction prompt (insert_document_to_vectordb / information_extraction (optional llama-stack groups)) huggingface.co (sentence-transformers/<DOCLING_MCP_LLS_VDB_EMBEDDING> tokenizer): tokenizer download request (insert_document_to_vectordb (optional)) localhost:8000 (listens; default transport is streamable-http): serves MCP tool calls; no authentication layer in package code (for the whole time the server runs unless --transport stdio) |
|---|---|
| Keys and settings | DOCLING_MCP_SERVICE_URL: remote converter target; logged at INFODOCLING_MCP_SERVICE_API_KEY: the docling-serve instance only; not loggedDOCLING_MCP_CONVERSION_MODE / FALLBACK_TO_LOCAL / KEEP_IMAGES / IMAGES_SCALE / DO_OCR / DO_TABLE_STRUCTURE / DO_PICTURE_DESCRIPTION / PICTURE_DESCRIPTION_PRESET / IMAGE_EXPORT_MODE / CACHE_MAX_DOCUMENTS / SERVICE_TIMEOUT / SERVICE_MAX_RETRIES: local config (pipeline options also sent to docling-serve in remote mode)DOCLING_MCP_LI_API_BASE / DOCLING_MCP_LI_API_KEY / DOCLING_MCP_LI_MODEL_ID / DOCLING_MCP_LI_EMBEDDING_MODEL: the configured OpenAI-compatible endpoint (optional group)DOCLING_MCP_LLS_URL / DOCLING_MCP_LLS_VDB_EMBEDDING / DOCLING_MCP_LLS_EXTRACTION_MODEL: the configured Llama Stack server (optional group)CACHE_DIR: local only: where saved .md/.json/.png files goCloud credentials for s3/gcs/azure (ambient, read by fsspec providers): the matching object-storage provider.env file in the working directory: read by pydantic-settings for all of the above |
| Files on your machine | By design, convert_document_into_docling_document reads any local file path the AI passes, and convert_directory_files_into_docling_document lists and reads every file in any directory. The content is returned to the AI and, in remote mode, uploaded to docling-serve. save_docling_document and get_page_thumbnail write <key>.md, <key>.json and <key>-<page>.png into a _cache directory. That directory is CACHE_DIR, or by default sits next to the installed package (e.g. site-packages/_cache). Filenames come from existing cache keys, so tool input cannot cause path traversal on write. The optional llama-index group creates ./milvus_demo.db in the working directory (overwrite=True). Object-storage sources are copied to a temp file that is deleted afterwards. |
| Runs programs | None in package code: no subprocess, os.system, eval or exec. Optional tool groups are imported by fixed module names. |
| Telemetry | None in package code. |
| Tools | check_document_in_local_cache, remove_document_from_local_cache, convert_document_into_docling_document, convert_directory_files_into_docling_document, list_cached_documents, create_new_docling_document, export_docling_document_to_markdown, save_docling_document, get_page_thumbnail, add_title_to_docling_document, add_section_heading_to_docling_document, add_paragraph_to_docling_document, open_list_in_docling_document, close_list_in_docling_document, add_list_items_to_list_in_docling_document, add_table_in_html_format_to_docling_document, get_overview_of_document_anchors, search_for_text_in_document_anchors, get_text_of_document_item_at_anchor, update_text_of_document_item_at_anchor, delete_document_items_at_anchors, export_docling_document_to_vector_db (optional llama-index-rag), search_documents (optional llama-index-rag), insert_document_to_vectordb (optional llama-stack-rag), information_extraction (optional llama-stack-ie) |
| Tool descriptions | clean. Seven MCP prompts (Convert document, Convert and summarize, Convert directory, Author structured document, Convert and rewrite, Review and edit, Find and replace) only tell the AI to call this server's own tools. 'Find and replace' even tells the AI to confirm with the user before applying keyword-only matches. No hidden or invisible text. |
This covers the package's own code only, not the 14 packages it depends on (mcp, typer, pydantic, pydantic-settings, docling-core, docling (or docling-slim; [local] extra), fsspec + s3fs / gcsfs / adlfs (optional extras), llama-index-core, llama-index-embeddings-huggingface, llama-index-llms-openai-like, llama-index-node-parser-docling, llama-index-vector-stores-milvus, llama-stack-client, transformers). A new version drops this review until we read it again.
Popularity & health: 74 / 100
Worked out from public numbers and our own checks, not from user reviews or ratings. It says how used and how looked-after a server is, not whether it is safe.
143 forks, 85 merged pull requests. Sources: GitHub, npm, PyPI (pypistats.org) and Hacker News (Algolia), fetched 2026-10-31.
What people say
No Hacker News threads link to its source code.
Look further: search Reddit, search Hacker News, read its GitHub issues. These are not reviews we checked.
Facts
| Registry name | io.github.docling-project/docling-mcp |
|---|---|
| Publisher | GitHub account docling-project |
| How the name is verified | Name verified via GitHub account docling-project. The registry ties the name prefix to that account or domain; it does not check the code. |
| Type | Local: runs on your machine from a package |
| Packages | pypi docling-mcp 3.4.0 (stdio) |
| Version | 3.4.0 |
| Published | |
| Last updated | |
| Source repository | https://github.com/docling-project/docling-mcp |
| Website | None linked |
| Category | Files & documents (assigned by keyword rule, not by hand) |
Related servers in Files & documents
- GuruPDF7/7Convert, compress & merge PDFs and 100+ file formats from any AI…
- Scholar MCP7/8FastMCP server for scholarly papers, patents, books and standards…
- all2md7/7Read, convert, search, diff and outline PDF, Word, PowerPoint, HTML…
- shuck-convert7/7Convert between document formats — DOCX/PDF to Markdown, Markdown…
- HasData Google Scholar8/8Google Scholar search results, citation counts and citation export…
- ragie7/7Ingest, manage, and retrieve documents for RAG-powered AI applications