关于 Pdfnative
Pdfnative 是面向 Agent 的 TypeScript MCP 服务,用于创建、检查和修改 PDF。它涵盖归档与印刷标准、表单、签名、排版和页面操作。
主要功能
- 01创建带布局与排版选项的 PDF
- 02生成 PDF/A 和 PDF/X-4 文档
- 03创建及填写交互式表单
- 04签名、加时间戳并验证 PDF
- 05合并、拆分和提取页面
- 06检查布局、文本和附件
适用场景
- 01制作归档或印刷就绪文档
- 02准备带长期验证的签名 PDF
- 03生成含表格、图表和表单的报告
- 04生成 PDF 前检查分页
MCP 相关
向 MCP 客户端提供 28 个工具和 7 个提示词,用于 PDF 生成、检查、签名、验证和页面管理。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y pdfnative-mcpPDFNATIVE_MCP_OUTPUT_DIRAbsolute path of a sandboxed directory where outputMode='file' may write PDFs. Unset: every tool returns base64 only (file output disabled).PDFNATIVE_MCP_CACHE_DIROpt-in content-addressed response cache directory (SHA-256 keyed, 1h TTL, 256 MiB LRU, plaintext at rest). Never caches encrypt/decrypt, sign, timestamp, add_ltv, update_metadata, encrypted builds or file output.PDFNATIVE_MCP_PORTServe Streamable HTTP on this loopback port instead of stdio (MCP 2026-07-28, stateless). Unauthenticated unless PDFNATIVE_MCP_HTTP_TOKEN is set.PDFNATIVE_MCP_HTTP_TOKEN密钥Opt-in bearer token for the HTTP transport (>= 16 chars, no whitespace). When set, /mcp requires 'Authorization: Bearer <token>' or answers 401. Never logged.PDFNATIVE_MCP_MAX_INFLATE_BYTESPer-stream FlateDecode decompression cap in bytes (zip-bomb mitigation; default 104857600 = 100 MiB). Integer >= 1024; an invalid value refuses to start the server.PDFNATIVE_MCP_CREATION_DATEISO 8601 instant with a time zone (e.g. 2026-01-01T00:00:00Z) pinned as the creation date of every generated document: reproducible bytes on any host. A call's own creationDate still wins. An invalid value refuses to start the server.SOURCE_DATE_EPOCHreproducible-builds.org convention: integer seconds since the Unix epoch, used as the pinned creation date when PDFNATIVE_MCP_CREATION_DATE is unset. An invalid value refuses to start the server.PDFNATIVE_MCP_TSA_URLhttp(s) URL of the RFC 3161 timestamp authority used by sign_pdf timestamp=true and timestamp_pdf (PAdES B-T / B-LTA). Unset: those calls fail with TSA_NOT_CONFIGURED and no network request is made. Tool arguments can never supply a URL.PDFNATIVE_MCP_TSA_AUTH密钥Optional Authorization header value sent to the TSA (e.g. 'Basic ...' or 'Bearer ...'). Never logged or echoed.PDFNATIVE_MCP_REVOCATION'ocsp', 'crl' or 'ocsp,crl': enables online revocation collection for add_ltv mode='online' (PAdES B-LT). Unset: that mode fails with REVOCATION_NOT_CONFIGURED; mode='offline' stays fully offline. Requires PDFNATIVE_MCP_NETWORK_ALLOWED_HOSTS.PDFNATIVE_MCP_NETWORK_ALLOWED_HOSTSComma-separated allow-list of OCSP / CRL responder hosts ('host', 'host:port' or '*.suffix'). Mandatory when PDFNATIVE_MCP_REVOCATION is set: responder URLs found in certificates are fetched only if the host matches (http(s) only, no credentials, no redirects, internal addresses rejected unless listed verbatim).PDFNATIVE_MCP_NETWORK_TIMEOUT_MSPer-request timeout for TSA / OCSP / CRL calls in milliseconds, 1000-120000 (default 10000).本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
24收录的工具列表 · 更新于 3 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| title | string | 是 | 文档标题(在第 1 页顶部呈现,并用作 PDF 元数据标题)。 |
| blocks | array | 是 | 构成文档正文的有序内容区块列表。 |
| footerText | string | 否 | 可选的页脚文本,显示在每一页的底部。 |
| pdfA | enum | 否 | 可选的 PDF/A 符合性级别(由 pdfnative v1.2 提供支持)。简单文本和图像归档使用 'pdfa1b';内容较丰富时使用 'pdfa2b'/'pdfa2u'(2u 可确保 Unicode 映射);嵌入源附件(Factur-X / ZUGFeRD)时使用 'pdfa3b'。不能与 PDF 加密同时使用。参见 docs/guides/PDFA.md。pdfa1b | pdfa2b | pdfa2u | pdfa3b |
| watermark | object | 否 | 可选的半透明文本水印,显示在每一页上(例如 'DRAFT'、'CONFIDENTIAL')。此版本仅支持文本。当 pdfA='pdfa1b' 时,opacity < 1.0 会被拒绝(ISO 19005-1 禁止透明度)。 |
| watermark.text | string | 是 | 水印文本。 |
| watermark.fontSize | number | 否 | 字体大小,单位为点。默认值为 60,并自动适配页面。 |
| watermark.opacity | number | 否 | 不透明度 0.0–1.0。默认值为 0.15。 |
| watermark.angle | number | 否 | 旋转角度(度,逆时针)。默认值为 -45。 |
| watermark.color | array | 否 | 0.0–1.0 范围内的 RGB 颜色,格式为 [r, g, b] 三元组。默认值为浅灰色 [0.75, 0.75, 0.75]。 |
| watermark.position | enum | 否 | 'background'(页面内容后方,默认值)或 'foreground'(页面内容上方)。background | foreground |
| normalize | enum | 否 | 在字形整形前应用于所有渲染文本的可选 Unicode 规范化。'NFC'(推荐)会将基字符和组合标记合成为预组合码点,以提高字形覆盖率;也接受 'NFD'/'NFKC'/'NFKD'。省略此项可获得字节稳定的输出(不进行规范化)。NFC | NFD | NFKC | NFKD |
| outline | any | 否 | 文档大纲(书签面板)。可以是 'auto'(从标题块生成平面大纲),也可以是显式的嵌套书签树。 |
| pageLabels | array | 否 | 页面标签范围(查看器中显示的页码,例如前置部分使用罗马数字,正文使用十进制数字)。startPage 值必须唯一且严格递增。 |
| viewerPreferences | object | 否 | 阅读器显示提示(目录 /PageLayout、/PageMode、/ViewerPreferences)。符合 PDF/A;全部为可选项。 |
| viewerPreferences.pageLayout | enum | 否 | singlePage | oneColumn | twoColumnLeft | twoColumnRight | twoPageLeft | twoPageRight |
| viewerPreferences.pageMode | enum | 否 | useNone | useOutlines | useThumbs | fullScreen | useOC | useAttachments |
| viewerPreferences.hideToolbar | boolean | 否 | |
| viewerPreferences.hideMenubar | boolean | 否 | |
| viewerPreferences.hideWindowUI | boolean | 否 | |
| viewerPreferences.fitWindow | boolean | 否 | |
| viewerPreferences.centerWindow | boolean | 否 | |
| viewerPreferences.displayDocTitle | boolean | 否 | |
| viewerPreferences.nonFullScreenPageMode | enum | 否 | useNone | useOutlines | useThumbs | useOC |
| viewerPreferences.direction | enum | 否 | l2r | r2l |
| viewerPreferences.printScaling | enum | 否 | none | appDefault |
| outputMode | enum | 否 | 可以是 'base64'(以内嵌 base64 字符串形式返回 PDF)或 'file'(将文件写入已配置的 PDFNATIVE_MCP_OUTPUT_DIR 沙盒路径)。base64 | file |
| outputPath | string | 否 | 当 outputMode='file' 时必填。沙盒内的相对路径;必须以 .pdf 结尾。 |
详细介绍
pdfnative-mcp
用于 PDF 生成、PDF/A 归档、PDF/X-4 印刷交换、精细排版、支持长期验证的 PAdES 签名、AcroForms、合并/拆分、加密和布局预览的 MCP 服务 —— 基于 pdfnative 引擎(零依赖,符合 ISO 32000-1),提供 28 个工具和 7 个提示词,可用于 Claude Desktop、Cursor、ChatGPT 及任何 Model Context Protocol 客户端。
✨ 功能
pdfnative-mcp 向任何 MCP 宿主提供 28 个可用于生产环境的工具:
| 工具 | 用途 |
|---|---|
generate_basic_pdf | 使用 13 种块类型生成多页文档:heading、paragraph、list、table、image(JPEG/PNG)、link、toc(打印目录)、barcode、svg、formField、chart、pageBreak、spacer——涵盖引擎提供的所有 DocumentBlock。嵌入的换行符会自动拆分为多个段落。可选项包括 pdfA、pdfx(v1.7.0 新增)、print、metadata、embedFonts、watermark、outline、布局选项(pageSize、margins、headerTemplate / footerTemplate、compress、debug、encrypt)、typography(v1.7.0 新增)和 CMYK 颜色(v1.7.0 新增)。 |
inspect_layout (v1.6.0 新增) | 对相同的 blocks(以及 title、footerText、pdfA、normalize、embedFonts、pageSize、margins、headerTemplate、footerTemplate、typography)进行只读的分页试运行:返回页数和每个块的所在位置,不生成 PDF。 |
add_barcode | QR Code、Code 128、EAN-13、Data Matrix、PDF417——嵌入单页 PDF。 |
add_international_text | 支持 27 种 Unicode 文字系统——老挝文、Tai Tham、New Tai Lue、Tai Le 和 Cham(v1.7.0 新增)——以及拉丁文字、数学符号和 COLRv1 彩色表情符号(旗帜 / ZWJ 序列、肤色修饰符),支持 BiDi 和 OpenType 字形塑形;单个文档可使用多种语言。 |
add_table | 用于表格报告的智能字段(换行、repeatHeader、zebra、caption、minRowHeight、cellPadding)。 |
add_form | 创建包含文本字段、文本区域、复选框、单选按钮、下拉列表、列表框(以及 placeholder 提示文本)的新交互式 AcroForm PDF。 |
read_form_fields | 只读枚举现有 AcroForm 的字段树(名称、类型、值、控件)。 |
fill_form | 填写和/或扁平化现有 AcroForm(非破坏性增量更新)。 |
add_chart | 原生矢量图表 v2——bar / barH / stackedBar / stackedBarH / line / area / scatter / pie / donut,支持次坐标轴、对数和时间刻度、数据标签(纯 PDF 路径运算符,符合 PDF/A)。 |
embed_image | 将 JPEG 或 PNG 图像(base64)嵌入带标题的 PDF 文档(align、用于带标签输出的 alt 文本)。 |
prepare_signature_placeholder | 签名工作流的可选第 1 步——创建含有 /Sig 占位符的 PDF(内置签署者元数据、subFilter、reserveTimestamp)。 |
sign_pdf | PAdES B-B / B-T CMS 签名(RSA-SHA256/384/512、ECDSA-SHA256 P-256;profile: 'pades'、timestamp、certChainDerBase64、多重签名、可固定的 signingTime)。需要时自动注入占位符。 |
add_ltv (v1.6.0 新增) | PAdES B-LT——嵌入包含证书和 OCSP/CRL 材料的 /DSS(由操作方配置的提供方,或调用方提供的离线材料)。 |
timestamp_pdf (v1.6.0 新增) | PAdES B-LTA——从操作方配置的 TSA 追加 RFC 3161 /DocTimeStamp;重新运行即可扩展归档链。 |
verify_pdf | 验证每个 PAdES 签名和文档时间戳(完整性 + 签名值 + 可选的证书链信任;/DocTimeStamp 与任何签名一样计入 allValid);ltv: true 会报告 B-B…B-LTA 级别。 |
validate_pdf | 验证带标签的 PDF 是否符合 PDF/UA(ISO 14289-1)结构要求;或者使用 standard: 'pdf-x-4'(v1.7.0 新增)验证 PDF/X-4(ISO 15930-7)的结构性前提条件——只读,不是经过认证的预检。 |
add_attachment | 生成包含嵌入文件的 PDF/A-3 文档(Factur-X / ZUGFeRD 发票)。 |
extract_attachments | 只读提取嵌入文件(Factur-X / ZUGFeRD XML 往返),保留逐字节一致的有效载荷。 |
extract_text | 提取 Unicode 文本(解析 /ToUnicode),可选返回带位置信息的文本段;通过 password 打开加密 PDF。 |
inspect_pdf | 只读检查:PDF 版本、页数、加密状态(以及精确的 encryptionInfo)、PDF/A 声明、PDF/X 声明(pdfX,v1.7.0 新增)、签名(以及清单、/DSS、文档时间戳)、页面框、/Trapped、附件、占位符状态,以及通过 annotations: true 获取现有页面注释清单。 |
update_metadata (v1.6.0 新增) | 将现有 PDF 的 /Info 标题 / 作者 / 主题 / 关键词(以及 XMP,包含日期)重写为增量更新;固定 modDate 以生成可复现的字节内容。 |
encrypt_pdf | 使用 AES-128 / AES-256 重新保护 PDF(所有者/用户密码、权限、密码轮换)。 |
decrypt_pdf | 输出 RC4 / AES-128 / AES-256 文档的未加密副本。 |
merge_pdfs | 通过 pdfnative 的页面树 API 将 2–50 个 PDF 合并为一个(保留页面框)。 |
split_pdf | 将一个 PDF 按页面范围拆分为多个文档(多输出)。 |
extract_pages | 提取任意页面子集并生成单个 PDF。 |
annotate_pdf | 添加标记注释(高亮、备注、正方形/圆形、直线、自由文本)作为视觉叠加层——不是涂黑。 |
draft_governance_issue | 在本地起草符合治理要求的 GitHub issue,供人工审查;不会提交,也不会联网。 |
| New in v1.7.0: |
-
🔤 精细排版 — 九个文档工具和
inspect_layout均新增可选的typography对象:splitParagraphs,含orphans/widows;keepHeadingsWithNext;unitBinding;bindShortWords;punctuationSpacing('fr'、'fr-CA'或显式规则);opticalMargins;metrics: 'exact';fontFeatures(11 个 OpenType 标签);kerning;hyphenationLanguage。段落块新增align(left/right/center/justify)、keepWithNext和splittable。标题块新增keepWithNext。如实说明限制:kerning、fontFeatures和'fr'窄不换行空格需要embedFonts: true(基础 14 字体 Helvetica 会将'fr'降级为'fr-CA');捆绑的 Noto Sans 上,tnum/lnum不会产生任何变化(诊断码TYPOGRAPHY_FEATURE_INEFFECTIVE);未安装连字词典,因此hyphenationLanguage在此处无效——软连字符(U+00AD)仍会生效。请参阅docs/guides/TYPOGRAPHY.md。 -
🎨 所有接受颜色的地方均支持 CMYK — 除现有的十六进制 / RGB 格式外,还支持
'c m y k'操作数字符串(0–1)和[c, m, y, k]百分比元组(0–100):水印、页眉 / 页脚模板、表格单元格边框、大纲条目、图表、link和svg块、annotate_pdf。所有 1.6.0 颜色格式仍会通过验证。 -
🖨️ PDF/X-4 — 六个生成工具(
generate_basic_pdf、add_table、add_chart、add_barcode、embed_image、add_international_text)支持pdfx: 'pdfx4';除 RGB 外,还支持 CMYK 或 GrayoutputIntent配置文件;支持print.marks.colourBars;可使用validate_pdf { standard: 'pdf-x-4' }检查结果;inspect_pdf会报告该声明(pdfX,检查项'pdfx')。此功能需要打印机的 ICC 配置文件(设备类别prtr——未捆绑任何配置文件);要生成符合规范的文件,必须设置embedFonts: true(否则会出现PDFX_NO_FONT_ENTRIES;设置strict: true时则会拒绝)。它不能与pdfA和encrypt同时使用。此验证仅检查结构——并非经过认证的预检;结果会在自身的caveats[]中说明这一点。请参阅docs/guides/PRINT.md。 -
🌏 27 种 Unicode 文字 —
add_international_text支持lo(老挝文)、nod(兰纳文)、khb(新傣仂文)、tdd(傣仂文)和cjm(占文);ha、yo、ig、sw是latin的别名(声调符号会附着);支持渲染表情符号肤色修饰符。PDF/A 中的兰纳文必须使用pdfa2b,而非pdfa2u(上游有一个字形缺少ToUnicode条目)。 -
🔁 在任何主机上均可复现 — 所有日期均以 UTC 写入,页眉或页脚中的
{date}会遵循固定的时间点,操作人员可通过PDFNATIVE_MCP_CREATION_DATE或SOURCE_DATE_EPOCH固定整个进程(请参阅环境变量)。按设计不在此范围内:signingTime、modDate、RFC 3161 令牌和吊销数据、加密、ECDSA 签名。请参阅docs/guides/REPRODUCIBLE.md。 -
🚦
strict按诊断码升级处理 —PDFA_*→PDF_A_COMPLIANCE_VIOLATION,PDFX_*→PDF_X_COMPLIANCE_VIOLATION(新增),其他所有情况 →DIAGNOSTIC_ESCALATED(新增)。这两个新增代码仅会由设置了strict: true的调用返回。 -
🧩 第七个 MCP 提示词
typography— 并重写print_ready、reproducible_output、pdfa_valid,纳入 CMYK、PDF/X-4、色条以及 UTC / 操作人员固定时间点。 -
🐛 修复 — 0–1 RGB 三元组(
watermark.color、annotate_pdf的颜色)现在会渲染其指定的颜色(以前[1, 0, 0]会渲染成几乎全黑);任何接受 PDF 输入的工具发生意外故障时,现在会归类为PDF_PARSE_FAILED,而不再以无代码形式呈现。 -
✅ 上游问题已解决 — 使用
embedFonts: true构建的 PDF/A 表单现在可通过 veraPDF 验证(AcroForm 字体已嵌入),且inspect_layout对toc块的测量结果与构建时的布局完全一致。 -
🧪 单一门禁、强化 CI、已验证文档 —
npm run gate是判定通过的唯一标准(通过 stdio 驱动构建后的服务,且 stdout 必须仅包含 JSON-RPC 帧);veraPDF 会对 41 个文件的合规性语料执行阻断式检查;96 个样本的字节基线会检查输出;npm run verify:docs会确保文档中引用的所有计数、版本、工具、错误代码和操作人员变量均与docs/assets/ecosystem.json及源代码树一致。 -
🧾 目录 —
tools/list增长至约 306 kB(排版片段和扩展后的颜色架构会内联到每个包含这些内容的工具中;npx tsx scripts/tool-shape.ts --check会确保其小于 320 KiB,说明小于 8 KiB);_meta.apiVersion为1.7.0。 -
⬆ 引擎升级 — pdfnative v1.8.0。工具 API 没有破坏性更改;发生变化的字节(嵌入的 TrueType 子集、
print.marks、带有标记定位的成形文本、UTC 日期)已列于release-notes/v1.7.0.md的 升级 部分。 New in v1.6.0: -
🧱 完整引擎覆盖——13 种块类型 —
generate_basic_pdf支持 pdfnative 提供的所有DocumentBlock:新增的table、image、link、toc、barcode、svg和formField块与专用工具(add_table、embed_image、add_barcode、add_form)共用相同的主体内容,因此独立生成的文件和内嵌块会以相同方式通过验证和渲染。规则:link仅接受http:/https:/mailto:(拒绝控制字符);image块有大小限制(每个块最多 12 M 个 base64 字符,每次调用解码后最多 24 MiB;PNG 必须为 8 位、非隔行扫描、不带 alpha 通道或调色板——不符合要求时会提供修正方法);svg支持路径、基本形状和<text>(不支持transform、<g>、渐变或 CSS——会静默忽略;绝不会获取任何内容);toc与outline: 'auto'配合使用;在 PDF/A 声明下使用formField会报告PDFA_UNEMBEDDED_FORM_FONT;barcode不支持alt(引擎限制)。 -
📐 九种文档工具的布局选项 —
pageSize(默认为A4,还支持Letter、Legal、A3、Tabloid)、margins(四边均可设置,范围为 0–200 pt)、headerTemplate/footerTemplate(支持{page}{pages}{title}{date};footerTemplate会替换默认页脚,因此此时会忽略footerText;1.6.0 中的{date}使用构建当天的挂钟时间——从 v1.7.0 起改为使用固定的时间点)、compress(FlateDecode 流——文件更小,但字节不同;PDF/A 下的 XMP 保持未压缩)和debug(辅助矩形、未标记内容——不适用于 PDF/UA)。默认不启用,因此默认输出的字节保持不变。 -
🔐 构建时加密 — 七种文档工具支持
encrypt(generate_basic_pdf、add_table、add_form、add_international_text、embed_image、add_barcode、add_chart):标准安全处理器,默认使用 AES-128,也支持 AES-256;保留 AcroForm(与会重建页面树的encrypt_pdf不同)。不能与pdfA同时使用(会返回VALIDATION_ERROR),结果永不缓存;prepare_signature_placeholder不提供此功能(必须保持可签名),add_attachment也不提供(PDF/A-3)。 -
📏
inspect_layout— 第 28 种工具:只读的分页试运行,使用相同的blocks和布局输入,不渲染 PDF,并报告totalPages以及每个块所在的页面、x 坐标、顶部位置、宽度和高度。1.6.0 中已知的引擎缺陷(已在 v1.7.0 修复):toc块被测量为 0 pt,因此包含打印目录的文档实际分页可能比预览多一页。 -
🔎
inspect_pdf annotations: true— 列出每个页面注释(子类型、从 0 开始的页码、rect、最多截取 200 个字符的内容、标题、颜色、quadPoints、链接 URL),并提供annotationCount;新增check: 'annotations'。 -
🖼️ 图像水印 —
generate_basic_pdf和add_table支持watermark.image(JPEG/PNG,默认不透明度为 0.10,单独限制为 8 MiB),可单独使用,也可与text组合(默认不透明度为 0.15);两者均支持position: 'background' | 'foreground'。在pdfa1b下,任一不透明度低于 1.0 都会被拒绝。 -
🧯
PDFNATIVE_MCP_MAX_INFLATE_BYTES— 可由运维人员覆盖引擎每个流 100 MiB 的解压缩上限(整数 ≥ 1024;无效值会导致启动被拒)。超出上限的附件流会使extract_attachments includeData: true返回PDF_PARSE_FAILED;extract_text则会退化为空页面文本(引擎会吞掉逐页解码失败)。 -
📝 表单 —
add_form和formField块新增listbox和placeholder;fieldType: 'textarea'现在会以multilineText传给引擎(此前未映射,直接传递后渲染为单行字段——此修复会改变该输入的字节)。embed_image新增align和alt。 -
🔏 PAdES 长期验证阶梯 —
sign_pdf新增profile: 'pades'(ETSI EN 319 142-1 基线、ESS signing-certificate-v2、ETSI.CAdES.detached)、timestamp: true(B-T、RFC 3161)、RSA-SHA384/512、certChainDerBase64,以及用于多个签名的fieldName/allowMultiple;新增add_ltv,可嵌入/DSS(B-LT,mode: 'online'通过运维人员配置的提供方,或mode: 'offline'并由调用方提供 DER 材料);新增timestamp_pdf,可追加/DocTimeStamp(B-LTA)。verify_pdf ltv: true会报告配置文件、时间戳、吊销状态和ltvLevel。参见docs/guides/LTV.md。 -
🌐 网络规范 — 默认不发出外部请求。服务唯一可能发出的外部请求,是访问运维人员配置的 RFC 3161 / OCSP / CRL 端点(
PDFNATIVE_MCP_TSA_URL、PDFNATIVE_MCP_REVOCATION、PDFNATIVE_MCP_NETWORK_ALLOWED_HOSTS),且会经过 SSRF 防护;工具参数绝不能提供 URL。 -
🖨️ 印刷制作 — 每种文档工具均接受
print(TrimBox / BleedBox / ArtBox / CropBox 或bleed简写、裁切和套准marks、/UserUnit)、metadata(/Author、/Subject、/Keywords、/Trapped)和outputIntent(适用于 PDF/A 的自定义 RGB ICC);viewerPreferences新增duplex、pickTrayByPDFSize、printPageRange、numCopies。inspect_pdf pages: true会报告页面框;合并 / 拆分 / 提取时会保留这些设置。参见docs/guides/PRINT.md。 -
✍️
update_metadata— 以增量更新方式重写现有 PDF 的/Info和 XMP(此前的修订版本和签名均按原样保留)。 -
📊 图表 v2 — 支持
stackedBar/stackedBarH/area/scatter、右侧次坐标轴(axis2)、axis.scale: 'log'、xAxis.type: 'linear' | 'time'、dataLabels、labelStride/labelRotation;重叠的分类标签会自动稀疏显示。 -
📜 如实处理 PDF/A —
embedFonts: true会嵌入 Noto Sans Latin(base-14 Helvetica 不会嵌入,因此纯拉丁文本上的 PDF/A 声明会被 veraPDF 拒绝);strict: true会报错,而不是生成不合规文件;includeDiagnostics: true会回显引擎诊断信息。针对包含 26 个文件的语料库运行本地 veraPDF 脚本(npm run validate:pdfa;24 个通过验证,其中 3 个为负向哨兵文件;跳过 2 个页面树输出),并支持失败即关闭模式VERAPDF_REQUIRED=1;CI 工作流通过 SHA-256 固定安装程序,且在 1.6.0 中不会阻断构建(从 v1.7.0 起会阻断构建,并在门禁中以--require-all取代VERAPDF_REQUIRED=1)。1.6.0 中已知的引擎缺陷:即使使用embedFonts,add_form输出仍不符合 PDF/A-2b(未嵌入/DR /Helv——已在 v1.7.0 修复);prepare_signature_placeholder输出只有在完成签名后才符合要求。 -
🧰
inspect_pdf— 支持signatures: true清点签名,以及dss/docTimestampCount/trapped(需存在相应内容);新增check值dss、docTimestamp、trapped;checks只列出你请求的键,signed表示结构上存在已签名字段(签名是否有效由verify_pdf检查)。 -
🔁 可复现输出 — 九种文档工具均可选择性设置
creationDate,以固定/CreationDate、XMP 日期和 trailer/ID;prepare_signature_placeholder和sign_pdf支持signingTime(现也支持时区偏移),以固定/Sig /M。1.6.0 中,在同一主机时区下生成的字节相同(从 v1.7.0 起,在所有主机上均相同:日期均以 UTC 写入)。由reproducible_output提示词支持。 -
🛡️ 加固边界 — 严格输入架构(未知或拼写错误的键会返回
VALIDATION_ERROR,而不会被静默忽略);可接受data:…;base64,前缀,遇到 DER 应为 PEM 格式的内容以及双重编码的载荷时会拒绝,并给出确切的修正方法;页面树工具中的页码索引错误会返回VALIDATION_ERROR并提示使用从 0 开始的索引;未知工具名称会作为 JSON-RPC 协议错误处理(-32602、[UNKNOWN_TOOL])。 -
🔑 HTTP bearer token — 可选择启用
PDFNATIVE_MCP_HTTP_TOKEN,为 Streamable HTTP 端点设置访问门槛(否则返回401和WWW-Authenticate)。未设置时,loopback 端点不进行身份验证——参见SECURITY.md。 -
🧾 工具目录 —
tools/list大约为 245 kB(1.5.0 约为 108 kB),因为现在会在内联内容中公布每种块类型、布局选项和encrypt片段——根据策略不使用$ref/$defs,因此会将inputSchema转发给函数调用 API 的主机不会遇到引用;服务说明约为 6.7 kB(此前为 12.9 kB)。结构由scripts/tool-shape.mjs(从 v1.7.0 起为scripts/tool-shape.ts)和tests/catalogue-parity.test.ts共同检查,tests/catalogue-superset.test.ts则证明实时工具目录包含已发布的 1.5.0 目录中的所有内容;每种工具最多有两个可执行的_meta.examples,其余示例位于examples/。新增四种配方提示词:pades_ladder、print_ready、reproducible_output、pdfa_valid。 -
🐛 修复 — 在 pdfnative < 1.7 中,签名者元数据(
signerName/reason/location/contactInfo)从未写入/Sig字典;现在会在占位符创建时写入。对于 B-LTA 文档,verify_pdf不再报告allValid: false(此前/DocTimeStamp会被解析为 CMS 签名)。 -
🔌 MCP 2026-07-28 基于 MCP TypeScript SDK v2(
@modelcontextprotocol/server),并自动回退到 2025 时代的initialize握手——现有主机无需更改即可继续工作。参见 MCP 协议合规性。 -
⬆ 引擎升级 — pdfnative v1.7.0(LTV、印刷制作、图表 v2、摘要算法敏捷性、旗帜 / ZWJ 表情符号序列、UAX #9 修复)。 v1.5.0 新增功能:
-
📊 原生矢量图表 —
add_chart通过纯 PDF 路径运算符绘制柱状图/横向柱状图/折线图/饼图/圆环图(零栅格化,符合 PDF/A 标准并自动生成替代文本)。generate_basic_pdf也接受chart块,可与文本和表格组合。 -
📝 填写并扁平化表单 —
read_form_fields列出现有 AcroForm 的字段;fill_form通过非破坏性增量更新填写和/或扁平化表单(与add_form相对应)。 -
🔐 加密往返处理 —
encrypt_pdf使用 AES-128/AES-256 重新保护文件(不会生成 RC4 加密);decrypt_pdf恢复未加密副本;只读工具新增password输入以打开加密源文件;merge_pdfs/split_pdf/extract_pages新增password+encrypt。 -
🔤 真实文本提取 —
extract_text现在会解析每种字体的/ToUnicodeCMap(不再输出字形索引),并可返回带位置的runs。 -
🔗 原生 MCP 资源 — 沙盒中生成的 PDF 会成为
pdfnative://output/…资源(resources/list+resources/read);文件模式的结果中包含resource_link,便于在后续调用中重新引用。 -
🏷️ 工具注释 — 每个工具都会公布
readOnlyHint/destructiveHint/idempotentHint/openWorldHint。 -
⬆ 引擎升级 — pdfnative v1.6.0(解密/重新加密、
extractText、填写/扁平化、图表;彩色表情子集字形数从 221 增至 1167)。
v1.4.0 新增功能:
- 🤝 AI 治理 + 人机协同 —
draft_governance_issue让 Agent 在本地起草完全合规的 GitHub issue(草稿.md+ 机器可读的合规报告)。Agent 是起草者,绝不自主提交:只有人工审核这一道关卡,且服务不会向 GitHub 写入任何内容(自 v1.6.0 起,除调用运营者配置的 TSA/OCSP/CRL 端点外,不会发出任何外部请求)。由governance_contract和draft_issue_workflowMCP 提示词提供支持。 - ✏️ 标记注释 —
annotate_pdf通过增量更新,在现有 PDF 上叠加高亮、便笺、下划线、删除线、波浪线、方形、圆形、直线和自由文本注释。这是视觉审阅层,而非涂黑处理——底层字节保持不变。 - 🔢
inspect_pdf中的页面标签 — 只读展示/PageLabels范围(罗马数字、十进制、带前缀)。 - ∑ 数学/科学脚本 —
add_international_text接受lang: 'math'(与emoji一样需显式指定),以便按需嵌入 Noto Sans Math 字体。 - 🧩 MCP 提示词 — 服务现在公布
prompts能力,包含governance_contract和draft_issue_workflow。 - ⬆ 引擎升级 — pdfnative v1.5.0。
v1.3.0 新增功能:
- 🆕 三个页面树工具 —
merge_pdfs、split_pdf、extract_pages(基于 pdfnative v1.4.0 的页面树 API;加密源文件在 v1.5.0 新增password之前会被拒绝)。 - 🔖 书签、页面标签和嵌套列表 —
generate_basic_pdf新增outline('auto'或显式树)、pageLabels、多级list项和viewerPreferences。 - 📐 表格单元格边框和对齐 —
add_table新增cellBorders、cellVAlign和viewerPreferences;add_international_text新增viewerPreferences。 - 🔐 恒定时间签名 —
sign_pdf通过node:crypto提供程序对 RSA 和 EC-DER 密钥签名,并透明回退到纯 JS 实现(原始 P-256 标量仍使用纯 JS,验证也使用纯 JS);签名保持互操作性。 - ⬆ 引擎升级 — pdfnative v1.4.0。
- 🆕 工具
extract_attachments——从 PDF 中读取嵌入文件(补全 Factur-X / ZUGFeRD 往返流程),保留逐字节一致的载荷,支持filename筛选器,以及includeData: false元数据探查模式。 - 💧 水印——
generate_basic_pdf和add_table支持可选的watermark(文本、不透明度、角度、颜色、位置;自 v1.6.0 起支持image),并在每一页上渲染。 - 🌐 Unicode
normalize——generate_basic_pdf和add_international_text支持选择启用NFC/NFD/NFKC/NFKD。 - 🪙 节省 token 的读取——只读工具(
inspect_pdf、verify_pdf、validate_pdf、extract_text、extract_attachments;read_form_fields自 v1.5.0 起支持)接受可选的verbosity: 'summary'和fields: […]输入,可让大型结果的响应缩小约 90%,同时保留 Agent 用于分支判断的字段。默认值不变。 - 🪙 不重复 base64——生成的 PDF(base64 模式)仅作为嵌入式
resource内容块返回一次,不再同时复制到structuredContent中。 - 🔧 MCP 注册表发布修复——
mcpName现在采用规范的 GitHub 登录名大小写(io.github.Nizoka/pdfnative-mcp),以便注册表的区分大小写验证能够接受 npm 包。 - ⬆ 依赖项——已升级到 zod 4。
v1.1.0 新增内容:
- 🆕 新工具
validate_pdf——只读 PDF/UA(ISO 14289-1)结构符合性检查。 - 🆕 新增六种文字脚本——泰卢固文、僧伽罗文、藏文、高棉文、缅甸文、埃塞俄比亚文(总计 24 种脚本)。
- 🆕 COLRv1 彩色表情符号——原生彩色表情符号,支持单色回退。
- 🆕 换行符清理器——段落中的嵌入式
\n会自动拆分为多个独立段落(安全 PDF/A)。 - 🆕
add_international_text自动进行 NFC 规范化。 - 🛠 引擎升级——pdfnative v1.3.0:欧元符号 / CP-1252 符号现在可以正确提取,表格中自动换行的单元格会为每一行分配唯一的 MCID(符合 PDF/UA 安全要求)。
v1.0.0 新增内容:
- 🆕 新增三个工具:
verify_pdf、add_attachment(Factur-X / ZUGFeRD)、extract_text。 - 🆕 智能表格字段:
wrap、repeatHeader、zebra、caption、minRowHeight、cellPadding。 - 🆕
inspect_pdf现在会报告hasSignaturePlaceholder和每个附件的摘要;新增check值'placeholder'和'attachments'。 - 🆕 签名易用性改进:
sign_pdf接受 ECDSA SEC1 / PKCS#8 DER 密钥,并会在缺少/Sig占位符时自动注入(只需一次调用即可为任意 PDF 签名)。 - 🆕 可选缓存(
PDFNATIVE_MCP_CACHE_DIR):基于 SHA-256 键,TTL 为 1 小时,采用 256 MiB LRU。 - 🆕
_meta.apiVersion和每个工具的_meta.examples,便于 AI Agent 发现工具——参见docs/API_STABILITY.md。 - 🆕 AI Agent 指南:
docs/AI_GUIDE.md——决策树和常见问题。另请参阅 Agent 合约docs/AGENT_CONTRACT.md(目录、决策树、操作指南、错误表);贡献者和编码 Agent 请从AGENTS.md开始。 - 🆕 PDF/A 编写指南:
docs/guides/PDFA.md。 - 🛠 环境变量重命名:
PDFNATIVE_MCP_OUTPUT_DIR(原为PDFNATIVE_MPC_OUTPUT_DIR;旧名称仍可使用,并会显示一次性弃用警告)。 - ✅ 现已提供:
merge_pdfs、split_pdf、extract_pages(v1.3.0)、annotate_pdf(v1.4.0)、add_chart/read_form_fields/fill_form/encrypt_pdf/decrypt_pdf工具,以及加密往返流程和原生 MCP 资源(v1.5.0),还有add_ltv/timestamp_pdf/update_metadata,以及印刷生产和图表 v2(v1.6.0)。redact_pdf仍暂缓提供——pdfnative 可以叠加内容或扁平化页面,但无法移除页面内容;仅靠叠加实现的“涂黑”会造成虚假的安全感,因此我们有意不提供此功能(已记录为上游内容移除需求)。
所有工具均支持两种输出模式:
base64(默认) — 生成的 PDF 仅作为嵌入式resource内容块(data:application/pdf;base64,…URI)返回一次;structuredContent仅包含{ mode, sizeBytes }(当includeDiagnostics: true时还包含diagnostics[],对于add_ltv还包含summary)。file— 将 PDF 写入通过PDFNATIVE_MCP_OUTPUT_DIR配置的沙盒目录。除非设置此变量,否则会禁用文件输出;绝对路径、路径遍历、非.pdf扩展名和 NUL 字节均会被拒绝。
**从 v1.1.0 升级:**唯一的行为变更是,base64 模式下的字节不再重复写入
structuredContent.base64。请改为从嵌入式resource块中读取:- const base64 = response.structuredContent.base64; // v1.1.0 + const block = response.content.find((c) => c.type === 'resource'); + const base64 = block.resource.blob; // v1.2.0
**节省令牌的读取(v1.2.0)。**七个只读工具(inspect_pdf、verify_pdf、validate_pdf、extract_text、extract_attachments、read_form_fields、inspect_layout)接受两个可选输入:
verbosity: 'summary'— 返回精简的纯标量判定结果(省略大型数组/完整文本)。例如,verify_pdf→{ signatureCount, allValid, invalid, summary }(ltv: true时还包含ltvLevel);inspect_pdf在存在时保留docTimestampCount/trapped/checksPassed。fields: ['a', 'b.c']— 将结构化结果投影为指定的点路径;在verbosity处理后应用。未匹配的路径会被省略,并在_meta.unmatchedFields中报告(同时提供_meta.availableFields)。
用于探测“此 PDF 是否已签名且有效?”的最简请求:{ "pdfBase64": "…", "verbosity": "summary", "fields": ["allValid"] }。
为什么选择 pdfnative?
pdfnative-mcp 继承底层引擎的所有保证:
- 引擎零运行时依赖——纯 JavaScript,无原生绑定(此服务仅额外添加 MCP SDK 和 zod:总计三个运行时依赖)。
- 符合 ISO 32000-1(PDF 1.7)。
- PDF/A-1b/2b/2u/3b、AES-128/256 加密、AcroForm、数字签名。
- 27 种 Unicode 文字系统(34 个
lang代码,包括latin、emoji、math和四个latin别名),内置 BiDi 重排、阿拉伯语位置字形塑形,以及泰语/天城文/孟加拉语/泰米尔语 OpenType 字形塑形。 - PDF/X-4 印刷交换、DeviceCMYK 颜色和精细排版(孤行/寡行控制、两端对齐、法语标点间距、OpenType 功能)。
- 支持 Tree-shaking 的 ESM 构建。
🚀 安装
# Run directly with npx (recommended for MCP clients)
npx -y pdfnative-mcp
# Or install globally
npm install -g pdfnative-mcp
pdfnative-mcp
要求:Node.js ≥ 22。
⚙️ 配置
Claude Desktop
编辑 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):
{
"mcpServers": {
"pdfnative": {
"command": "npx",
"args": ["-y", "pdfnative-mcp"],
"env": {
"PDFNATIVE_MCP_OUTPUT_DIR": "/Users/you/Documents/mcp-pdfs"
}
}
}
}
Cursor / Continue / Zed / Windsurf / Cline / Roo Code
任何支持 stdio 服务的 MCP 兼容客户端均可使用。使用相同的 command + args + env 三元组。Cursor 示例(~/.cursor/mcp.json):
{
"mcpServers": {
"pdfnative": {
"command": "npx",
"args": ["-y", "pdfnative-mcp"],
"env": { "PDFNATIVE_MCP_OUTPUT_DIR": "/Users/you/Documents/mcp-pdfs" }
}
}
}
Windsurf / Cline / Roo Code 在各自的 MCP 配置文件中使用相同的结构。
🌐 支持的 AI 生态系统和客户端
pdfnative-mcp 专为 MCP 原生环境设计,可与支持通过 stdio 或 Streamable HTTP 使用 MCP 的客户端配合使用。
社区已验证的兼容性包括:
- Ontheia — 可自托管的开源 AI Agent 平台(注重隐私)。据 issue #41 报告,可开箱即用,并列于 Ontheia 的兼容 MCP 服务页面。
🔌 MCP 协议兼容性
自 v1.6.0 起,服务基于 MCP TypeScript SDK v2(@modelcontextprotocol/server)构建,并支持 MCP 2026-07-28:
- 无状态服务——
server/discover取代会话握手;每个结果都包含resultType和_metaserverInfo信封。通过 HTTP 通信时,2026-07-28 客户端会在每个POST /mcp请求中发送Mcp-Method/Mcp-Name标头。 - 缓存提示——
tools/list和prompts/list的缓存级别为public,ttlMs为 24 小时;server/discover的缓存级别为public,有效期为 1 小时;resources/list/resources/templates/list/resources/read的缓存级别为private,ttlMs: 0(生成的 PDF 属于特定主机的用户数据)。 - 资源错误——未知资源 URI 会被报告为 JSON-RPC
-32602(Invalid params),这是 2026-07-28 规范的要求。 - 自动兼容旧版协议——客户端使用
initialize(2025-11-25、2025-06-18 或 2025-03-26)建立连接时,会通过 SDK 的旧版路径提供服务,stdio 和 HTTP 均如此。现有主机不会有任何变化。 - HTTP——
GET/DELETE /mcp返回 405(不支持 SSE 恢复;服务无状态)。环回绑定以及Host/Origin防护保持不变;Origin端口现在必须与服务端口相同(SDK 自身的检查不区分端口);PDFNATIVE_MCP_HTTP_TOKEN可选择启用 bearer 令牌验证(未提供令牌时返回401+WWW-Authenticate)。HTTP 接受 JSON-RPC 批量数组(2025-03-26)。保持活动状态的连接不再累积套接字监听器。 - stdio——与迄今所有 SDK 版本一样,在
initialize之前发送的请求会被丢弃且不作回复;stdio 不接受 JSON-RPC 批量数组(与 1.5.0 相同;没有主要主机使用批量请求)。 - 协议错误——使用未知工具名称调用
tools/call时,会返回 JSON-RPC 错误(-32602,[UNKNOWN_TOOL] Unknown tool: …),而不是isError结果,因为规范将其归类为错误;isError: true仅用于执行失败。 - 输出架构——每个
structuredContent都符合工具的outputSchema(2026-07-28 的强制要求),包括verbosity: 'summary'和fields投影:七个读取工具都声明了可投影的架构(所有属性均为可选,并保留additionalProperties: false)。根据策略,输入架构不带$schema关键字(MCP ≥ 2025-11-25 默认使用 JSON Schema 2020-12;某些主机会将inputSchema转发给拒绝未知关键字的函数调用 API)。serverInfo包含websiteUrl;资源模板为pdfnative://output/{+path}。
tools/call 负载(content、structuredContent、isError)在 2026-07-28 路径和旧版路径中完全相同;tests/http-modern.test.ts 对此进行断言,tests/schema-conformance.test.ts 使用 SDK 的 JSON Schema 2020-12 验证器校验 structuredContent。
| 客户端 | 传输方式 | 协商的协议 |
|---|---|---|
| Claude Desktop、Cursor、Continue、Zed、Windsurf、Cline | stdio | 旧版 initialize(2025-xx)——保持不变 |
| ChatGPT 和其他 Streamable HTTP 主机 | HTTP POST /mcp | 旧版无状态 Streamable HTTP——保持不变 |
MCP 2026-07-28 客户端(SDK v2 Client、当前 MCP Inspector) | stdio / HTTP | server/discover、缓存提示、_meta 信封 |
| Ontheia | stdio | 旧版 initialize(社区验证,#41) |
环境变量
| 变量 | 用途 |
|---|---|
PDFNATIVE_MCP_OUTPUT_DIR | 沙盒目录的绝对路径。启用 outputMode: 'file' 所必需。 |
PDFNATIVE_MCP_CACHE_DIR | 启用持久化 SHA-256 键控结果缓存的绝对路径(TTL 为 1 h,LRU 为 256 MiB;键按工具 API、软件包版本和固定的创建时刻进行命名空间隔离)。未设置时,缓存将被禁用。不会缓存 encrypt_pdf / decrypt_pdf / sign_pdf / add_ltv / timestamp_pdf / update_metadata 或文件模式调用;命中缓存时会附带 _meta.cached: true,并返回先前调用的字节内容。 |
PDFNATIVE_MCP_PORT | 若设置为有效端口(1–65535),则在 http://127.0.0.1:<port>/mcp 启动 HTTP 服务,而非使用 stdio。仅绑定到环回地址,并启用 DNS 重绑定保护(外部 Host / Origin → 403)。除非设置了 PDFNATIVE_MCP_HTTP_TOKEN,否则不进行身份验证——其他本地进程可以访问此端点。 |
PDFNATIVE_MCP_HTTP_TOKEN | (v1.6.0,机密) HTTP 传输的可选 Bearer 令牌(≥ 16 个字符,不含空格——值强度不足时将中止启动)。设置后,每个 /mcp 请求都必须携带 Authorization: Bearer <token>;否则返回 401 和 WWW-Authenticate: Bearer realm="pdfnative-mcp"(仅在已发送凭据时包含 error="invalid_token"——RFC 6750 §3.1)。使用恒定时间比较,绝不记录日志。 |
PDFNATIVE_MCP_MAX_INFLATE_BYTES | (v1.6.0) 覆盖引擎对每个数据流设置的 100 MiB 解压上限(防止 zip 炸弹):正整数,单位为字节,且 ≥ 1024;启动时读取一次——值无效时将拒绝启动。在共享主机上可调低此值;对于可信的大型扫描文档存档可调高此值。附件数据流达到上限时,extract_attachments includeData: true 会失败并返回 PDF_PARSE_FAILED;内容数据流达到上限时,extract_text 会将页面文本降级为空(引擎行为,不会显示错误)。 |
PDFNATIVE_MCP_TSA_URL | (v1.6.0) RFC 3161 时间戳颁发机构的绝对 http(s) URL,供 sign_pdf timestamp: true 和 timestamp_pdf 使用。未设置时返回 TSA_NOT_CONFIGURED,且不会发出请求。 |
PDFNATIVE_MCP_TSA_AUTH | (v1.6.0,机密) 发送给 TSA 的可选 Authorization 标头值。绝不记录日志或回显。 |
PDFNATIVE_MCP_REVOCATION | (v1.6.0) ocsp、crl 或 ocsp,crl——为 add_ltv mode: 'online' 启用在线吊销信息收集。未设置时返回 REVOCATION_NOT_CONFIGURED。 |
PDFNATIVE_MCP_NETWORK_ALLOWED_HOSTS | (v1.6.0) 以逗号分隔的允许列表(host、host:port、*.suffix),用于 OCSP / CRL 响应方。设置 PDFNATIVE_MCP_REVOCATION 时必填——响应方 URL 来自不可信证书。 |
PDFNATIVE_MCP_NETWORK_TIMEOUT_MS | (v1.6.0) TSA / OCSP / CRL 调用的单次请求超时时间,范围为 1000–120000 ms(默认值为 10000)。 |
PDFNATIVE_MCP_CREATION_DATE | (v1.7.0) 带时区的 ISO 8601 时刻(例如 2026-01-01T00:00:00Z),用于固定进程所创建的每个文档的创建时刻:/CreationDate、XMP 日期、trailer /ID 以及 {date} 页眉 / 页脚占位符。启动时读取一次——值无效时将拒绝启动;固定时刻的来源会记录到 stderr。 |
SOURCE_DATE_EPOCH | (v1.7.0) reproducible-builds.org 约定:自 Unix 纪元起的整数秒数,在未设置 PDFNATIVE_MCP_CREATION_DATE 时使用。值无效时将拒绝启动。许多构建环境已导出此变量:从此版本起,它会固定每个文档的创建日期——如果不需要此行为,请在服务器进程中取消设置。 |
创建日期的优先级(从高到低):单次调用的 creationDate → PDFNATIVE_MCP_CREATION_DATE → SOURCE_DATE_EPOCH → 系统时钟。日期始终以 UTC 写入,因此固定输出在任何主机和任何时区中都具有相同的字节。按设计,固定日期不涵盖:signingTime(sign_pdf、prepare_signature_placeholder)、modDate(update_metadata)、增量写入器重新生成的第二个 /ID(annotate_pdf、fill_form)、RFC 3161 时间戳令牌和在线撤销数据、加密(新的文件密钥、盐值和 IV)以及 ECDSA 签名(按设计为随机生成)。参见 docs/guides/REPRODUCIBLE.md。 |
🛠 工具参考
generate_basic_pdf
{
"title": "Q1 2026 Report",
"blocks": [
{ "type": "heading", "text": "Executive summary", "level": 1 },
{ "type": "paragraph", "text": "Revenue grew 24% year over year." },
{ "type": "list", "style": "bullet", "items": ["Strong APAC", "Stable EU", "Soft NA"] },
{ "type": "pageBreak" },
{ "type": "heading", "text": "Details", "level": 2 }
],
"footerText": "Confidential — Internal use only",
"outputMode": "base64"
}
13 种块类型:heading、paragraph、list、table、image、link、toc、barcode、svg、formField、chart、pageBreak、spacer。复合报告:
{
"title": "Quarterly report",
"blocks": [
{ "type": "toc" },
{ "type": "heading", "text": "Sales", "level": 1 },
{ "type": "table", "headers": ["Region", "Revenue"], "rows": [["EMEA", "1.2 M"], ["APAC", "0.9 M"]], "zebra": true },
{ "type": "image", "imageBase64": "<base64 JPEG>", "mimeType": "image/jpeg", "width": 300, "alt": "Revenue chart" },
{ "type": "svg", "data": "M10 10 H 90 V 90 H 10 Z", "viewBox": [0, 0, 100, 100], "fill": "#0a7e8c" },
{ "type": "barcode", "format": "qr", "data": "https://example.com/q1", "align": "center" },
{ "type": "link", "text": "Full dataset", "url": "https://example.com/data" },
{ "type": "formField", "fieldType": "text", "name": "reviewer", "label": "Reviewed by" }
],
"outline": "auto",
"pageSize": "Letter",
"headerTemplate": { "right": "{title} — page {page}/{pages}" },
"embedFonts": true
}
块规则:table、barcode、formField 和 chart 使用与 add_table / add_barcode / add_form / add_chart 相同的正文;link URL 必须为 http:、https: 或 mailto:;每个 image 块最多包含 12 M 个 base64 字符,每次调用解码后最多 24 MiB(PNG:8 位灰度/RGB、非隔行扫描、无 alpha、无调色板——否则会返回 VALIDATION_ERROR 并提供解决方法);svg 支持 <path>、<rect>、<circle>、<ellipse>、<line>、<polyline>、<polygon>、<text>/<tspan>,并会静默忽略 transform、<g>、<use>、<image>、渐变、不透明度和 CSS(绝不会获取外部引用);toc 根据标题块生成,并与 outline: 'auto' 配合使用;pdfA 中的 formField 需要 embedFonts: true,以嵌入字段字体(否则会出现 PDFA_UNEMBEDDED_FORM_FONT;此时 strict: true 会导致失败);barcode 没有 alt。渲染前,请使用相同的输入调用 inspect_layout 预览分页。
排版(v1.7.0)。 typography 是一个可选对象(共 12 个键,默认全部关闭——省略时字节保持不变),可用于九种文档工具和 inspect_layout:
{
"title": "Annual report",
"embedFonts": true,
"typography": {
"splitParagraphs": true, "orphans": 3, "widows": 3,
"keepHeadingsWithNext": { "minLines": 3 },
"opticalMargins": true, "kerning": true, "fontFeatures": ["onum", "smcp"],
"unitBinding": true, "bindShortWords": true, "punctuationSpacing": "fr"
},
"blocks": [
{ "type": "heading", "text": "Outlook", "level": 2, "keepWithNext": true },
{ "type": "paragraph", "text": "A long justified paragraph…", "align": "justify" },
{ "type": "paragraph", "text": "Figures by region:", "keepWithNext": true, "splittable": false }
]
}
- 键:
splitParagraphs、orphans/widows(1–10,默认值为 2,需启用splitParagraphs)、keepHeadingsWithNext(true或{ minLines })、unitBinding(true或{ units })、bindShortWords(true或{ maxLength, words })、punctuationSpacing('fr'、'fr-CA'或由{ char, side, space }规则组成的数组)、opticalMargins、metrics(默认值为'approximate'/'exact')、fontFeatures(tnum、pnum、lnum、onum、zero、ordn、sups、subs、smcp、c2sc、case)、kerning、hyphenationLanguage。 - 块输入:
paragraph接受align(默认值为left,也可设为right/center/justify)、keepWithNext和splittable(会覆盖该块的typography.splitParagraphs);heading接受keepWithNext(会覆盖该块的typography.keepHeadingsWithNext)。 - 限制:
kerning、fontFeatures和'fr'窄不换行空格需要嵌入字体(embedFonts: true;使用 base-14 Helvetica 时,'fr'会降级为'fr-CA');metrics: 'exact'仅作用于 base-14 文本;对随附的 Noto Sans 而言,tnum/lnum不会产生任何变化(诊断信息为TYPOGRAPHY_FEATURE_INEFFECTIVE);未安装任何连字符词典,因此hyphenationLanguage在此服务上不起作用——文本中的软连字符(U+00AD)会得到处理。参见docs/guides/TYPOGRAPHY.md和typography提示词。 CMYK 颜色(v1.7.0)。 每种颜色输入都保留其一直以来支持的形式(图表、模板、link和svg块使用十六进制值;水印和annotate_pdf使用 0–1 的 RGB 三元组;轮廓条目和表格单元格边框使用自由字符串),并新增 DeviceCMYK 支持:操作数字符串'c m y k',各分量为 0–1("1 0.6 0 0.1");以及百分比元组[c, m, y, k],各分量为 0–100([100, 60, 0, 10])。如果根据默认 sRGB 意图声明 PDF/A,CMYK 颜色会报告PDFA_DEVICE_CMYK_CONTENT——此处请使用 RGB 颜色,或提供 CMYKoutputIntent。
PDF/X-4(v1.7.0)。 在 generate_basic_pdf、add_table、add_chart、add_barcode、embed_image 和 add_international_text 中设置 pdfx: 'pdfx4',即可生成 PDF/X-4(ISO 15930-7)文件:%PDF-1.6 文件头、PDF/X-4 XMP 标识、/GTS_PDFX 输出意图、每页均有 TrimBox,以及 /Trapped。
{
"title": "Spring catalogue",
"pdfx": "pdfx4",
"embedFonts": true,
"outputIntent": { "iccProfileBase64": "<the printer's CMYK ICC profile, base64>", "outputConditionIdentifier": "FOGRA39" },
"metadata": { "trapped": "False" },
"print": { "bleed": 14.17, "marks": { "colourBars": true } },
"blocks": [{ "type": "paragraph", "text": "Four-colour job exchanged as PDF/X-4." }]
}
- 必须提供打印条件对应的 ICC 配置文件作为
outputIntent(设备类别prtr,CMYK 或 Gray——不随附印刷机配置文件;请咨询印刷厂);要生成符合规范的文件,需设置embedFonts: true(否则会报告PDFX_NO_FONT_ENTRIES;设置strict: true时会拒绝请求);不能与pdfA和encrypt同时使用;metadata.trapped必须为'True'或'False';每页只能带有 TrimBox 或 ArtBox,不能两者都有。对不一致的请求会在开始任何工作前以VALIDATION_ERROR拒绝。链接和表单字段会生成报告(PDFX_ANNOTATIONS);设置strict: true时,PDFX_*诊断会使调用失败,并返回PDF_X_COMPLIANCE_VIOLATION。 outputIntent接受 RGB、CMYK 和 Gray 配置文件(大小 ≤ 8 MiB,在pdfA或pdfx下均适用)。配置文件必须是有效的 ICC 文件(带有acsp签名,大小字段一致)——手工制作的存根文件会被拒绝。print.marks接受true或对象;marks.colourBars(true或{ tints, size },size为 4–72 pt,默认值为 12)会在出血区域添加 C、M、Y、K 实色块及其 50 % 色调。默认关闭;需要约 5 mm(14.17 pt)的出血,若色条无法放入,则会跳过。- 使用
validate_pdf { standard: 'pdf-x-4' }检查结果——这只是结构检查,并非经认证的印前检查。请参阅docs/guides/PRINT.md和print_ready提示词。
add_barcode
{
"format": "qr",
"data": "https://pdfnative.dev",
"caption": "Scan to learn more",
"ecLevel": "H",
"outputMode": "file",
"outputPath": "tickets/event-42.pdf"
}
支持的格式:qr、code128、ean13、datamatrix、pdf417。
add_international_text
{
"title": "مرحبا بالعالم",
"lang": "ar",
"paragraphs": [
"هذا اختبار للنص العربي مع تشكيل OpenType ومحارف ثنائية الاتجاه.",
"Mixed content: العربية + English ✓"
]
}
支持的 lang 代码:27 种 Unicode 脚本——ar、he、th、ja、zh、ko、el、hi、bn、ta、ru、ka、hy、tr、pl、vi、te、si、bo、km、my、am,以及自 v1.7.0 起支持的 lo(老挝文)、nod(泰谭文)、khb(新傣仂文)、tdd(傣仂文)、cjm(占文);另有实用字体 latin、emoji 和 math。自 v1.7.0 起,ha(豪萨语)、yo(约鲁巴语)、ig(伊博语)和 sw(斯瓦希里语)均为 latin 的别名:内置的 Noto Sans 会处理其声调符号,不会嵌入额外字体。字体始终会嵌入(不接受 embedFonts 输入);设置固定的 creationDate 可确保输出字节一致。该工具还接受 typography 和 pdfx(参见 generate_basic_pdf)。
PDF/A 下的泰谭文: 使用
pdfA: 'pdfa2b'搭配lang: 'nod',不要使用pdfa2u——引擎中有一个字形缺少ToUnicode条目,veraPDF 会因此拒绝 PDF/A-2u(问题已在上游跟踪)。
多脚本文档——传入数组或逗号分隔的列表:
{
"title": "Mixed Script",
"lang": ["ar", "emoji"],
"paragraphs": ["العربية مع رموز 🎉🚀"],
"pdfA": "pdfa2u"
}
sign_pdf
从 v1.0.0 起,如果缺少 /Sig 占位符,sign_pdf 会自动注入一个——只需一次调用即可签署任意 PDF:
{
"pdfBase64": "<any base64 PDF>",
"algorithm": "rsa-sha256",
"certDerBase64": "<base64 X.509 cert in DER>",
"rsaKeyPkcs1DerBase64": "<base64 PKCS#1 RSAPrivateKey DER>",
"signerName": "Alice",
"reason": "Approval",
"location": "Paris, FR",
"signingTime": "2026-01-15T10:30:00Z"
}
对于 ECDSA P-256:使用 algorithm: "ecdsa-sha256",并提供 ecPrivateKeyDerBase64(SEC1 或 PKCS#8 DER)或 ecPrivateScalarHex(64 个十六进制字符)。
PEM → DER 转换:
openssl x509 -in cert.pem -outform DER | openssl base64 -A # cert
openssl rsa -in key.pem -outform DER -traditional | openssl base64 -A # RSA PKCS#1
openssl pkey -in key.pem -outform DER | openssl base64 -A # ECDSA
只有在需要自定义占位符时才使用
prepare_signature_placeholder(例如,为 >4096 位 RSA 密钥设置更大的placeholderBytes、设置subFilter: 'ETSI.CAdES.detached'或reserveTimestamp: true)。其他情况下直接调用sign_pdf。
PAdES 阶梯(v1.6.0)。 使用 profile: "pades" 调用 sign_pdf 会生成 B-B 签名;添加 timestamp: true 可生成 B-T(需要 PDFNATIVE_MCP_TSA_URL),然后使用 add_ltv 生成 B-LT,再使用 timestamp_pdf 生成 B-LTA:
// 1. sign_pdf { ..., "profile": "pades", "timestamp": true, "certChainDerBase64": ["<intermediate DER>"] }
// 2. add_ltv { "pdfBase64": "<signed>", "mode": "online" } // or "offline" + certificatesDerBase64 / ocspResponsesDerBase64 / crlsDerBase64
// 3. timestamp_pdf { "pdfBase64": "<ltv>" } // re-run before the TSA certificate expires
// 4. verify_pdf { "pdfBase64": "<final>", "ltv": true } // -> ltvLevel: "B-LTA"
签名者元数据(signerName、reason、location、contactInfo)会写入占位符;fieldName 用于选择多个未签名占位符中的一个(否则会出现 PLACEHOLDER_AMBIGUOUS),而 allowMultiple: true 会添加另一个签名。请参阅 docs/guides/LTV.md。
add_table
{
"title": "Monthly Sales",
"headers": ["Region", "Units", "Revenue"],
"rows": [
["APAC", "1200", "$240,000"],
["EMEA", "800", "$160,000"]
],
"infoItems": [{ "label": "Period", "value": "January 2025" }],
"footerText": "Internal use only",
"outputMode": "base64"
}
add_form
{
"title": "Employee Onboarding",
"fields": [
{ "fieldType": "text", "name": "fullName", "label": "Full Name", "required": true },
{ "fieldType": "dropdown", "name": "dept", "label": "Department", "options": ["Engineering", "Sales", "HR"] },
{ "fieldType": "checkbox", "name": "agree", "label": "I agree to the terms", "checked": false },
{ "fieldType": "listbox", "name": "skills", "label": "Skills", "options": ["TypeScript", "PDF", "MCP"] },
{ "fieldType": "textarea", "name": "notes", "label": "Notes", "placeholder": "Anything we should know?" }
],
"outputMode": "base64"
}
字段类型:text、textarea(多行,/Ff 4096)、checkbox、radio、dropdown、listbox;字段为空时,placeholder 会显示提示文本。添加 encrypt 可生成受密码保护且保留其 AcroForm 的表单。在声明为 PDF/A 时,传入 embedFonts: true,以便同时嵌入字段字体(从 v1.7.0 起,此类表单可通过 veraPDF 验证);否则调用会报告 PDFA_UNEMBEDDED_FORM_FONT(此时 strict: true 会导致失败)。
embed_image
{
"title": "Product Photo",
"imageBase64": "<base64-encoded JPEG bytes>",
"mimeType": "image/jpeg",
"caption": "Front view of Model X",
"width": 400,
"align": "center",
"alt": "Front view of the Model X chassis",
"outputMode": "base64"
}
**注意:**引擎的 PNG 解码器仅接受 8 位、非隔行的灰度/RGB 图像。带 Alpha 通道(颜色类型 4/6)、调色板(类型 3)、16 位和隔行 PNG 会在边界处被拒绝,并返回
VALIDATION_ERROR和解决建议(扁平化或重新导出)——此规则同样适用于image块和图像水印。embed_image.imageBase64保持其 1.5.0 版契约,不设长度上限;12 M 字符上限仅适用于内联image块和水印图像。
prepare_signature_placeholder
{
"title": "Service Agreement",
"signerName": "Alice Dupont",
"reason": "Approved",
"location": "Paris, FR",
"blocks": [
{ "type": "paragraph", "text": "By signing below, I accept the terms and conditions." }
],
"outputMode": "base64"
}
将返回的 PDF 字节传给 sign_pdf,即可完成签名工作流。
inspect_pdf
只读的结构与安全检查——适用于下游验证、CI 断言,以及需要在操作 PDF 前对其进行分析的 AI Agent。
{
"pdfBase64": "<base64 PDF>",
"pages": true,
"check": ["pdfa", "signed", "attachments"]
}
返回:
{
"version": "1.7",
"pageCount": 3,
"encryption": "none", // 'none' | 'aes-128' | 'aes-256' | 'rc4' | 'unknown'
"pdfA": "3B", // null when no PDF/A claim is present
"signatureCount": 1,
"hasSignaturePlaceholder": false,
"attachments": [{ "filename": "factur-x.xml", "mimeType": "application/xml", "sizeBytes": 1234, "relationship": "Source" }],
"info": { "Producer": "pdfnative", "Title": "Invoice INV-2025-001" },
"perPage": [{ "index": 0, "width": 595, "height": 842 }],
"checks": { "pdfa": true, "signed": true, "attachments": true },
"checksPassed": true
}
check[] 可接受 'pdfa'、'signed'、'encrypted'、'placeholder'、'attachments'、'dss'、'docTimestamp'、'trapped'、'annotations'(后四项从 v1.6.0 起支持)以及 'pdfx'(从 v1.7.0 起支持:XMP 声明该 PDF 为 PDF/X——这里只检查声明,不验证其有效性;有效性检查请使用 validate_pdf standard: 'pdf-x-4')。只有当 XMP 声明该 PDF 为 PDF/X 时,结果中才会出现 pdfX(verbosity: 'summary' 也会保留该字段)。checksPassed 是所有请求检查结果的 AND。signatures: true 会添加逐字段清单(subFilter、isDocTimestamp、isPlaceholder、byteRange、vriKey);annotations: true 会添加 annotations[](每个 /Annots 条目:从 0 开始的 page、subtype、rect,以及在存在时截断至 200 个字符的 contents、title、color、quadPoints、链接 url)和 annotationCount;只有存在时才会出现 dss、docTimestampCount 和 trapped;设置 pages: true 时,如果对应值已设置,每个 perPage 条目还会包含 trimBox/bleedBox/artBox/cropBox/userUnit。
inspect_layout
只读分页试运行——包含与 generate_basic_pdf 相同的 blocks,以及所有会移动块的输入(title、footerText、pdfA、normalize、embedFonts、pageSize、margins、headerTemplate、footerTemplate,以及自 v1.7.0 起的 typography)。不会生成 PDF;请传入与调用 generate_basic_pdf 时完全相同的内容,以确保 totalPages 一致。
{ "title": "Memo", "blocks": [{ "type": "paragraph", "text": "Short note." }], "pageSize": "Letter", "verbosity": "summary", "fields": ["totalPages"] }
完整结果包含 pageWidth、pageHeight、margins、totalPages 和 pages[].blocks[](type、page、x、top、width、height,单位为点,四舍五入到小数点后两位)。自 v1.7.0 起,试运行和构建共用同一个分页规划器,因此会按照实际排版方式精确测量每种块类型,包括 toc(在 1.6.0 中,toc 块的测量值为 0 pt)。
validate_pdf
只读结构符合性检查。standard 用于选择规则集:'pdf-ua-1'(默认值——适用于带标签 PDF 的 PDF/UA,ISO 14289-1),或自 v1.7.0 起支持的 'pdf-x-4'(PDF/X-4,ISO 15930-7)。使用任何工具通过 pdfA 生成无障碍文档(例如 pdfA: 'pdfa2u'),然后验证结果:
{ "pdfBase64": "<tagged-pdf-base64>" }
返回:
{
"standard": "pdf-ua-1",
"valid": true,
"errors": [], // blocking structural violations (empty when valid)
"warnings": [], // non-blocking best-practice recommendations
"summary": "PDF/UA structural prerequisites hold."
}
它会验证目录中的 /MarkInfo /Marked true、/StructTreeRoot(以及 /ParentTree)、/Metadata(XMP)、/Lang,以及每页 MCID 的唯一性。这是一个快速的开发阶段检查门槛——不能替代完整的参考验证器(veraPDF),后者还会检查字体、颜色和渲染。
PDF/X-4(v1.7.0)。{ "pdfBase64": "<pdf>", "standard": "pdf-x-4" } 会检查 ISO 15930-7 的结构先决条件:PDF 1.6 标头、无加密、trailer /ID、PDF/X-4 XMP 标识、带嵌入式 prtr ICC 配置文件的 /GTS_PDFX 输出意图、每页都有嵌套在 BleedBox 和 MediaBox 中的 TrimBox 或 ArtBox、所有字体均已嵌入、打印区域内无注释、无 JavaScript、无嵌入文件,以及设备颜色与输出意图一致。结果的结构相同,另含 caveats[],其中说明 valid: true 的判定并不代表什么:这不是经过认证的印前检查,而且 veraPDF 不涵盖 PDF/X——请使用 callas pdfToolbox 或 Acrobat Preflight 确认印刷作业。默认的 pdf-ua-1 响应保持不变,不包含 caveats。
annotate_pdf
通过增量更新在现有 PDF 上叠加标记注释。这是一个视觉审阅层,并非涂黑隐去——底层内容不会更改。
{
"pdfBase64": "<base64 PDF>",
"annotations": [
{ "type": "highlight", "page": 0, "rect": [72, 700, 520, 715], "color": [1, 1, 0], "contents": "Check this figure" },
{ "type": "text", "page": 0, "rect": [540, 700, 560, 720], "contents": "Reviewer note" }
]
}
类型:text、highlight、underline、strikeout、squiggly、square、circle、line、freetext。页面索引从 0 开始。color / interiorColor 可接受十六进制字符串或操作数字符串(包括 CMYK 操作数字符串)、0–1 RGB 三元组([1, 1, 0]),或自 v1.7.0 起支持的 CMYK 百分比元组([0, 0, 100, 0]);v1.7.0 还修复了 0–1 三元组的问题,之前它渲染出来几乎是黑色。加密的源文件会被拒绝(ENCRYPTED_SOURCE)——请先运行 decrypt_pdf(会移除签名 / AcroForm),再添加注释,最后重新运行 encrypt_pdf。
draft_governance_issue
在本地起草符合治理规范的 GitHub issue,供人工审阅和提交。服务不会联系 GitHub(它唯一可能的外联是由操作者配置的 TSA / OCSP / CRL 端点——参见网络与外联);它会返回草稿 Markdown 和机器可读的合规报告。
{
"title": "add_table drops the caption on the second page",
"issueType": "bug",
"summary": "The table caption is only rendered on page 1 when repeatHeader is true.",
"reproduction": { "command": "add_table with caption + repeatHeader over 2 pages (examples/bordered-table.json, then inspect_pdf)", "result": "Page 2 has no caption row." },
"expectedBehavior": "The caption repeats with the header on every page.",
"duplicateSearchPerformed": true
}
如果草稿提出运行时依赖、缺少复现步骤,或将 duplicateSearchPerformed 设为 false,则会被拒绝并返回 GOVERNANCE_VIOLATION。完整的人机协同约定请参见 docs/guides/AI_GOVERNANCE.md。
verify_pdf、add_attachment、extract_text
请参见 docs/AI_GUIDE.md 中的专门章节,以及 docs/KNOWLEDGE_BASE.md 中的参考资料。可直接运行的示例位于 examples/ 下。
🔐 安全模型
pdfnative-mcp 在宿主进程内运行,并提供 stdio MCP 服务(或仅限回环的 HTTP 端点)。它不会在已配置的沙箱之外执行任何 I/O。
- 文件写入受
PDFNATIVE_MCP_OUTPUT_DIR限制。未设置时,file输出模式会被拒绝,并返回SecurityError。 - 路径解析会拒绝绝对路径、路径遍历序列(
..)、NUL 字节以及.pdf以外的任何扩展名。 - 输出大小每次调用上限为 50 MB。
- 输入会在每个工具的边界处通过严格的 JSON Schemas 和 Zod 运行时检查进行验证——未知或拼写错误的键(顶层或嵌套)会被拒绝,并返回
VALIDATION_ERROR;在运行任何解析器之前,还会对 base64 / DER 负载进行合理性检查(容忍data:前缀;拒绝 PEM 或双重编码的输入,并提供解决方法)。 - HTTP 传输(
PDFNATIVE_MCP_PORT)仅绑定到回环地址;除非设置了PDFNATIVE_MCP_HTTP_TOKEN,否则不进行身份验证(没有有效的 bearer token 时返回401)。
网络与出站流量
默认情况下,服务不会发起任何出站网络调用。它可能产生的唯一出站流量,是发往操作者为 PAdES 长期验证在环境中配置的 RFC 3161 / OCSP / CRL 端点(PDFNATIVE_MCP_TSA_URL、PDFNATIVE_MCP_REVOCATION、PDFNATIVE_MCP_NETWORK_ALLOWED_HOSTS)——绝不会发往工具参数提供的 URL、绝不会发往 GitHub,也绝不用于遥测。未进行此类配置时,sign_pdf timestamp: true、timestamp_pdf 和 add_ltv mode: 'online' 会在触碰文档之前立即失败,并返回 TSA_NOT_CONFIGURED / REVOCATION_NOT_CONFIGURED;add_ltv mode: 'offline' 会嵌入调用方提供的材料,完全不访问网络。
OCSP / CRL URL 来自 PDF 中不受信任证书的 AIA / CRL 分发点扩展,因此每次获取都会经过 SSRF 防护:
- 主机必须匹配操作者的允许列表(
host、host:port或*.suffix;拒绝裸通配符)。条目必须是主机名,而非 URL:host:port条目仅匹配带有显式端口的 URL(URL 解析器会移除默认的:80/:443——这类情况请列出不带端口的主机);通配符条目不能带端口;IDN 主机名必须以 punycode(xn--…)列出;IPv6 字面地址须带方括号([2001:db8::1]); - 仅允许
http:/https:,不得包含内嵌凭据,且绝不跟随重定向; - 除非逐字列入允许列表,否则会拒绝回环、链路本地、私有、唯一本地、CGNAT、未指定和多播地址字面值(包括十进制 / 八进制 / 十六进制写法以及 IPv4 映射的 IPv6)。防护仅检查字面值——列入允许列表但解析到内部地址的主机名(DNS 重绑定)无法被检测,因为不添加依赖就无法进行解析;允许列表中仅添加你控制的主机;
- 在流式传输过程中强制执行每次请求的超时(
PDFNATIVE_MCP_NETWORK_TIMEOUT_MS)和响应上限(TSA 为 256 KiB、OCSP 为 1 MiB、CRL 为 16 MiB),因此超大响应会被截断,而不是缓冲; - 响应方返回的 OCSP 响应和 CRL 在由
add_ltv嵌入之前会经过解析验证; - TSA URL 受操作者信任(仅检查方案和凭据);绝不会在日志或错误消息中记录或回显
PDFNATIVE_MCP_TSA_AUTH密钥。
每次调用都会构建 Provider,并通过 pdfnative 的每次调用选项传入——绝不使用进程级 Provider 设置器,因此并发请求之间不会共享任何内容。server/discover 说明会报告当前的出站策略(仅端点类型,绝不包含密钥)。
请参阅 SECURITY.md 了解负责任披露流程,并参阅 docs/guides/LTV.md 了解操作者配置方法。
🧪 本地开发
git clone https://github.com/Nizoka/pdfnative-mcp.git
cd pdfnative-mcp
npm ci # .npmrc sets ignore-scripts=true: nothing builds on install
npm run gate:fast # before every commit: typecheck:all, lint, test, server-json, verify:docs
npm run gate # the CI profile: build, dist checks, stdio smoke test, tool shape, samples, coverage, docs, corpus, validate:pdfx
npx tsx scripts/gate.ts --publish --require-all # release branches: everything incl. validate:pdfa (veraPDF); a skipped step fails
npm run gate(scripts/gate.ts)是通过标准的唯一判定依据——1631 项测试、vitest.config.ts 的覆盖率阈值,以及通过标准输入输出运行的构建后服务,其中标准输出只能包含 JSON-RPC 帧。该脚本每个步骤打印一行,并将日志写入 test-output/.gate/<step>.log;--only <step> 只运行一个步骤,--json 输出机器可读内容(如需传递标志,请直接调用脚本:npx tsx scripts/gate.ts --fast)。各个步骤都是常规的 npm 脚本:
npm run build && npm run test:generate # drive the built server under TZ=UTC, operator variables scrubbed -> test-output/samples/
npm run verify:samples # hold the 96 samples to tests/_fixtures/samples.sha256.json (93 by bytes, 3 by a semantic projection)
npm run corpus:pdfa # write the 41-file conformance corpus (33 claim PDF/A, 6 claim PDF/X-4, 2 page-tree outputs claim nothing)
npm run validate:pdfx # in-process structural PDF/X-4 check of the corpus; never skips
npm run validate:pdfa # veraPDF over the PDF/A files (VERAPDF_HOME, JAVACMD); exit 0 ok / 1 conformance / 2 infrastructure
npm run verify:docs # every count, version, tool, error code, operator variable, link and anchor in the docs vs docs/assets/ecosystem.json and src/
npx tsx scripts/tool-shape.ts --write # only after a deliberate tools/list schema change (npm run verify:tool-shape checks the fixture)
有意更改输出时,应使用 npx tsx scripts/verify-samples.ts --update 重新生成基准,并在发布说明中声明——绝不能为了掩盖意外情况而这样做。使用 veraPDF 1.30.2 时,语料库中有 27 项通过、6 项符合预期的失败(必须继续被拒绝的负向哨兵用例)。所有脚本及其标志和退出代码都列在 scripts/README.md 中。
通过标准输入输出对服务进行冒烟测试:
node dist/cli.js
# In another terminal, send a JSON-RPC initialize request via stdin (e.g. with mcp-inspector).
贡献者: 请从
AGENTS.md开始(其中包含所有编码 Agent 和贡献者都应遵守的仓库规则),并参阅 docs/guides/LOCAL_TESTING.md,了解完整的本地验证工作流——质量门禁、将示例用作测试、验证生成的 PDF 在结构上是否正确(assertValidPdf、inspect_pdf、validate_pdf、verify_pdf)、在查看器中打开输出、使用 veraPDF 进行外部 PDF/A 检查,以及使用 MCP Inspector。
📣 发布流程
pdfnative-mcp 遵循与 pdfnative 相同的发布规范:
- 每个标签对应一个发布说明文件,路径为
release-notes/vX.Y.Z.md CHANGELOG.md与每次发布的条目列表保持一致- GitHub Release 正文从
release-notes/vX.Y.Z.md复制 npx tsx scripts/release-prepare.ts --version X.Y.Z执行版本升级中的机械性工作(不会提交、创建标签或发布);package.json、src/version.ts、server.json和docs/assets/ecosystem.json中的版本会同步更新- 发布分支必须通过
npx tsx scripts/gate.ts --publish --require-all——所有步骤都必须通过,包括 veraPDF,不得跳过 - npm 发布通过 GitHub Actions Trusted Publishing(OIDC)处理,无需
NPM_TOKEN,并在受保护的环境中进行:工作流会检查标签是否与软件包版本一致,运行发布门禁并使用--provenance发布;第二个作业会为 tarball(构建来源证明)生成证明,并附上 CycloneDX SBOM,二者都会附加到 GitHub Release - 每个 Linux 和 Windows 作业都以
step-security/harden-runner开始(该 action 不支持 macOS;macOS 作业是文档记录在案的例外),检出时使用persist-credentials: false,使用npm ci --ignore-scripts安装,并在最小权限的permissions下运行;actions 均通过提交 SHA 固定;veraPDF 作业为阻断项 - 人工参与流程:编码 Agent 负责准备和验证;维护者负责推送、创建拉取请求、打标签和发布(
.github/AGENT_RULES.md)
请参阅 release-notes/TEMPLATE.md,了解规范结构和发布检查清单;发布流程请参阅 CONTRIBUTING.md。
📚 项目结构
src/
├── cli.ts # entrypoint: stdio (default) or Streamable HTTP (PDFNATIVE_MCP_PORT)
├── http.ts # Node http <-> Web Request/Response bridge + Host/Origin loopback guard
├── auth.ts # opt-in HTTP bearer token (PDFNATIVE_MCP_HTTP_TOKEN)
├── base64.ts # base64 / DER boundary decoding with agent-facing diagnostics
├── index.ts # public library exports
├── server.ts # Server factory, tool registry, cache hints, SERVER_INSTRUCTIONS
├── network.ts # operator-configured TSA / OCSP / CRL egress + SSRF guard
├── print.ts # print-production schema (boxes, bleed, marks + colour bars, userUnit, RGB / CMYK / Gray outputIntent, metadata, creationDate)
├── pdfx.ts # pdfx: 'pdfx4' conformance target + the static conflicts refused before the build
├── color.ts # shared colour fragment: CMYK operand string / percent tuple beside each historical form, toEngineColor()
├── typography.ts # the typography fragment (12 opt-in keys) + TypographyOptions mapper
├── reproducible.ts # operator-pinned creation instant (PDFNATIVE_MCP_CREATION_DATE, SOURCE_DATE_EPOCH)
├── diagnostics.ts # engine diagnostics sink (PDFA_* / PDFX_* / TYPOGRAPHY_*), strict escalation by code, includeDiagnostics, embedFonts
├── chart.ts # charts v2 schema + ChartBlock mapper
├── blocks.ts # the 7 extended document blocks (table, image, link, toc, barcode, svg, formField)
├── layout.ts # pageSize / margins / header & footer templates / compress / debug / encrypt / typography (PdfLayoutOptions)
├── table.ts, barcode.ts, form.ts, image.ts # bodies shared by a dedicated tool and its inline block
├── watermark.ts # text and/or image watermark + position, PDF/A-1b transparency guard
├── encryption.ts # password + encrypt schema (Standard Security Handler), decrypt error mapping
├── inflate-cap.ts # PDFNATIVE_MCP_MAX_INFLATE_BYTES (engine decompression cap) + PDF_PARSE_FAILED mapping
├── output.ts # sandboxed file writer / base64 emitter (single + multi)
├── text.ts # newline sanitizer (Safe PDF/A)
├── doc-features.ts # nested lists, outline, page labels, viewer prefs (+ print-dialog defaults)
├── pagetree.ts # page-tree error mapping (merge/split/extract)
├── crypto-provider.ts # node:crypto signing provider for DER keys (SHA-256/384/512); verification stays pure JS
├── projection.ts # verbosity / fields projection for the seven read tools
├── errors.ts # ToolError, SecurityError, GovernanceError
└── tools/
├── generate-basic-pdf.ts
├── inspect-layout.ts
├── add-barcode.ts
├── sign-pdf.ts
├── add-ltv.ts
├── timestamp-pdf.ts
├── update-metadata.ts
├── add-international-text.ts
├── add-table.ts
├── add-form.ts
├── read-form-fields.ts
├── fill-form.ts
├── add-chart.ts
├── embed-image.ts
├── inspect-pdf.ts
├── verify-pdf.ts
├── validate-pdf.ts
├── add-attachment.ts
├── extract-attachments.ts
├── extract-text.ts
├── merge-pdfs.ts
├── split-pdf.ts
├── extract-pages.ts
├── annotate-pdf.ts
├── encrypt-pdf.ts
├── decrypt-pdf.ts
├── draft-governance-issue.ts
└── prepare-signature-placeholder.ts
scripts/ # TypeScript run by tsx — the full table is in scripts/README.md
├── gate.ts # THE quality gate (npm run gate / gate:fast; --publish --require-all on release branches)
├── generate-samples.ts # npm run test:generate — the built server under TZ=UTC -> test-output/samples/
├── verify-samples.ts # npm run verify:samples — the byte baseline (tests/_fixtures/samples.sha256.json)
├── generate-pdfa-corpus.ts # npm run corpus:pdfa — the 41-file PDF/A + PDF/X-4 conformance corpus
├── validate-pdfa.ts # npm run validate:pdfa — veraPDF (PASS/FAIL/XFAIL/XPASS; exit 0 / 1 / 2)
├── validate-pdfx.ts # npm run validate:pdfx — in-process structural PDF/X-4 check, never skips
├── tool-shape.ts # structural tools/list fingerprint (--write refreshes tests/_fixtures/tool-shape.json)
├── verify-docs.ts # npm run verify:docs — the docs held to docs/assets/ecosystem.json and the source tree
├── release-prepare.ts # mechanical version bump (never commits, tags or publishes)
├── build-claude-rules.ts # npm run agents:rules — .github/instructions/ -> .claude/rules/
└── verify-issue.mjs # governance draft checker (npm run verify:issue)
docs/
├── AGENT_CONTRACT.md # the consumer contract for agents that USE the server (catalogue, decision tree, recipes, error codes)
├── AI_GUIDE.md, KNOWLEDGE_BASE.md, API_STABILITY.md
├── guides/ # PDFA, PRINT, TYPOGRAPHY, REPRODUCIBLE, CHARTS, FORMS, ENCRYPTION, LTV, AI_GOVERNANCE, LOCAL_TESTING
└── assets/ecosystem.json # the single source of every count and version quoted in the docs
examples/ # 43 executable tools/call sequences (npm run examples:check)
AGENTS.md, CLAUDE.md # repository rules for coding agents; .github/instructions/ holds the per-area rules
.claude/ # shared agent settings, the fail-closed guard hook, generated rules, the release-audit skill
.github/workflows/ # ci (Node 22 / 24 on Linux, plus Windows and macOS, all running the gate, all required), publish, sample-regression, verapdf (blocking),
# docs, codeql, scorecard, dependency-review, audit
.github/rulesets/ # branch and tag rulesets to import
tests/ # vitest suites (one per tool / module), _fixtures/ (tool shape, sample baseline, engine-surface matrix,
# the frozen 1.5.0 catalogue), tools/ (repository tooling)
🗺 路线图
v1.7.0 已发布(精美排版、CMYK 颜色、PDF/X-4、27 种 Unicode 文字、在所有主机上均可复现的输出、pdfnative 1.8),是在 v1.6.0(完整引擎覆盖——13 种块类型、布局选项、inspect_layout——PAdES LTV 阶梯、印刷生产、图表 v2、update_metadata、MCP 2026-07-28)的基础上推出的。完整计划——已发布的里程碑、进行中的工作和长期方向——见 ROADMAP.md。
仍暂缓的事项:
redact_pdf— pdfnative 没有内容移除 API;仅通过覆盖层实现的“涂黑”会造成虚假的安全感。- 自定义字体(操作端字体目录)以及
annotate_pdf中的link注释——已列入路线图,但不会纳入 v1.7.0。 - 原生 ECDSA 验证——pdfnative 不导出
ecdsaVerifyHash;verify_pdf对 P-256 继续使用纯 JS 路径。 - HTTP 页面流式传输——MCP 2026-07-28 仍不支持部分
structuredContent,因此大型结果仍会一次性返回。
有功能想法?欢迎提交 issue 或 PR。
⭐ 为项目点星
如果 pdfnative-mcp 对你有帮助,请给此仓库点个 ⭐——也可以为底层引擎 Nizoka/pdfnative 点星。星标能帮助更多人发现这个项目,并激励我们持续开发。
🤝 参与贡献
我们非常欢迎贡献。请阅读 CONTRIBUTING.md,查看未解决的问题,并遵守行为准则。
📄 许可证
MIT © 2026 Nizoka。第三方材料:THIRD-PARTY-NOTICES.md。
pdfnative-mcp 基于 pdfnative 和 Model Context Protocol TypeScript SDK 构建。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。