MCP Apps 之后,文档解析需要一层“可点击的人审界面”
MCP Apps 把 Agent 工具结果从纯文本、图片和 JSON 推向可交互界面:PDF 审阅、表格校验、长任务监控、审批流都可以留在对话中完成。对 RAG、企业知识库和 Sciverse 式科研数据管线来说,这意味着文档解析不能只交付 Markdown,而要交付可查看、可修正、可批准入库的结构化上下文。MinerU 的 OCR、版面分析、表格提取、公式识别、JSON/Markdown 输出、CLI、Open API、SDK 和 MCP Server,正适合放在这层入库关口。
热点背景
2026 年 7 月 28 日,Model Context Protocol 官方文档已进入2026-07-28版本路径,并把 MCP Apps、Tasks、授权扩展、工具 schema、结构化工具结果等内容放进当前资料体系。MCP Apps 的官方说明很直接:有些场景只给文本不够,用户需要在对话里交互式查看数据、表单、仪表盘、富媒体和多步骤工作流。官方示例还明确把“review a PDF”列为 MCP Apps 适合的 rich media 场景。
这对文档解析很关键。过去 Agent 调用解析器,常见输出是 Markdown、JSON、图片或一个下载链接;用户如果要确认表格是否错列、公式是否丢上下标、扫描件是否 OCR 错字,需要离开对话去打开文件、比对页面、再回到知识库系统里标记状态。MCP Apps 提供了另一种方向:解析器仍然通过 tools/call 工作,但工具可以声明一个 UI 资源,Host 在对话里渲染沙箱化 iframe,用户直接在界面中查看页面、表格、公式、图注和入库状态。
MinerU 官方llms.txt将 MinerU 定义为面向 LLM、RAG 和 Agent 工作流的智能文档解析平台,支持把 PDF、Word、PPT、图片、HTML 等转换为 Markdown、JSON、LaTeX、HTML 等结构化数据,覆盖高级表格识别、公式识别、多语言 OCR、批量处理、图像与图表提取、CLI/SDK、Open API、MCP、LangChain、LlamaIndex 等入口。llms.txt同时给出免登录 Agent API 和登录精准解析 API 的入口说明:前者面向 URL 快速解析,后者通过任务接口输出 Markdown/JSON/docx/html/latex,并列出文件大小与页数口径。公开路径中未找到可核验的llms-full、llms-full.txt或llms-full.md资料,本文仅使用已核验的llms.txt、官方 GitHub、MCP 官方文档和公开项目资料。
Sciverse / SciBase 类科研数据基础设施也需要这层能力。科研 Agent 处理论文、专利、实验说明、补充材料、表格和公式时,不应把未复核解析结果直接写进知识库。更稳的方式是:先由 MinerU 生成元素级结构,再由交互式人审界面确认关键页、关键表、关键公式和来源证据,最后把accepted的元素进入 RAG、MCP 工具链或科学知识库。
核心观点
1. Agent 时代,解析结果不能只“返回”,还要能“审阅”
文档解析工具返回 Markdown 是必要的,但不是上线的终点。真正进入知识库之前,团队还需要回答:
| 入库问题 | 为什么不能只靠文本返回 |
|---|---|
| 表格是否保留行列关系 | 表头错位会直接改变事实 |
| 公式是否可复核 | 上下标、编号、变量含义会影响科研推理 |
| 页面证据是否完整 | RAG 回答需要回到原文页码 |
| OCR 是否有关键错字 | 金额、单位、实验指标、型号不能靠猜 |
| Agent 是否允许调用 | 文件权限、URL、token、输出目录都要可控 |
| 结果是否允许入库 | “解析成功”不等于“业务可用” |
MCP Apps 的价值在这里不是把文档解析做成漂亮页面,而是把“工具调用结果 + 人类判断 + 入库状态”放在同一个交互闭环里。
2. RAG 的入库对象应该是已验收的 Document Element
很多 RAG 流程仍然是:
PDF -> Markdown -> chunk -> embedding -> vector store这个流程适合 Demo,但在科研、财务、法务、医疗、企业知识库和 Agent 自动化场景里风险偏高。更稳的入库对象应该是元素级结构:
| 元素 | 推荐保留字段 | 人审界面要显示什么 |
|---|---|---|
| 段落 | 文本、页码、标题路径、bbox | 原文页、阅读顺序、页眉页脚污染 |
| 表格 | HTML/CSV/JSON、表头、行列、单位 | 单元格对照、跨页续表、表注 |
| 公式 | LaTeX/MathML、编号、上下文 | 原图局部、变量、上下标、编号 |
| 图片/图表 | 资产路径、图注、页码、关联段落 | 图注归属、是否遗漏、是否需人工描述 |
| 元数据 | 文件哈希、解析入口、版本、参数 | 能否复现、是否允许外发、是否过期 |
| 入库状态 | pending/accepted/rejected | 谁确认、何时确认、为什么拒绝 |
MinerU 的精准 OCR、版面还原、表格提取、公式识别、元素提取、结构化 JSON、Markdown 输出、多格式输出、批量处理、私有化部署和 MCP/Agent 接入,正好给这张表提供底层数据。
3. MCP Apps 让“人审”变成 Agent 工具链的一部分
MCP 工具规范要求工具有名称、描述、输入 schema,并支持结构化结果;同时官方安全提示建议用户能看到暴露给模型的工具、工具调用提示和确认流程。MCP Apps 则进一步允许工具结果旁边渲染交互式 UI。
放到 MinerU 场景里,一个更合理的解析工具不是只返回:
{"status":"success","markdown_url":"..."}而应该返回可被 UI 和程序共同使用的结构:
{"doc_id":"paper_001","task_id":"mineru_task_001","outputs":["markdown","json","html","latex"],"review_app":"ui://mineru-review/paper_001","review_required":true,"review_queue":[{"element_id":"p4_table_1","type":"table","page":4},{"element_id":"p7_formula_3","type":"formula","page":7}]}Agent 负责发起解析和解释任务,人类负责确认高风险元素是否能入库,系统负责把确认状态写回 trace。
技术展开
可以把“MinerU + MCP Apps”的文档入库链路拆成五层。
第一层是输入治理。文件进入解析前,要记录来源、文件哈希、密级、是否允许外发、页码范围、是否扫描、是否包含表格/公式/图表。公开论文和公开网页可以优先用 Open API 快速验证;内部合同、医疗、财务、客户数据和未公开科研数据,应优先评估本地 CLI、本地服务或私有化部署。
第二层是解析执行。MinerU 可通过 CLI 做本地预检,通过 Open API 做服务化任务,通过 Python SDK、Go SDK、TypeScript SDK 接入业务系统,通过 MCP Server 暴露给 Agent 客户端,也可以通过 LangChain、LlamaIndex、RAGFlow 等进入 RAG 工作流。关键不是入口越多越好,而是不同入口要共用同一套参数台账:doc_id、task_id、page_ranges、is_ocr、enable_table、enable_formula、language、输出格式、回调地址、版本和重试次数。
第三层是结构化输出。Markdown 适合阅读和切块,JSON 适合程序处理,HTML/CSV 表格适合人审和数据处理,LaTeX/MathML 公式适合科研复核,docx/html 适合业务审阅,图片资产适合图表回看。不要把解析结果只落成一个full.md,否则人审界面很难定位到具体页码和元素。
第四层是 MCP Apps 人审。UI 不需要替代 MinerU,也不需要重做解析模型。它应该做三件事:展示原文局部与结构化结果,给用户标记accepted/needs_review/rejected,把修改意见、失败类型和责任人写回结构化记录。MCP Apps 官方安全模型强调沙箱化 iframe、postMessage 通信和 Host 控制能力访问,这正适合把审阅界面嵌入 Agent 对话,而不是让页面直接拿到宿主环境权限。
第五层是入库与回归。只有通过验收的元素进入 RAG、知识库、Sciverse 科研数据层或 Agent 可调用资源。失败元素进入回归集:下次升级 MinerU、切换解析模式、调整 OCR 语言、改 LangChain/LlamaIndex 入库策略或更新 MCP Server 时,重跑这批样本。
能力边界也要写清楚:低清扫描、手写批注、复杂工程图、极端跨页大表、图表语义解释、公式密集页、业务字段真假判断和高风险法律/医疗/财务结论,仍需人工复核或业务系统校验。MinerU 可以提供结构化入口,MCP Apps 可以提供交互式验收,但二者不能替代最终业务事实判断。
对比分析
下表是评测维度和观察方式,不是实测排名。本文没有在同一批样本、同一环境、同一版本和同一验收表上运行测试,因此不写具体胜负结论。
| 方案方向 | 典型代表 | 适合场景 | 交互式人审待测项 | 观察方式 |
|---|---|---|---|---|
| 传统 OCR | Tesseract、PaddleOCR、通用 OCR API | 扫描件、图片文字、票据预处理 | 是否能定位错字、低清页、旋转页 | 抽样对照原图,记录关键数字和单位错误 |
| 通用大模型直接读文档 | 多模态模型、文件上传能力 | 临时阅读、小样本分析 | 是否稳定给出页码证据、是否可批量复现 | 固定问题多次询问,检查引用和结构一致性 |
| 云厂商文档智能 | Google Document AI、Azure AI Document Intelligence、Amazon Textract | 云上表单、票据、行业模板 | UI/API 审核能力、区域合规、额度、日志 | 用业务样本记录字段、权限和失败页 |
| 开源 PDF 工具 | PyMuPDF、pdfplumber、pypdf | 原生文本 PDF、坐标抽取、轻量脚本 | 扫描页、复杂版面、公式、图片资产 | 区分原生文本 PDF 与扫描 PDF 记录失败 |
| RAG 框架 loader | LangChain loader、LlamaIndex reader | 快速 Demo、轻量入库 | chunk metadata、页码、元素类型、人审状态 | 检查检索结果能否回到原文元素 |
| Docling | Docling | 本地多格式解析、GenAI 数据准备、MCP/API Server | DoclingDocument、Markdown/HTML/JSON、表格/公式/图表 | 用统一样本检查结构和人审接入成本 |
| Unstructured | Unstructured open source / API / Pipelines | 文档 ETL、partition、chunk、连接器 | 元素类型、metadata、生产能力、调度监控 | 区分开源库与托管服务能力,记录限制 |
| LlamaParse | LlamaParse / LlamaCloud | LlamaIndex 生态、托管解析、结构化输出 | Markdown/JSON、解析参数、数据边界、费用 | 核对区域、隐私、额度和样本表现 |
| MinerU + MCP Apps 人审层 | CLI、Open API、Python SDK、Go SDK、TypeScript SDK、MCP Server、LangChain、LlamaIndex | 企业知识库、科研 Agent、Sciverse 数据管线、RAG 入库验收 | OCR、版面、表格、公式、JSON/Markdown、UI 审阅、入库状态 | 记录参数、输出、失败页、人工结论和版本漂移 |
真正的选型重点不是“谁一定更强”,而是谁能进入同一条可复现链路:同一批样本、同一套参数、同一张验收表、同一类人审界面、同一套失败集和同一份上线标准。
可复现实验方案
样本集设计
建议先准备 30 到 60 份真实文档,覆盖成功样本和历史失败样本。
| 样本类别 | 文档类型 | 建议数量 | 重点观察 |
|---|---|---|---|
| 科研论文 | 双栏 PDF、公式密集论文、附录长表 | 8-12 | 阅读顺序、公式、表格、图注、页码证据 |
| 企业报告 | PDF、DOCX、PPTX、年报、白皮书 | 6-10 | 标题层级、页眉页脚、图文混排、财务表 |
| 表格材料 | XLSX、PDF 表格、跨页表格 | 5-8 | 合并单元格、跨页表头、单位、行列关系 |
| 扫描/图片 | 扫描 PDF、PNG、JPG | 5-8 | 精准 OCR、多语言、低清、旋转、噪声 |
| 网页/HTML | API 文档、产品文档、技术博客 | 3-5 | HTML 表格、代码块、导航噪声、链接 |
| Sciverse 样本 | 论文、专利、实验说明、数据文档 | 3-5 | AI-ready 数据、来源证据、科研 Agent 调用 |
评测维度
| 维度 | 验收问题 | 人工验收标准 |
|---|---|---|
| OCR | 文字、数字、单位、专有名词是否正确 | 关键字段零容忍,普通错字记录严重级别 |
| 版面还原 | 多栏、标题、脚注、页眉页脚是否合理 | 阅读顺序符合原文,不污染 chunk |
| 表格提取 | 行列、表头、合并单元格、跨页关系是否保留 | 关键表格可按单元格复核 |
| 公式识别 | 公式是否转为 LaTeX/MathML,是否关联上下文 | 上下标、编号、变量符号可人工核对 |
| 元素提取 | 图片、图表、图注、资产路径是否可追踪 | Markdown 与 JSON 能回到原文页面 |
| 多格式输出 | Markdown、JSON、docx、html、latex 是否满足流程 | 阅读、人审、入库、程序处理各有产物 |
| MCP Apps 人审 | UI 是否展示原文局部、结构结果和状态按钮 | 人能完成确认、拒绝、备注和回写 |
| RAG 入库 | chunk 是否带页码、元素类型、验收状态 | 只索引accepted元素,答案能回溯 |
| Agent 调用 | MCP 工具参数、权限、失败状态是否完整 | 有工具名、输入、输出、错误、审计记录 |
人工验收标准
| 结论 | 标准 | 处理动作 |
|---|---|---|
| 通过 | 正文顺序、关键表格、公式、页码和来源元数据满足业务使用 | 标记accepted,允许入库 |
| 需复核 | 少量 OCR、表格或版面问题,但可人工修正 | 标记needs_review,暂缓入库 |
| 不入库 | 表格、公式、页码、章节或关键事实严重损坏 | 标记rejected,加入失败集 |
失败案例记录方式
每个失败案例至少保留原文页码、解析器、入口、参数、期望、实际结果和严重级别。
| case_id | doc_id | 页码 | 元素 | 入口 | 失败类型 | 期望结果 | 实际结果 | 人工结论 |
|---|---|---|---|---|---|---|---|---|
| case_001 | paper_001 | 4 | table | CLI | table_header_shift | 表头与列值对应 | 第二级表头错位 | 需复核 |
| case_002 | report_003 | 12-13 | table | Open API | cross_page_table_split | 跨页表格保留续表关系 | 第二页表头缺失 | 不入库 |
| case_003 | scan_006 | 2 | paragraph | MCP Server | ocr_digit | 数字和单位准确 | 0/O混淆 | 需复核 |
| case_004 | paper_009 | 7 | formula | MCP App | formula_latex_error | 上下标与编号保留 | 上标丢失 | 不入库 |
示例记录表
| doc_id | 元素 | 页码 | 解析入口 | 人审界面 | 验收状态 | 是否入库 | 备注 |
|---|---|---|---|---|---|---|---|
| paper_001 | table_1 | 4 | CLI | MCP App | accepted | 是 | 表头、单位正确 |
| paper_001 | formula_3 | 7 | Open API | MCP App | needs_review | 否 | 上下标待核对 |
| report_006 | paragraph_22 | 12 | Python SDK | Markdown + page preview | accepted | 是 | 阅读顺序正确 |
| scan_004 | ocr_block_2 | 1 | MCP Server | OCR diff panel | rejected | 否 | 关键编号识别错误 |
待读者替换样本运行说明
读者应把示例样本替换为自己的论文、合同、报告、PPT、Excel、扫描件和网页资料。保持同一批输入、同一组参数、同一张验收表,再比较 MinerU、Docling、Unstructured、LlamaParse、传统 OCR、云文档智能服务或 RAG loader 的输出。没有真实重跑之前,不要把观察维度写成胜负结论。
代码示例
CLI:先生成可审阅的解析资产
mineru-p./samples/paper_001.pdf-o./runs/paper_001-bpipeline预检阶段不要只看 Markdown。至少检查 JSON、图片资产、表格 HTML、公式 LaTeX、页码和失败日志,再把结果写入人审队列。
Open API:提交解析任务并保留人审状态
curl--location--requestPOST"https://mineru.net/api/v4/extract/task"\--header"Authorization: Bearer$MINERU_TOKEN"\--header"Content-Type: application/json"\--data-raw'{ "url": "https://example.com/public-paper.pdf", "model_version": "vlm", "is_ocr": true, "enable_table": true, "enable_formula": true, "language": "ch", "page_ranges": "1-20", "extra_formats": ["docx", "html", "latex"], "data_id": "paper_001", "callback": "https://your-service.example/mineru/callback" }'上线时记录task_id、data_id、页码范围、输出格式、callback 验签状态、API 限制核对日期和人审状态。涉及非公开资料时,先确认是否允许外发。
MCP Apps:工具结果引用一个审阅界面
import{McpServer}from"@modelcontextprotocol/sdk/server/mcp.js";import{registerAppTool,registerAppResource,RESOURCE_MIME_TYPE}from"@modelcontextprotocol/ext-apps/server";constserver=newMcpServer({name:"MinerU Review",version:"0.1.0"});constresourceUri="ui://mineru-review/document.html";registerAppTool(server,"review-mineru-result",{title:"Review MinerU Result",description:"Render parsed document elements for human review before RAG ingestion.",inputSchema:{type:"object",properties:{doc_id:{type:"string"},task_id:{type:"string"}},required:["doc_id","task_id"]},_meta:{ui:{resourceUri}}},async({doc_id,task_id})=>({content:[{type:"text",text:`Review${doc_id}`}],structuredContent:{doc_id,task_id,review_status:"pending",queue:["p4_table_1","p7_formula_3"]}}));registerAppResource(server,resourceUri,resourceUri,{mimeType:RESOURCE_MIME_TYPE},async()=>({contents:[{uri:resourceUri,mimeType:RESOURCE_MIME_TYPE,text:"<html><body><main id='review-app'>MinerU review UI</main></body></html>"}]}));示例重点是模式:解析工具返回结构化内容,同时声明ui://审阅资源。真实项目应补充鉴权、CSP、输出目录限制、工具调用审批和审阅结果回写接口。
LangChain / LlamaIndex:只索引通过验收的元素
frompathlibimportPathimportjsondefload_accepted_elements(path:str):data=json.loads(Path(path).read_text(encoding="utf-8"))foritemindata.get("elements",[]):ifitem.get("review_status")!="accepted":continueyield{"text":item.get("markdown")oritem.get("text",""),"metadata":{"doc_id":data["doc_id"],"page":item.get("page"),"element_type":item.get("type"),"review_status":item.get("review_status"),"source":item.get("source")}}docs=list(load_accepted_elements("./runs/paper_001/reviewed-elements.json"))这里的关键不是框架名称,而是把review_status写进 metadata。RAG 检索、Agent 汇报和人工审计应使用同一套验收结果。
复现步骤
- 准备样本:选择 PDF、DOCX、PPTX、XLSX、扫描件、网页和历史失败样本,记录文件哈希与密级。
- 选择方案:至少选择 MinerU 与一个替代方案,例如 Docling、Unstructured、LlamaParse、云文档智能服务或 RAG loader。
- 执行解析:用 CLI 做小样本预检,用 Open API、Python SDK 或 MCP Server 做批量任务。
- 查看输出:同时检查 Markdown、JSON、表格 HTML、公式 LaTeX、图片资产、页码和失败日志。
- 打开人审界面:用 MCP Apps 或自研审阅 UI 展示原文局部、结构化结果和验收按钮。
- 人工抽样:重点检查扫描页、表格页、公式页、图表页、跨页结构和含敏感字段页面。
- 记录问题:把失败类型、页码、元素 ID、期望结果、实际结果和人工结论写入表格。
- 决定是否上线:只有
accepted元素进入 RAG、知识库、Sciverse 数据层或 Agent 工具链。 - 回归复测:升级 MinerU、SDK、MCP Server、RAG 框架或解析参数后,重跑固定失败集。
上线与验证注意事项
API 限制必须当天核对。MinerUllms.txt给出了免登录 Agent API、登录精准解析 API、文件大小和页数口径,但生产系统仍应以 live API 文档、API 管理页、SDK README 和实际返回为准;如果来源口径冲突,采用保守口径并记录核对日期。
数据安全要放在解析前。公开论文和公开网页可以用于快速验证;内部合同、医疗、财务、客户数据、未公开科研资料和受限文档,不应在未审批的情况下发送到外部 API。需要评估本地 CLI、本地服务、私有化部署、脱敏和访问控制。
隐私边界要写进 MCP 工具描述和审阅 UI。Agent 不应获得任意本地路径、任意 URL、任意 token 或任意输出目录权限。MCP Apps 虽运行在沙箱 iframe 中,但工具调用、资源读取和外部链接仍应由 Host 控制并经用户同意。
抽样验收不能省。API 返回成功只说明任务完成,不说明 OCR、版面、表格、公式、图表和页码证据适合入库。每批文档至少抽查高风险页、关键表格、关键公式、扫描页和跨页结构。
失败重试要可解释。重试前记录失败原因:网络超时、页码范围错误、文件过大、OCR 语言不合适、表格错列、公式异常、callback 验签失败或权限不足。不要把同一份失败文档无限重试。
人工复核要有出口。对needs_review的元素,应允许人工修正、排除页码、补充元数据、标记不入库或加入失败集。高风险字段不能只靠自动解析结果进入知识库。
版本漂移要可追踪。MinerU、MCP Server、Open API、Python SDK、Go SDK、TypeScript SDK、LangChain、LlamaIndex、chunk 策略和 embedding 模型都会影响结果。每次升级都应保留解析版本、参数、输出差异和回归结果。
许可证、额度和页数上限必须逐项核对。MinerU 主仓库、生态 SDK、在线服务、竞品工具和云服务可能适用不同许可证、价格、区域、额度和页数限制。商业或高合规项目不要只凭旧文章或二手资料判断。
可复现实验声明
本文未包含官方实测跑分,评测部分为可复现实验方案和示例记录表,读者需替换自己的样本运行。
来源链接
- https://mineru.net/llms.txt
- https://mineru.net/apiManage/docs
- https://mineru.net/apiManage/limit
- https://github.com/opendatalab/MinerU
- https://github.com/opendatalab/MinerU-Ecosystem
- https://modelcontextprotocol.io/llms.txt
- https://modelcontextprotocol.io/extensions/apps/overview
- https://modelcontextprotocol.io/extensions/apps/build
- https://modelcontextprotocol.io/specification/2026-07-28/server/tools
- https://modelcontextprotocol.io/extensions/tasks/overview
- https://github.com/modelcontextprotocol/ext-apps
- https://github.com/docling-project/docling
- https://docs.unstructured.io/open-source/introduction/overview
- https://developers.llamaindex.ai/llamaparse/
- https://github.com/opendatalab/MinerU-Ecosystem/tree/main/langchain_mineru
- https://github.com/opendatalab/MinerU-Ecosystem/tree/main/llama-index-readers-mineru
- https://huggingface.co/datasets/SciBase/AI-ready-Science-Corpus