mcpField
D
doc-extract-api

doc-extract-api

本地服务
github.com/thestarboy9696生产力07 周前更新

关于 doc-extract-api

doc-extract-api 是面向 Agent 等调用方的付费文档转 JSON 提取 API。它为四类文档提供经过校验的结构,或接受调用方提供的 JSON Schema;每次请求通过 x402 使用 USDC 付款。

主要功能

  1. 01从 PDF 和图像提取 JSON
  2. 02支持四类文档的结构
  3. 03自定义 JSON Schema 提取
  4. 04领域校验与警告
  5. 05按次通过 x402 支付 USDC

适用场景

  1. 01从发票或收据提取结构化字段
  2. 02将合同或简历转换为 JSON
  3. 03对文档或文本应用自定义结构

MCP 相关

单独发布的 doc-extract-api-mcp 服务提供五种提取工具,调用在线 API 并使用所提供的钱包进行真实 x402 付款;它不在本地执行提取,也不提供免费路径。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"thestarboy9696-doc-extract-api": {
"command": "npx",
"args": [
"-y",
"doc-extract-api"
],
"env": {
"WALLET_PRIVATE_KEY": "<WALLET_PRIVATE_KEY>"
}
}
}
}
启动命令npx -y doc-extract-api
需要配置的环境变量
WALLET_PRIVATE_KEY密钥EVM private key for a wallet funded with real USDC on Base. Every tool call pays the live x402 API from this wallet — there is no free extraction path.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmdoc-extract-api0.2.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

doc-extract-api

文档转结构化 JSON 提取 API。输入 PDF/PNG/JPEG,返回简洁的 JSON。 四种固定文档类型(发票、收据、合同、简历)会获得匹配的架构和领域专属验证;/extract/custom 则接受任意 JSON Schema,因此调用方不受这四种类型的限制。专为自主 AI Agent 打造:无需注册、无需 API 密钥,也无需人工结账——Agent 可通过 x402 v2(USDC)发现价格并按次付费,全程通过 HTTP 完成,还可以通过 x402 Bazaar 发现目录以编程方式找到此服务。此服务也以 MCP 服务的形式发布(npm 上的 doc-extract-api-mcp,以及官方 MCP Registry)——但它只是同一个付费 API 的客户端,并非免费替代方案:每次调用 MCP 工具,都会从你提供的钱包中实际支付 x402 款项,而不是在本地运行、不限量的提取服务。此服务没有免费使用方式。

为什么使用 x402,而不是 Stripe

Stripe Checkout 是为人类打造的——它通过 UI 收取银行卡信息,其支付按钮会主动阻止非受信任的程序化(由 Agent 驱动的)提交。x402 让 HTTP 402 Payment Required 状态码重获新生:访问付费端点但未付款时,会收到一个 402 响应,其 PAYMENT-REQUIRED 标头包含完整、机器可读的清单(价格、网络、收款地址、资产,以及通过 Bazaar 扩展提供的完整输入/输出架构和实际示例)。然后通过 X-PAYMENT 标头携带已签名的 USDC 转账授权并重试,请求即可通过。无需账户、无需密钥、无需人工介入——发现和支付步骤就是同一次 HTTP 往返。

只有在提取成功后,款项才会结算——@x402/hono 的中间件会在运行处理程序前验证支付签名,但只有当处理程序返回非错误状态时才会执行实际的链上转账(已确认:此项目的 paymentMiddlewareFromConfig 调用会在被包装的路由响应为 ≥400 时跳过结算)。提取失败不会让调用方产生任何费用。

发现:x402 Bazaar

Bazaar(GET {facilitator}/discovery/resources)是一个实时、可查询的 x402 服务目录——截至本文撰写时约有 15k 条目,可供 Agent 客户端搜索(client.extensions.bazaar.search({ query: "..." }))。要加入目录,无需填写提交表单:facilitator 会在首次处理回显了路由声明的 bazaar 扩展的实际付款时,自动为资源编目。src/lib/discovery.ts 为全部四个路由声明了该扩展,包含完整输入架构(multipart form-data,file 字段)和经验证的实际输出示例——因此,一旦某个路由收到首笔主网实时付款,它就会出现在目录中,并提供足够详细的信息,让 Agent 无需阅读任何文档即可正确集成。截至本文撰写时,/extract/invoice 的目录条目仍显示迁移前的旧记录,而非这些丰富内容——请查看 git 历史记录或询问状态;/extract/receipt、/extract/contract 和 /extract/resume 尚未收到主网付款,因此还未编入目录。

定位(基于撰写目录文案前对实时 Bazaar 的调查):通用 OCR 竞品免费,但只返回未经验证的原始文本;通用结构化提取竞品每次调用收费约 $0.10,并要求调用方事先提供纯文本,而非原始文件。我们发现,只有此条目同时具备这两点——输入原始 PDF/图像,输出经过验证的固定架构。定价(见 wrangler.toml)按路由与该类别中直接竞品经验证的最低实时 402 价格匹配,而非单独设定——发票/收据/简历/自定义类型收费 $0.02,合同收费 $0.03(其真正可比的竞品价格高出一美分)。确切的目录文案和各路由的标签(serviceName/tags/description)请参见 src/lib/discovery.ts。

架构

  • schemas/ — invoice、receipt、contract 和 resume 提取结果的 JSON Schema (同时也是发送给 Claude 的工具 input_schema,因此模型必须严格遵循此结构)。
  • src/lib/claude.ts — 调用 Anthropic Messages API,将文档作为原生 document/image 内容块传入,并强制指定 tool_choice,因此模型只能返回符合该 Schema 的内容。
  • src/lib/validate.ts — 提取后的合理性检查:行项目之和等于小计,小计 + 税额(+ 小费)≈ 总额,日期有效且未在未来,货币为真实的 ISO 4217 代码,并标记置信度较低的字段。
  • src/lib/extract.ts — 编排一次提取流程并进行验证;若验证失败,则使用纠正提示重试一次,准确说明哪些数值对不上。绝不会静默失败:无论结果如何,都会在数据旁返回 validation_warnings。
  • src/lib/customSchema.ts / src/routes/customExtractHandler.ts — /extract/custom: 使用相同的 Claude 强制工具调用引擎,但工具的 input_schema 是调用方在请求时提供的 JSON Schema,而不是四种固定 Schema 之一。这里没有特定领域的验证器(没有固定领域可供核对),因此返回的是符合 Schema 的输出,而非经过事实核查的输出——validation_warnings 始终为 []。调用方提供的 Schema 有边界限制(≤6000 个字符、深度 ≤4、每层 ≤30 个属性、不允许 $ref),不符合要求时会在调用模型之前以 400 响应拒绝——此操作不产生费用,因为 x402 只会在响应非错误时结算。请求可接受 file(二进制 PDF/图像,与固定路由相同)或 content(调用方已有的原始文本/HTML,例如已抓取的网页,≤100,000 个字符),两者必须且只能提供一个。发送给 Claude 的提示词会明确将文本/HTML 标记为数据而非指令,因为这是调用方任意提供的内容,否则可能成为提示注入途径。
  • src/lib/facilitator.ts — 在测试网上选择免费的默认 facilitator;在主网上(X402_NETWORK = "base")使用 Coinbase 经过身份验证的 CDP facilitator,以及 Mogami 和 PayAI,以扩展与 Bazaar 等效的发现覆盖面(CDP 仍排在首位/作为主要 facilitator——较早的 facilitator 在验证/结算时拥有优先权);并将本项目的人类可读网络名称映射为 x402 v2 使用的 CAIP-2 标识符(eip155:8453 等)。重要:src/index.ts 在模块级别缓存构建好的支付中间件,而不是每个请求都重新构建——如果有多个 facilitator,其中一个运行异常时,会让 initialize() 增加其完整超时时间;每个请求都重新构建就意味着每次请求都要付出此代价(首次尝试多个 facilitator 时,这完全破坏了 API)。缓存后,只有冷启动隔离环境的第一个请求需要付出此代价。
  • src/lib/discovery.ts — Bazaar 列表内容:四个路由的描述、标签和发现扩展(Schema + 真实示例)。
  • src/index.ts — 运行于 Cloudflare Workers 的 Hono 应用。@x402/hono 的 paymentMiddlewareFromConfig 保护 /extract/*;它根据 Env 绑定按请求构建(Workers 只会在请求期间提供环境变量,而不会在模块加载时提供)。
  • src/routes/extractHandler.ts — 纯提取逻辑;执行到这里时,支付已经过验证。
  • mcp/server.ts — stdio MCP 服务,提供 extract_invoice、extract_receipt、 extract_contract、extract_resume 和 extract_custom 工具。每次工具调用都会通过 WALLET_PRIVATE_KEY 提供的钱包签署并发送真实的 x402 付款(使用 @x402/fetch 的 wrapFetchWithPayment,与 scripts/test-payment.mjs 使用相同机制),然后通过网络调用在线 HTTP API——它不会在本地执行提取,也不会直接调用 Claude。 没有免费调用途径:缺少钱包或钱包余额不足时,失败方式与直接调用 API 相同。

与原始规范的一处刻意偏离

规范假设了一个 PDF→图像转换步骤(pdf2image/poppler)。Cloudflare Workers 无法运行原生二进制文件,而 Claude 的 Messages API 原生接受 document 内容块中的 PDF,因此 PDF 会原样发送给 Claude。这样既移除了整个流水线阶段,也移除了一个无论如何都无法在 Workers 上运行的依赖。

设置

cd "doc-extract-api"
npm install
1. 密钥

本地开发 — 将 .dev.vars.example 复制为 .dev.vars,并填入真实密钥(已加入 gitignore):

cp .dev.vars.example .dev.vars

生产环境:

npx wrangler secret put ANTHROPIC_API_KEY
2. 钱包 — 收款地址

编辑 wrangler.toml:在此服务能够接收实际付款之前,X402_PAY_TO_ADDRESS 必须设置为你控制的真实钱包地址。这是公开的收款地址(可以安全提交,类似银行账号)——切勿在此项目的任何位置放入私钥。

X402_NETWORK 默认值为 base-sepolia(测试网,可从水龙头领取免费的测试 USDC — 适合在完全没有真实资金风险的情况下验证整个流程)。

价格按路由单独设置,不共享:X402_INVOICE_PRICE、X402_RECEIPT_PRICE、X402_CONTRACT_PRICE、X402_RESUME_PRICE、X402_CUSTOM_PRICE。默认价格与各类别中已验证的最低现行竞品价格持平 — 参见上文的定位说明。

2b. 切换到主网(X402_NETWORK = "base")

免费默认 Facilitator(x402.org/facilitator,在测试网上自动使用)仅支持测试网 — 主网需要经过身份验证的 Facilitator。本项目已接入 Coinbase 的 CDP Facilitator(src/lib/facilitator.ts):

  1. 创建一个 CDP Portal 账号,并在 Project → API Keys 下创建一个 Secret API Key。
  2. npx wrangler secret put CDP_API_KEY_ID
  3. npx wrangler secret put CDP_API_KEY_SECRET
  4. 在 wrangler.toml 中设置 X402_NETWORK = "base",然后重新部署。

价格:每月结算的前约 1,000 笔交易免费,之后每笔 $0.001 — 付款验证始终免费。如果 X402_NETWORK 为 "base",但未设置这些密钥,请求会在 Facilitator 配置步骤明确报错,而不会静默地错误配置付款。

要在 Bazaar 上架,至少需要完成一笔真实的主网付款 — Facilitator 首次处理带有 bazaar 扩展的付款时,会将该资源加入目录。使用真实且已注资的钱包运行一次 scripts/test-payment.mjs 来触发此流程(见下文),然后通过以下命令确认:

curl -s "https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources?limit=200" \
  | grep -o 'doc-extract-api'
3. 端到端付款测试(scripts/test-payment.mjs)

模拟真实的自主 Agent:生成或使用一次性钱包,通过 x402 v2 付款,并调用线上 API。请先为测试钱包注资 — 可从水龙头领取测试网 USDC(例如,faucet.circle.com,Base Sepolia),免费运行;如果 X402_NETWORK 为 "base",也可以在 Base 上使用少量真实 USDC:

node scripts/gen-test-wallet.mjs        # prints a fresh throwaway private key + address
TEST_WALLET_PRIVATE_KEY=0x... node scripts/test-payment.mjs

会打印结算详情以及收款方 USDC 余额的前后变化 — 已确认在 Base Sepolia(测试网)和使用真实 USDC 的 Base 主网上均可端到端运行。

4. 本地运行
npm run dev
curl -X POST http://localhost:8787/extract/invoice -F "file=@/path/to/invoice.pdf"
# → 402 Payment Required; full payment + discovery manifest in the PAYMENT-REQUIRED header

/extract/custom 接受一个 schema 字段(JSON Schema 字符串,type: "object")、一个可选的 instructions 字段,以及 file(二进制)或 content(原始文本/HTML)两者中的且仅其中一个:

curl -X POST http://localhost:8787/extract/custom \
  -F "file=@/path/to/doc.pdf" \
  -F 'schema={"type":"object","properties":{"order_id":{"type":"string"},"ship_date":{"type":"string"}}}' \
  -F "instructions=Dates in YYYY-MM-DD"

也可以直接使用已有的原始文本/HTML — 无需文件:

curl -X POST http://localhost:8787/extract/custom \
  -F "content=<html><body><h1>Acme Corp</h1><p>Founded 1998, HQ in Austin, TX</p></body></html>" \
  -F 'schema={"type":"object","properties":{"company":{"type":"string"},"founded":{"type":"number"},"hq":{"type":"string"}}}'

实际调用方会使用支持 x402 的 HTTP 客户端(例如 Agent 端的 @x402/fetch),自动处理 402 → 签署付款 → 重试循环。

5. 部署
npm run deploy
6. MCP 服务(付费,供 Agent 使用)
export WALLET_PRIVATE_KEY=0x...   # a wallet funded with real USDC on Base — every call spends from it
npm run mcp

或者,发布后,MCP 客户端无需克隆此仓库即可直接运行:

npx doc-extract-api-mcp

将支持 MCP 的客户端指向此 stdio 服务,即可将 extract_invoice、extract_receipt、extract_contract、extract_resume 和 extract_custom 暴露为工具。每次调用都会通过 x402 在网络上调用线上 API 并付款 — 不存在本地/免费提取路径,客户端也完全不需要 ANTHROPIC_API_KEY(该密钥由服务端持有;调用方只需要一个已注资的钱包)。

尚未完成

  • 简历包含真实的个人身份信息(姓名、联系方式、工作经历)。响应返回后不会保留任何数据(与此处的其他文档类型相同),但鉴于其敏感性,值得再次说明——请参阅 src/lib/discovery.ts 中的简历说明。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。