ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Rust 终于有能打的文档解析了?用 xberg 搭一个 MCP server 试试

Rust 终于有能打的文档解析了?用 xberg 搭一个 MCP server 试试 1. 为什么我要在 Rust 里折腾文档解析做 RAG 应用的人迟早会撞上同一堵墙PDF、Word、扫描件要喂给 LLM第一步就是把这些东西变成干净文本。我在选型的时候发现一个尴尬现实Unstructured、Docling、MinerU 全是 Python 系Rust 生态里只有 pdf-extract、lopdf 这类单格式库没有一个能一站式收口的方案。你要在 Rust 服务里解析文档要么自己拼五六个库要么在架构里硬塞一个 Python 边车服务运维成本直接翻倍。后来看到 xbergRust 核心、101 种格式、371 种语言的代码智能、15 种语言绑定还自带 MCP server。这个组合正好戳中我的需求Rust 项目同构、不引入第二门运行时、Agent 能直接调。我把它装下来实测了一周重点验证两件事一是文档解析质量到底能不能打二是它自带的 MCP server 能不能真的接进现有 AI 工具链。这篇文章就围绕第二个问题展开。我会给出可复制的 MCP server 配置片段、启动命令再演示一次从文档输入到结构化输出的完整验证流程。如果你也在给 AI 工具找本地文档解析能力这篇可以当作一份可跟做的接入记录。xberg 是什么一句话说清它是一个 Rust 写的文档解析库把 PDF、Word、图片、网页、代码文件丢给它它给你吐干净的文本和结构化数据表格、实体、embedding 都有主要就是给 LLM 应用喂料的。crates.io 上的定位是 document intelligence当前版本 1.0.14。它解决的核心问题是多格式一个入口。以前一个 PDF 一个库Office 又换一个代码文件还得再找解析器凑起来是一堆散件。xberg 把所有格式统一收进一套 API用语言无关的插件体系按格式挑 extractor。这个设计比一个函数硬啃所有格式实在也比自己拼五六家库省心。架构一句话就能说清核心是 Rust其它都是绑定。核心模块做 extract 编排MIME 检测覆盖 115 种扩展名按格式优先级挑 extractor。插件体系是语言无关的PDF、图片、Office、邮件各走各的提取器。OCR 后端有 Tesseract、PaddleOCR 和 Candle 系的 VLM按需切换。绑定层覆盖 Python、TSNAPI-RS、WASM、Java、Go、Elixir 等 15 种WASM 性能约为原生 60%-80%不是所有绑定体验一致。接入方式有库 API、CLI、REST API、MCP server。自带 MCP server 这一点说明它是冲着 AI Agent 场景设计的。2. 接入前的准备TaoToken 与 MCP 环境在动手搭 MCP server 之前先把模型侧和工具侧的账算清楚。MCP server 本身只负责把文档解析成结构化文本它不产生智能真正做推理、做总结、做 embedding 的是背后的模型。所以你需要一个稳定的模型接入点我这边用的是 TaoToken官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。它的作用是给 MCP 客户端提供统一的模型调用入口省得你在每个工具里单独配一遍 key。先把环境清单列一下避免你中途卡壳。第一Rust 工具链建议 1.75 以上用 rustup 装最省事。第二一个 MCP 客户端我用的是 Claude Code你也可以用 Cline 或者任何支持 MCP 的编辑器插件。第三TaoToken 的 API Key去控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 生成注意这个 key 只在生成时显示一次复制好。第四一份测试文档我准备了一份 5 页的 arXiv 论文和一份 Markdown 文件用来对比结构保真度。这里有个前置认知要先建立xberg 的 MCP server 是它自己提供的不是第三方封装的。这意味着你不需要额外写胶水代码装好 crate 之后直接跑命令就能起服务。但它的默认特性并不包含所有格式PDF 和 HTML 都要手动开 feature这一点后面会详细说也是我踩的第一个坑。关于模型侧如果你只是做文档解析验证其实不一定需要模型。但一旦你要把解析结果喂给 LLM 做问答或者摘要就需要一个能稳定调用的 API。TaoToken 在这里的角色是统一入口你可以在它的模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 先手动试一下模型能不能正常返回确认 key 有效再往下走。如果你打算长期跑编码类 Agent 任务可以看看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 按套餐走比按量计费更可控。环境准备好之后先别急着写配置。我建议你先用 CLI 跑一次单文件解析确认 xberg 本体能正常工作再去接 MCP。这样出问题的时候你能快速定位是解析层的问题还是 MCP 层的问题。CLI 验证命令很简单装好之后直接xberg extract document.pdf就能看到输出。如果这一步就报 UnsupportedFormat那说明 feature 没开跟 MCP 无关。3. 可复制的 MCP server 配置与启动命令这一节是全文的核心我把我实际跑通的配置原样贴出来你照着改路径就能用。先说 Cargo.toml这是第一个必须写对的地方。默认特性下 xberg 连 PDF 都打不开会报UnsupportedFormat(application/pdf)因为 101 种格式是特性开关不是默认全开。正确的写法是这样[package] name xberg-mcp-demo version 0.1.0 edition 2021 [dependencies] xberg { version 1.0.14, features [pdf, html, mcp] } tokio { version 1, features [full] } anyhow 1注意 features 里我加了 pdf、html 和 mcp 三个。mcp 这个 feature 是开启 MCP server 能力的关键很多人只加 pdf 然后发现没有 server 命令就是漏了这个。开 pdf 特性之后构建可能会失败报错长这样error: failed to select a version for the requirement fax ^0.3 candidate versions found which didnt match: 0.2.7, 0.2.6, ... required by package pdf_oxide v0.3.77原因是 xberg 的 PDF 能力基于 pdf_oxide 0.3.77它依赖 fax ^0.3而本地 cargo 索引缓存里只有 0.2.x。跑一次cargo update更新索引编译就过了。整个编译约 6 分钟产物 28.4MB。新项目第一次跑大概率踩这个记一笔。编译通过后MCP server 的启动命令是这样cargo run --release -- mcp --transport stdio如果你要跑 HTTP 模式给多个客户端用可以换成cargo run --release -- mcp --transport http --port 8787接下来是客户端侧的配置。我用的是 Claude Code它的 MCP 配置放在项目根目录的.mcp.json里内容如下{ mcpServers: { xberg: { command: /path/to/your/xberg-mcp-demo/target/release/xberg-mcp-demo, args: [mcp, --transport, stdio], env: { XBERG_OCR_BACKEND: tesseract, TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: sk-你的key } } } }这里三个环境变量要说明。XBERG_OCR_BACKEND 指定 OCR 后端可选 tesseract、paddleocr、candle按你本地装了什么来。TAOTOKEN_BASE_URL 和 TAOTOKEN_API_KEY 是给后续模型调用用的如果你只用解析不调模型这两个可以暂时不填。但既然要接进 AI 工具链早晚要用先配上省事。如果你用的是 Cline配置位置在 VS Code 的 settings.json 里结构类似只是外层 key 换成cline.mcpServers。Codex 用户则要写~/.codex/auth.json把 base_url 和 api_key 填进去。这三个客户端的配置逻辑一致都是 Base URL Key Model ID 三件套Model ID 按你实际用的模型填。配置写完之后重启客户端在对话里输入/mcp或者查看 MCP 面板应该能看到 xberg 这个 server 处于 connected 状态。如果显示 failed先看日志大概率是路径写错或者二进制没编译出来。这一步过了才算真正把 MCP server 接进来了。4. 验证请求从文档输入到结构化输出配置连上只是第一步真正要验证的是它能不能把文档解析成可用的结构化数据。我设计了一个完整的验证流程从输入到输出走一遍你可以照着复现。第一步准备测试文档。我放了两份在项目根目录的samples/下一份是attention.pdf5 页文本层论文一份是notes.md带标题、表格、代码块的 Markdown。为什么要两份因为我想对比不同格式的结构保真度。第二步在 MCP 客户端里发起解析请求。Claude Code 里可以直接说「用 xberg 解析 samples/attention.pdf输出文本内容和元数据」。它会调用 xberg 的 extract 工具返回结构化结果。我实测下来PDF 的耗时是 0.302 秒输出 39.6KB、809 行文本。内容完整性没得说Multi-Head、positional encoding、BLEU、softmax 这些关键词全部命中正文、公式叙述、表标题都在。第三步检查结构保真度。这一步是重点也是我要提醒你的地方。PDF 输出的结构保真一般没有 Markdown 标题层级表格没有还原成表格Table 1 的标题和叙述在但表格数据被打平成文本流数学符号的下标混在句子里。同一批样本里Markdown 输入的结构保真度高很多标题、表格、代码块全部保留。HTML 输入内容正确结构也简化成了文本流。第四步把解析结果喂给模型做一次问答验证端到端链路。我在对话里接着问「这篇论文的核心贡献是什么用三点概括」。客户端会把上一步的解析文本作为上下文通过 TaoToken 的 API 调用模型返回结构化答案。这一步能跑通说明从文档解析到模型推理的完整链路是通的。如果你要更工程化的验证可以用 CLI 直接跑把输出重定向到文件xberg extract samples/attention.pdf --format json output.json然后检查 output.json 里的results[0].content字段这就是提取出的文本。JSON 格式的好处是你能程序化地检查字段完整性比如统计字符数、检查关键词命中率。我写了个小脚本统计关键词命中PDF 样本里 12 个技术关键词全部命中说明文本层提取没有丢内容。这里要强调一个判断标准对 RAG 场景文本层 PDF 提取到这个程度够用LLM 吃的是文本不是版面。你要表格结构还原、版面分析那还不是 xberg 现在的强项。所以验证的时候别拿版面还原当唯一指标先看内容完整性再看结构最后看性能。5. 常见报错排查401、UnsupportedFormat 与编译断链这一节把我踩过的坑和社区里高频的报错整理出来你遇到问题先对照这里查。第一个高频报错是UnsupportedFormat(application/pdf)。这个前面提过根因是 feature 没开。解决方法是检查 Cargo.toml 里 features 是否包含 pdf。注意 Markdown、CSV、JSON 是开箱即用的所以很多人先用这些格式测试通过换成 PDF 就懵了。记住 101 种格式是特性开关不是默认全开。第二个是编译期的failed to select a version for the requirement fax ^0.3。这是索引缓存过期导致的跑cargo update更新索引即可。如果更新后还不行检查你的 cargo 版本太老的版本可能拉不到新索引。这个坑在新项目第一次编译时几乎必现别慌。第三个是 401 报错。如果你在 MCP 客户端里看到401 Unauthorized先分清楚是哪个环节的 401。如果是 xberg 解析本身报 401那不太可能因为解析是本地行为。更可能是模型调用环节也就是 TaoToken 的 key 无效或者没填。检查.mcp.json里的 TAOTOKEN_API_KEY 是否正确注意 key 只在生成时显示一次如果你复制的时候漏了字符就会 401。去控制台重新生成一个路径是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。第四个是local proxy failed或者连接超时。这类报错通常出现在 HTTP transport 模式下客户端连不上 server 的端口。检查两件事一是 server 是否真的起来了看终端有没有监听日志二是端口是否被占用换一个端口试试。stdio 模式下一般不会有这个问题所以如果你不确定先用 stdio。第五个是reading choices相关的报错。这个通常出现在模型返回格式不符合预期的时候比如你用的模型不支持某些参数。检查 Model ID 是否填对以及请求体里的参数是否在模型支持范围内。如果你用的是 Claude Code 接 Anthropic 系模型可以参考文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里的参数说明。第六个是 OAuth 相关的报错。如果你在配置 Claude Code 的时候看到 OAuth 失败先确认你用的是 API Key 模式而不是 OAuth 模式。API Key 模式更简单直接填 key 就行。Claude Code 的接入文档在 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-code-anthropicutm_campaignrewrite 里面有完整的配置示例。排查的通用思路是分层定位。先确认 xberg 本体能用用 CLI 跑单文件再确认 MCP server 能起看终端日志最后确认客户端能连看 MCP 面板状态。哪一层断了就查哪一层别一上来就怀疑最外层。6. 把 xberg 接进你的工具链验证跑通之后回到最初的问题xberg 值不值得纳入现有工具链。我的判断是分场景的。用 xberg 的场景有四类。Rust 项目因为和你的技术栈同构不引入第二门运行时。想省 Python 运行时省去专门维护一个 Python 服务。要 MCP 接入因为 Agent 直接调省掉中间层。性能敏感因为原生编译产物启动和吞吐都有优势。这四类里Rust 项目和 MCP 接入是最刚需的前者是技术栈匹配后者是 Agent 时代的标配。留 Python 系的场景有三类。全 Python 团队别为解析器引入 Rust 工具链。要深度学习文档理解提取之外还要版面、语义结构。要 Docling 级别的版面分析精度xberg 现在给不了。中文 OCR 深度定制也算一类Python 系后端选择更多。许可证和商业背景也要说清楚。xberg 是 MIT背后是商业公司 xberg-io提供 Enterprise SDK。这件事带来两个直接后果。社区版免费可用但 roadmap 大概率服务于商业目标核心格式的解析质量会优先保冷门格式的维护优先级要你自己盯。任何商业开源项目都这样不用当成黑点只是评估时要独立解析质量和许可证风险分开算。如果你决定接入下一步可以做的几件事。第一把 MCP server 配到你的日常工具里先用一周看看稳定性。第二拿你自己的真实文档跑一批重点看内容完整性和结构保真度是否满足你的 RAG 需求。第三如果要调模型把 TaoToken 的 key 配好模型对话页面可以先手动验证 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 。第四长期跑 Agent 任务的话Coding Plan 比按量计费更划算 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。我实测一周的结论是xberg 能用它占的是 Rust 原生、文本提取、Agent 集成这个位置表格结构还原和版面分析还差一截OCR 依赖链要自己评估。如果你的场景正好落在它的强项区间它值得进你的工具链。如果你的场景需要重度版面分析那再等等或者继续用 Python 系。选型没有银弹只有匹配。
返回列表