Doc2x MCP Server
The Doc2x MCP Server wraps the Doc2x API into composable MCP tools, enabling AI agents to parse, convert, and download PDF and image documents programmatically.
PDF Parsing & Export
Submit local PDF files for parsing (v2 or v3-2026 models), query task status, and retrieve merged text or detailed layout JSON (block structures and coordinates)
Export parsed PDFs to Markdown, LaTeX (TeX), or DOCX with configurable formula handling options
Image OCR & Layout
Perform synchronous or asynchronous OCR and layout analysis on PNG/JPG files, returning text or raw JSON results
File Download & Materialization
Download export results to local files, unpack base64-encoded ZIP archives into output directories, and save layout JSON for figure/table cropping and structural analysis
Async Task Management
Submit, monitor, and wait for long-running tasks with configurable timeouts and polling intervals
Diagnostics & Configuration
Inspect resolved server configuration and API key sources via
doc2x_debug_configConfigure API keys, base URLs, timeouts, and secure download URL allowlists via environment variables
Converts PDF documents and images into Markdown format, utilizing Doc2x's semantic analysis to preserve complex layouts, tables, and mathematical formulas.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Doc2x MCP Serverconvert this PDF to Markdown and wait for the result"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Doc2x MCP Server
简体中文 | English
将 Doc2x v2 PDF/图片能力封装为基于 stdio 的 MCP Server,提供稳定、可组合的语义化 tools。
目录
Related MCP server: document-parser
项目定位
面向 MCP 客户端(Codex CLI / Claude Code / 自定义 Agent)提供 Doc2x 能力。
以 submit/status/wait 统一异步任务模型,便于自动化编排。
提供可控超时、轮询、下载白名单等运行时安全边界。
版本与环境
本地运行:Node.js
>=18即可。CI 校验:Node.js
18、20都会跑构建。发布环境:GitHub Actions 中发布任务使用 Node.js
24。包管理器:统一用 pnpm(锁文件
pnpm-lock.yaml)。
快速开始
方式 A:通过 npx(推荐)
在 MCP client 配置中添加:
{
"command": "npx",
"args": ["-y", "@noedgeai-org/doc2x-mcp@latest"],
"env": {
"DOC2X_API_KEY": "sk-xxx",
"DOC2X_BASE_URL": "https://v2.doc2x.noedgeai.com"
}
}方式 B:本地源码运行
cd doc2x-mcp
pnpm install --frozen-lockfile
pnpm run build
DOC2X_API_KEY=sk-xxx pnpm startMCP client 指向本地构建产物:
{
"command": "node",
"args": ["<ABS_PATH>/doc2x-mcp/dist/index.js"],
"env": {
"DOC2X_API_KEY": "sk-xxx",
"DOC2X_BASE_URL": "https://v2.doc2x.noedgeai.com"
}
}配置参考
环境变量 | 必填 | 默认值 | 说明 |
| 是 | - | Doc2x API Key( |
| 否 |
| Doc2x API 基础地址 |
| 否 |
| 单次 HTTP 超时(毫秒) |
| 否 |
| 轮询间隔(毫秒) |
| 否 |
| wait 类工具最大等待时长(毫秒) |
| 否 |
|
|
| 否 |
|
|
| 否 |
| 下载 URL 白名单; |
Tool API 总览
阶段 | Tools | 说明 |
PDF 解析 |
| 提交任务、查询状态、等待并取文本,或将 v3 layout 结果落盘为本地 JSON |
结果导出 |
| 发起导出、查结果、等待导出完成 |
下载落盘 |
| 下载 URL 到本地、解包 convert zip |
图片版面解析 |
| 同步/异步图片 OCR 与版面解析 |
诊断 |
| 返回配置解析与 API key 来源,便于排错 |
PDF 解析模型(doc2x_parse_pdf_submit / doc2x_parse_pdf_wait_text)
可选参数:
model可选值:
v2(默认) /v3-2026(最新模型)不传时默认
v2
{
"model": "v3-2026"
}PDF Layout JSON 落盘(doc2x_materialize_pdf_layout_json)
必选参数:
output_pathuid与pdf_path二选一v2不支持layout;需要pages[].layout时请使用v3-2026若传
pdf_path但不传model,该工具默认使用v3-2026成功时将原始
resultJSON 写到本地
layout 是页面块结构和坐标信息,适合 figure/table 裁剪、区域高亮、结构化抽取和版面分析;如果只想看正文内容,优先使用 Markdown / DOCX 导出。
{
"pdf_path": "/absolute/path/to/input.pdf",
"output_path": "/absolute/path/to/input_v3.layout.json"
}导出公式参数(doc2x_convert_export_submit / doc2x_convert_export_wait)
必选参数:
formula_mode(normal/dollar)可选参数:
formula_level(仅源解析任务为model=v3-2026时生效)取值说明:
0:保留公式1:仅退化行内公式(\\(...\\)、$...$)2:退化全部公式(\\(...\\)、$...$、\\[...\\]、$$...$$)
导出文件名
filename 是 API 内部导出文件的名称,不影响下载时指定的本地路径。默认 filename_mode="auto" 先取 basename、去掉对应格式的扩展名,再将超过 50 个 Unicode 字符的名称缩短为前缀加稳定哈希后缀,避免服务端文件名校验失败。同名前缀的不同长标题会使用不同后缀。
filename_mode="raw" 保留 basename 及扩展名;超过 50 个 Unicode 字符时,在发送请求前返回不可重试的 invalid_argument。请缩短名称或改用 auto。这些规则也适用于 doc2x_convert_export_wait 的自动提交。
等待导出同时支持当前 API 的不透明下载地址和旧格式地址。同一 uid 的不同格式导出请按顺序进行,避免读取到另一笔导出的结果。
常见工作流
工作流 1:PDF -> Markdown 本地文件
doc2x_parse_pdf_submit提交 PDF 解析。doc2x_convert_export_wait等待导出(to=md,并指定formula_mode)。doc2x_convert_export_result获取下载 URL。doc2x_download_url_to_file下载到目标路径。
工作流 2:图片版面 OCR 快速结果
doc2x_parse_image_layout_sync直接同步解析。若需要稳态轮询,改用 submit/status/wait 组合。
工作流 3:PDF -> v3 layout JSON 本地文件
调用
doc2x_materialize_pdf_layout_json,传入pdf_path和output_path。工具会等待 parse 成功,并将原始
resultJSON 落到本地。该 JSON 可直接提供给后续 figure/table 裁剪脚本使用。
本地开发
环境要求
Node.js
>=18pnpm(与仓库锁文件一致)
常用命令
pnpm install --frozen-lockfile
pnpm run build
pnpm run test
pnpm run format:check运行服务:
DOC2X_API_KEY=sk-xxx pnpm startCI / 发布流水线
仓库使用 GitHub Actions:
CI:
.github/workflows/ci.yml触发:
push到main、pull_request、workflow_dispatch、每周一 UTC03:17文档-only 变更(
**/*.md、LICENSE)自动跳过任务:
dependency-review(仅 PR)build(Node.js18/20矩阵)package-smoke(npm pack --dry-run)security-audit(仅手动/定时)
Publish:
.github/workflows/publish.ymldev分支 push:发布 npmdevtagv*.*.*tag push:发布 npmlatest发布前校验 tag 版本与
package.json版本一致发布命令:
npm publish --provenance
建议提交前本地对齐:
pnpm install --frozen-lockfile
pnpm run build
npm pack --dry-run
pnpm audit --prod --audit-level high如何发布
开发预发布(
dev):push 到dev分支后自动发布到 npmdevtag。版本会自动改成x.y.z-dev.<run>.<attempt>。正式发布(
latest):pushv*.*.*tag 后发布到 npmlatest。tag 版本必须和package.json版本一致。
安装本仓库 Skill(可选)
用于给 Codex CLI / Claude Code 增加一个"教大模型如何使用 doc2x-mcp tools 的 Skill"。
提示: 每次升级
doc2x-mcp版本后,建议重新运行安装命令以更新 Skill,确保大模型使用最新的 tool 描述与工作流。
不需要 clone 仓库的一键安装(推荐):
curl -fsSL https://raw.githubusercontent.com/NoEdgeAI/doc2x-mcp/main/scripts/install-skill.sh | sh在本仓库源码目录安装:
pnpm run skill:install默认安装目录:
Codex CLI:
~/.codex/skills/public/doc2x-mcp(可用CODEX_HOME覆盖)Claude Code:
~/.claude/skills/doc2x-mcp(可用CLAUDE_HOME覆盖)
说明:
--target auto(默认)会同时安装到 Codex + Claude。PowerShell 7+:
irm https://raw.githubusercontent.com/NoEdgeAI/doc2x-mcp/main/scripts/install-skill.ps1 | iexWindows PowerShell 5.1:
irm https://raw.githubusercontent.com/NoEdgeAI/doc2x-mcp/main/scripts/install-skill-winps.ps1 | iex
安全与排错
不要在仓库提交真实
DOC2X_API_KEY。白名单默认限制下载域名;如需放开,评估风险后再使用
DOC2X_DOWNLOAD_URL_ALLOWLIST=*。配置异常时优先调用
doc2x_debug_config定位环境变量来源与解析结果。
问题反馈
使用问题或缺陷反馈:GitHub Issues
https://github.com/NoEdgeAI/doc2x-mcp/issues建议在 issue 中附上最小复现输入、触发的 tool 名称、以及
doc2x_debug_config结果(可脱敏)。
License
MIT License,详见 LICENSE。
Available Tools
14 toolsdoc2x_convert_export_resultB
Get the latest export (convert) result for a parsed PDF uid (may contain an escaped URL).
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Doc2x parse task uid returned by doc2x_parse_pdf_submit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It mentions 'latest export result' suggesting it retrieves data (read operation) and that uid 'may contain an escaped URL', adding some context. But it doesn't disclose behavioral traits like error handling, rate limits, authentication needs, or what 'result' entails (e.g., format, size).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste—front-loaded with the core action ('Get'), specifies the resource and constraint, and includes a helpful note about the uid. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 1 parameter with full schema coverage and no output schema, the description is minimally adequate. It clarifies the tool's purpose and uid source, but as a read operation with no annotations, it should ideally explain more about the result (e.g., what data is returned) to compensate for the lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the uid parameter fully. The description adds marginal value by noting the uid 'may contain an escaped URL', but doesn't provide additional syntax or format details beyond the schema's description. Baseline 3 is appropriate as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'latest export (convert) result', specifying it's for a parsed PDF uid. It distinguishes from siblings like doc2x_convert_export_submit (which submits) and doc2x_convert_export_wait (which waits), but doesn't explicitly contrast with status-checking tools like doc2x_parse_pdf_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage after a parse task (uid from doc2x_parse_pdf_submit) and for getting results, not submitting or waiting. However, it lacks explicit when-not-to-use guidance or clear alternatives among siblings (e.g., vs. doc2x_parse_pdf_status for parse status).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_convert_export_submitA
Start an export (convert) job for a parsed PDF uid. After this, poll with doc2x_convert_export_wait or doc2x_convert_export_result. Do NOT call doc2x_convert_export_submit twice for the same uid+format in parallel.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| uid | Yes | Doc2x parse task uid returned by doc2x_parse_pdf_submit. | |
| filename | No | Optional output filename (for md/tex only). Tip: pass a basename WITHOUT extension to avoid getting 'name.md.md' / 'name.tex.tex'. | |
| formula_mode | Yes | ||
| filename_mode | No | How to treat filename. 'auto' strips the target extension and shortens names exceeding 50 Unicode characters with a stable hash suffix; 'raw' preserves the basename and rejects names over 50 characters before submission. | |
| formula_level | No | Optional formula degradation level. Effective only when source parse uses model=v3-2026 (ignored by v2). 0: keep formulas, 1: degrade inline formulas, 2: degrade inline and block formulas. | |
| merge_cross_page_forms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that this is an async job requiring polling and that parallel duplicate submissions for the same uid+format are forbidden, but says nothing about the immediate return value (task id?), whether resubmission after completion is allowed, or any cost or rate limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences totalling roughly 30 words. The action and the follow-up polling step come first, and the concurrency warning comes last. Nothing is padded, and the next-step information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a job-submission tool with 7 parameters, no annotations, and no output schema, the description adequately covers the workflow and the concurrency hazard. It is not complete enough to prevent wrong calls, because required-enum semantics and the return contract remain undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 57%, and the gaps matter: required 'to' and 'formula_mode' (a required enum with values normal/dollar) and optional 'merge_cross_page_forms' have no descriptions anywhere. The description mentions only 'uid+format' and adds no meaning, such as how output formats differ or what formula_mode does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Start') and resource ('an export (convert) job for a parsed PDF uid'), and it names the polling siblings, so the agent can tell it apart from doc2x_convert_export_wait and doc2x_convert_export_result. The async workflow is clear from the first sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent to doc2x_convert_export_wait or doc2x_convert_export_result after submitting, and adds a concrete negative rule ('Do NOT call ... twice for the same uid+format in parallel'). The remaining gap is that it doesn't state the precondition that the parse must be finished, or how to retry after a failure.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_convert_export_waitA
Wait for an export job to finish. Prefer calling doc2x_convert_export_submit first, then wait with uid+to. For backward compatibility, if formula_mode is provided and this job was not submitted in-process, this tool will submit once then wait.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Expected target format. Rejects contradictory legacy URL format hints; current download URLs may use opaque object IDs. Keep exports for the same uid sequential. | |
| uid | Yes | Doc2x parse task uid returned by doc2x_parse_pdf_submit. | |
| filename | No | ||
| max_wait_ms | No | ||
| formula_mode | No | ||
| filename_mode | No | For auto-submission: 'auto' strips the target extension and shortens names to at most 50 Unicode characters with a stable hash suffix; 'raw' preserves the basename and rejects longer names. | |
| formula_level | No | Optional formula degradation level used when this tool auto-submits export (formula_mode must be provided). Effective only when source parse uses model=v3-2026 (ignored by v2). | |
| poll_interval_ms | No | ||
| merge_cross_page_forms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden, and it does disclose a critical hidden side effect: this 'wait' tool can silently perform a write (submit an export job) when formula_mode is supplied and the job wasn't submitted in-process. That is genuinely valuable. However it says nothing about timeout semantics, whether max_wait_ms expiry raises or returns partial state, or whether waiting blocks/polls server-side.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the primary action, followed by the preferred workflow, then the legacy exception. Nothing is padded, though the backward-compatibility sentence is dense enough that it could be parsed as covering the main path.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter polling/wait tool with no annotations and no output schema, the description explains the happy path and the legacy path but omits what a completed wait yields and what happens on timeout or failure. An agent can start the call but cannot fully predict its outcome or its error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 44% across 9 parameters, so the description must compensate and only partially does: it names uid and to as the wait keys and ties formula_mode to the auto-submit trigger. The other six parameters (max_wait_ms, poll_interval_ms, filename, merge_cross_page_forms, filename_mode) get no treatment in the description, and formula_level is only inferable via the schema's own note that formula_mode must be provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Wait for an export job to finish', and names the prerequisite sibling doc2x_convert_export_submit. It does not differentiate itself from doc2x_convert_export_result, which is the obvious other half of the flow, leaving some ambiguity about which call actually returns the artifact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Prefer calling doc2x_convert_export_submit first, then wait with uid+to' gives an explicit ordering and the required arguments. The backward-compatibility path (formula_mode present + job not submitted in-process → auto-submit once) explains a second legitimate usage mode. No 'when not to use' guidance, e.g. that an already-finished job should go straight to the result tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_debug_configA
Debug helper: return resolved config and API key source for troubleshooting.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool returns information for debugging, which implies it is a read-only, non-destructive operation. However, it lacks details on potential side effects, authentication needs, rate limits, or output format. The description adds basic context but does not fully compensate for the absence of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads key information ('Debug helper') and clearly states the action and purpose. There is no wasted language, and it effectively communicates the tool's role in minimal words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity is low (0 parameters, no output schema), the description is somewhat complete for a debugging utility. However, without annotations or an output schema, it lacks details on what the returned config and API key source entail, such as format or structure. This leaves gaps in understanding the tool's full behavior and output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description does not add parameter-specific information, which is appropriate. A baseline of 4 is applied as per the rules for zero parameters, since the schema fully covers the lack of inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as a 'Debug helper' that 'return[s] resolved config and API key source for troubleshooting.' It specifies the verb ('return'), resource ('resolved config and API key source'), and context ('for troubleshooting'), making the intent unambiguous. However, it does not explicitly differentiate from sibling tools, which are focused on conversion, download, and parsing operations, so it falls short of a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context ('for troubleshooting'), suggesting this tool should be used when debugging issues, but it does not provide explicit guidance on when to use it versus alternatives or any exclusions. No sibling tools appear to serve a similar debugging purpose, so the implication is adequate but not comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_download_url_to_fileB
Download a Doc2x-provided URL (e.g. from doc2x_convert_export_result) to a local file path.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | A URL returned by doc2x_convert_export_result (may contain escaped '\u0026'). | |
| output_path | Yes | Absolute path for the output file. The file will be overwritten if it exists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden, yet it says nothing about side effects, that an existing file is overwritten, whether directories must exist, auth needs, or what is returned. The overwrite caveat exists only in the schema, not in the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the action, source, and destination in that order, and no filler. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with fully documented parameters, the core is covered. But with no annotations and no output schema, the description should say what it returns (path? bytes? success flag) and confirm the overwrite behavior, which it leaves to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, so the baseline is 3. The description adds one meaningful constraint beyond the schema: the URL is expected to be 'Doc2x-provided' (i.e., from doc2x_convert_export_result), narrowing acceptable inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Download) and resource (a Doc2x-provided URL) with a defined destination (local file path), and ties the input to the sibling doc2x_convert_export_result. It does not, however, distinguish itself from the file-writing siblings like doc2x_materialize_convert_zip, which likely also produce local artifacts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(e.g. from doc2x_convert_export_result)' implies the tool should be used after that call, giving implied sequencing. There is no explicit when/when-not guidance and no mention of when to prefer the materialize_* siblings instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_materialize_convert_zipB
Materialize convert_zip (base64) into output_dir. Best-effort: tries system unzip first; otherwise writes the zip file.
| Name | Required | Description | Default |
|---|---|---|---|
| output_dir | Yes | ||
| convert_zip_base64 | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals the tool's 'best-effort' nature and two-step process (system unzip first, then write zip file), which adds useful context beyond the basic operation. However, it doesn't cover critical aspects like error handling, permissions needed for output_dir, or what 'materialize' entails in terms of file structure or overwrites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized with two concise sentences. The first sentence front-loads the core purpose, and the second adds behavioral context without redundancy. Every sentence earns its place by clarifying the operation and fallback mechanism, though it could be slightly more structured (e.g., bullet points for steps).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of handling zip files and base64 encoding, with no annotations and no output schema, the description is incomplete. It misses key details: what 'materialize' means (extract? copy?), error responses, output format, or success indicators. For a tool with 2 parameters and significant behavioral nuance, this leaves the agent under-informed about execution and outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains that convert_zip_base64 is a base64-encoded zip file to materialize and output_dir is the target directory, adding meaning beyond the schema's minimal type constraints. However, it doesn't detail format expectations (e.g., zip structure, encoding standards) or directory requirements (e.g., must exist), leaving gaps in parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: materializing a base64-encoded zip file into an output directory. It specifies the verb 'materialize' and the resource 'convert_zip (base64)', which distinguishes it from sibling tools focused on conversion, parsing, or downloading. However, it doesn't explicitly differentiate from all siblings (e.g., doc2x_download_url_to_file might also handle files), so it's not a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It mentions a 'best-effort' approach with system unzip as a fallback, but doesn't specify prerequisites, error conditions, or comparisons to sibling tools like doc2x_convert_export_result. Without explicit when/when-not instructions, the agent lacks context for proper selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_materialize_pdf_layout_jsonA
Wait for a PDF parse task and write the raw Doc2x result JSON (with page layout) to output_path. Prefer passing uid. If only pdf_path is provided, this tool reuses a cached uid or submits a new parse with model='v3-2026' by default.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | No | Doc2x parse task uid returned by doc2x_parse_pdf_submit. | |
| model | No | Optional parse model used only when submitting from pdf_path. Supported values: 'v2' and 'v3-2026'. Defaults to 'v3-2026' for this tool because v2 does not return layout. | |
| pdf_path | No | Absolute path to a local PDF file. If uid is not provided, this tool will reuse cached uid (if any) or submit a new task. | |
| max_wait_ms | No | ||
| output_path | Yes | Absolute path for the output JSON file. The file will be overwritten if it exists. | |
| poll_interval_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does disclose the key hidden behavior: it blocks/waits, it may submit a new parse task when only pdf_path is given, and it reuses a cached uid. It does not explain what happens on wait timeout (max_wait_ms), polling mechanics, or failure/partial-result behavior, which matter for a long-running blocking tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler; the core action and output destination lead, followed by parameter selection rules. Every sentence carries information the schema does not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Six parameters, no annotations, and no output schema, so the description carries the full burden. It covers the main execution path but omits timeout/polling semantics and what the written JSON contains beyond 'raw result with page layout', leaving the two undocumented integer parameters ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%; max_wait_ms and poll_interval_ms are completely undocumented in both schema and description. The description does add value the schema lacks — the uid-over-pdf_path preference and the cached-uid reuse rule — but leaves the timeout/polling knobs unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb chain ('wait for a PDF parse task and write the raw Doc2x result JSON with page layout to output_path') plus a concrete resource and destination. The 'with page layout' and file-writing framing implicitly separate it from doc2x_parse_pdf_wait_text and doc2x_parse_pdf_status, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Prefer passing uid' and the pdf_path fallback rule give real guidance on how to call it, but nothing states when to choose this tool over doc2x_parse_pdf_wait_text, doc2x_parse_pdf_status, or doc2x_parse_image_layout_sync. Usage is implied by the layout-JSON output rather than contrasted with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_parse_image_layout_statusA
Get status/result for an existing async image-layout parse task by uid.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Doc2x image-layout parse task uid returned by doc2x_parse_image_layout_submit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions retrieving status/result for an async task, which implies a read-only operation, but does not detail potential behaviors like error handling, rate limits, authentication needs, or what the result format might be. For a tool with zero annotation coverage, this is insufficient transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the key information ('Get status/result') and includes essential context (e.g., 'async image-layout parse task by uid'). There is no wasted verbiage, making it highly concise and well-structured for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of an async task status tool with no annotations and no output schema, the description is incomplete. It lacks details on what the status/result includes (e.g., progress indicators, error messages, or output data format), which is critical for an agent to use this tool effectively. The description does not compensate for these gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the uid parameter fully documented in the schema as a string from doc2x_parse_image_layout_submit. The description adds minimal value by reinforcing the uid's purpose but does not provide additional semantics beyond what the schema already covers, aligning with the baseline score for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get status/result') and resource ('existing async image-layout parse task by uid'), distinguishing it from siblings like doc2x_parse_image_layout_submit (which submits tasks) and doc2x_parse_image_layout_sync (which performs synchronous parsing). It precisely identifies the tool's function without being vague or tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by specifying 'existing async image-layout parse task by uid' and referencing doc2x_parse_image_layout_submit as the source of the uid, which guides when to use this tool. However, it does not explicitly state when not to use it or name alternatives like doc2x_parse_image_layout_wait_text, leaving some room for improvement in sibling differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_parse_image_layout_submitA
Create an async image-layout parse task and return {uid}. After this, call doc2x_parse_image_layout_wait_text (with uid) or doc2x_parse_image_layout_status.
| Name | Required | Description | Default |
|---|---|---|---|
| image_path | Yes | Absolute path to a local image file (png/jpg). Use an absolute path (relative paths are resolved from the MCP server process cwd, which may be '/'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes the asynchronous nature of the operation, the return format, and the required follow-up workflow. However, it doesn't mention potential limitations like file size restrictions, supported image formats beyond png/jpg (implied by schema), or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (two sentences) and front-loaded with the core purpose. Every sentence earns its place: the first explains what the tool does and returns, the second provides critical workflow guidance. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (async workflow requiring follow-up calls), no annotations, and no output schema, the description does well by explaining the async nature and required subsequent steps. However, it doesn't describe what the parse task actually produces or potential error scenarios, leaving some gaps in completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents the single parameter. The description doesn't add any parameter-specific information beyond what's in the schema. According to scoring rules, when schema coverage is high (>80%), the baseline is 3 even with no param info in description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Create an async image-layout parse task') and resource ('image-layout'), distinguishing it from siblings like doc2x_parse_image_layout_sync (synchronous version) and doc2x_parse_image_layout_status (status check). It explicitly mentions the return value format '{uid}' and subsequent required calls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus alternatives: it specifies this is an async task that requires follow-up calls to doc2x_parse_image_layout_wait_text or doc2x_parse_image_layout_status with the returned uid. This clearly distinguishes it from the synchronous sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_parse_image_layout_syncA
Parse an image layout synchronously and return the raw Doc2x result JSON (including convert_zip when present).
| Name | Required | Description | Default |
|---|---|---|---|
| image_path | Yes | Absolute path to a local image file (png/jpg). Use an absolute path (relative paths are resolved from the MCP server process cwd, which may be '/'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the synchronous behavior and return format (raw JSON with convert_zip), which is useful. However, it lacks details on error handling, performance expectations (e.g., timeouts for large images), or authentication needs, leaving gaps for a mutation-like tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core action and output. Every word earns its place, with no redundancy or unnecessary details, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and a single parameter with full schema coverage, the description is minimally adequate. It covers the purpose and output format but lacks context on errors, limitations (e.g., supported image types beyond png/jpg implied by schema), or integration with sibling tools, leaving room for improvement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the schema fully documenting the 'image_path' parameter (type, constraints, path resolution). The description adds no parameter-specific information beyond what the schema provides, so it meets the baseline but doesn't enhance understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('parse an image layout synchronously') and the resource ('image'), specifying it returns raw Doc2x result JSON. It distinguishes from siblings like 'doc2x_parse_image_layout_submit' (async) and 'doc2x_parse_image_layout_wait_text' (text-focused), but could be more explicit about the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for synchronous parsing of image layouts, but lacks explicit guidance on when to use this vs. alternatives like 'doc2x_parse_image_layout_submit' (async) or 'doc2x_parse_pdf_*' tools. It mentions 'convert_zip when present' as a feature, but no clear when-not scenarios or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_parse_image_layout_wait_textA
Wait for an image-layout parse task until success, returning first page markdown. Prefer passing uid (no re-submit). If only image_path is provided, it will (a) reuse an in-process cached uid if available, otherwise (b) submit a new async task then wait.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | No | Doc2x image-layout parse task uid returned by doc2x_parse_image_layout_submit. | |
| image_path | No | Absolute path to a local image file (png/jpg). Used to reuse cached uid or submit a new async task. | |
| max_wait_ms | No | ||
| poll_interval_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes key behaviors: it's a blocking/waiting operation ('wait...until success'), it returns specific output ('first page markdown'), and it has caching logic ('reuse an in-process cached uid'). It doesn't mention error handling or rate limits, but covers the core operational flow well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured in two sentences. The first sentence states the core purpose and output. The second sentence provides crucial usage guidance for the two main parameters. Every word earns its place with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters, no annotations, and no output schema, the description does well by explaining the waiting behavior, output format, and parameter interplay. It could be more complete by mentioning what happens on failure or the format of the returned markdown, but it covers the essential context given the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50% (uid and image_path have descriptions, poll_interval_ms and max_wait_ms do not). The description adds significant value by explaining the semantic relationship between uid and image_path: uid is preferred to avoid resubmission, while image_path triggers either cache reuse or new submission. This clarifies parameter usage beyond the basic schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Wait for an image-layout parse task until success') and the resource involved ('first page markdown'). It distinguishes itself from siblings like doc2x_parse_image_layout_submit (which submits) and doc2x_parse_image_layout_status (which checks status) by emphasizing waiting for completion and returning output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides usage guidance: 'Prefer passing uid (no re-submit)' indicates when to use uid over image_path, and it explains the alternative flow when only image_path is provided (reuse cached uid or submit new task). This directly addresses when to use this tool versus its submit sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_parse_pdf_statusA
Query parse task status by uid. Returns {status, progress, detail}. status is one of processing/failed/success; progress is an integer 0..100; detail is populated only when status=failed. Fetch parsed content via doc2x_convert_export_*.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Doc2x parse task uid returned by doc2x_parse_pdf_submit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes the return structure ({status, progress, detail}), status values (processing/failed/success), progress range (0..100), and when detail is populated (only when status=failed). It also mentions the dependency on doc2x_parse_pdf_submit for obtaining the uid. However, it doesn't cover potential errors, rate limits, or authentication needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured in two sentences: the first explains the tool's purpose and return values, the second provides critical usage guidance. Every sentence adds essential information without redundancy, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (single parameter, no output schema, no annotations), the description is largely complete. It explains the return structure and tool relationships well. However, it could benefit from mentioning error handling or timeouts, which would make it fully comprehensive for a status-checking operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the uid parameter. The description adds meaningful context by explaining that the uid comes from doc2x_parse_pdf_submit, which helps the agent understand the parameter's origin and relationship to other tools. This goes beyond the schema's technical description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Query parse task status') and resource ('by uid'), distinguishing it from sibling tools like doc2x_parse_pdf_submit (which submits tasks) and doc2x_parse_pdf_wait_text (which waits for completion). It explicitly identifies the tool's role in checking status rather than initiating or retrieving content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool: after submitting a parse task via doc2x_parse_pdf_submit (referenced in the parameter description) and before fetching content via doc2x_convert_export_* tools. It clearly differentiates this status-checking tool from content-retrieval alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_parse_pdf_submitA
Create a Doc2x PDF parse task for a local file and return {uid}. Prefer calling doc2x_parse_pdf_status to monitor progress/result; only call doc2x_parse_pdf_wait_text if the user explicitly asks to wait/return merged text.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Optional parse model. Supported values: 'v2' and 'v3-2026'. Omit this field to use default v2. | |
| pdf_path | Yes | Absolute path to a local PDF file. Use an absolute path (relative paths are resolved from the MCP server process cwd, which may be '/'). Must end with '.pdf'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It usefully says this creates a task, returns a uid, and that progress should be monitored via status, but it does not mention permissions, upload side effects, failure behavior, or whether duplicate submissions are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences are front-loaded with the core action, return value, and sibling routing. There is no wasted text, and the usage caveat about doc2x_parse_pdf_wait_text is placed after the primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter async submit tool with full schema coverage and no output schema, the description gives the essential action, return value, and next-step routing. It could be slightly more complete by explicitly tying the returned uid to doc2x_parse_pdf_status, but it is otherwise sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both pdf_path and model are already well documented in the schema. The description adds only that this is for a local file and that the result is a uid, without adding parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: create a Doc2x PDF parse task for a local file. It also states the immediate return value ({uid}) and explicitly distinguishes this submit step from monitoring via doc2x_parse_pdf_status and doc2x_parse_pdf_wait_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes monitoring to doc2x_parse_pdf_status and restricts doc2x_parse_pdf_wait_text to cases where the user explicitly asks to wait or return merged text. The intended use is clear: submit the local PDF first, then monitor through the named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc2x_parse_pdf_wait_textA
Wait for a PDF parse task until success and return merged text. Prefer passing uid (no re-submit). If only pdf_path is provided, it will (a) reuse an in-process cached uid if available, otherwise (b) submit a new task then wait.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | No | Doc2x parse task uid returned by doc2x_parse_pdf_submit. | |
| model | No | Optional parse model used only when submitting from pdf_path. Supported values: 'v2' and 'v3-2026'. Omit this field to use default v2. | |
| pdf_path | No | Absolute path to a local PDF file. If uid is not provided, this tool will reuse cached uid (if any) or submit a new task. | |
| join_with | No | ||
| max_wait_ms | No | ||
| max_output_chars | No | Max characters of returned text (0 = unlimited). Useful to avoid LLM context overflow. Default can be set via env DOC2X_PARSE_PDF_MAX_OUTPUT_CHARS. | |
| max_output_pages | No | Max pages to merge into returned text (0 = unlimited). Default can be set via env DOC2X_PARSE_PDF_MAX_OUTPUT_PAGES. | |
| poll_interval_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description usefully discloses that it may submit a new task when only pdf_path is provided and that it may reuse an in-process cached uid. However, it omits important behavior around timeout/failure handling despite the max_wait_ms parameter, and does not describe polling or error outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded, and every sentence contributes needed information. The uid preference and pdf_path fallback are expressed compactly without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-parameter blocking/waiting tool with no annotations and no output schema, the description covers the core purpose and key uid/pdf_path behavior. It is still incomplete regarding timeout/failure behavior, polling, join semantics, and how the returned merged text is structured.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 63%, and the description adds meaningful conditional semantics for uid versus pdf_path, including cache reuse and resubmission behavior. It still says nothing about join_with, max_wait_ms, or poll_interval_ms, so it does not fully compensate for the remaining schema coverage gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (wait for a PDF parse task), the condition (until success), and the result (merged text). It is clearly distinguishable from a submit or status tool, though it does not explicitly name sibling alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear routing guidance: prefer passing uid to avoid resubmission, and if only pdf_path is given, it will reuse a cached uid or submit a new task before waiting. It does not explicitly compare this tool to doc2x_parse_pdf_status or doc2x_parse_pdf_submit, leaving some alternative-selection guidance implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.7- Changed
doc2x_convert_export_submit3 fields changed- added
Input schema / properties / filename / minLengthAdded value: +1 - changed
Input schema / properties / filename_mode / descriptionPrevious value: -"How to treat filename. 'auto' strips common extensions for the target format; 'raw' passes basename as-is."New value: +"How to treat filename. 'auto' strips the target extension and shortens names exceeding 50 Unicode characters with a stable hash suffix; 'raw' preserves the basename and rejects names over 50 characters before submission." - added
Input schema / properties / formula_levelAdded value: +{ + "anyOf": [ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + }, + { + "const": 2, + "type": "number" + } + ], + "description": "Optional formula degradation level. Effective only when source parse uses model=v3-2026 (ignored by v2). 0: keep formulas, 1: degrade inline formulas, 2: degrade inline and block formulas." +}
- Changed
doc2x_convert_export_wait4 fields changed- added
Input schema / properties / filename / minLengthAdded value: +1 - added
Input schema / properties / filename_mode / descriptionAdded value: +"For auto-submission: 'auto' strips the target extension and shortens names to at most 50 Unicode characters with a stable hash suffix; 'raw' preserves the basename and rejects longer names." - added
Input schema / properties / formula_levelAdded value: +{ + "anyOf": [ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + }, + { + "const": 2, + "type": "number" + } + ], + "description": "Optional formula degradation level used when this tool auto-submits export (formula_mode must be provided). Effective only when source parse uses model=v3-2026 (ignored by v2)." +} - changed
Input schema / properties / to / descriptionPrevious value: -"Expected target format. Used to verify the result URL."New value: +"Expected target format. Rejects contradictory legacy URL format hints; current download URLs may use opaque object IDs. Keep exports for the same uid sequential."
- Changed
doc2x_download_url_to_file1 field changed- removed
Input schema / properties / url / minLengthRemoved value: -1
- Added
doc2x_materialize_pdf_layout_json - Changed
doc2x_parse_pdf_submit1 field changed- added
Input schema / properties / modelAdded value: +{ + "description": "Optional parse model. Supported values: 'v2' and 'v3-2026'. Omit this field to use default v2.", + "enum": [ + "v2", + "v3-2026" + ], + "type": "string" +}
- Changed
doc2x_parse_pdf_wait_text1 field changed- added
Input schema / properties / modelAdded value: +{ + "description": "Optional parse model used only when submitting from pdf_path. Supported values: 'v2' and 'v3-2026'. Omit this field to use default v2.", + "enum": [ + "v2", + "v3-2026" + ], + "type": "string" +}
13 tool updates
v0.1.2- First observed
doc2x_convert_export_result - First observed
doc2x_convert_export_submit - First observed
doc2x_convert_export_wait - First observed
doc2x_debug_config - First observed
doc2x_download_url_to_file - First observed
doc2x_materialize_convert_zip - First observed
doc2x_parse_image_layout_status - First observed
doc2x_parse_image_layout_submit - First observed
doc2x_parse_image_layout_sync - First observed
doc2x_parse_image_layout_wait_text - First observed
doc2x_parse_pdf_status - First observed
doc2x_parse_pdf_submit - First observed
doc2x_parse_pdf_wait_text
TDQS
Scored across 14 tools
The PDF-parse, image-layout, and convert-export domains are broadly distinguishable, but several tools overlap heavily: doc2x_parse_pdf_wait_text and doc2x_materialize_pdf_layout_json both wait on a PDF parse, while doc2x_convert_export_result and doc2x_convert_export_wait both retrieve export output. Descriptions clarify preferred usage, but an agent must still choose carefully among multiple convenience wrappers.
All tools use the doc2x_ prefix and snake_case, and core lifecycle tools follow grouped patterns like parse_pdf_submit/status/wait_text and convert_export_submit/wait/result. A few helper tools use verb-first naming (materialize_convert_zip, download_url_to_file, debug_config), which is a minor deviation.
The 14-tool surface is well-scoped for a document parsing/export server, covering PDF parsing, image-layout parsing, export lifecycle, materialization/download, and debugging. The count is neither thin nor bloated, and each tool maps to a recognizable role.
The set covers submission, status polling, waiting, export conversion, materialization, download, and config debugging, so core document-parsing workflows are supported. Minor lifecycle gaps remain, such as task cancellation/listing or deletion/cleanup operations.
Maintenance
Related MCP Connectors
Document conversion and OCR for AI agents: PDF, Office docs, images to text.
Convert PDF, Word, Excel and scanned documents to Markdown, tables and RAG chunks. OCR.
File conversion: PDF, DOCX, STT, asynchronous TTS with MP3/ASS downloads, watermarking
Hosted document tools for agents: extract, parse, classify, convert, OCR, sign, and redact.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI assistants to extract and structure content from documents (PDFs, images, Office files) using Upstage AI's document digitization and information extraction APIs.226 PyPI3MIT
- AlicenseNot gradedqualityCmaintenanceProvides AI agents with comprehensive document parsing capabilities including PDF text extraction, OCR, HTML-to-markdown conversion, table extraction, and summarization, optimized for agent workflows.21 npmMIT

docuprox-mcpofficial
AlicenseAqualityDmaintenanceEnables AI clients like Claude to process documents (invoices, passports, etc.) via the DocuProx API, with tools for submitting jobs, checking status, and retrieving results.53 npmMIT- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to parse and search documents including PDF, Word, Excel, PowerPoint, and images via OCR, with support for semantic search and batch processing.2MIT