Skip to content

MCP 服务器

pdfvision mcp 通过 stdio,在 Model Context Protocol 上提供同一套提取引擎。它是为那些无法运行 shell 的宿主而存在的——Claude Desktop、Cursor、Cline、Zed、n8n,以及模型只能调用 tool 的类似环境。

如果你的智能体拥有 shell(Claude Code、Codex 或其他支持 CLI 的环境),优先使用 CLI 加 Agent Skills 的组合。skill 按需加载,未被使用前不消耗任何 context,而 MCP tool schema 会在整个会话期间常驻宿主的 context。

设置

服务器是主可执行文件的子命令,而不是单独的 package:

json
{
  "mcpServers": {
    "pdfvision": { "command": "npx", "args": ["-y", "pdfvision", "mcp"] }
  }
}

pdfvision mcp 不接受任何参数。它在 stdout 上使用 JSON-RPC 通信,因此进程原本要输出的日志都会转到 stderr。

三个 Tool

Tool返回内容参数
read_pdfMarkdown 格式的文本sourcepagesocrattachmentpassword
search_pdf每个 match 都带一个短 ref 的扁平命中列表sourcequerypagesregexpassword
render_pdf页面或区域 PNG(image block)sourcepagesrefregionpassword

source 接受本地路径或 http(s) URL——没有单独的远程参数。

这个 surface 比 CLI 刻意做得更小。没有 format、include、scale 或 cache 参数:凡是 pdfvision 能从文档本身判断的事,都由服务器决定。read_pdf 总是会运行 layout、form field、link 和 annotation 提取,只是省略那些一无所获的 section。这让常驻的 tool schema 保持精简,也不给模型留下配置出错的余地。

会话如何进行

对超过 20 页的文档执行不带 pagesread_pdf,返回的不是正文,而是文档地图:页数、outline、按区间折叠的每页原生文本质量与 warning code,以及接下来该调用什么。面对未知文档时,这是标准的第一步。

由此往后:

  • read_pdf(pages: "12-18") 读取一个区间。
  • search_pdf(query: "…") 定位一个词。每个命中项都带一个像 p47m1 这样的短 ref——把它原样传给 render_pdf(ref: "p47m1"),就能就地查看匹配内容,不必抄写坐标。
  • 当 quality 报告说原生文本不可用时,用 read_pdf(pages: "31", ocr: "jpn+eng") 对扫描页重新做 OCR。
  • read_pdf(attachment: "invoice.xml")——或一个从 1 开始的索引——返回一个嵌入文件,而不是页面。在电子发票和监管申报文件(Factur-X、ZUGFeRD、XBRL)中,附件才是权威数据,页面只是它的渲染呈现。文本附件会内联返回,图像作为 image block 返回;不透明的二进制文件会被拒绝,并指向 CLI 的 --attachments --attachment-output

渲染图会被适配到最长边 1568 px,超过这个尺寸 vision 模型本来也会做下采样。如果渲染图小到读不清,该做的是缩小 region,而不是放大分辨率。

Budget 与诚实

响应是有 budget 的:正文 30,000 字符、每页 12,000 字符、100 个 match、4 个渲染页面、5 个 OCR 页面,以及每次调用 6 MB 的图像。每次截断都会指明确切的后续调用,因此被截断的结果是可恢复的,而不是悄悄地不完整。

同样的诚实也适用于搜索:core warning 会随响应一起返回,因此当一个 regex query 超出单页时间 budget 时,它会如实报告,而不是伪装成“0 matches”;对没有可用原生文本的页面搜索时,也会说明该处的落空并不代表证据缺失。

每个结果都带有 untrusted-data 提示条。MCP 宿主没有 Agent Skill 那样的指引,所以信任边界要随负载一起传递。请把提取出的内容当作数据而非指令来对待——参见安全与隐私

远程输入受到防护

与 CLI 的 --remote 不同,MCP 服务器会拒绝解析到私有地址、环回地址、链路本地地址、CGNAT 地址、NAT64 地址或 IPv4 映射地址的 URL,并重新验证每一跳重定向。这里选择 URL 的是模型,如果不这样做,服务器就会变成通往其所在网络的 SSRF 跳板。

对于内网文档存储,请设置 PDFVISION_MCP_ALLOW_PRIVATE_NETWORK=1。已知限制:已验证的地址不会为这次 fetch 固定下来,因此在验证与连接之间发生变化的 DNS 答案不在覆盖范围内。

错误会指明下一次调用

Tool 失败会以带恢复说明的带内结果返回,而不是协议错误。越界的页面选择器、超出页面 budget 的 OCR 请求、未知的 ref,或格式错误的 region,都会说明该怎么做——读一下这条消息,它会指明下一次调用。

Released under the MIT License.