Docling MCP:通过 Model Context Protocol 让 AI Agent 直接调用文档解析能力
本文围绕 Docling 官方文档 docs/usage/mcp.md 展开,讲解如何利用 MCP(Model Context Protocol)把 Docling 的文档理解能力暴露给各类 AI Agent 客户端(Claude Desktop、LM Studio 等),以及如何将转换工作委托给远程 docling-serve API 服务并配置本地回退。读完后你将掌握:MCP 客户端的最小接入配置、DOCLING_SERVICE_URL / DOCLING_CONVERSION_MODE 等远程模式环境变量、远程服务不可用时的降级策略,以及底层 REST 协议在 Docling 本仓库中的对应实现证据。
1. 为什么需要 MCP:Agentic AI 的工具接入标准
原文档开篇指出了一个趋势:AI 正在从"被动应答"走向 Agentic AI——能够在有限监督下自主理解、规划并执行特定任务的智能体系统。Agent 要真正"动手"干活,就必须能调用外部工具;而模型与工具之间的集成问题是长期痛点。
MCP(Model Context Protocol) 正是为了解决这一集成问题而兴起的主流标准:它为 AI 应用与外部工具之间提供了统一的连接协议。Docling 对这个趋势的回应是提供了一个 Docling MCP Server:把它加进任何支持 MCP 的客户端,Agent 就可以直接"实验文档处理"——即让 Agent 按自己的意图决定转换哪些文档、以什么方式输出,而不需要开发者在应用层逐个对接 API。
需要说明的是:MCP Server 本体(docling-mcp 包)位于 Docling 生态的独立 Server 仓库中,本文所引用的配置与环境变量行为以 docs/usage/mcp.md 为权威来源;而它对接的 docling-serve REST 协议,则可以在本仓库的 服务客户端 与 convert-remote 命令 源码中得到印证,后文会展开。
2. 在 MCP 客户端中接入 Docling
原文档强调,将 Docling MCP 加入你偏好的客户端"通常只需要在配置文件里加一段条目"。标准配置如下(uvx 会自动拉取 docling-mcp 包并启动 docling-mcp-server 进程):
{
"mcpServers": {
"docling": {
"command": "uvx",
"args": [
"--from=docling-mcp",
"docling-mcp-server"
]
}
}
}
2.1 Claude Desktop
在桌面版 Claude 中,直接编辑配置文件 claude_desktop_config.json,将上面的片段写入即可(docling-mcp 仓库另提供了现成的示例配置可供参考)。
2.2 LM Studio
在 LM Studio 中,编辑 mcp.json 文件写入相应配置段;LM Studio 也提供了"一键安装"深链按钮,点击即可自动完成 MCP Server 的安装配置。
从配置方式可以看出 Docling MCP 的设计取向:它把 Docling 包装成一个自托管、进程内启动的工具服务——客户端负责拉起 uvx --from=docling-mcp docling-mcp-server 子进程,工具调用通过 MCP 标准消息协议在该进程内完成,无需任何自建 HTTP 基础设施。
3. 远程转换模式:把 Docling 转换委托给 docling-serve
3.1 本地模式与远程模式的取舍
默认情况下,Docling MCP Server 在本地执行文档转换——文档不离开本机,模型推理在运行 MCP 客户端的机器上完成。这在单机实验、隐私敏感场景下最方便。
但在以下场景,远程模式更合适:
- 文档量大、单机构造/计算资源不足,需要共享一个转换服务;
- 希望在多 Agent、多客户端之间复用同一份 GPU/服务资源;
- 希望把 Docling 版本升级、依赖管理集中在服务侧统一处理。
此时可以让 MCP Server 把转换委托给一个正在运行的 API server——可以是自托管的 docling-serve 实例,也可以是托管服务——只需设置三个环境变量:
export DOCLING_SERVICE_URL=https://your-docling-service.example.com
export DOCLING_SERVICE_API_KEY=your-api-key # if the service requires one
export DOCLING_CONVERSION_MODE=remote
各变量含义:
| 变量 | 作用 |
|---|---|
DOCLING_SERVICE_URL |
docling-serve 服务的基础 URL(本地服务默认为 http://localhost:5001) |
DOCLING_SERVICE_API_KEY |
服务要求的 API key(如服务以 DOCLING_SERVE_API_KEY 开启了鉴权则必填,否则可省略) |
DOCLING_CONVERSION_MODE=remote |
声明转换模式为远程,MCP Server 不再在本地跑 Docling |
3.2 故障回退:DOCLING_FALLBACK_TO_LOCAL
远程服务不可用(宕机、网络中断)时,Agent 会整体失去文档能力。为此文档给出了回退开关:
export DOCLING_FALLBACK_TO_LOCAL=true
启用后,当远程服务不可达时,MCP Server 会退回本地处理。注意原文档标注的前提:本地回退需要安装带本地依赖的 extra,即 pip install "docling-mcp[local]"——这意味着"远程为主、本地兜底"的部署需要同时具备两套运行时,读者在规划部署时应把这一依赖成本考虑在内(安装选项细节见 docling-mcp 仓库的安装说明)。
4. 远程模式背后的协议:docling-serve REST API 与仓库内实现证据
DOCLING_CONVERSION_MODE=remote 指向的"API server",在本仓库文档中有完整定义:docs/usage/api_server/index.md 说明 docling-serve 是一个 FastAPI 服务,把 Docling 的文档转换能力以 REST API 形式暴露出来;REST API 参考(与 docling-serve v1.21.0 同步)给出了核心端点:
| Endpoint | Method | 用途 |
|---|---|---|
/v1/convert/source |
POST | 从 URL / base64 源转换(同步) |
/v1/convert/file |
POST | 上传文件转换,multipart(同步) |
/v1/convert/source/async、/v1/convert/file/async |
POST | 提交异步任务 |
/v1/status/poll/{task_id} |
GET | 轮询任务状态 |
/v1/status/ws/{task_id} |
WebSocket | 订阅任务状态 |
/v1/result/{task_id} |
GET | 获取已完成的结果 |
鉴权方式与 MCP 的 DOCLING_SERVICE_API_KEY 对应:服务端设置 DOCLING_SERVE_API_KEY 后,每个请求需携带 -H "X-Api-Key: <YOUR_KEY>"。
本仓库不仅描述了这套协议,还内置了它的官方 Python 客户端,可以直接用来验证远程服务是否按 MCP remote 模式预期的那样工作。DoclingServiceClient 的用法(来自 REST API 文档):
from docling.service_client import DoclingServiceClient
from docling.datamodel.service.options import ConvertDocumentsOptions
with DoclingServiceClient(url="http://localhost:5001") as client:
result = client.convert(
source="https://arxiv.org/pdf/2501.17887",
options=ConvertDocumentsOptions(to_formats=["md"]),
)
print(result.document.export_to_markdown())
从源码结构看,客户端的实现细节进一步印证了远程模式的工程完备性(见 docling/service_client/client.py):
- 客户端默认优先使用 WebSocket 订阅任务状态(
StatusWatcherKind.WEBSOCKET),并可通过ws_fallback_to_poll回退到轮询——这正解释了 REST API 同时提供/status/ws/与/status/poll/两条状态通道的意义; - 默认并发
DEFAULT_MAX_CONCURRENCY = 8(上限 512)、默认任务超时 300 秒、HTTP 重试 3 次(client.py#L127-L131),这些是长时间文档转换的合理缺省值; client.py中还有针对产物下载地址的 SSRF 防护(_is_safe_artifact_url,client.py#L149-L180),拒绝把预签名 URL 指向内网地址——说明该客户端是面向生产环境的严肃实现,而非演示代码。
仓库还提供了可直接运行的示例:docs/examples/service_client/README.md 说明这些脚本针对已运行的 docling-serve 实例工作(pip install "docling-slim[service-client]" 安装客户端),并通过 DOCLING_SERVICE_URL / DOCLING_SERVICE_API_KEY 环境变量或工作目录的 .env 文件定位服务;convert.py 演示了 convert()(单文档)与 convert_all(source=[...], max_concurrency=4)(并发批量)两个高层 API,其默认行为(OCR、表格结构、Markdown 输出)与本地 DocumentConverter 保持一致。
4.1 同一套环境变量约定:docling convert-remote CLI
一个值得注意的交叉印证:本仓库 CLI 中的 docling convert-remote 命令使用与 MCP remote 模式完全相同的环境变量名。docling/cli/remote.py 的帮助文本明确写道:
Authentication (precedence: flag > environment variable > .env file):
--service-url or DOCLING_SERVICE_URL (required)
--api-key or DOCLING_SERVICE_API_KEY (optional; omit if unauthenticated)
A .env file in the working directory is loaded automatically when present.
即:命令行 flag 优先于环境变量,环境变量优先于 .env 文件;服务不可达时退出码为 1,配置错误(如未解析到任何 service URL)时退出码为 2(remote.py#L58-L61)。这带来两个实操价值:
- 配置可复用:为 MCP Server 配好的
DOCLING_SERVICE_URL/DOCLING_SERVICE_API_KEY环境变量,可以直接被 CLI 和 Python 示例脚本(convert.py等)复用,同一部署环境只维护一份凭据; - 协议可验证:如果你不确定 MCP remote 模式背后调用的服务是否健康,可以用同环境下的
docling convert-remote report.pdf --to md或示例脚本做一次端到端冒烟测试,命令内部会先调用client.health()快速失败(见remote.py#L343-L346),再执行转换并复用与本地convert完全相同的导出器,输出格式一致。
此外,convert-remote 的参数集(--from/--to、--no-ocr、--page-range、enrichment 开关等)恰好对应 REST API 文档中 options 字段的"公共子集"(to_formats、do_ocr、page_range、do_picture_description 等),可以从中反推出远程转换时你能通过服务侧控制哪些行为——注意其中没有本地执行类参数(device、线程数、PDF 后端内部选项等),因为这些只在本地运行时才有意义(remote.py#L4-L10 的模块 docstring 明确说明了这一取舍)。
5. 面向特定框架的 Agent 工具与生态示例
原文档还指出:Docling MCP 针对一些应用和框架提供了专用工具(tools),并给出了一批"用 Docling 能力构建 Agent"的示例方向,涵盖 LlamaIndex、Llama Stack、Pydantic AI、smolagents 等流行框架。具体工具清单与示例代码以 docling-mcp Server 仓库为准;本仓库侧可结合的资料包括 集成指南目录(LangChain、LlamaIndex、Haystack 等)与 服务客户端示例(其中 tasks.py 演示任务生命周期与结果目标,chunk.py 演示把文档切分为检索就绪的 chunks)。
可以推断:MCP 是"协议层"的统一入口(任何 MCP 客户端都能用),而框架示例解决的是"编程层"的集成——两条路径互补,前者适合桌面/对话式 Agent 快速实验,后者适合把 Docling 嵌入自有 Python 服务。
6. 选型与落地建议
结合 API server 文档的选型表,可以给出清晰的分层建议:
| 你的场景 | 推荐路径 |
|---|---|
| 在 Claude Desktop / LM Studio 等客户端里让 Agent 本地处理文档 | Docling MCP,默认本地模式,只需一段 mcpServers 配置 |
| 多客户端/多 Agent 共享一个转换服务 | Docling MCP + DOCLING_CONVERSION_MODE=remote 指向自托管 docling-serve(见 部署文档) |
| 不想运维基础设施 | 指向托管服务(如 Docling for IBM watsonx,见 managed service 说明),只需替换 base URL 并提供 API key |
| Python 应用内直接调用(非 Agent 场景) | DoclingServiceClient(客户端代码)或 docling convert-remote 命令 |
| 远程服务要有可用性兜底 | MCP remote 模式 + DOCLING_FALLBACK_TO_LOCAL=true(需 docling-mcp[local] extra) |
安全方面提醒:DOCLING_SERVICE_API_KEY 属于凭据,文档示例将其写入 shell 导出或 .env 文件是常规做法,但不应提交进版本库;服务端鉴权由 DOCLING_SERVE_API_KEY 控制,请求侧以 X-Api-Key 头传递。
小结
Docling 对 Agentic AI 的接入方案是分层清晰的:MCP Server 提供协议统一,让任意 MCP 客户端一行配置即可让 Agent 获得文档理解工具;本地/远程双模式(DOCLING_CONVERSION_MODE)加本地回退(DOCLING_FALLBACK_TO_LOCAL)覆盖从单机实验到共享服务再到高可用兜底的完整谱系;而远程模式的底层 docling-serve REST 协议在本仓库有完整的文档(API server)、示例(service_client 示例)与生产级客户端实现(docling/service_client/)作为支撑,DOCLING_SERVICE_URL / DOCLING_SERVICE_API_KEY 环境变量在 MCP Server、convert-remote CLI 和 Python 示例间保持一致,是同一套远程接入约定的不同投影。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00