pdfnative-mcp
pdfnative-mcp
用于 PDF 生成、PDF/A 归档、带长期验证的 PAdES 签名、AcroForms、合并/拆分、加密与布局预览的 MCP 服务器 — 基于 pdfnative 引擎(零依赖、符合 ISO 32000/1)的 28 个工具,适用于 Claude Desktop、Cursor、ChatGPT 以及任何 Model Context Protocol 客户端。
[](https://www.npmjs.com/package/pdfnative-mcp]
✨ 功能
pdfnative-mcp 向任何 MCP 主机提供 28 个生产级工具:
工具 | 用途 |
| 由 13 种块类型生成多页文档 — |
| 对相同的 |
|
|
| 24 种文字系统(含 Latin 与支持国旗 / ZWJ 序列的 COLRv1 彩色表情符号),具备 BiDi 与 OpenType 塑形;每文档支持多语言。 |
| 表格报告,支持智能字段( |
| 创建新的交互式 AcroForm PDF,含文本字段、文本区域、复选框、单选按钮、下拉框、列表框(+ |
| 对现有 AcroForm 字段树进行只读枚举(名称、类型、值、控件)。 |
| 现有 AcroForm 的 fills / 扁平化(非破坏性增量更新)。 |
| 原生矢量图表 v2 — bar / barH / stackedBar / stackedHH / line / line / area / scatter / pie / donut,支持次坐标轴、对数与时间刻度尺、数据标签(纯 PDF 路径操作符,PDF/A 安全)。 |
| 将 JPEG 或 PNG 图像(base64)嵌入带标题的 PDF 文档( |
| 签名流程的可选第 1 步 — 创建备 |
| PAdES B-B / B-T CMS 签名(RSA-SHA256/384/512、ECDA-SHA256 P-256; |
| PAdES B-LT — 嵌入 |
| PAdES B-LTA — 从运营方配置的 TSA 追 RFC 3161 |
| 验证每个 PAdES 签名与文档时间戳(完整性 + 签名值 + 可选受信任链; |
| 只读验证 Tagged PDF 的 PDF/UA (ISO 14289-1) 结构一致性。 |
| 生成带嵌入文件的 PDF/A-3 文档(Factur-X / ZUGFeRD 发票)。 |
只读提取嵌入的文件(Factur-X / ZUGFeRD XML 的往返),负载逐字节一致。 | |
| Unicde 文本提取(解析 |
| 只读检查:PDF 版本、页数、加密(+精确的 |
| 以增量更新方式重写现有 PDF 的 |
| 使用 AES-128 / AES-256 重新保护 PDF(owner / user 密码、权限、密码轮换)。 |
| 输出 RC4 / AES-128 / AES-256 文档的未加密副本。 |
| 通过 pdf-merge 的原生页树 API 将 2–50 个 PDF 合并成一个(页面框保留)。 |
| 将一个 PDF 按页范围拆分为多个文档(多输出)。 |
| 提取任意页面子集到一个 PDF 中。 |
| 添加标记批注(高亮、注释、方块/圆形、直线、自由文本)作为视觉覆盖层 — not 涂改; |
| 在本地起草一份合规的 GitHub issue,供人审查;绝不提交、不连网。 |
v1.6.0 新功能:
1 完整引擎覆盖 — 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)、`headderTemplate` / `footerTemplate`,支持 `{page}` `{pages}` `{title}` `{date}`(指定 `footerTemplate` 会替换默认页脚,因此随后的 `footerText` 会被忽略;`{date}` 是构建当天的墙上时间,不是 `creationDate`)、`compress`(FlateDecode 流——文件更小,但字节不同;PDF/A 下 XMP 仍为明文)和 `debug`(辅助参考矩形、未标记内容——不可用于 PDF/UA)。默认不附带这些选项,因此默认输出保持字节级完全一致。
🔐 构建时加密 — 在七个文档工具(`generate_basic_pdf`、`add_table`、`add_form`、`add_international_text`、`embed_image`、`add_barcode`、`add_char
)上提供 \encrypt`:标准安全处理器(Standard Security Handler),默认 AES-128 / AES-256,保留 AcroForm(与 `encrypt_pdf` 不同,后者会重建页面树)。与 `pdfA` 互斥(`VALIDATION_EXPLOR`),绝不缓存;在 `prepare_signature_placeholder`(必须保持可签名)或 `add_attachment`(PDF/A-3)上不提供此选项。📏 `inspect_layout` — 第 28 个工具:对相同的 `blocks` 和 `layout` 输入做只读分页预览,在不渲染 PDF 的情况下报告 `totalPages` 以及每 block 的 page / x / top / width / height。已知引擎缺口:`toc` 块被量计为 0 pt,因此含打印目录的文档实际分页可能比预览晚 1 页。
🔎 `inspect_pdf annotations: true` — 列出每个页面标注(子类型 subtype、0 基页、rect、截断到 200 字符的 contents、title、colour、quadPoints、link URL),以及 `annotationCount`;新增 `check: 'annotations'`。
🖼️ 图片水印 — `generate_basic_pdf` 和 `add_table` 支持 `watermark.image`(JPEG/PNG,默认 opaque 0.10,自带 8 MiB 上限),颜色可单独使用或与 `text`(默认 opacity 0.15)组合;两者都支持 `position: 'background' | 'foreground'`。在 `pdfa1b` 下,任何不透明度低于 1.0 都会被拒绝。
\ `PDFNATIVE_MCP_MAX_INFLATE_BYTES` — 操作者覆盖引擎每流 100 MiB 解压上限操作符(整数 ≥ 1024;无效会拒绝启动)。若附件流被限压上限卡住,`extract_attaactions includeData: true` 会以 `PDF_SE_FAIED` 失败;`extract_text` 会降级为空白页文本(引擎吞掉每页解码失败)。
📝 表单 — `add_form` 和 `formField` 块新增 `textbox` 和 `placeholder`;`fieldType: 'textarea'` 现在以 `multilineText` 传到引擎(之前未映射直接透传并渲染为单行单字段——这是 bug 修复,会改变该输入的字节)。`embed_image` 新增 `align` 和 `alt`。
🔵 PAdES 长期验证阶梯 — `sign_pdf` 新增 `profile: 'pades'`(ETSI EN 319 142-1 baseline、ESS signing-certificate-v2、`ETSI.CAdES.detached`)、`timestamp: true`(B-T,RFC 3161)、RSA-HA384/512、`certChainDerBase64`、`fieldName` / `allowMultiple` 用于正常加密签名;新的 `add_ltv` 嵌入
/DSS\(B-LT;`mode: 'online'` 通过操作者提供方,或 `mode: 'offline'` 使用调用方提供的 DER 材料);新的 `timestamp_pdf` 追加/DocTimeStamp\(B-LTA)。`verify_pdf` 的 `ltv: true` 会报告 profile、timestamp、吊销状态以及 `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` 会报告这些 box;merge / split / extract 会保留它们。见 `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 不嵌入,因此对纯文本 Latin 文本做 PDF/A 声明会被 veraPDF 拒绝);`strict: true` 选择失败而不是产生不合规文件;`includeDiagnostics: true` 会回传引擎诊断信息。本地运行 veraPDF 验证脚本(`npm run validate:pdfa`)测试 26 个文件的语料库(其中 24 个通过验证,3 个为负面 canaries,跳过 2 个 pages-tree 输出),并支持 fail-closed 的 `VERAPDF_REQUIRED=1` 模式;CI work 使用 SHA-256 固定安装包,且在 1.6.0 中保持非 blocking 状态。已知引擎缺口:`add_form` 即使启用 `embedFonts`,其输出仍不通过 PDF/A-2b(存在未嵌入的
/DR /Helv);`prepare_signature_placeholder` 的输出只有在签名后才合规。🧰 `inspect_pdf` — `signatures: true` 时可枚举签名;`dss` / `docTimeStampCount` / `trapped`(存在性 gating)新增了 `check` 值 `dss`、`docTimeS`、`trapped`;`checks` 只列出你指定的键,且 `signed` 是结构性的(只要存在签名字段字段,有效与否交由 `verify_pdf` 负责)。
🔁 可复现输出 — 所有九个文档工具都可以选设 `creationDate` 固定
/CreationDate\、XMP 日期和 trailer/ID\;`signingTime`(`prepare_signature_placeholder` 和 `sign_pdf` 现在传递给时区偏移)可固定/Sig /M\。在同一台主机的同主机时区下,字节完全相同。由 `reproducible_output` 提示词提供支持。͡️ 加固边界 — 严格的输入 schema(未知或拼错的键 →
VALIDATION_EXPLOR\而不是静默覆盖);容忍 `data:…;base64,` 前缀,但拒绝 PEM 默认置于 DER、双倍编码的载荷,并附上解决建议;在页面树工具中错误页索引触发VALIDATION_ERROR且附带 0-based 提示;未知工具名是 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.4.0 约 108 kB),因为现在每个块 kind、layout option 和 `encrypt` fragment 都会内联声明——按策略不使用 `$ref` / `$defs`,因此将
inputSchema\转发给 function-calling API 的 host 永远不会遇到引用问题;服务器说明约 6.7 kB(从 12.9 kB 降)。这种结构由 `scripts/tool-shape.mjs` + `tests/catalog-parity.test.ts` 守护,而 `tests/catalogue-superset.test.ts` 证明在线目录是已发布 1.5.0 目录的 superset;每个工具最多只带两个可执行_meta.examples\,其余例子放到 ``examples/` 下面。新增四个 recipe 提示词:` pades_ladder`、`print_ready`、`reproducible_output`、`pdfa_valid`。🐛 修复 — 在 pdfnative < 1.7 中,签名者 /SignerName / reason / location / contactInfo 未写入
/Sig字典;现在会在此方体过程在占位阶段提前嵌入。`verify_pdf` 不再对 B-LTA 文档报告 `allValid: false`(此前一个 `/DocTimeStamp 被误当作 CMS 签名)。🔌 MCP 2026-07-28 — 基于 MCP TypeScript SDK v2(`@modear
)的 MCP 2026-07-28,自动回退到 2025 时代的 \initialize` 握手——现有主机无需改动即可继续使用。参见 [MCP 协议 compliance](#- m-wrapper).引擎升级 — pdfnative v1.7.0 (LTV、print生产、charts v2、digest 声 4?——译:...).
v1.5.0 新功能:
📊 原生矢量图表 — `add_chart` 将条形 / 水平条形 / 线形 / 饼图 / 环形图渲染为纯 PDF 路径算子(不是栅格,PDF/A-safe,自动 alt 属性)。`generate_asic_pdf` 现在也接受 `pretty` block 与文字和表格一起布局。
📝 Fill & flatten 表单 — `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),并在 file 模式结果中带有resource_link,可在跨调用时重新引用。** tool annotations** — 每个工具公布
readOnlyHint/destructiveHint/idempotentHint/openWorldHint。⬆ 引擎升级 — pdfnative v1.6.0 (解密/加密、extractText、填表 / 展开、charts;color-emoji subsets 221 → 1167 glyph)。
v1.4.0 新功能:
🤝 AI 治理 + 人在环回 —
draft_governance_issue让代理在本地起草完全合规的 GitHub issue(草稿 .md + 机器可读的合规报告)。代理是起草者,绝不自主提交:人类是唯一门槛,服务器零 GitHub 写入(且自 v1.6.0 起,除操作者配置的 TSA / OCSP / CRL 端点外不发任何出站请求)。由governance_contract与draft_issue_workflowMCP prompts 支持。✏️ 标注等 —
annotate_pdf增量式地在现有 PDF 上叠加高亮、便签、下文线、删除 & 上的强调、正方形、圆圈、直线和自由文本标注。它只是一个视觉审阅层,而非 redaction,原字节依然存在。🔢 inspect_pdf 中的页标签 — 只读3
inspect_pdfnow provides/PageLabelsranges(main / decimal / prefixed)。∑ 数学 / 科学文本 —
add_international_text拥有lang: 'math'(显式,像emoji一样)按需嵌入 Noto Sans Math。🔌 MCP prompts — server now advertises
promptscapability withgovernance_contractanddraft_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。${cell border... Here we must not translate code names. Let's translate carefully. We'll present after.
Let's craft final full text.* 三个页面树工具** — merge_pdfs、split_pdf、extract_pages(基于 pdfnative v1.4.0 构建;加密源文件在 v1.5.0 加入 password 之前会被拒绝)。
🔖 书签、标签与嵌套列表 —
generate_basic_pdf新增outline('auto'或显式树)、pageLabels、多层list项和viewerPreferences。📐 表格单元格边框与对齐 —
add_table新增cellBorders、cellVAlign和viewerrences;add_international_text新增viewerPreferences。🔐 Constant-time signing —
sign_pdf签名 RSA 和 EC-DER 密钥,通过node:crypto提供者,并支持透明纯 JS 回退(原始 P-256 标量保持纯 JS,签名验证也纯 JS);签名保持互操作。引擎升级 — pdfnative v1.5.0。
新增工具
extract_attachments— 从 PDF 中读回嵌入文件(完成 Factur-X / ZUGFeR 的往返),支持逐字节的载荷、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;自 v1.5.0 起read_form_fields)可接受可选的verbosity: 'summary'和fields: [...]参数,从而使大型结果集响应体积约减少 90%,同时不丢智能体所依赖的字段。默认设置不变。no base64 duplication — 生成的 PDF(base64 模式)只返回一次作为嵌入的
resource内容块,而不再同时复制到structuredContent。🔧 MCP registry publish fix —
mcpName现在使用规范的 GitHub 登录名大小写形式(io.github.Nizoka/pdfnative-mcp),以使注册表的区分大小写校验接受该 npm 包。依赖 — 升级到 zod 4。
v1.1.0 中的新增功能:
工具
validate_pdf— 只读的 PDF/U (ISO 14289-P) 结构正确性检查。六种新文字 — 泰卢固、僧伽罗、藏文、高棉文、阿姆哈拉、吉巽亚文(共 24 个 scripts)。
COLRv1 彩色 emoji — 原生彩色 emoji,并支持无彩色回退。
工具 newline sanitizer —
...中的\input with paragraph 内嵌\n自动拆分为独立段落(PDF/A 安全)。Automatic NFC normalize 为
add_international_text。引擎升级 — pdfnative v1.4.0 : 欧元符号 / CP-125符号现在可以正确提取,表单元格换行时获得唯一的逐-ine MCIDs(符合 PDF/A 规范)。
v1.0.0 中的新增功能:
三个新工具:
verify_pdf、add_attachment(Factur-X / ZUGFeR)、extract_text。智能表格字段:
wrap、repeatHeader、zebra、caption、minRowHeight、cellPadding。inspect_pdf现在报告hasSignaturePlaceholder以及 per-astachment summary;新的check值有'placeholder'和'attachments'。签名体验改进:
sign_pdf接受 ECDSA SEC1 / PKBS#8 DER 密钥,并在缺少时自动注入/Sig占位(一键签署任意 PPDF)。可选缓存(
PDFINATIVE_MCP_CACHE_DIR):以 SHA-256 为键,过期时间 1小时,LRU 256 MiB。_meta.apiVersion和每个工具_meta.examples用于 AI 代理发现 — 见docs/API_STABILITY.md。AI 代理指南:
docs/AI_GUIDE.md— 决策树及常见错误。另见根目录AGENTS.md操作手册。PDF/A 编写指南永久:
docs/guides/PDFA.md。环境变量重新名称:
PDFNATIVE_MCP_UTPUT_DIR(先前为PDFNATIVE_MPC_OUTUT_DIR;旧名称仍可用,只显示一次弃用警告)。✅ 当前:
merge_pdfs,split_pdf,extract_pages(v1.4.0 工具)、annotate_pdf(v1.4.0 工具),以及 v1.5.0 工具(sign_pdf等)。** 为您提供。
All tools support two output modes:
base64(默认) — 生成的 PDF 一次返回为嵌入的resource内容(以data:application/pdf;base64,…形式);structuredContent仅包含{ mode, sizeBytes }(如果includeDiagnostics: true还包括diagnostics[],以及add_ltv的summary)。file— PDF 写到由PDFNATIVE_MCP_OUT_DIR配置的沙箱目录。除非设置该变量,否则禁用;拒绝绝对路径、路径传递、非.pdftail 且不接受 NUL 字节。
从 v1.1.0 升级:唯一的行为变更是不再将 base64 字节输出到
structuredContent.base64。请从嵌入式content块读取:- 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
Token 节省读取(v1.0)——七个只读工具(inspect_pdf, verify_pdf, validate_pdf, extract_text, extract_attachments, read_pdf_fields, inspect_layout) 支持两个可选输入:
verbosity: 'summary'— 返回精简标量结只(由您调用),例如verify_pdf→{ signatureCount, allValid, invalid, summary }(如ltv: true则还包含ltvLevel);inspect_pdf保留存在的hasDocumentTimestamp,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/3b/2u/3b、AI-128/256 加密、AcroForm、数字签名。
支持 24 种文字(25 个
lang代码,含emoji和math),具备 BiDi 重排、阿拉伯语定位文本、泰语/天城文/孟加拉/泰米尔语 OpenType 特性。可安全树structure ESM。
Related MCP server: document-intelligence-mcp
Installation
# Run directly with npx (recommended for MCP clients)
npx -y pdfnative-mcp
# Or install globally
npm install -g pdfnative-mcp
pdfnative-mcp条件:Node >= 22。
Configuration
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 / Red Code
任何以 stdio 方式运行的 MCP 兼容客户端均可使用。使用同样的 command + args + env 三点。以 Curser(~/.curser/mcp.json)为例:
{
"mcpServers": {
"pdfnative": {
"command": "npx",
"args": ["-y", "pdfnative-mcp"],
"env": { "PDFNATIVE_MCP_OUTPUT_DIR": "/Users/you/Documents/mcp-pdfs" }
}
}
}本级开发环境兼容性:见上方
#节。
🌐 支持的 AI 生态环境与客户端
pdfnative-mcp 面向 MCP 原生环境设计,兼容以 stdio/HTTP 的 MCP 客户端。社区确认的兼容联系人包括:。
MCP 协议 external 11: 支持
自 v1.6.0 起,服务器基于 MCP TS-SDK v2(@modelscontext),并实现 MCP 2026-2026:
无状态服务 —
server/discover取代initialize;所有响应包含resultType及_meta.serverInfo。缓存提示 —
tools/list,prompts/list标注为public并设ttlMs24 h;server/discover为public;resources/list列为private,ttlMs: 0。资源错误 — 未知 URI 返回 JSON-RP
-32602。** legacy fallback** —
initialize请求来自 2025-11-25 等旧客户端时,则通过 SDK 的兼容路径继续服务。协议错误 —
tools/call未知工具名返回-32602;不返回isError。输出模式 —
structuredContent接受optionschema(2025-06-18 规定),且不设置$schema。
MCP protocol behavior after app reads as follows.
客户端 | 传输 | 协议 |
Claude Desktop 等 | stdio | 过去 |
Chat(等 HTTP | HTTP | legacy HTTP |
MCP 客户端 2023 | stdio |
|
Related | stdio |
|
Server配置
环境变量包含:PDFNATIVE_MCP_CACHE_DIR, PDFNATIVE_MCP_OUTPUT_DIR, PDFNATIVE_MCP_HTTP_TOKEN。
变量 | 用途 |
| 沙盒目录的绝对路径。启用 |
| 启用持久化 SHA-256 键控结果缓存的绝对路径(TTL 1 小时,256 MiB LRU;键按工具 API + 包版本划分命名空间)。未设置时,缓存处于禁用状态。从不缓存 |
| 当设置为有效端口(1–655S35)时,在 |
| (v1.6.0, 机密) 用于 HTTP 传输的可选 Bearer 令牌(≥ 16 个字符,不含空白 — 若更弱则会导致启动中止)。设置后,每一个 |
| (v1.6.0) 覆盖引擎的每流 100 MiB 解压上限(zip-bomb 防护):一个 ≥ 1024 的正整数 byte 数,在启动时只读取一次 — 无效值则拒绝启动。在共享主机上调低它,对可信的大扫描归档可调高。超限的附件流会让 |
| (v1.6.0) 由 |
| (v1.6.0, 机密) 发送给 TSA 的可选 |
| (v1.6.0) |
| (v1.6.0) 用于 OCSP/ CRL 响应器的使用逗号分隔的允许清单( |
| (v1.6.0) TSA/OCSP/CRL 调用的每次请求超时,1000–120000 毫秒(默认 10000)。 |
工具参考
[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 种 block 种类:headin、paragraph、list、table、image、ling、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 块每块上限 12M base64 字符、每块解码后 24 MiB(PNG:8bit 灰度/RGB、非交错、无 alpha 通道、无调色板 — 否则返回 VALIDATION_ERROR 并附带可修复方案);svg 支持 <path>、<rect>、<circle>、<ellipse>、<line>、<plyline>、<plygon>、<text>/<tspan>,并静默忽略 transform、<g>、<use>、<image>、渐变、不透明度与 CSS(不获取任何外部引用);toc 由 heading 块构建,并与 outline: 'auto' 搭配;在 pdfA 下 formField 会报告 PDFA_UNEMBEDDED_FORM_FONT(strict: true 时失败);barcode 不提供 alt。在渲染前可用相同输入先调用 inspect_layout 预览分页结果。
add_barcode
{
"format": "qr",
"data": "https://pdfnative.dev",
"caption": "Scan to learn more",
"ecLevel": "H",
"outputMode": "file",
"outputPath": "tickets/event-42.pdf"
}支持的格式: qic、jasafe, code128, ean13, datamatrix, pdf417。
add_interrnational_text
{
"title": "مرحبا بالعالم",
"lang": "ar",
"paragraphs": [
"هذا اختبار للنص العربي مع تشكيل OpenType ومحارف ثنائية الاتجاه.",
"Mixed content: العربية + English ✓"
]
}支持的 lang 代码(25 个):ar, he, th, ja, zh, ko, el, hi, bn, ta, ru, ka, hy, tr, pl, vi, latin, te, si, bo, km, my, am, emojii, math。字体始终嵌入(没有 embedFonts 这个输入);想获得逐字节相同的输出请固定 creationDate。
多脚本文档 — 传入一个数组或逗号分隔列表:
{
"title": "Mixed Script",
"lang": ["ar", "emoji"],
"paragraphs": ["العربية مع رموز 🎉🚀"],
"pdfA": "pdfa2u"
}sign_pdf
自 v1.0.0 起,sign_pdf 会缺失时自动注入 /Sig 占位符 — 一次调用即可签署任意 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 或 PKS#8 DER)或 ecPrivateScalarHex(64 个十六进制字符)。
PEM → DER 转换:
openssl x509 -in cert.pem -outform DER | base64 -w0 # cert
openssl rsa -in key.pem -outform DER -traditional | base64 -w0 # RSA PKCS#1
openssl pkey -in key.pem -outform DER | base64 -w0 # ECDSA只有当需要自定义占位符时才使用
prepare_placeholder的占位符(例如:大于 4096 位的 RSA 密钥传更大的placeholderBytes、subFilter: 'ETSI.CAdES.detached、reserveTimestamp: true)。否则直接调用sign_pdf` 即可。
PAdES 阶梯(v1.6.0)。sign_pdf 以 profile: "pades" 得到 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_AMBIG_UOUS),而 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"
}Field 类型:text、textarea(多行,/FFf 4096)、checkbox、radio、dropdown、listbox;placeholder 表示在字段空时显示提示文本。添加 encrypt 可生成仍保留其 AcroForm 的密码保护表单。在 PDF/A 声明下,控件外观字体不会被嵌入(PDFA_UNEMBEDDED_FORM_FONT)。
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块和水印图图像的 water。
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 代理。
{
"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'、'ndsign'、'encrypted'、'placeholder'、'parent'、placeholder'、'streams'、signature (括号内的为 v1.6.0 起的 doTimetamp、trapped、annotation)。checksPassed 是所有请求检的全部为真时的逻辑与。signatures: true 会增加每字段清单(subFilter、isDocTimetamp、isPlaceholder、byteRange、vriKey);annotation: true 会增加 annotations[](每个 /Annots 条目:0 起 page、subtype、rect,以及存在时 专人… contents(超过 200 字符会截断)、title、color、quadPoints、链接 url)和 annotationCount;dss、docTimetampCount和trapped仅在存在时出现;在pages: true时每个perPage项还有trimBox/bleedBox/artBox/cropBox/userUnit`(如已经设置)。
inspect_layout
只读型的翻页 pre-非 — blocks 与 generate_basic_pdf 相同,再加上所有会移动块位置的输入(title、footerText、pdfA、normalize、embedFonts、pageSize、margins、headerTemplate、footerTemplate)。不产出任何 PDF;只要给入与将输出 generate_basic_pdf 完全相同的输入值,totalPages 就会相同。
{ "title": "Memo", "blocks": [{ "type": "paragraph", "text": "Short note." }], "pageSize": "Letter", "verbosity": "summary", "fields": ["totalPages"] }完整结果包含 pageW{idth、pageHeight、margins、totalPages 与 页面的 pages[].blocks[] (type、page、x、top节,width、height,单位 pt,保留两位小数)。已知引擎缺口:toc` 块在这里会被量化为 0 pt,所以含本期目录打印的文档实际可能比预览多一页。
validate_pdf
只读的 PDF/UA(ISO 14289‑1) 结构符合性检查,用于 Tagged PDF。用任意工具在 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."
}它检查 PDF 中的 /MarkInfo /Marked true、/StructTreeRoot(+ /ParentTree)、/Media(XMP)、/Size,以及每页 MCID 的唯一性。这是一个快速开发阶段的门禁——并非用于替代完整的参考验证器(veraPDF),后者还会额外检查字体、颜色和渲染。
annotate_pdf
通过增量更新在现有 PDF 上叠加标记批注。这是一个视觉审阅层,不是 redaction(涂黑/删除)——底层内容不会被改动。
{
"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 开始。加密的源文件会被拒绝(ENCRYPTED_SOURCE)——请先运行 decrypt_pdf(该操作会移除签名和 AcroForm),再标注,之后重新运行 en crypt_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。完整的人机协同(human-in-the-loop)契约见 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 Schema + Zod 运行时检查做校验;未知或拼写错误的键(无论顶层还是嵌套)都会得到
VALIDATION_ERROR;并且任何解析执行之前,base64 / DER 载荷都会被做合理性检查(允许data:前缀;PEM 或双重编码的输入会被拒绝,并给出对应的整改提示)。HTTP 传输(
PDFNATIVE_MCP_PORT):仅绑定回环地址;除非设置PDFNATIVE_MCP_HTTP_TOKEN,否则没有身份验证(若缺少该 token,则拒绝401)。
网络与出站
服务器默认不做任何出站网络请求。它可能产生的唯一出站流量,只会前往运维人员在环境中为 PAdES 长期验证而配置的 RFC 3161 / OCSP / CRL 端点(即 PDFNATIVE_MCP_TSA_URL、PDFNATIVE_MCP_REVOCATION、PDFNATIVE_MCP_NETWORK_ALLOWED_HEEDS)——绝不会去访问任何由工具参数提供的 URL,绝不去 GitHub,绝不用于另一类遥测。当这些配置不存在时,sign_pdf timestamp: true、timestamp_pdf 和 add_ltv mode: 'onLine' 都会在触到文档之前快速失败,返回 TSA_NOT_CONFIGURED / REVOCATION_NOT_CONFIGURED;而 add_ltv mode: 'offline' 会把调用者提供的材料 embedding 进文档,且完全不使用网络。
OCSP / CRL 的 URL 来自 PDF 内不可信证书的 ALA / CRL 分发点扩展,因此每次拉取都会经过一个 SSRF 防护:
目标主机必须匹配运维允许列表(
host、host:port或*.suffix;裸通配符会被拒绝)。列表中的条目是主机名,而不是 URL:host:port条目只匹配 URL 中带显式端口的请求(URL 解析器会省略默认的:80/:443——请为这些请求列出裸主机名);通配符条目不能带端口;IDN 主机名必须采用 punycode 形式(xn--…);IPv6 字面量需要带方括号([2001:db8::1]);只支持
http:和https:,不允许内嵌认证信息,重定向请求不跟随;回环、link-local、私有、unique-local、CGNAT、未指定以及组播地址的字面量(包括十进制/八进制/十六进制写法,以及 IPv4 映射的 IPv6)都会被拒绝,除非该字面量已被明确加入白。该防护只检查字面量——因此,已允许的主机名若解析成内网地址(DNS rebinding 攻击)就无法被检测到,因为不增加解析依赖就不会有 resolver;请只允许名单中那台主机确实在你自己的控制下;
每次请求的超时(
PDFNATIVE_MCP_NETWORK_TIMEOUT_MS)和响应大小值(Tsa 为 256 KiB、OCSP 1 MiB、CRL 16 MiB)在流式读取期间都强制执行,因此在响应主体还没有完全取得之前就会将其切断,而不是整个缓冲区读取;OCSP 响应及 CRL 在嵌入
add_ltv之前,会先对响应方返回的内容做解析校验;TSA 的 URL 是运维信任的(仅检查 scheme 与凭据);
PDFNATIVE_MCP_TSA_AUTH的 secret 永远不会出现在日志或错误信息中。提供方(provider)按每次调用构建,并通过 pdfnative 的 per-call 选项传入——进程范围内通用的 PROVIDER 设置器永远不会被使用,因此并发请求之间不共享任何状态。
server/discover指令会输出当前的出口策略(只包含端点类型,从不输出机密信息)。
查看SECURITY.md 以了解负责制史的披露流程,docs/guides/LTV.md 则介绍了运维配置。
🔪 本地开发
git clone https://github.com/Nizoka/pdfnative-mcp.git
cd pdfnative-mcp
npm install
npm run typecheck
npm run lint
npm test
npm run build
npm run validate:pdfa # advisory: veraPDF over the 26-file PDF/A corpus (24 validated; skips when veraPDF is absent; VERAPDF_REQUIRED=1 fails closed)
node scripts/tool-shape.mjs --write # only after a deliberate tools/list schema change (catalogue parity fixture)基于 stdio 对服务器进行冒烟测试:
node dist/cli.js
# In another terminal, send a JSON-RPC initialize request via stdin (e.g. with mcp-inspector).**Contributors:**完整、本地验证工作流请见[Dev,guides/LOCAL_TESTING.md — 包括质量门禁、以示例当测试、验证生成的 PDF 结构是否合法(
assertValidPdf、inspect_pdf、validate_pdf、verify_pdf)、在查看器中打开输出、用 veraPDF 做外部 PDF/A 校验,以及使用 MCP Inspector。
📣 发布流程
pdfnative-mcp 与 pdfnative 遵循相同的发布方式:
在
Goss-notes/vX.Y.Z.md每个 tag 对应一份发布说明;CHANGELOG.md跟随镜像每个发布里设置;GitHub Release 的正文从
Goss-notes/vX.Y.Z.md专辑复制;在 GitHub Actions 的 Trusted Publishing(OID)+ OIDC 机制下完成 npm 发布,无需
NPM_TOKEN。
关于规范结构与发布清单,请见 release-notes/TEMPLATE.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, userUnit, outputIntent, metadata, creationDate)
├── diagnostics.ts # PDF/A diagnostics sink, strict / 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 (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/
├── verify-issue.mjs # governance draft checker (npm run verify:issue)
├── validate-pdfa.mjs # veraPDF run (npm run validate:pdfa; PASS/FAIL/XFAIL/XPASS/INFRA/SKIP)
├── generate-pdfa-corpus.mjs # builds the 26-file PDF/A corpus (24 validated incl. 3 negative canaries, 2 page-tree outputs)
└── tool-shape.mjs # structural tools/list fingerprint (--write refreshes tests/_fixtures/tool-shape.json)
.github/workflows/ci.yml # Linux (Node 22 / 24) + Windows quality gate
.github/workflows/verapdf.yml # non-blocking veraPDF CI job (SHA-256-pinned installer, VERAPDF_REQUIRED=1)
tests/ # vitest suites (one per tool / module; document-blocks, layout-options, inspect-layout,
# watermark, inflate-cap, catalogue-parity + catalogue-superset vs the 1.5.0 fixture)🗺 路线图
v1.6.0 已发布(完整引擎升级——支持 13 种班类型、布局选项、inspect_layout,并具备 PAdES 长期验证、打印生产、charts v2、update_metadata、MCP 2026-07-28)。完整计划等——已发布里程碑、进行中工作、未来方向——可在 ROUTE.md中查看。
暂缓事项:
redact_pdf—— pdfnative 没有内容不可删除的 API;若仅做“覆盖式 redaction”,可能造成错误的安全体验。原生 ECDSA验证 —— router 未提供导出
ecdsVerifyHash;所以verify_pdf对 P-256 保留它的纯 JS 路径。HTTP 页面流 —— MCP 2026-07-28 仍不支持部分
structuredContent,所以大结果只能一次性返回。
有功能建议吗?欢迎提交 issue 或 PR。
⭐ 给项目加个星星
如果 pdfnative-mcp 对你有用,也请把“start”这个仓库——也请顺手对最底层引擎 Nizoka/pdfnative 竖标 star。星标既帮助其他开发者发现您的项目、也激励我持续开发。
🤝 贡献
贡献非常欢迎。请先阅读 CONTRIBUTING.md,查阅本仓库的[open issues](https://github.com/Nizoka/pdfnative issues),并遵守 行为准则。
📄 许可证
[MIT License] © 2026 Nizoka
pdfnative-mcp 是构建于 pdfnative 与 Model Context Protocol TypeScript SDK 之上。
Available Tools
28 toolsadd_attachmentAdd embedded file attachment (PDF/A-3, Factur-X)AIdempotent
PDF/A-3b document with embedded files — the tool for Factur-X / ZUGFeRD e-invoices (one XML attachment, relationship 'Source', mimeType application/xml) or any PDF carrying machine-readable side-files (≤ 8 MiB each). Body via blocks (same schema as generate_basic_pdf). Pair with embedFonts:true for a valid PDF/A-3 claim (strict:true fails otherwise). Read them back with extract_attachments. Print, metadata and creationDate options as on every document tool.
| Name | Required | Description | Default |
|---|---|---|---|
| debug | No | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. | |
| No | Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md. | ||
| title | Yes | Document title (also written to the /Info dictionary). | |
| blocks | No | Optional human-readable document body (same block schema as generate_basic_pdf). When omitted, a minimal cover paragraph is emitted so the PDF is not empty. | |
| strict | No | Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true. | |
| margins | No | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. | |
| compress | No | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. | |
| metadata | No | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. | |
| pageSize | No | Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it. | |
| embedFonts | No | Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB. | |
| footerText | No | Optional footer text rendered on every page. | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). | |
| typography | No | Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt. | |
| attachments | Yes | One or more files to embed. Auto-enables PDF/A-3 (ISO 19005-3). Factur-X invoices use a single attachment with relationship=Source and mimeType=application/xml. | |
| creationDate | No | ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs. | |
| outputIntent | No | Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space. | |
| footerTemplate | No | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. | |
| headerTemplate | No | Running header on every page (left / center / right zones); reserves 15 pt. | |
| includeDiagnostics | No | Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (not read-only, idempotent, non-destructive), and the description adds useful constraints beyond that: the 8 MiB per-attachment ceiling, the requirement to pair with embedFonts:true for a valid PDF/A-3 claim, and that strict:true will fail rather than warn. It does not say what happens on size or strict failure in terms of error surfaces, but the added operational context is substantive.
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?
One dense paragraph, front-loaded with the identity and intended use case, then the critical caveats (size limit, embedFonts pairing), then the read-back pointer and the note that shared options behave as on other document tools. No sentence is filler.
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 20-parameter creation tool with an output schema and full schema coverage, the description supplies exactly the non-schema-critical knowledge an agent needs: when to choose it, the font-embedding prerequisite for compliant output, the per-file size cap, and where to read attachments back. Nothing essential is left implicit.
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 100%, so the baseline is 3; the description still adds the 8 MiB attachment size limit (not in the schema) and the Factur-X recipe (single XML attachment, relationship 'Source', mimeType application/xml) that tells the agent how to fill the required attachments array for the most common case. The blocks parity note with generate_basic_pdf is also useful cross-tool parameter context.
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?
Opens with a specific output type (PDF/A-3b with embedded files) and names the concrete use cases (Factur-X / ZUGFeRD e-invoices, machine-readable side-files), so the agent can distinguish it from generate_basic_pdf and the other document-producing siblings without reading the schema. The 'the tool for X' framing makes the resource and scope unambiguous.
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?
Gives clear selection context (use this when a PDF must carry embedded side-files, e.g. Factur-X) and names a follow-up tool explicitly ('Read them back with extract_attachments'). It stops short of an explicit when-not rule contrasting it with generate_basic_pdf for ordinary documents, which would have made it a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_barcodeAdd barcode / QR codeAIdempotent
Single-page PDF with a barcode: qr (URLs, vCards, UTF-8 ≤ 4296 chars; ecLevel 'H' for print, 'M' default), code128 (ASCII SKUs), ean13 (12–13 digits, checksum auto), datamatrix (dense industrial marks), pdf417 (ID cards, boarding passes). data is the raw payload — never pre-encode. Typical: { format:'qr', data:'https://example.com', caption:'Scan me' }. PDF/A, print, metadata and creationDate options as on every document tool.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Raw payload to encode — do NOT URL-encode. For QR/URL pass e.g. "https://example.com" verbatim. EAN-13 must be 12 or 13 digits (13th is auto-computed). Code 128 accepts ASCII alphanumerics. | |
| pdfA | No | PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md. | |
| pdfx | No | PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt. | |
| debug | No | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. | |
| No | Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md. | ||
| title | No | PDF document title (also rendered as page heading). | Barcode |
| width | No | Barcode width in PDF points. | |
| format | Yes | Barcode symbology to render. | |
| height | No | Barcode height in PDF points (ignored for square symbologies like QR/Data Matrix). | |
| strict | No | Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true. | |
| caption | No | Optional caption rendered above the barcode. | |
| ecLevel | No | QR ONLY. Error correction level (L=7%, M=15%, Q=25%, H=30%). Ignored for code128/ean13/datamatrix/pdf417. Use H for printed media that may get smudged or partially covered (e.g. logo overlay). | M |
| encrypt | No | Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached. | |
| margins | No | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. | |
| compress | No | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. | |
| metadata | No | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. | |
| pageSize | No | Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it. | |
| embedFonts | No | Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB. | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). | |
| typography | No | Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt. | |
| creationDate | No | ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs. | |
| outputIntent | No | Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space. | |
| footerTemplate | No | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. | |
| headerTemplate | No | Running header on every page (left / center / right zones); reserves 15 pt. | |
| includeDiagnostics | No | Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (destructiveHint=false, idempotentHint=true, openWorldHint=false), and the description adds real behavioral context beyond them: the result is a single-page PDF, `data` must be raw (never pre-encoded), and ecLevel should be 'H' for print. It does not discuss outputMode/file sandbox or error escalation, which keeps it below a 5.
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?
Front-loaded with the format taxonomy, then the critical `data` caveat, then a concrete call example — every clause carries information and nothing is redundant.
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 26-parameter tool with full schema coverage and an output schema, the description focuses correctly on what is distinctive (barcode creation, single page, raw payload) and delegates shared options to 'as on every document tool'. A note on outputMode defaults or the returned artifact would make it fully self-contained.
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 100%, so the baseline is 3, but the description meaningfully enriches the two most important parameters: it explains the format enum semantics beyond the schema's terse labels and warns that `data` is the raw payload that must not be pre-encoded, plus ecLevel guidance not fully captured in 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?
States a specific verb and resource ('Single-page PDF with a barcode') and immediately enumerates the supported symbologies with their intended payloads, so an agent can distinguish this from generate_basic_pdf or other document builders without opening the schema.
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?
Gives clear per-format selection guidance (qr for URLs/vCards, code128 for ASCII SKUs, ean13 for 12-13 digits, datamatrix for dense industrial marks, pdf417 for ID/boarding passes) with constraints like the 4296-char limit and auto-checksum. It stops short of naming an alternative tool or stating when not to use it, so it is strong but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_chartAdd native vector chartAIdempotent
Single-page PDF with a native vector chart (pure path operators, no raster): bar, barH, stackedBar, stackedBarH, line (markers), area, scatter, pie, donut. Multi-series, legends, 'nice' ticks, gridlines, negatives; per-series xValues with xAxis.type 'linear' | 'time' (ISO-8601), secondary right axis (axis2 + yAxis:'right'), axis.scale 'log', dataLabels, labelStride / labelRotation. Pie/donut take exactly one series. Colours are hex ('#3366cc'). Tagged /Figure + /Alt (auto when altText is omitted). Engine cross-field rules surface as CHART_ERROR with the remedy. Inside a longer document use a 'chart' block in generate_basic_pdf. PDF/A (pdfA + embedFonts:true), print, metadata and creationDate as on every document tool.
| Name | Required | Description | Default |
|---|---|---|---|
| axis | No | Value-axis options (bar/line only). | |
| pdfA | No | PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md. | |
| pdfx | No | PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt. | |
| align | No | Horizontal alignment within the content width. Default 'left'. | |
| axis2 | No | Secondary RIGHT value axis (drawn only when a series sets yAxis:'right'). | |
| debug | No | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. | |
| intro | No | Optional introductory paragraph rendered above the chart. The chart `title` (if any) is also used as the PDF metadata title. | |
| No | Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md. | ||
| title | No | Chart title rendered above the plot. | |
| width | No | Plot width in points (clamped to content width). Default 460. | |
| xAxis | No | Horizontal axis. 'category' (default) positions points by index; 'linear' / 'time' position them by series xValues (line/area/scatter only). Time ticks are UTC-deterministic. | |
| colors | No | Palette override (per-series for bar/line, per-slice for pie/donut). | |
| height | No | Plot-area height in points. Default 240. | |
| legend | No | Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'. | |
| series | Yes | Data series. Pie/donut charts use exactly one series (each value becomes a slice). | |
| strict | No | Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true. | |
| altText | No | Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted. | |
| encrypt | No | Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached. | |
| margins | No | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. | |
| markers | No | Draw point markers on line series. Default false. | |
| compress | No | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. | |
| metadata | No | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. | |
| pageSize | No | Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it. | |
| chartType | Yes | Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'stackedBar'/'stackedBarH'/'line'/'area'/'scatter' support multiple series. 'scatter' requires xValues on every series and a positional xAxis.type ('linear' or 'time'). | |
| categories | No | Category / slice labels (x-axis). Defaults to 1-based indices when omitted. | |
| dataLabels | No | Per-point value labels: true for defaults, or an object to format them. | |
| embedFonts | No | Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB. | |
| outputMode | No | Either 'base64' (returns the PDF inline) or 'file' (writes into the PDFNATIVE_MCP_OUTPUT_DIR sandbox). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. | |
| typography | No | Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt. | |
| labelStride | No | Draw every Nth category label. Default: automatic (measured non-overlap); 1 draws every label. | |
| creationDate | No | ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs. | |
| outputIntent | No | Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space. | |
| labelRotation | No | Rotate category labels counter-clockwise by this many degrees (disables the automatic stride). | |
| footerTemplate | No | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. | |
| headerTemplate | No | Running header on every page (left / center / right zones); reserves 15 pt. | |
| includeDiagnostics | No | Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, but the description adds substantive behavior beyond them: alt text is auto-generated when omitted, /Figure tagging, cross-field engine rules surfacing as CHART_ERROR with the remedy, and the PDF/A requirement (pdfA + embedFonts:true, plus print/metadata/creationDate notes). That is real operational context an agent needs before calling a 37-parameter generator.
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?
Purpose and chart types are front-loaded and almost every clause carries information, so there is little waste. However, the whole description is a single run-on paragraph that mixes chart-feature semantics with PDF/A, print and metadata concerns, producing a dense wall of semicolon clauses that is hard to scan before a call.
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?
With an output schema present, return values need no explanation, and the 100%-covered schema carries the per-field detail. The description covers the headline capabilities and the composition/PDF-A constraints, which is sufficient for a tool of this complexity, though it does not mention pagination/sandbox expectations for outputMode beyond what the schema says.
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 baseline is 3. The description earns the extra point by explaining cross-parameter coupling that the flat schema only states locally: per-series xValues must pair with xAxis.type 'linear'|'time', the secondary axis is engaged only via axis2 + series yAxis:'right', and pie/donut accept exactly one series. Those are integration-level semantics rather than restatements.
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+resource ('Add native vector chart') immediately qualified by what it produces ('Single-page PDF with a native vector chart ... pure path operators, no raster') and an enumerated chart-type list that an agent can match against a request. It also routes the agent to the sibling case ('Inside a longer document use a 'chart' block in generate_basic_pdf'), so add_chart is clearly distinguishable from generate_basic_pdf.
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?
Gives an explicit alternative and the condition that selects it: standalone one-chart PDFs here, embedded charts via generate_basic_pdf's 'chart' block in longer documents. It also states form constraints (pie/donut take exactly one series). It does not spell out when the tool should not be used at all (e.g. raster image charts), so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_formAdd interactive formAIdempotent
New PDF with an interactive AcroForm: text fields, text areas, checkboxes, radio buttons, dropdowns (data capture, surveys, fillable templates). To fill or flatten an EXISTING form use read_form_fields + fill_form. PDF/A, print, metadata and creationDate options as on every document tool.
| Name | Required | Description | Default |
|---|---|---|---|
| pdfA | No | PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md. | |
| debug | No | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. | |
| No | Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md. | ||
| title | Yes | Form title rendered at the top of the document. | |
| fields | Yes | Ordered list of form field definitions. | |
| strict | No | Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true. | |
| encrypt | No | Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached. | |
| margins | No | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. | |
| compress | No | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. | |
| metadata | No | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. | |
| pageSize | No | Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it. | |
| embedFonts | No | Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB. | |
| footerText | No | Optional footer text rendered at the bottom of every page. | |
| outputMode | No | Either 'base64' (returns the PDF inline) or 'file' (writes to a sandboxed path inside PDFNATIVE_MCP_OUTPUT_DIR). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. | |
| typography | No | Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt. | |
| creationDate | No | ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs. | |
| outputIntent | No | Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space. | |
| footerTemplate | No | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. | |
| headerTemplate | No | Running header on every page (left / center / right zones); reserves 15 pt. | |
| includeDiagnostics | No | Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description adds useful context beyond that: this produces a brand-new document rather than mutating an existing one, and it names the correct pathway for existing forms. It doesn't discuss permissions or caching, but with annotations carrying the safety load that is acceptable.
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 front-loaded sentences with the creation semantics first and the routing rule second. The parenthetical use-case list is mild padding and 'as on every document tool' is vague delegation, keeping it just under a perfect score.
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?
An output schema exists, so return values need no explanation, and the 21 parameters are fully schema-documented. For a complex creation tool the description covers the key agent decision points (what it makes, where the alternative tool lives) and delegates the shared option details appropriately.
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 baseline is 3. The description lists the field types ('text fields, text areas, checkboxes, radio buttons, dropdowns') and characterizes them as use cases (data capture, surveys, fillable templates), but adds no syntax or format detail beyond what the schema already documents.
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 and resource ('New PDF with an interactive AcroForm') and enumerates the field types it can build. The explicit 'New PDF' framing distinguishes it from siblings like fill_form/read_form_fields without opening any schema.
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?
Gives an explicit routing rule: 'To fill or flatten an EXISTING form use read_form_fields + fill_form.' That names the alternative and the condition selecting it. However, it doesn't cover when-not-to-use for other scenarios (e.g., adding fields to an existing document), so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_international_textAdd international textAIdempotent
PDF rendering text in 27 scripts (Arabic, Hebrew, Thai, Lao, CJK, Devanagari, Bengali, Tamil, Telugu, Sinhala, Tibetan, Khmer, Myanmar, Tai Tham, New Tai Lue, Tai Le, Cham, Ethiopic, Cyrillic, Greek, Georgian, Armenian, Vietnamese, …; ha / yo / ig / sw are aliases of latin with anchored combining marks), COLRv1 colour emoji and mathematical symbols ('math': ∀ ∃ √ ∑ ∫ ∞). BiDi (UAX #9), Arabic joining and complex-script shaping are automatic; input is NFC-normalised; newlines split paragraphs. lang is a code or an array for mixed runs (['ar','emoji'], ['latin','math']). Fonts are always embedded, so embedFonts does not exist here. PDF/A, print, metadata and creationDate options as on every document tool.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | Yes | Language / script identifier. Either a single code (e.g. 'ar'), a comma-separated list ('ar,emoji'), or an array (['ar','emoji']). Multiple codes enable multi-font run splitting (script + emoji + Latin fallback). 27 scripts; ha / yo / ig / sw (Hausa, Yoruba, Igbo, Swahili) are aliases of latin, whose combining marks are anchored. | |
| pdfA | No | PDF/A level (Tagged PDF + sRGB OutputIntent + XMP). Fonts are embedded here, so the claim is valid as-is. See docs/guides/PDFA.md. | |
| pdfx | No | PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt. | |
| debug | No | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. | |
| No | Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md. | ||
| title | Yes | PDF title (rendered as page heading and stored as document metadata). | |
| strict | No | Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true. | |
| encrypt | No | Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached. | |
| margins | No | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. | |
| compress | No | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. | |
| metadata | No | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. | |
| pageSize | No | Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it. | |
| normalize | No | Unicode normalization before shaping. Default 'NFC' (widest glyph coverage); NFD/NFKC/NFKD or false for special needs. | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). | |
| paragraphs | Yes | Ordered list of paragraphs to render in the chosen script. | |
| typography | No | Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt. | |
| creationDate | No | ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs. | |
| outputIntent | No | Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space. | |
| footerTemplate | No | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. | |
| headerTemplate | No | Running header on every page (left / center / right zones); reserves 15 pt. | |
| viewerPreferences | No | Reader presentation hints (catalog /PageLayout, /PageMode, /ViewerPreferences). PDF/A-safe; all optional. | |
| includeDiagnostics | No | Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (idempotent, non-destructive), the description discloses real behavioural traits: fonts are always embedded so `embedFonts` does not exist here, input is NFC-normalised, newlines split paragraphs, and BiDi/Arabic joining/shaping are automatic. These are non-obvious engine behaviours an agent could not derive from the schema.
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 dense paragraph, front-loaded with the script inventory before mechanics. Every clause carries information (script list, aliases, emoji/math, BiDi, NFC, newline behaviour), though the parenthetical script enumeration is long and could be trimmed.
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 23-parameter tool with an output schema, the description correctly focuses on the international-text differentiators and delegates the shared document options (PDF/A, print, metadata, creationDate) to 'as on every document tool'. That delegation assumes cross-tool documentation the agent may not have, which is the only gap.
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 carries parameter meaning, and the description mostly restates the `lang` semantics (single code, comma list, array of mixed runs) that the schema documents in full. It adds the useful note that the tool has no `embedFonts`, but little else 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+resource and scope: rendering PDF text across 27 named scripts, colour emoji and math, with BiDi/shaping/normalisation details. It implicitly distinguishes itself from generate_basic_pdf by positioning this as the international/multilingual entry point, but never names that sibling 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?
Usage is only implied: an agent reads the script list and infers 'use this when text is non-Latin'. There is no explicit when-to-use versus generate_basic_pdf, and no statement of what happens (or which tool to use) if the input is plain ASCII. Adequate but leaves selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_ltvEmbed LTV validation material (PAdES B-LT)A
PAdES B-LT: embed a Document Security Store (/DSS + per-signature /VRI) with the certificates and OCSP/CRL material future verifiers need ('LTV enabled' in Adobe Reader once the root is trusted). Ladder step 3: sign_pdf (profile:'pades', timestamp:true) → add_ltv → timestamp_pdf. mode 'online' (default) fetches through the OPERATOR revocation provider (PDFNATIVE_MCP_REVOCATION + PDFNATIVE_MCP_NETWORK_ALLOWED_HOSTS; REVOCATION_NOT_CONFIGURED otherwise — no network without it); mode 'offline' embeds caller-supplied DER certificates / OCSP responses / CRLs with zero network. Incremental (existing /DSS merged). Needs ≥ 1 signed signature; unencrypted PDFs only.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 'online': fetch OCSP/CRL through the operator provider (PDFNATIVE_MCP_REVOCATION + allow-list; REVOCATION_NOT_CONFIGURED otherwise). 'offline': embed the caller-supplied DER material, zero network. | online |
| pdfBase64 | Yes | Base64-encoded SIGNED PDF (unencrypted). Sign with sign_pdf (profile=pades recommended) first. | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Relative path inside PDFNATIVE_MCP_OUTPUT_DIR (required when outputMode='file'). | |
| preferOcsp | No | online: try OCSP before CRL for each certificate (default true). | |
| crlsDerBase64 | No | offline: DER CertificateList (RFC 5280) blobs to embed in /DSS /CRLs. | |
| certificatesDerBase64 | No | offline: DER X.509 certificates to embed in /DSS /Certs. | |
| ocspResponsesDerBase64 | No | offline: DER OCSPResponse (RFC 6960) blobs to embed in /DSS /OCSPs. | |
| extraCertificatesDerBase64 | No | online: additional DER certificates (intermediates / roots) to complete chains the CMS does not carry. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag openWorldHint and non-idempotence; the description adds the substantive behavior: incremental update with existing /DSS merged, network gated on PDFNATIVE_MCP_REVOCATION + allow-list with REVOCATION_NOT_CONFIGURED otherwise, and the fact that offline mode performs zero network I/O. These are the operational details an agent needs before invoking.
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?
Dense but front-loaded: the PAdES B-LT action leads, then the ladder, then mode semantics, then constraints. Every sentence carries information, though the heavy parenthetical/env-var stacking makes it harder to scan than it could be.
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?
With an output schema present, return values need not be described, and the description covers what remains: prerequisites, mode selection, network configuration requirements, and failure conditions. Nothing needed to invoke it correctly is missing.
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 baseline is 3. The description nonetheless adds value beyond the schema by framing mode 'online'/'offline' as a network-vs-no-network tradeoff with named env vars and by explaining that extraCertificates complete chains the CMS does not carry.
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 and resource ('embed a Document Security Store (/DSS + per-signature /VRI)') and pins the exact spec level (PAdES B-LT). It also situates itself against siblings by naming the ladder (sign_pdf → add_ltv → timestamp_pdf), so an agent can place it without opening other schemas.
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?
Explicitly states when to use it (ladder step 3, after signing with profile:'pades', before timestamp_pdf) and when each mode applies: 'online' fetches via the operator revocation provider, 'offline' embeds caller-supplied DER with zero network. Prerequisites are given too: ≥1 signed signature and unencrypted PDFs only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_tableAdd table / reportAIdempotent
Tabular PDF report from headers + rows (every row the same length). Smart-table options: wrap, repeatHeader (header on every page), zebra, caption (tagged for PDF/A), minRowHeight, cellPadding, cellBorders, cellVAlign, autoFitColumns, clipCells. Inside a longer document use a 'table' block of generate_basic_pdf instead. PDF/A (pdfA + embedFonts:true), print, metadata, watermark and creationDate options as on every document tool.
| Name | Required | Description | Default |
|---|---|---|---|
| pdfA | No | PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md. | |
| pdfx | No | PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt. | |
| rows | Yes | Data rows. Each row is an array of cell strings with the same length as `headers`. | |
| wrap | No | Cell wrap policy: 'auto' (default) wraps only overflowing cells; 'always' wraps every cell; 'never' truncates. | |
| debug | No | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. | |
| No | Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md. | ||
| title | Yes | Report title rendered at the top of the document and used as PDF metadata title. | |
| zebra | No | Alternate-row light tint (static fill, PDF/A-1b safe). | |
| strict | No | Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true. | |
| caption | No | Caption rendered above the table (tagged as /Caption under PDF/A). | |
| encrypt | No | Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached. | |
| headers | Yes | Column header labels. Must have the same length as each row in `rows`. | |
| margins | No | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. | |
| compress | No | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. | |
| metadata | No | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. | |
| pageSize | No | Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it. | |
| clipCells | No | Clip cell contents to the column bounds (PDF clip operators). Recommended for PDF/A and visual safety. | |
| infoItems | No | Optional key-value metadata rows rendered below the title (e.g. date, author). | |
| watermark | No | Optional semi-transparent watermark rendered centred on every page: `text` (e.g. 'DRAFT'), `image` (JPEG/PNG), or both combined. At least one of text / image is required. opacity < 1.0 (text or image, including the defaults) is rejected under pdfA='pdfa1b' (ISO 19005-1 forbids transparency). | |
| cellVAlign | No | Vertical alignment of cell content. | |
| embedFonts | No | Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB. | |
| footerText | No | Optional text rendered at the bottom of every page. | |
| outputMode | No | Either 'base64' (returns the PDF inline) or 'file' (writes to a sandboxed path inside PDFNATIVE_MCP_OUTPUT_DIR). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. | |
| typography | No | Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt. | |
| cellBorders | No | Per-cell vector borders (pure strokes, PDF/A-safe). Choose individual sides or `all`. | |
| cellPadding | No | Horizontal cell padding in points (default 3). | |
| creationDate | No | ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs. | |
| minRowHeight | No | Minimum row height in points (default 12). | |
| outputIntent | No | Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space. | |
| repeatHeader | No | Repeat the header row on every continuation page (default true). | |
| autoFitColumns | No | Auto-fit column widths to content. Output bytes then depend on text metrics (not byte-deterministic across content changes). | |
| footerTemplate | No | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. | |
| headerTemplate | No | Running header on every page (left / center / right zones); reserves 15 pt. | |
| viewerPreferences | No | Reader presentation hints (catalog /PageLayout, /PageMode, /ViewerPreferences). PDF/A-safe; all optional. | |
| includeDiagnostics | No | Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Though annotations declare non-readOnly/non-destructive, the description adds substantial behavioral context beyond them: embedFonts adds ~0.3 MiB, creationDate omission causes byte-differences across calls while pinning it gives deterministic output, and autoFitColumns makes output non-byte-deterministic. These are non-obvious traits that meaningfully inform invocation.
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?
Front-loaded with the core purpose and constraint in the opening sentence, followed by the alternative routing and a compact option summary. Given 36 parameters, the length is justified, though the option-name enumeration is somewhat redundant with the schema.
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?
An output schema exists, so return values need no explanation. The description covers purpose, the sibling alternative for longer documents, and PDF/A pairing; with 100% schema coverage the remaining parameter detail is delegated appropriately. Some behavioral nuance could still be richer, but it is complete enough to call correctly.
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 carries the parameter semantics. The description's smart-table option list (wrap, repeatHeader, zebra, caption, etc.) largely restates what the schema documents, adding only marginal value over the structured fields.
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 first sentence gives a specific verb-resource pairing ('Tabular PDF report from `headers` + `rows`') with a concrete constraint (rows the same length), and later names the sibling alternative (generate_basic_pdf's 'table' block) for longer documents. It is clear, though the core purpose arrives without an explicit action verb and is partly buried under the feature enumeration.
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 an explicit routing condition: 'Inside a longer document use a "table" block of generate_basic_pdf instead,' which tells the agent when to prefer the sibling. It also notes 'Pair with embedFonts=true for a valid PDF/A claim.' No explicit when-not/exclusion list beyond these, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
annotate_pdfAnnotate PDF (markup / drawing)AIdempotent
Append markup annotations (ISO 32000-1 §12.5) to an existing PDF as a non-destructive incremental update (original bytes preserved). Types: text (sticky note), highlight | underline | strikeout | squiggly, square | circle, line (needs start/end), freetext. Each needs a 0-based page and rect [x1,y1,x2,y2]; optional contents, color, opacity, title and type-specific fields. VISUAL OVERLAY ONLY — nothing is removed or redacted (covered text stays extractable). Encrypted sources → ENCRYPTED_SOURCE (decrypt_pdf first).
| Name | Required | Description | Default |
|---|---|---|---|
| pdfBase64 | Yes | Base64-encoded source PDF to annotate. | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). | |
| annotations | Yes | Markup / drawing annotations to add. Each is attached to a 0-based page index. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior well beyond annotations: non-destructive incremental update preserving original bytes, VISUAL OVERLAY ONLY semantics (covered text remains extractable — critical for anyone who might assume redaction), and the encrypted-source error code with remediation. Annotations declare idempotent=true and destructive=false, consistent with 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?
Dense but front-loaded: purpose, non-destructive guarantee, type list, coordinates, then the critical visual-only caveat and error handling. A bit packed but every clause carries information; no filler.
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 output schema exists, return values need not be explained. The description covers mutation semantics, coordinates, type-specific fields, error handling for encrypted sources, and the crucial non-redaction caveat — everything an agent needs to invoke correctly.
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 100%, so baseline is 3. Description adds derivative value by summarizing type-specific requirements (line needs start/end, each needs page+rect) and the page-0-based convention, though the schema itself documents these in detail.
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 (append) and resource (markup annotations), enumerates the annotation types supported, and distinguishes the tool from siblings like generate_basic_pdf or inspect_pdf by naming the ISO spec section.
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?
Explicitly handles the encrypted-source case by pointing to decrypt_pdf first via the ENCRYPTED_SOURCE error. The 'non-destructive' framing clarifies that this is for overlay markup, but it doesn't contrast against sibling tools like fill_form or add_table for agent routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decrypt_pdfDecrypt a PDFAIdempotent
Emit an UNENCRYPTED copy of an encrypted PDF (RC4 V1–V4, AES-128, AES-256) given password (user or owner; empty user password needs none). CAVEAT: the page tree is rebuilt — signatures and AcroForm are DROPPED. To merely READ an encrypted PDF pass password to inspect_pdf / extract_text / extract_attachments / read_form_fields instead. Never cached.
| Name | Required | Description | Default |
|---|---|---|---|
| password | No | Password to open the encrypted source (user or owner). Omit only for documents with an empty user password. | |
| pdfBase64 | Yes | Base64-encoded encrypted PDF to decrypt. NOTE: signatures and AcroForm are dropped (page-tree rebuild). | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses non-obvious behavioral traits beyond the annotations: the page tree is rebuilt and signatures/AcroForm are DROPPED, plus "Never cached". Annotations only give the generic read/write/idempotency profile; the lossy-output caveat and the caching behavior are real added context. No contradiction with destructiveHint=false, since the source PDF is not modified.
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 dense sentences with the core action first, the lossy caveat second, and the alternative-route guidance last. Every clause carries information; nothing is filler.
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?
An output schema exists, so return values need no explanation. With algorithm support, password rules, output caveats and the read-only alternative all covered, an agent has everything needed to call this correctly.
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 100% and the schema already defines password eligibility, outputMode sandboxing and outputPath requirements. The description's "given `password` (user or owner; empty user password needs none)" largely restates the schema, so the baseline 3 applies rather than extra credit.
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?
Opens with a concrete verb+resource ("Emit an UNENCRYPTED copy of an encrypted PDF") and scopes it precisely with the supported cipher list (RC4 V1–V4, AES-128, AES-256). It is immediately distinguishable from encrypt_pdf and from the read-only siblings named later.
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?
Explicitly routes the agent: "To merely READ an encrypted PDF pass `password` to inspect_pdf / extract_text / extract_attachments / read_form_fields instead." It also states when the password may be omitted (empty user password), so both use and non-use conditions are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_governance_issueDraft a governance-compliant GitHub issue (HITL)AIdempotent
Produce a LOCAL GitHub issue draft + compliance report for pdfnative / pdfnative-mcp and NEVER submit it — the agent drafts, a human reviews and files it under their own identity (Human-In-The-Loop contract, .github/AGENT_RULES.md). No GitHub write path exists. The draft is checked against the zero-dependency + reproduction policy; a violation (new runtime dependency, missing reproduction, duplicateSearchPerformed:false) throws GOVERNANCE_VIOLATION. Returns markdown inline (outputMode:'file' also writes a .md). Present the draft AND the report to the user, then STOP.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Concise issue title (imperative, no trailing period). | |
| summary | Yes | One or two paragraphs describing the problem or proposal. | |
| issueType | Yes | Issue category: 'bug' | 'feature' | 'security' | 'docs' | 'performance'. | |
| outputMode | No | 'inline' (default) returns the draft markdown in the response. 'file' additionally writes it to the sandbox (requires PDFNATIVE_MCP_OUTPUT_DIR); outputPath must be a relative .md path. | inline |
| outputPath | No | Relative .md path inside the sandbox (only when outputMode='file'). | |
| targetRepo | No | Destination repository label for the draft (documentation only — the server never contacts it). Typically 'pdfnative-mcp' or 'pdfnative'. | pdfnative-mcp |
| reproduction | Yes | The minimal, locally-executed reproduction that justifies this issue. | |
| actualBehavior | No | What actually happened (defaults to the reproduction result when omitted). | |
| affectedPackages | No | Packages impacted by this issue (e.g. ["pdfnative-mcp"], ["pdfnative"]). | |
| expectedBehavior | Yes | What you expected to happen instead. | |
| duplicateSearchPerformed | Yes | MUST be true: confirms you searched open AND closed issues/PRs for duplicates before drafting. |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | Yes | |
| filePath | No | Sandboxed absolute path (when outputMode='file'). |
| warnings | Yes | |
| issueType | Yes | |
| sizeBytes | Yes | |
| compliance | Yes | |
| outputMode | Yes | |
| targetRepo | Yes | |
| draftMarkdown | Yes | The full draft, ready for a human to review and submit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotation set and provides crucial behavioral context: the draft is never submitted, a human files it, no GitHub write path exists, policy violations raise GOVERNANCE_VIOLATION, and the agent must present output and then STOP. This is exactly the kind of non-obvious behavior an autonomous agent 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 compact yet information-dense. Critically, it front-loads the key constraints (LOCAL, NEVER submit, HITL) and includes the procedural end state ('present the draft AND the report to the user, then STOP') with 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 11 parameters, nested reproduction object, output schema, and annotations, this description still closes all important gaps: the governance policy, violation behavior, output modes, human review step, and stop condition. An agent has enough to invoke the tool and interpret its guidance correctly.
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?
Even though the input schema describes every parameter thoroughly, the description adds meaningful behavioral requirements: duplicateSearchPerformed:false triggers a GOVERNANCE_VIOLATION, and outputMode 'file' writes a .md file. These enrich the interpretation of the parameters beyond their simple schema definitions.
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 ('Produce a LOCAL GitHub issue draft + compliance report'), the resource ('for pdfnative / pdfnative-mcp'), and the critical boundary ('NEVER submit it'). It is fully differentiated from the PDF-manipulation siblings by the explicit issue-drafting scope.
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 clearly establishes when to use the tool: when an issue draft is needed under the Human-In-The-Loop contract and must not be submitted. It also tells the agent it does not provide a GitHub write path, implying it should not be used for actual issue submission, though no explicit alternative tool is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
embed_imageEmbed image in PDFAIdempotent
PDF with one embedded JPEG or PNG (base64; PNG without alpha channel) plus optional caption and render width/height. Inside a longer document use an 'image' block of generate_basic_pdf instead. PDF/A, print, metadata and creationDate options as on every document tool.
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | Accessible description of the image (tagged /Figure /Alt). Provide it for non-decorative images under PDF/A or PDF/UA. | |
| pdfA | No | PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md. | |
| pdfx | No | PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt. | |
| align | No | Horizontal placement of the image inside the content width. | left |
| debug | No | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. | |
| No | Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md. | ||
| title | Yes | Document title rendered at the top and used as PDF metadata title. | |
| width | No | Render width in points. If omitted, the image is auto-sized to fit the page. | |
| height | No | Render height in points. If omitted, aspect ratio is preserved. | |
| strict | No | Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true. | |
| caption | No | Optional caption rendered below the image. | |
| encrypt | No | Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached. | |
| margins | No | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. | |
| compress | No | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. | |
| metadata | No | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. | |
| mimeType | Yes | MIME type of the image. Must match the actual encoding of imageBase64 (magic bytes are checked). | |
| pageSize | No | Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it. | |
| embedFonts | No | Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB. | |
| outputMode | No | Either 'base64' (returns the PDF inline) or 'file' (writes to a sandboxed path inside PDFNATIVE_MCP_OUTPUT_DIR). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. | |
| typography | No | Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt. | |
| imageBase64 | Yes | Base64 image bytes. JPEG (baseline; 1, 3 or 4 components — CMYK raises PDFA_DEVICE_CMYK_IMAGE under PDF/A) or PNG (8-bit greyscale/RGB, non-interlaced; alpha-channel and palette PNGs are rejected with a remedy). No data: URI. | |
| creationDate | No | ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs. | |
| outputIntent | No | Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space. | |
| footerTemplate | No | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. | |
| headerTemplate | No | Running header on every page (left / center / right zones); reserves 15 pt. | |
| includeDiagnostics | No | Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the bar is lower. The description adds real substance: PNG without an alpha channel, base64 input, and that PDF/A, print, metadata and creationDate options behave as on every other document tool — a useful cross-tool parity signal. It does not restate the deterministic/byte-identical behavior that creationDate pinning implies.
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 compact sentences, front-loaded with the artifact and its constraints before the routing rule. Every clause earns its place; the only slightly loose element is the trailing cross-reference to 'every document tool', which is terse but a bit hand-wavy about where those options are documented.
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 27-parameter tool with full schema coverage, an output schema and annotations, the description only needs to frame the artifact and route the agent, which it does. The complex regimes it inherits (PDF/A, PDF/X, print production, encryption, typography) are covered by the schema and sibling docs, so nothing essential for a correct call is missing.
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 all 27 properties in depth. The description's mentions of base64, PNG-without-alpha, caption and render width/height merely echo what the schema states, adding no syntax or format detail beyond it. Baseline 3 is correct when 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?
States a specific verb and resource ('PDF with one embedded JPEG or PNG') plus the optional caption and render width/height, so the output artifact is unambiguous. It also names the sibling to use instead ('image' block of generate_basic_pdf) for longer documents, letting an agent distinguish embed_image from generate_basic_pdf without opening either schema.
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?
Explicit routing rule with condition: 'Inside a longer document use an "image" block of generate_basic_pdf instead.' This names the alternative and when to prefer it. It offers no other usage context (e.g. when PDF/A or print options matter for this tool), so it stops short of a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
encrypt_pdfEncrypt / re-secure a PDFA
Encrypt an existing PDF with the Standard Security Handler: AES-128 (default) or AES-256; RC4 is never emitted. ownerPassword required; optional userPassword (open password), permissions { print, copy, modify, extractText }. Rotate the password of an already-encrypted source by passing its current password. CAVEAT: the page tree is rebuilt — signatures and AcroForm are DROPPED, only URI links kept; encrypt BEFORE signing. Never cached.
| Name | Required | Description | Default |
|---|---|---|---|
| password | No | Current password of an already-encrypted source (enables password rotation). Omit for an unencrypted source. | |
| algorithm | No | aes128 (V4/R4, widest compatibility) or aes256 (V5/R6). | aes128 |
| pdfBase64 | Yes | Base64-encoded source PDF to encrypt. NOTE: existing signatures and AcroForm are dropped (page-tree rebuild). | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. | |
| permissions | No | Permission flags; each defaults to allowed. | |
| userPassword | No | Open password; omitted/empty = opens without a prompt. | |
| ownerPassword | Yes | Owner password (full access). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by disclosing the destructive side-effects: signatures and AcroForm are DROPPED, only URI links kept, and results are never cached. These are exactly the consequences an agent must know before invoking, and they are not derivable from the readOnly/destructive/idempotent hints.
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?
Dense and front-loaded with the key outcome and CAVEAT clearly flagged. Semicolon-heavy phrasing packs a lot into two sentences; everything earns its place, though the first sentence is slightly run-on.
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?
Covers algorithm choice, password roles, permissions, output modes, rotation, and the signature/AcroForm drop caveat. With an output schema present, return values need not be described, so nothing an agent needs is missing.
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 100%, so baseline is 3, but the description adds meaning beyond the schema by explaining the interplay: ownerPassword is required, userPassword is the open password, permissions map to the four flags (default allowed), and `password` enables rotation of an already-encrypted source.
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 (Encrypt) applied to a specific resource (an existing PDF) with the exact handler and algorithm set (AES-128/AES-256, RC4 never emitted). An agent can distinguish this from decrypt_pdf and sign_pdf without opening the schema.
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?
Gives clear situational guidance: rotate a password by passing the current `password`, and 'encrypt BEFORE signing' due to the page-tree rebuild. It does not explicitly name the alternative (decrypt_pdf) or state when not to use it, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_attachmentsExtract embedded files from PDFARead-onlyIdempotent
Read-only extraction of embedded files (PDF/A-3, Factur-X, ZUGFeRD): name, mimeType, AFRelationship, description, sizeBytes and (by default) the payload as dataBase64. filename selects one file; includeData:false probes metadata only. Encrypted sources: pass password. Token-frugal: verbosity:'summary'.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Optional dot-path projection applied to the structured result (e.g. ['attachments.name']). Composes after verbosity. Unknown paths are omitted. | |
| filename | No | Optional exact attachment name to extract. When omitted, every embedded file is returned. | |
| password | No | Password (user or owner) of an encrypted source. Never logged or echoed. | |
| pdfBase64 | Yes | Base64-encoded PDF bytes to read embedded files from. | |
| verbosity | No | Response verbosity. 'full' (default) returns the attachments[] array; 'summary' returns a token-frugal { attachmentCount } and drops the array. | full |
| includeData | No | When true (default) each attachment carries its decoded payload as dataBase64. Set false for a metadata-only probe (names, sizes, relationships) with no payload bytes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| attachments | No | |
| attachmentCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description reinforces this with 'Read-only extraction'. It adds valuable behavioral details beyond annotations: default payload inclusion, metadata-only probing, password handling, and token-frugal summary mode. These add meaningful context without contradicting the 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 three tightly-worded sentences with no fluff. The core action is front-loaded (read-only extraction), key formats are named in the first sentence, and the remaining sentences efficiently cover optional behaviors and parameter interactions.
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 has a high-quality output schema, rich parameter descriptions, and complete annotations, the description covers the necessary behavioral context: file selection, payload vs metadata probing, encrypted sources, and response verbosity. Nothing appears missing for an agent to correctly invoke this tool.
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 schema already provides 100% parameter coverage with detailed descriptions, so the baseline is 3. The description adds concise semantic layer by explaining the practical intent of includeData:false as metadata-only probing and verbosity:'summary' as token-frugal. It also hints at the relationship between filename and single-file selection, complementing 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 clearly identifies a specific verb-object pair ('Read-only extraction') targeting embedded files in PDFs, including recognizable formats like PDF/A-3 and ZUGFeRD. This distinguishes it from sibling tools such as add_attachment and extract_text without ambiguity.
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 clear usage context: extracting embedded files from a PDF, including how to select a single file, probe metadata only, handle encrypted sources, and save tokens. It stops short of explicitly naming alternative tools or stating when not to use this tool, but the context is strong enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_pagesExtract pages into one PDFAIdempotent
Keep an arbitrary pages[] subset (0-based, in the given order) in ONE fresh PDF. Same page-tree caveats as merge_pdfs (signatures/AcroForm/XMP dropped; boxes kept; URI links unless dropAnnotations). Encrypted sources: password; output unencrypted unless encrypt. Need several documents? Use split_pdf.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | Yes | 0-based page indices to keep, in output order. Duplicates and out-of-range indices are rejected. | |
| encrypt | No | Re-encrypt the output (Standard Security Handler; AES-128 default or AES-256; RC4 never emitted). | |
| password | No | Password (user or owner) of an encrypted source. Never logged or echoed. | |
| pdfBase64 | Yes | Base64-encoded source PDF. Pass `password` for an encrypted source. | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). | |
| dropAnnotations | No | When true, drop ALL annotations. Default keeps self-contained URI link annotations. | |
| maxOutputSizeBytes | No | Maximum size, in bytes, of the produced PDF. Defaults to 268435456 (256 MiB). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read/write/idempotency hints, but the description adds concrete lossy behavior: signatures, AcroForm, and XMP are dropped; boxes are kept; URI links are preserved unless dropAnnotations. It also discloses that output is unencrypted unless `encrypt` and that encrypted sources need `password`.
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?
Four compact clauses front-load the core behavior and bury constraints in parentheticals with minimal waste. It is dense but each sentence carries real information; slightly terse cross-references keep it from a full 5.
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?
With an output schema present, return values need not be explained, and the description covers the mutation profile, source-encryption handling, output-encryption default, annotation retention, and the sibling alternative. Nothing needed to invoke it correctly is missing.
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 every parameter, and this is the baseline case. The description reiterates `pages`, `password`, `encrypt`, and `dropAnnotations` but adds little syntax or constraint detail beyond what the schema provides.
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+resource: keep a `pages[]` subset in ONE fresh PDF, with 0-based ordering semantics. It also discriminates from the sibling split_pdf by naming the multi-document case as its opposite, so the agent can distinguish it without opening either schema.
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: 'Need several documents? Use split_pdf.' It also constrains input handling ('arbitrary pages[] subset') and references merge_pdfs for shared caveats, giving clear when-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_textExtract plain text from PDFARead-onlyIdempotent
Plain-text extraction: decodes Tj/TJ operands through each font's /ToUnicode CMap, /Encoding /Differences or base encoding and returns pages[] + fullText (positioned runs with includeRuns:true; pages selects 0-based pages). extractable is false only when a page decoded ENTIRELY to U+FFFD (a font with no usable mapping — expected for some subset fonts, not an error; extractableReason explains). Tagged content carrying /ActualText (every pdfA document this server writes) returns that SOURCE text, in logical order; untagged right-to-left and Indic runs come back in the order their glyphs were drawn — generate with pdfA when faithful extraction of complex scripts matters. Encrypted sources: pass password (PASSWORD_REQUIRED / PASSWORD_INVALID otherwise). Token-frugal: verbosity:'summary', fields:[…].
| Name | Required | Description | Default |
|---|---|---|---|
| pages | No | Optional 0-based page indices to extract. When omitted, every page is extracted. | |
| fields | No | Optional dot-path projection applied to the structured result (e.g. ['fullText'] or ['extractable']). Composes after verbosity. Unknown paths are omitted. | |
| password | No | Password (user or owner) of an encrypted source. Never logged or echoed. | |
| pdfBase64 | Yes | Base64-encoded PDF bytes. | |
| verbosity | No | Response verbosity. 'full' (default) returns the per-page pages[] array and fullText; 'summary' returns a token-frugal { pageCount, extractedPageCount, extractable, charCount } and drops the text payloads. | full |
| includeRuns | No | When true, each page also carries `runs[]` — positioned text-showing operations `{ text, x, y, fontSize, fontName }` in device space (content-stream order). Useful for layout-aware extraction; larger responses. | |
| maxTextLength | No | Hard cap on total extracted characters across all pages (memory bound for adversarial input). Default 16000000. Exceeding it fails with OUTPUT_TOO_LARGE. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pages | No | |
| fullText | No | |
| charCount | No | summary only: length of fullText. |
| pageCount | No | |
| extractable | No | False when one or more requested pages produced text that is entirely U+FFFD replacement characters — a font with no usable /ToUnicode CMap or base encoding. Blank pages are still considered extractable. |
| extractableReason | No | Present when extractable is false: why no text could be decoded. |
| extractedPageCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description goes well beyond them: `extractable` is false only on ENTIRE U+FFFD decoding with extractableReason, ActualText/tagged-content returns SOURCE text in logical order, untagged RTL/Indic returns glyph-draw order, encrypted sources yield PASSWORD_REQUIRED/PASSWORD_INVALID, and maxTextLength overflow fails with OUTPUT_TOO_LARGE. This is unusually rich behavioral disclosure.
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 purpose and core extraction semantics are front-loaded and no sentence is pure filler, but the paragraph is dense and heavily backticked, mixing contract-level guarantees (ActualText ordering, error codes) with implementation detail. Slightly over-stuffed for a single description, though nothing is wasted.
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?
An output schema exists, so return shapes need not be re-explained, yet the description still clarifies the semantic meaning of `extractable`/`extractableReason`. With encryption handling, memory-bound behavior, and token-frugal options all covered, an agent has everything needed to call it correctly.
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 baseline is 3, but the description adds meaning beyond the schema: the PASSWORD_REQUIRED/PASSWORD_INVALID error outcomes for `password`, the extractableReason semantics tied to extraction, and the interplay of verbosity:'summary' with the returned fields. It adds real inter-parameter behavior rather than restating field docs.
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 ('Plain-text extraction' returning pages[] + fullText) and implicitly distinguishes itself from siblings like extract_pages, extract_attachments and inspect_pdf by naming text extraction and its decoding mechanism (ToUnicode CMap, /Differences). An agent can identify what it does without opening the schema.
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?
Gives clear conditional guidance: pass `password` for encrypted sources, use includeRuns:true for positioned runs, verbosity:'summary' for token frugality, and prefer generating with pdfA when faithful extraction of complex scripts matters. It does not explicitly contrast with the closest sibling (extract_pages) or state when *not* to use it, so it stops short of full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fill_formFill / flatten an existing AcroFormAIdempotent
Fill and/or flatten the AcroForm of an EXISTING PDF (add_form creates one) as an incremental update — prior signatures stay valid for their revision. values: fully-qualified name → string (array for multi-select), boolean or export state for checkbox/radio. flatten:true stamps appearances and drops the interactive layer (with no values = pure flatten). Unknown names → FORM_FIELD_NOT_FOUND unless onUnknownField:'ignore'; signature fields cannot be filled (FORM_UNSUPPORTED). Encrypted sources: password.
| Name | Required | Description | Default |
|---|---|---|---|
| values | No | Map of fully-qualified field name → value. Text/choice: a string (array of strings for multi-select listboxes). Checkbox/radio: a boolean or the export-state string. Omit (or pass {}) with flatten:true for a pure flatten. | |
| flatten | No | When true, stamp appearances into page content and remove the interactive fields after filling. | |
| password | No | Password (user or owner) of an encrypted source. Never logged or echoed. | |
| pdfBase64 | Yes | Base64-encoded source PDF containing the AcroForm to fill. Use read_form_fields first to discover field names. | |
| nonWinAnsi | No | Behaviour when a value contains non-WinAnsi characters (appearance font is Helvetica/WinAnsi). 'throw' (default) rejects it; 'needAppearances' writes the value and sets /NeedAppearances so the viewer regenerates the appearance. | throw |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. | |
| onUnknownField | No | Behaviour for a value key that matches no field. 'throw' (default) → FORM_FIELD_NOT_FOUND; 'ignore' skips it. | throw |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing that writes are incremental so prior signatures stay valid for their revision, that flatten.drops the interactive layer, that unknown field names raise FORM_FIELD_NOT_FOUND unless onUnknownField:'ignore', that signature fields cannot be filled (FORM_UNSUPPORTED), and that encrypted sources need a password. These are exactly the behavioral traits an agent needs and none are derivable from readOnlyHint/idempotentHint.
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?
Effectively four dense sentences with no filler; the operation and its alternative are front-loaded and error behavior is packed into terse semicolon clauses. The telegraphic compression (backticked terms, arrow notation) costs a little readability, but nothing is wasted.
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 8-parameter mutation tool with a nested values object and an output schema, the description covers scope, alternatives, mutation semantics, error codes, security (encryption) and the incremental-update guarantee. Return values need not be explained since an output schema exists.
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 already 100%, so baseline is 3, but the description adds real meaning: the values map semantics (fully-qualified name → string/array/boolean/export state), the pure-flatten shorthand, and the signature-field exclusion. It omits explaining outputMode/outputPath sandbox behavior, which lives only in 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?
States a specific verb (fill and/or flatten) on a specific resource (the AcroForm of an EXISTING PDF) and explicitly contrasts with the sibling that creates one (add_form). An agent can distinguish this from add_form and read_form_fields without opening any schema.
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?
Names add_form as the alternative for creating forms and states the selection condition ('EXISTING PDF'), plus clarifies that flatten with no values is a pure flatten. It does not explicitly route to read_form_fields for discovery in the description itself (though the schema does), so it stops just short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_basic_pdfGenerate basic PDFAIdempotent
Multi-page PDF composed from ordered blocks: heading, paragraph, list, table, image (JPEG/PNG), link, toc (printed table of contents), barcode, svg, formField, chart, pageBreak, spacer — every block kind the engine offers, each sharing its body with the dedicated tool (add_table, embed_image, add_barcode, add_form, add_chart). DEFAULT for any document; use the dedicated tools only for a standalone artefact, add_attachment for embedded files and add_international_text for non-Latin scripts. pdfA + embedFonts:true for a valid PDF/A-1b/2b/2u/3b claim; outline / pageLabels / viewerPreferences / watermark for navigation and presentation; print, metadata, outputIntent, creationDate as on every document tool. The 'chart' block takes the same body as add_chart.
| Name | Required | Description | Default |
|---|---|---|---|
| pdfA | No | PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md. | |
| pdfx | No | PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt. | |
| debug | No | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. | |
| No | Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md. | ||
| title | Yes | Document title (rendered at top of page 1 and used as PDF metadata title). | |
| blocks | Yes | Ordered list of content blocks composing the document body. | |
| strict | No | Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true. | |
| encrypt | No | Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached. | |
| margins | No | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. | |
| outline | No | Document outline (bookmarks panel). Either 'auto' (derive a flat outline from heading blocks) or an explicit nested bookmark tree. | |
| compress | No | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. | |
| metadata | No | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. | |
| pageSize | No | Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it. | |
| normalize | No | Unicode normalization before shaping ('NFC' recommended for glyph coverage; NFD/NFKC/NFKD accepted). Omit = none. | |
| watermark | No | Optional semi-transparent watermark rendered centred on every page: `text` (e.g. 'DRAFT'), `image` (JPEG/PNG), or both combined. At least one of text / image is required. opacity < 1.0 (text or image, including the defaults) is rejected under pdfA='pdfa1b' (ISO 19005-1 forbids transparency). | |
| embedFonts | No | Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB. | |
| footerText | No | Optional footer text rendered at the bottom of every page. | |
| outputMode | No | Either 'base64' (returns the PDF inline as a base64 string) or 'file' (writes to a path inside the configured PDFNATIVE_MCP_OUTPUT_DIR sandbox). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. | |
| pageLabels | No | Page-label ranges (the visible page numbers in the viewer, e.g. roman front-matter then decimal body). startPage values must be unique and strictly increasing. | |
| typography | No | Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt. | |
| creationDate | No | ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs. | |
| outputIntent | No | Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space. | |
| footerTemplate | No | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. | |
| headerTemplate | No | Running header on every page (left / center / right zones); reserves 15 pt. | |
| viewerPreferences | No | Reader presentation hints (catalog /PageLayout, /PageMode, /ViewerPreferences). PDF/A-safe; all optional. | |
| includeDiagnostics | No | Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true and openWorldHint=false, so the safety profile is largely covered. The description adds compliance-state consequences (what a valid PDF/A claim requires) and structural notes (block bodies mirror the dedicated tools), but says nothing about output mode behaviour (inline base64 vs sandboxed file write), the pdfA/encryption exclusivity, or the random-vs-deterministic output caveat — all material for a 27-parameter generator.
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?
Front-loaded with the block inventory, then the routing rule, then the option map — the three things an agent needs in priority order. Given the scope of the tool, every clause carries information; there is no filler or restated title.
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?
An output schema exists and the input schema is exhaustively documented, so return-value detail is unnecessary. The description covers routing and the major option families, and the block inventory matches the schema's oneOf variants; it stops short only on output delivery (outputMode/outputPath) and the pdfA/encrypt exclusivity, which matter for correct invocation.
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 per-parameter text is already complete and the baseline is 3. The description earns above baseline by grouping the 27 parameters into functional clusters (compliance, navigation/presentation, print, metadata, determinism) and asserting cross-parameter pairings, which is orientation an agent does not get from reading 27 independent schema entries.
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 first sentence states a specific verb+resource (multi-page PDF) and enumerates exactly what can be composed from ordered blocks, naming every block kind. It explicitly positions itself against siblings: 'DEFAULT for any document; use the dedicated tools only for a standalone artefact', making it unmistakable that this is the general-purpose document builder rather than add_table/add_chart/embed_image.
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?
Explicit routing guidance: default for any document, dedicated tools only for standalone artefacts, add_attachment for embedded files, add_international_text for non-Latin scripts. It also gives conditional guidance for compliance flags ('pdfA + embedFonts:true for a valid PDF/A-1b/2b/2u/3b claim') and for navigation/presentation options, which is when-to-use at the parameter level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_layoutInspect document layout (dry run)ARead-onlyIdempotent
Pagination preview WITHOUT generating a PDF: page count and where every block lands (page, x, top, width, height in points). Same blocks as generate_basic_pdf plus every input that moves a block (title, footerText, pdfA, normalize, embedFonts, pageSize, margins, headerTemplate, footerTemplate): pass what you will give generate_basic_pdf and the page count matches — the dry run shares the pagination planner of the builder, toc blocks included. Read-only, deterministic. Token-frugal: verbosity:'summary', fields:['totalPages'].
| Name | Required | Description | Default |
|---|---|---|---|
| pdfA | No | Tagged (PDF/A) layout mode, as you would pass it to generate_basic_pdf. PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md. | |
| title | Yes | Document title — reserves the title band on page 1 exactly as generate_basic_pdf does. | |
| blocks | Yes | Ordered list of content blocks composing the document body. | |
| fields | No | Optional dot-path projection applied to the structured result (e.g. ['totalPages'] or ['pages.blocks.type']). Composes after verbosity. Unknown paths are omitted. | |
| margins | No | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. | |
| pageSize | No | Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it. | |
| normalize | No | Unicode normalization before shaping ('NFC' recommended for glyph coverage; NFD/NFKC/NFKD accepted). Omit = none. | |
| verbosity | No | 'full' (default) or 'summary' (scalars only: pageWidth, pageHeight, totalPages, blockCount; pages[] and margins dropped). | full |
| embedFonts | No | Measure with the embedded Noto Sans Latin metrics instead of Helvetica — pass the same value you will give generate_basic_pdf. (Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB.) | |
| footerText | No | Footer text as you would pass it to generate_basic_pdf (reserves the footer band). | |
| typography | No | Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt. | |
| footerTemplate | No | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. | |
| headerTemplate | No | Running header on every page (left / center / right zones); reserves 15 pt. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pages | No | Per-page block placement, in render order. A table that spans pages appears once per slice. |
| margins | No | Page margins { top, right, bottom, left } in points. |
| pageWidth | No | Page width in points (595.28 = A4). |
| blockCount | No | summary only: number of placed blocks (table slices count once each). |
| pageHeight | No | Page height in points (841.89 = A4). |
| totalPages | No | Number of pages the blocks paginate into. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, so the description's 'Read-only, deterministic' is partly redundant. However it adds genuine behavioral value: the dry run shares the builder's pagination planner and includes toc blocks, guaranteeing page-count parity with generate_basic_pdf — non-obvious behavior beyond the 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?
Front-loaded with the core purpose ('Pagination preview WITHOUT generating a PDF'), followed by output shape, parity guarantee, and a token-efficiency tip. Dense but every clause earns its place, though the em-dash-heavy run-on phrasing slightly hurts readability.
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?
With an output schema present the description needn't explain return values, and the annotations cover the safety profile. Given the 13-param complexity, it still tells the agent what the tool is, when to reach for it, how its inputs mirror generate_basic_pdf, and how to keep calls cheap — nothing an agent needs is missing.
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 100%, so the baseline is 3, but the description adds real meaning: it enumerates which inputs move a block (title, footerText, pdfA, normalize, embedFonts, pageSize, margins, header/footerTemplate) and directs the agent to reuse generate_basic_pdf's arguments, plus a token-frugal recipe (verbosity:'summary', fields:['totalPages']).
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 precise verb+resource (pagination preview / inspect layout) and explicitly frames it as a dry run that does NOT generate a PDF, immediately distinguishing it from generate_basic_pdf. It also names the return shape (page count, block page/x/top/width/height in points), so an agent knows exactly what it produces.
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?
Gives clear usage context: pass the same inputs you would give generate_basic_pdf and the page count will match, because both share the pagination planner. The alternative (generate_basic_pdf) is implied rather than explicitly named as the non-preview path, and there are no explicit when-not-to-use exclusions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_pdfInspect PDF metadataARead-onlyIdempotent
Read-only facts about a PDF: version, pageCount, encryption, pdfA claim (the claim, not its validity — use veraPDF for that), signatureCount, hasSignaturePlaceholder, attachments[], info; presence-gated dss / docTimestampCount / trapped; signatures:true lists every field (subFilter, isDocTimestamp, isPlaceholder, byteRange, vriKey); pages:true adds per-page sizes and boxes. check:[…] turns it into a CI assertion ('pdfa','signed','encrypted','placeholder','attachments','dss','docTimestamp','trapped') → checks (requested keys only) + checksPassed. Encrypted sources: pass password. Token-frugal: verbosity:'summary', fields:[…].
| Name | Required | Description | Default |
|---|---|---|---|
| check | No | CI assertions → checks (requested keys only) + checksPassed (all hold). 'signed' = a signature field with signed content exists (structural; validity is verify_pdf's job), 'placeholder' = an unsigned placeholder exists, 'dss' = /DSS present, 'docTimestamp' = a /DocTimeStamp exists, 'trapped' = /Info /Trapped set, 'annotations' = at least one page annotation exists, 'pdfx' = the XMP claims PDF/X (the claim, not its validity — validate_pdf standard:'pdf-x-4'). | |
| pages | No | When true, include per-page metadata in the response. | |
| fields | No | Optional dot-path projection applied to the structured result (e.g. ['pageCount','signatureCount']). Composes after verbosity. Unknown paths are omitted. | |
| password | No | Password (user or owner) of an encrypted source. Never logged or echoed. | |
| pdfBase64 | Yes | Base64-encoded PDF bytes to inspect. | |
| verbosity | No | 'full' (default) or 'summary' (scalars only: version, pageCount, encryption, pdfA, signatureCount, hasSignaturePlaceholder, attachmentCount, + docTimestampCount / trapped / pdfX / checksPassed when present; arrays and dss dropped). | full |
| signatures | No | When true, include a signatures[] array describing every signature field (field name, SubFilter, document-timestamp flag, placeholder flag, ByteRange, /Contents length, /VRI key). Off by default to keep responses compact. | |
| annotations | No | When true, include an annotations[] array listing every page annotation (/Annots: links, text notes, highlights, shapes, widgets…) with its 0-based page, subtype, rect and, when present, contents (truncated to 200 chars), title, color, quadPoints and link url. Off by default to keep responses compact. |
Output Schema
| Name | Required | Description |
|---|---|---|
| dss | No | Document Security Store summary (ISO 32000-2 §12.8.4.3), present only when the catalog has a /DSS. |
| info | No | Document /Info dictionary entries decoded as strings. |
| pdfA | No | Detected PDF/A claim (e.g. '1B', '2B', '2U', '3B') from XMP metadata, or null when absent. |
| pdfX | No | PDF/X claim from XMP (pdfxid:GTS_PDFXVersion, e.g. 'PDF/X-4'), present only when the document makes one. A claim, not a verdict: validate_pdf standard:'pdf-x-4' checks it. |
| checks | No | One boolean per REQUESTED check (keys = the check[] you passed, nothing else). |
| perPage | No | |
| trapped | No | /Info /Trapped flag, present only when the document carries one. |
| version | No | PDF version (e.g. "1.7"). |
| pageCount | No | |
| encryption | No | |
| pageLabels | No | Logical page-numbering ranges from the /PageLabels number tree (ISO 32000-1 §12.4.2), or absent when the document has none. Each range gives the 0-based first page, numbering style, optional prefix and start value. |
| signatures | No | Signature fields (opt-in via the `signatures` input). Document timestamps are listed inline with isDocTimestamp=true. |
| annotations | No | Page annotations (opt-in via the `annotations` input), in page order then /Annots order. Only the keys the annotation actually carries are emitted. |
| attachments | No | Embedded files exposed via /Names → /EmbeddedFiles (PDF/A-3, Factur-X). |
| checksPassed | No | Present when check[] was supplied: true when every requested check holds. |
| encryptionInfo | No | Precise Standard Security Handler details (pdfnative v1.6.0), present only when the document is encrypted and was opened successfully. Objects served by the reader are already decrypted. |
| signatureCount | No | |
| annotationCount | No | Total number of page annotations (opt-in via the `annotations` input). |
| attachmentCount | No | summary only: number of embedded files. |
| docTimestampCount | No | Number of /DocTimeStamp signature fields, present only when at least one exists. |
| hasSignaturePlaceholder | No | True when at least one signature widget exists with empty /Contents — i.e. an unsigned placeholder awaiting `sign_pdf`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely non-obvious behavior: encrypted sources require a `password`, `check` returns only requested keys plus a `checksPassed` aggregate, and the tool is deliberately token-frugal via verbosity/fields. Nothing about failure modes or limits beyond that, hence not a 5.
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?
Dense but front-loaded: the core output shape comes first, optional flags next, encryption and token notes last. Backtick-heavy jargon makes it terse rather than skim-friendly, but every clause carries 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 an 8-parameter inspection tool with an output schema, the description covers everything an agent needs: scope, field/claim distinction, CI-mode behavior, password handling and compactness controls. Return values are also briefly mapped even though the output schema carries them.
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% and the description largely restates what the schema already documents (check semantics, signatures/pages flags, verbosity contents). It adds little parameter meaning beyond the schema, though the 'composes after verbosity' projection ordering and token-frugal framing have some value.
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?
Opens with a precise verb+resource ('Read-only facts about a PDF') and enumerates exactly which facts are returned, then explicitly separates what it does NOT judge ('the claim, not its validity — use veraPDF for that'). This lets an agent distinguish it from validate_pdf and verify_pdf without opening any schema.
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?
Clear about context: it routes validity questions to veraPDF/verify_pdf and frames the `check` option as a CI assertion workflow. It does not, however, give an explicit when-to-use-this-instead-of-verify_pdf/Sibling routing sentence for the common 'is this signed and valid?' question, which the schema partially covers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_pdfsMerge PDFsAIdempotent
Concatenate 2–50 PDFs (pdfsBase64[]) into one fresh, self-contained document. Page-tree rebuild: signatures and AcroForm are dropped, XMP (and thus a PDF/A claim) does not survive — re-declare PDF/A on the generating tools; page boxes and /UserUnit do survive; URI links kept unless dropAnnotations:true. Encrypted sources open with one password (PASSWORD_REQUIRED / PASSWORD_INVALID); output unencrypted unless encrypt. Guards: 256 MiB assembly (maxOutputSizeBytes), 50 MiB output (OUTPUT_TOO_LARGE).
| Name | Required | Description | Default |
|---|---|---|---|
| encrypt | No | Re-encrypt the output (Standard Security Handler; AES-128 default or AES-256; RC4 never emitted). | |
| password | No | Password applied to every encrypted source (pdfnative v1.6.0). Sources with an empty user password open without it. The merged output is unencrypted unless `encrypt` is set. | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). | |
| pdfsBase64 | Yes | Base64-encoded source PDFs to concatenate, in order. 2–50 documents. Signatures and AcroForms are dropped (a page-tree edit invalidates them); encrypted PDFs are rejected. | |
| dropAnnotations | No | When true, drop ALL annotations. Default (false) keeps self-contained URI link annotations and drops cross-document/widget annotations. | |
| maxOutputSizeBytes | No | In-memory assembly guard (pdfnative maxOutputSize): the merge throws before materialising an object graph larger than this. Defaults to 268435456 (256 MiB). Note the emitted PDF is separately capped at 50 MiB by the output layer. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotation bar: it discloses what is destroyed (signatures, AcroForm, XMP/PDF-A claim), what survives (page boxes, /UserUnit, URI links), error codes (PASSWORD_REQUIRED, PASSWORD_INVALID, OUTPUT_TOO_LARGE, SECURITY_VIOLATION) and two distinct size guards. Annotations only say it is not read-only and is idempotent, so the description carries the real behavioral load.
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, front-loaded with the core operation before the caveats. Dense but every clause (what survives, error codes, guards) earns its place; the inline error-code tokens make it slightly less scannable than an ideal definition.
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?
An output schema exists so return values need no explanation, and the description still covers encryption, annotation handling, sandboxed file output, and size limits — everything an agent needs to invoke this 7-parameter nested-object tool correctly.
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 100%, so the baseline is 3, but the description adds genuine meaning: `password` applies to every encrypted source, output is unencrypted unless `encrypt` is set, and it explains the layering of `maxOutputSizeBytes` (256 MiB assembly) against the separate 50 MiB output cap. Still, per-parameter syntax largely lives in 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?
Opens with a specific verb and resource plus scope: 'Concatenate 2–50 PDFs into one fresh, self-contained document.' That cleanly separates it from siblings like split_pdf, extract_pages, or validate_pdf.
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?
Gives clear operating conditions (encrypted sources need a password, output is unencrypted unless `encrypt`, page-tree rebuild side effects) and even routes PDF/A re-declaration to the generating tools. It stops short of naming a specific alternative sibling or stating explicit when-not-to-use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_signature_placeholderPrepare signature placeholderAIdempotent
New PDF carrying an unsigned /Sig placeholder for a LATER sign_pdf call. OPTIONAL — sign_pdf auto-injects one. Use it to size the placeholder (placeholderBytes for > 4096-bit keys, reserveTimestamp for an RFC 3161 token), to pin the widget page (pageIndex), to choose subFilter 'ETSI.CAdES.detached' (PAdES), or to ship the placeholder separately. signerName/reason/location/contactInfo/signingTime are frozen into /Sig here — sign_pdf cannot rewrite them later. NOTE: the unsigned file is not yet a conformant PDF/A (empty /Contents); it becomes one once signed. PDF/A, print, metadata and creationDate options as on every document tool.
| Name | Required | Description | Default |
|---|---|---|---|
| pdfA | No | PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md. The unsigned placeholder is NOT yet conformant (empty /Contents, ISO 19005-2 §6.4.3); it is once signed with sign_pdf profile:'pades'. | |
| debug | No | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. | |
| No | Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md. | ||
| title | Yes | Document title. Used as the PDF metadata title and rendered at the top of page 1. | |
| blocks | No | Optional document body blocks rendered before the signature field. | |
| reason | No | Reason for signing (e.g. "Approved", "I agree to the terms"). | |
| strict | No | Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true. | |
| margins | No | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. | |
| compress | No | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. | |
| location | No | Signing location (city / country). | |
| metadata | No | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. | |
| pageSize | No | Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it. | |
| fieldName | No | Optional AcroForm field name for the signature widget (default 'Signature1'). | |
| pageIndex | No | Zero-based page index the (invisible) widget attaches to (default 0). | |
| subFilter | No | Signature SubFilter baked into the /Sig dictionary (frozen at placeholder time). Use 'ETSI.CAdES.detached' for PAdES baseline signatures (sign_pdf profile='pades'). Default 'adbe.pkcs7.detached'. | |
| embedFonts | No | Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB. | |
| outputMode | No | Either 'base64' (returns the PDF inline) or 'file' (writes to a sandboxed path inside PDFNATIVE_MCP_OUTPUT_DIR). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. | |
| signerName | No | Name of the intended signer, embedded in the /Sig dictionary. | |
| typography | No | Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt. | |
| contactInfo | No | Contact information for the signer. | |
| signingTime | No | /Sig /M — the claimed signing instant (ISO-8601), frozen into the placeholder dictionary. Omitted: the wall clock at placeholder time. Pin it (with creationDate) for byte-identical output across calls. | |
| creationDate | No | ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs. | |
| outputIntent | No | Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space. | |
| footerTemplate | No | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. | |
| headerTemplate | No | Running header on every page (left / center / right zones); reserves 15 pt. | |
| placeholderBytes | No | Reserved bytes for the future CMS /Contents blob (default 16384; 24576 when reserveTimestamp=true). Increase only for >4096-bit RSA, long chains or large TSA tokens. | |
| reserveTimestamp | No | Reserve room for an RFC 3161 signature timestamp (sign_pdf timestamp=true): adds 8 KiB to the default placeholder size. Ignored when placeholderBytes is set explicitly. | |
| includeDiagnostics | No | Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly=false, idempotent=true, destructive=false, so the description carries real weight: it discloses that signerName/reason/location/contactInfo/signingTime are frozen into /Sig at placeholder time and sign_pdf cannot rewrite them later, and that the unsigned output is not yet conformant PDF/A because /Contents is empty. These are non-obvious behavioral consequences not derivable from the 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 critical framing (what it is, that it is optional, that sign_pdf auto-injects) comes first, and the rest is a tight enumeration of reasons to use it. Sentences are dense and information-packed for a 29-parameter tool, though the parenthetical lists make it slightly harder to scan than an ideal definition.
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?
With an output schema present, the description need not document return values, and with annotations covering the safety profile it mainly needs to convey the placeholder-specific semantics — freezing, nonconformance, and sizing. It does all of that, plus points to shared options, so an agent has everything needed to decide whether and how to call it.
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 already 100%, so the baseline is 3, but the description adds genuine selection guidance beyond the schema: which situations justify placeholderBytes (large RSA keys, long chains), what reserveTimestamp is for, how pageIndex pins the widget, and the PAdES role of subFilter. It also forward-references cross-cutting options (PDF/A, print, metadata, creationDate) as shared document-tool conventions. It does not attempt to restate all 29 parameters, which is appropriate.
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 and artifact: creates a new PDF carrying an unsigned /Sig placeholder explicitly intended for a LATER sign_pdf call. This clearly separates it from sign_pdf and from generate_basic_pdf, so the agent knows this is a preparatory step, not the signing step.
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?
Explicitly declares itself OPTIONAL and names the alternative that makes it unnecessary ('sign_pdf auto-injects one'). It then enumerates the concrete reasons to use it anyway: sizing placeholderBytes for >4096-bit keys, reserveTimestamp for an RFC 3161 token, pinning pageIndex, choosing the PAdES subFilter, or shipping the placeholder separately. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_form_fieldsRead AcroForm fieldsARead-onlyIdempotent
Read-only list of an existing PDF's AcroForm fields: fully-qualified name, type (text | checkbox | radio | dropdown | listbox | button | signature | unknown), value, flags (readOnly / required / multiline), options, widget placements. Call it BEFORE fill_form to learn the names. Encrypted sources: password. Token-frugal: verbosity:'summary' → { fieldCount }.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Optional dot-path projection applied to the structured result (e.g. ['fields.name','fields.type']). Composes after verbosity. Unknown paths are omitted. | |
| password | No | Password (user or owner) of an encrypted source. Never logged or echoed. | |
| pdfBase64 | Yes | Base64-encoded PDF bytes whose AcroForm fields should be enumerated. | |
| verbosity | No | Response verbosity. 'full' (default) returns the fields[] array; 'summary' returns a token-frugal { fieldCount } and drops the array. | full |
Output Schema
| Name | Required | Description |
|---|---|---|
| fields | No | |
| fieldCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as read-only and idempotent, and the description adds useful behavior details: password handling for encrypted PDFs and a token-frugal 'summary' response mode that returns only fieldCount. It does not disclose every edge case, but the core behavioral traits are well covered by the annotations and description together.
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 purpose is front-loaded, and every sentence earns a place. The long first sentence packs critical output attributes efficiently, followed by short, actionable notes about fill_form, password, and verbosity. There is no excess filler or 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?
Given the annotations, the rich parameter schema, and the presence of an output schema, the description covers the remaining necessary context. It tells the agent when to call it, how to handle encrypted files, and how to customise response size, which is complete for a read-only enumeration tool.
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?
All four parameters already have thorough schema descriptions, so the baseline is met regardless. The description briefly mentions password and verbosity behavior, but those details are largely restating what is already in the schema. It adds little beyond what the input schema conveys.
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 a read-only list of AcroForm fields and enumerates what is returned: name, type, value, flags, options, and widget placements. It also ties the operation to the sibling fill_form tool, so its role in the workflow is unmistakable.
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 says 'Call it BEFORE fill_form to learn the names,' giving the agent a concrete, actionable use case and emphasizing that this tool is a prerequisite for fill_form. It does not mention when not to use it or provide other alternative tools, so it lacks full exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sign_pdfSign PDF (RSA / ECDSA, PAdES)A
CMS / PAdES signature in ONE call: a missing /Sig placeholder is auto-injected (prepare_signature_placeholder is optional). Inputs: pdfBase64, algorithm (rsa-sha256/384/512, ecdsa-sha256 P-256), certDerBase64 (+ certChainDerBase64 intermediates) and the DER key (rsaKeyPkcs1DerBase64 for rsa-*, ecPrivateKeyDerBase64 or ecPrivateScalarHex for ECDSA; PEM is rejected with the openssl remedy). profile:'pades' (ETSI EN 319 142-1 baseline) is the right choice when add_ltv / timestamp_pdf follow; timestamp:true = PAdES B-T through the operator TSA (TSA_NOT_CONFIGURED otherwise, no network without it). signerName/reason/location/contactInfo/signingTime are baked into the placeholder THIS call injects (a pre-built placeholder keeps its own). Several unsigned placeholders → pass fieldName (PLACEHOLDER_AMBIGUOUS); allowMultiple:true + a new fieldName adds a further signature. Verify with verify_pdf.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | /Sig /Reason — baked into the placeholder when this call injects it. | |
| profile | No | 'pkcs7' (default, adbe.pkcs7.detached) or 'pades' (ETSI EN 319 142-1 baseline; ETSI.CAdES.detached when the placeholder is injected here). Use 'pades' before timestamp / add_ltv / timestamp_pdf. | pkcs7 |
| location | No | /Sig /Location — baked into the placeholder when this call injects it. | |
| algorithm | Yes | Signature algorithm. 'rsa-sha384' / 'rsa-sha512' (pdfnative 1.7) upgrade the whole CMS digest chain. ECDSA only supports P-256 with SHA-256. | |
| fieldName | No | Name of the signature field to sign (required when several unsigned placeholders exist) and of the placeholder injected by this call. | |
| pdfBase64 | Yes | Base64-encoded PDF bytes. When the PDF already contains an unsigned /Sig placeholder it is signed in place; otherwise the placeholder is auto-injected (set autoInjectPlaceholder=false to opt out). | |
| timestamp | No | PAdES B-T: request an RFC 3161 signature timestamp from the operator-configured TSA (PDFNATIVE_MCP_TSA_URL). Fails with TSA_NOT_CONFIGURED when no TSA is configured — the server never contacts the network otherwise. | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). | |
| signerName | No | /Sig /Name — baked into the placeholder when this call injects it. | |
| contactInfo | No | /Sig /ContactInfo — baked into the placeholder when this call injects it. | |
| signingTime | No | ISO-8601 signing instant → /Sig /M (only when THIS call injects the placeholder) and the CMS signing-time (pkcs7 profile). Default: now. Not trusted time — use timestamp:true for that. | |
| allowMultiple | No | Add a NEW signature next to existing (already signed) fields instead of signing the first placeholder. Requires fieldName. Each signature is an incremental revision; earlier signatures stay valid. | |
| certDerBase64 | Yes | Base64 of the signer X.509 certificate in DER form. Convert from PEM with: openssl x509 -in cert.pem -outform DER | openssl base64 -A | |
| certChainDerBase64 | No | Optional intermediate CA certificates (DER base64) embedded in the CMS so verifiers and add_ltv can build the chain without fetching caIssuers. | |
| ecPrivateScalarHex | No | Hex-encoded P-256 private scalar `d` (exactly 64 lowercase or uppercase hex chars, no 0x prefix). Mutually exclusive with ecPrivateKeyDerBase64; either is accepted for ECDSA. | |
| rsaKeyPkcs1DerBase64 | No | Base64 of the RSA private key in DER form — PKCS#1 RSAPrivateKey (openssl rsa -in key.pem -outform DER -traditional | openssl base64 -A) or PKCS#8 PrivateKeyInfo (openssl pkey -in key.pem -outform DER | openssl base64 -A). NOT PEM. Required for the rsa-* algorithms. | |
| autoInjectPlaceholder | No | When true (default) and the input PDF has no /Sig widget, pdfnative.addSignaturePlaceholder is called before signing — enabling single-call signing of any PDF. | |
| ecPrivateKeyDerBase64 | No | Base64 of an ECDSA P-256 private key in SEC1 (RFC 5915) or PKCS#8 (RFC 5208) DER form. Convert from PEM with: openssl pkey -in key.pem -outform DER | openssl base64 -A Mutually exclusive with ecPrivateScalarHex. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, openWorldHint=true, idempotentHint=false), and the description goes well beyond them: auto-injection of the /Sig placeholder, error codes (TSA_NOT_CONFIGURED, PLACEHOLDER_AMBIGUOUS), the no-network guarantee, PEM rejection, and the fact that each allowMultiple signature is an incremental revision keeping earlier signatures valid. It stops short of stating revertibility or output/return shape, so a 4 rather than 5.
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?
Front-loaded with the one-call capability, then organized by input, profile choice, TSA behavior, placeholder metadata, and ambiguity handling. Extremely dense but no sentence is filler; the density slightly taxes readability, keeping it from a 5.
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 19-parameter cryptographic signing tool with an output schema and rich annotations, the description covers what to call, which profile, when the TSA is needed, how placeholder metadata is applied, and how to handle ambiguity and multiple signatures. Nothing an agent needs to invoke it correctly is missing.
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 100%, so the baseline is 3, but the description supplies cross-parameter semantics the schema cannot: PEM is rejected with the openssl remedy, the placeholder-baking rule for signerName/reason/location/contactInfo/signingTime applies only when THIS call injects the placeholder, fieldName is required on ambiguity, and allowMultiple needs a new fieldName. That is real added meaning.
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?
Opens with a specific verb+resource+scope: 'CMS / PAdES signature in ONE call', and immediately clarifies the relationship to the sibling prepare_signature_placeholder (optional) and the verify step (verify_pdf). An agent can distinguish this from every other sibling in the list.
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?
Explicit routing rules: profile:'pades' 'is the right choice when add_ltv / timestamp_pdf follow', timestamp:true for PAdES B-T, allowMultiple:true to add a further signature, and verify with verify_pdf. Names conditions and alternatives rather than leaving them to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
split_pdfSplit PDF into rangesAIdempotent
Split one PDF into several documents, one per ranges[] entry ({ start, end? }, 0-based inclusive; end defaults to start). Multi-output result: base64 mode returns one embedded resource per part; file mode writes indexed siblings ('out.pdf' → 'out-1.pdf', 'out-2.pdf', …). Same page-tree caveats as merge_pdfs (signatures/AcroForm/XMP dropped; boxes kept). Encrypted sources: password. Need ONE document from a page subset? Use extract_pages.
| Name | Required | Description | Default |
|---|---|---|---|
| ranges | Yes | Page ranges to extract, one output PDF per range. 0-based, inclusive; `end` defaults to `start` (a single page). | |
| encrypt | No | Re-encrypt the output (Standard Security Handler; AES-128 default or AES-256; RC4 never emitted). Applied to every produced range. | |
| password | No | Password (user or owner) of an encrypted source. Never logged or echoed. | |
| pdfBase64 | Yes | Base64-encoded source PDF. Pass `password` for an encrypted source. | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Base output path (file mode). Each PDF is written to an indexed sibling: 'out.pdf' → 'out-1.pdf', 'out-2.pdf', … | |
| dropAnnotations | No | When true, drop ALL annotations. Default keeps self-contained URI link annotations. | |
| maxOutputSizeBytes | No | Maximum size, in bytes, of each produced PDF. Defaults to 268435456 (256 MiB). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| count | Yes | |
| parts | Yes | |
| totalBytes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses multi-output behavior, output naming conventions in file mode, what happens in base64 mode, and important PDF caveats (signatures/AcroForm/XMP dropped; boxes kept). It also notes encrypted sources using password. These go beyond the annotations, which only describe readOnly/idemptency/destructive hints, and would meaningfully affect ai-agent expectations for the result.
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 compact and information-dense: four sentences that front-load the core operation, then deliver range semantics, output behavior, page-tree caveats, encrypted-source handling, and the sibling alternative. Every sentence earns its place and no extraneous content is present.
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 8 parameters, nested objects, and an output schema, the description covers the defining split behavior, the two output modes with concrete file naming, the main transformation caveats, and the canonical alternative. Given the rich schema and output schema, nothing essential is missing for selecting or invoking it correctly.
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 input schema already documents every parameter including the zero-based inclusive nature of ranges, outputPath semantics, password behavior, and outputMode defaults. The description reinforces the central `ranges[]` semantics and output naming but does not add meaningful meaning beyond what the schema already provides.
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 a specific verb and resource: 'Split one PDF into several documents, one per ranges[] entry'. It also distinguishes itself from extract_pages by explicitly naming the alternative for extracting a single document, so an agent can tell the tools apart at the description level.
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?
Includes explicit routing guidance: 'Need ONE document from a page subset? Use extract_pages.' It also references merge_pdfs for shared page-tree caveats, helping the agent understand this tool is best when multiple ranges are wanted, and points to password handling for encrypted sources. Clear enough to select this tool over the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timestamp_pdfAdd a document timestamp (PAdES B-LTA)A
PAdES B-LTA: append an RFC 3161 document timestamp (/DocTimeStamp, ETSI.RFC3161) over the whole document. Ladder step 4 after add_ltv; re-run before the TSA certificate expires. fieldName omitted → DocTimeStamp1, 2, …; a fieldName colliding with a signed field fails. Uses the OPERATOR TSA (PDFNATIVE_MCP_TSA_URL; TSA_NOT_CONFIGURED otherwise, no network without it). The token's status, imprint and nonce are checked before embedding (its own signature is verified by verify_pdf). Unencrypted PDFs only.
| Name | Required | Description | Default |
|---|---|---|---|
| fieldName | No | Signature field name for the timestamp. Omit it to get 'DocTimeStamp1', 'DocTimeStamp2', … auto-suffixed on each re-timestamp; an explicit name that collides with an existing signed field fails. | |
| pdfBase64 | Yes | Base64-encoded PDF (unencrypted). Typically already signed (+ add_ltv) — a document timestamp on an unsigned PDF is allowed but proves only existence at that time. | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Relative path inside PDFNATIVE_MCP_OUTPUT_DIR (required when outputMode='file'). | |
| placeholderBytes | No | Room reserved for the TimeStampToken (default 12288). Raise it for TSAs that return large certificate chains. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the OPERATOR TSA requirement, the TSA_NOT_CONFIGURED failure mode and absence of network without it, pre-embedding checks on status/imprint/nonce, fieldName collision failure, and re-run-before-expiry semantics that explain the non-idempotent annotation.
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?
Dense and front-loaded — the PAdES level and operation lead, with error modes and constraints following. Every sentence carries distinct information, though the single long block could be broken up for faster scanning.
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?
An output schema exists so return values need no explanation; the description instead covers the prerequisites (operator TSA, unencrypted PDF), failure modes (TSA_NOT_CONFIGURED, field collision, SECURITY_VIOLATION), and ladder placement — everything an agent needs to call it correctly.
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 every parameter including fieldName auto-suffixing, outputMode sandbox errors, and placeholderBytes sizing. The description largely restates the fieldName rules rather than adding syntax or constraints beyond the schema, making the baseline 3 appropriate.
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 ('append an RFC 3161 document timestamp over the whole document') and locates itself precisely in the ladder ('step 4 after add_ltv'), distinguishing it from siblings add_ltv and verify_pdf without opening any schema.
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?
Explicit sequencing guidance ('Ladder step 4 after add_ltv; re-run before the TSA certificate expires') and a hard exclusion ('Unencrypted PDFs only'). It stops short of naming when an agent should prefer verify_pdf or add_ltv instead, so it is clear context without full when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_metadataUpdate document metadataA
Rewrite /Info (title, author, subject, keywords) of an EXISTING PDF as an incremental update; XMP stays in sync on PDF/A documents; /ModDate is refreshed (pin modDate for reproducible bytes). Earlier revisions and signatures stay byte-identical — the new revision is unsigned (sign_pdf / timestamp_pdf again if needed). Encrypted sources → ENCRYPTED_SOURCE. For metadata at generation time use the metadata option of the document tools.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | New /Info /Title (mirrored to XMP dc:title when the document carries XMP). | |
| author | No | New /Info /Author (XMP dc:creator). | |
| modDate | No | ISO-8601 modification instant for /ModDate and xmp:ModifyDate. Defaults to now; pin it for reproducible output. | |
| subject | No | New /Info /Subject (XMP dc:description). | |
| keywords | No | New /Info /Keywords (XMP pdf:Keywords). | |
| pdfBase64 | Yes | Base64-encoded PDF to update (unencrypted). | |
| outputMode | No | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). | base64 |
| outputPath | No | Relative path inside PDFNATIVE_MCP_OUTPUT_DIR (required when outputMode='file'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| summary | No | Tool-specific summary, when produced. |
| filePath | No | Sandboxed absolute path (file mode). |
| sizeBytes | Yes | |
| diagnostics | No | Engine diagnostics (when includeDiagnostics=true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses incremental-update semantics, that earlier revisions and signatures stay byte-identical, that the new revision is unsigned, the ENCRYPTED_SOURCE failure for encrypted sources, XMP sync on PDF/A, and ModDate refresh/pinning for reproducibility. These are exactly the behavioral traits an agent needs that annotations (readOnly/idempotent/destructive hints) cannot convey.
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?
Four dense sentences, front-loaded with the core action and followed by the behavioral caveats and the alternative. No filler or restated boilerplate; every sentence carries distinct 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?
With an output schema and full annotation coverage already present, the description fills the remaining gaps: mutation semantics, signature invalidation, error codes, and alternative routing. Nothing an agent needs to invoke this correctly is missing.
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 100%, so the field-level semantics are already documented. The description still adds framing value by tying the fields to the /Info vs XMP dual-write behavior and to the ModDate pin for reproducible bytes, though it largely mirrors what the schema descriptions already say.
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 and resource ('Rewrite /Info (title, author, subject, keywords) of an EXISTING PDF') scoped precisely to an incremental update of an existing file. It distinguishes itself from the generation-time siblings by naming the `metadata` option of the document tools, so an agent can route without opening a schema.
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?
Explicitly names the alternative path ('For metadata at generation time use the `metadata` option of the document tools') and the condition that selects it. It also gives follow-up routing ('sign_pdf / timestamp_pdf again if needed'), so both when-to-use and what-to-do-next are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_pdfValidate PDF structure (PDF/UA, PDF/X-4)ARead-onlyIdempotent
Read-only structural gate; standard picks the rule set. 'pdf-ua-1' (default, ISO 14289-1) for Tagged PDF: /MarkInfo /Marked, /StructTreeRoot (+ /ParentTree), XMP /Metadata, /Lang, per-page MCID uniqueness — generate tagged input with pdfA (e.g. 'pdfa2u') first. 'pdf-x-4' (ISO 15930-7) for print exchange: /GTS_PDFX OutputIntent with a prtr ICC profile, TrimBox or ArtBox, every font embedded, no annotation / JavaScript / embedded file / transfer function — generate it with pdfx:'pdfx4'. Result { standard, valid, errors[], warnings[], summary } (+ caveats[] for PDF/X). Fast and structural only — NOT a reference validator or a certified preflight: fonts, colour and rendering are not checked (veraPDF for PDF/A and PDF/UA; callas pdfToolbox or Acrobat Preflight for PDF/X). Unparsable input → PDF_PARSE_FAILED.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Optional dot-path projection applied to the structured result (e.g. ['valid']). Composes after verbosity. Unknown paths are omitted. | |
| standard | No | Rule set. 'pdf-ua-1' (default): PDF/UA accessibility structure (ISO 14289-1). 'pdf-x-4': PDF/X-4 print exchange (ISO 15930-7) — OutputIntent + prtr ICC profile, TrimBox, embedded fonts, no annotations / JavaScript / embedded files; structural prerequisites only, not a certified preflight (see caveats[]). | pdf-ua-1 |
| pdfBase64 | Yes | Base64-encoded PDF bytes to validate for structural conformance. | |
| verbosity | No | Response verbosity. 'full' (default) returns errors[] and warnings[]; 'summary' returns a token-frugal verdict { standard, valid, errorCount, warningCount, summary } and drops the message arrays. | full |
Output Schema
| Name | Required | Description |
|---|---|---|
| valid | No | True when no blocking structural violations were found. |
| errors | No | Blocking conformance violations. Empty when valid is true. |
| caveats | No | standard 'pdf-x-4' only: what a valid verdict does NOT establish. |
| summary | No | Human-readable one-line summary of the result. |
| standard | No | Conformance standard checked (ISO 14289-1 or ISO 15930-7). |
| warnings | No | Non-blocking best-practice recommendations. |
| errorCount | No | summary only: number of errors. |
| warningCount | No | summary only: number of warnings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, but the description adds substantial behavior beyond them: what is deliberately not checked (fonts, colour, rendering), the caveats[] return for PDF/X, and the concrete failure mode 'PDF_PARSE_FAILED' for unparsable input.
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?
Dense but front-loaded: the core role and the standard switch come first, followed by per-standard detail, result shape, and limitations. Every clause carries information, though the single block is heavy enough that some trimming or line breaks would improve scanability.
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 an output schema exists, the description need not explain returns, yet it still summarizes the result shape and caveats[]. Combined with coverage of both standards, generation prerequisites, limitations, and the parse-failure code, an agent has everything needed to call it correctly.
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 100%, so baseline is 3, but the description still adds value by spelling out the ISO numbers and the exact rule contents behind each 'standard' enum value, plus the default. It does not add much beyond the schema for 'fields' or 'verbosity', keeping it at a 4.
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?
Opens with a specific verb+resource ('structural gate') and enumerates exactly what each standard validates (PDF/UA tags, PDF/X-4 OutputIntent/fonts/annotations). It is clearly distinguishable from siblings like inspect_pdf or verify_pdf, which are not described in these structural-conformance terms.
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?
States when to pick each standard, that input should be generated first with the pdfA/pdfx tools (e.g. 'pdfa2u', 'pdfx4'), and explicitly routes agents needing deeper validation to veraPDF/callas/Acrobat. It also bounds scope with 'NOT a reference validator or a certified preflight'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_pdfVerify PDF signaturesARead-onlyIdempotent
Read-only verification of every signature: ByteRange digest vs CMS messageDigest (integrity), CMS signatureValue vs the embedded signer certificate (RSA-SHA256/384/512, ECDSA P-256), chain trust when trustedRootsDerBase64 is given ('self-signed' | 'unverified' | 'trusted' otherwise). /DocTimeStamp entries are verified as RFC 3161 tokens and count in allValid like any signature. Result: { allValid, signatureCount, summary, signatures:[{ valid, integrity, signerSubject, signingTime, chainTrust, errors[] }] }. ltv:true adds the PAdES view: per-signature profile, timestamp, revocation (read from embedded /DSS only — responder signatures are not re-verified) and ltvLevel B-B / B-T / B-LT / B-LTA with explicit caveats. Token-frugal: verbosity:'summary', fields:['allValid'].
| Name | Required | Description | Default |
|---|---|---|---|
| ltv | No | Add the PAdES view: per signature profile, timestamp, revocation (embedded /DSS only), ltvLevel (B-B / B-T / B-LT / B-LTA); document-level dss, ltvLevel, caveats. | |
| fields | No | Optional dot-path projection applied to the structured result (e.g. ['allValid'] or ['signatures.valid']). Composes after verbosity. Unknown paths are omitted. | |
| password | No | Password (user or owner) of an encrypted source. Never logged or echoed. | |
| pdfBase64 | Yes | Base64-encoded PDF bytes to verify. | |
| verbosity | No | Response verbosity. 'full' (default) returns the per-signature signatures[] array; 'summary' returns a token-frugal verdict { signatureCount, allValid, invalid, summary } (+ ltvLevel when ltv:true) and drops signatures[], dss and caveats. | full |
| trustedRootsDerBase64 | No | Optional list of base64-encoded X.509 root certificates (DER). When supplied, each signer certificate is validated against these roots; otherwise chainTrust is reported as self-signed or unverified. |
Output Schema
| Name | Required | Description |
|---|---|---|
| dss | No | ltv only. Document Security Store summary, or null when the catalog has no /DSS. |
| caveats | No | ltv only. Fixed statements about what the LTV evaluation does not cover. |
| invalid | No | summary only: number of invalid signatures. |
| summary | No | |
| allValid | No | true when the document carries at least one signature and every entry of signatures[] — CMS signatures and /DocTimeStamp tokens alike — is valid (integrity + signature check + chain trust when trustedRootsDerBase64 is given). A tampered document timestamp fails the verdict; a sound one never does. |
| ltvLevel | No | ltv only. Minimum level across non-timestamp signatures ('B-B' when there are none). |
| signatures | No | |
| signatureCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnlyHint and idempotentHint annotations by explaining exactly what is verified, how chainTrust is determined, how /DocTimeStamp is treated, and what ltv:true does. It also includes important caveats such as embedded /DSS-only revocation data and the fact that responder signatures are not re-verified. This gives the agent a strong model of the tool's behavior before invoking it.
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 dense but well structured, front-loading the core verification purpose and then layering optional modes. Every sentence adds meaningful information, and the structured result shape and token-frugal guidance are presented in compact, scannable form.
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, the input schema, annotations, and output schema, the description covers the essential semantic, behavioral, and output-critical details. It explains verification scope, trust behavior, timestamp handling, LTV caveats, and result shapes well enough for an agent to decide whether to call it and what to expect.
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 schema already documents all six parameters with high coverage, so the baseline is solid. The description adds genuine semantic value by explaining the effect of trustedRootsDerBase64, the LTV behavior tied to ltv:true, and the token-frugal interaction between verbosity and fields.
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 precise operation: read-only verification of every PDF signature, including integrity, signature value, chain trust, timestamps, and PAdES LTV behavior. It clearly distinguishes the tool's scope from generic PDF validation by enumerating specific verification mechanics and output fields.
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 makes the tool's purpose and behavior easy to infer: it is for signature-specific verification, with optional LTV analysis. However, it does not explicitly tell the agent when to choose verify_pdf over sibling tools like validate_pdf or inspect_pdf, nor does it state any exclusions. Usage context is implied rather than directly described.
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.
22 tool updates
v1.6.2- Changed
add_attachment23 fields changed- changed
Input schema / properties / creationDate / descriptionPrevious value: -"ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs."New value: +"ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs." - changed
Input schema / properties / embedFonts / descriptionPrevious value: -"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB."New value: +"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB." - changed
Input schema / properties / footerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / footerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / footerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / footerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / footerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / footerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / footerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / headerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / headerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / headerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / headerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / headerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / includeDiagnostics / descriptionPrevious value: -"Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty)."New value: +"Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty)." - changed
Input schema / properties / outputIntent / descriptionPrevious value: -"Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected)."New value: +"Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space." - changed
Input schema / properties / outputIntent / properties / iccProfileBase64 / descriptionPrevious value: -"ICC profile bytes, base64 (RGB, ≤ 8 MiB)."New value: +"ICC profile bytes, base64 (RGB, CMYK or Gray; ≤ 8 MiB)." - changed
Input schema / properties / print / properties / marks / oneOfPrevious value: -[ - { - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "crop": { - "description": "Corner crop (trim) marks. Default true.", - "type": "boolean" - }, - "length": { - "description": "Mark length in points. Default 14.", - "maximum": 100, - "minimum": 1, - "type": "number" - }, - "offset": { - "description": "Gap between TrimBox and marks in points. Default 5.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "registration": { - "description": "Edge-midpoint registration targets. Default true.", - "type": "boolean" - }, - "weight": { - "description": "Stroke width in points. Default 0.25.", - "maximum": 5, - "minimum": 0.05, - "type": "number" - } - }, - "type": "object" - } -]New value: +[ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "colourBars": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "size": { + "description": "Patch size in points. Default 12.", + "maximum": 72, + "minimum": 4, + "type": "number" + }, + "tints": { + "description": "Add the four 50 % tint patches. Default true.", + "type": "boolean" + } + }, + "type": "object" + } + ], + "description": "Colour control strip in the bleed (C M Y K solids + their 50 % tints): true for defaults. Off by default; needs a bleed of about 5 mm (14.17 pt) and is skipped when the strip would not fit." + }, + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } +] - changed
Input schema / properties / strict / descriptionPrevious value: -"Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true."New value: +"Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true." - added
Input schema / properties / typographyAdded value: +{ + "additionalProperties": false, + "description": "Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt.", + "properties": { + "bindShortWords": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "maxLength": { + "maximum": 3, + "minimum": 1, + "type": "integer" + }, + "words": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "Never end a line on a short word: up to maxLength letters (default 1), or exactly the listed words." + }, + "fontFeatures": { + "description": "OpenType features, later wins. tnum / lnum are no-ops on Noto Sans (TYPOGRAPHY_FEATURE_INEFFECTIVE).", + "items": { + "enum": [ + "tnum", + "pnum", + "lnum", + "onum", + "zero", + "ordn", + "sups", + "subs", + "smcp", + "c2sc", + "case" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array", + "uniqueItems": true + }, + "hyphenationLanguage": { + "description": "BCP 47 tag; no effect here (no hyphenation provider installed).", + "maxLength": 35, + "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$", + "type": "string" + }, + "keepHeadingsWithNext": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "minLines": { + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" + } + ], + "description": "Never strand a heading at a page foot. true = { minLines: 2 }." + }, + "kerning": { + "description": "Pair kerning (GPOS).", + "type": "boolean" + }, + "metrics": { + "description": "Base-14 text: 'exact' uses the AFM widths (different wraps). Default 'approximate'.", + "enum": [ + "approximate", + "exact" + ], + "type": "string" + }, + "opticalMargins": { + "description": "Hang punctuation into the margin of align:'justify' text.", + "type": "boolean" + }, + "orphans": { + "description": "Min lines left at a page foot (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + }, + "punctuationSpacing": { + "anyOf": [ + { + "enum": [ + "fr", + "fr-CA" + ], + "type": "string" + }, + { + "items": { + "additionalProperties": false, + "properties": { + "char": { + "maxLength": 2, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "space": { + "description": "U+00A0 / U+202F (narrow needs embedFonts).", + "enum": [ + "nbsp", + "narrow" + ], + "type": "string" + } + }, + "required": [ + "char", + "side", + "space" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + } + ], + "description": "No-break spaces next to punctuation (existing spaces only). 'fr': narrow before ; ! ?, no-break before ':' and inside « ». 'fr-CA': ':' and « » only. Or explicit rules." + }, + "splitParagraphs": { + "description": "Paragraphs may break across pages at a line boundary (default: atomic).", + "type": "boolean" + }, + "unitBinding": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "units": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "No-break space between a number and its unit ('150 €', '12 kg'); units replaces the built-in list." + }, + "widows": { + "description": "Min lines carried over (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" +} - changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
add_barcode24 fields changed- changed
Input schema / properties / creationDate / descriptionPrevious value: -"ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs."New value: +"ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs." - changed
Input schema / properties / embedFonts / descriptionPrevious value: -"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB."New value: +"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB." - changed
Input schema / properties / footerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / footerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / footerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / footerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / footerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / footerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / footerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / headerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / headerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / headerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / headerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / headerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / includeDiagnostics / descriptionPrevious value: -"Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty)."New value: +"Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty)." - changed
Input schema / properties / outputIntent / descriptionPrevious value: -"Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected)."New value: +"Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space." - changed
Input schema / properties / outputIntent / properties / iccProfileBase64 / descriptionPrevious value: -"ICC profile bytes, base64 (RGB, ≤ 8 MiB)."New value: +"ICC profile bytes, base64 (RGB, CMYK or Gray; ≤ 8 MiB)." - added
Input schema / properties / pdfxAdded value: +{ + "description": "PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt.", + "enum": [ + "pdfx4" + ], + "type": "string" +} - changed
Input schema / properties / print / properties / marks / oneOfPrevious value: -[ - { - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "crop": { - "description": "Corner crop (trim) marks. Default true.", - "type": "boolean" - }, - "length": { - "description": "Mark length in points. Default 14.", - "maximum": 100, - "minimum": 1, - "type": "number" - }, - "offset": { - "description": "Gap between TrimBox and marks in points. Default 5.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "registration": { - "description": "Edge-midpoint registration targets. Default true.", - "type": "boolean" - }, - "weight": { - "description": "Stroke width in points. Default 0.25.", - "maximum": 5, - "minimum": 0.05, - "type": "number" - } - }, - "type": "object" - } -]New value: +[ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "colourBars": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "size": { + "description": "Patch size in points. Default 12.", + "maximum": 72, + "minimum": 4, + "type": "number" + }, + "tints": { + "description": "Add the four 50 % tint patches. Default true.", + "type": "boolean" + } + }, + "type": "object" + } + ], + "description": "Colour control strip in the bleed (C M Y K solids + their 50 % tints): true for defaults. Off by default; needs a bleed of about 5 mm (14.17 pt) and is skipped when the strip would not fit." + }, + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } +] - changed
Input schema / properties / strict / descriptionPrevious value: -"Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true."New value: +"Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true." - added
Input schema / properties / typographyAdded value: +{ + "additionalProperties": false, + "description": "Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt.", + "properties": { + "bindShortWords": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "maxLength": { + "maximum": 3, + "minimum": 1, + "type": "integer" + }, + "words": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "Never end a line on a short word: up to maxLength letters (default 1), or exactly the listed words." + }, + "fontFeatures": { + "description": "OpenType features, later wins. tnum / lnum are no-ops on Noto Sans (TYPOGRAPHY_FEATURE_INEFFECTIVE).", + "items": { + "enum": [ + "tnum", + "pnum", + "lnum", + "onum", + "zero", + "ordn", + "sups", + "subs", + "smcp", + "c2sc", + "case" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array", + "uniqueItems": true + }, + "hyphenationLanguage": { + "description": "BCP 47 tag; no effect here (no hyphenation provider installed).", + "maxLength": 35, + "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$", + "type": "string" + }, + "keepHeadingsWithNext": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "minLines": { + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" + } + ], + "description": "Never strand a heading at a page foot. true = { minLines: 2 }." + }, + "kerning": { + "description": "Pair kerning (GPOS).", + "type": "boolean" + }, + "metrics": { + "description": "Base-14 text: 'exact' uses the AFM widths (different wraps). Default 'approximate'.", + "enum": [ + "approximate", + "exact" + ], + "type": "string" + }, + "opticalMargins": { + "description": "Hang punctuation into the margin of align:'justify' text.", + "type": "boolean" + }, + "orphans": { + "description": "Min lines left at a page foot (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + }, + "punctuationSpacing": { + "anyOf": [ + { + "enum": [ + "fr", + "fr-CA" + ], + "type": "string" + }, + { + "items": { + "additionalProperties": false, + "properties": { + "char": { + "maxLength": 2, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "space": { + "description": "U+00A0 / U+202F (narrow needs embedFonts).", + "enum": [ + "nbsp", + "narrow" + ], + "type": "string" + } + }, + "required": [ + "char", + "side", + "space" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + } + ], + "description": "No-break spaces next to punctuation (existing spaces only). 'fr': narrow before ; ! ?, no-break before ':' and inside « ». 'fr-CA': ':' and « » only. Or explicit rules." + }, + "splitParagraphs": { + "description": "Paragraphs may break across pages at a line boundary (default: atomic).", + "type": "boolean" + }, + "unitBinding": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "units": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "No-break space between a number and its unit ('150 €', '12 kg'); units replaces the built-in list." + }, + "widows": { + "description": "Min lines carried over (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" +} - changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
add_chart30 fields changed- added
Input schema / properties / colors / items / anyOfAdded value: +[ + { + "pattern": "^#?[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - removed
Input schema / properties / colors / items / patternRemoved value: -"^#?[0-9a-fA-F]{6}$" - removed
Input schema / properties / colors / items / typeRemoved value: -"string" - changed
Input schema / properties / creationDate / descriptionPrevious value: -"ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs."New value: +"ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs." - changed
Input schema / properties / embedFonts / descriptionPrevious value: -"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB."New value: +"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB." - changed
Input schema / properties / footerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / footerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / footerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / footerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / footerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / footerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / footerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / headerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / headerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / headerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / headerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / headerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / includeDiagnostics / descriptionPrevious value: -"Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty)."New value: +"Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty)." - changed
Input schema / properties / outputIntent / descriptionPrevious value: -"Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected)."New value: +"Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space." - changed
Input schema / properties / outputIntent / properties / iccProfileBase64 / descriptionPrevious value: -"ICC profile bytes, base64 (RGB, ≤ 8 MiB)."New value: +"ICC profile bytes, base64 (RGB, CMYK or Gray; ≤ 8 MiB)." - added
Input schema / properties / pdfxAdded value: +{ + "description": "PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt.", + "enum": [ + "pdfx4" + ], + "type": "string" +} - changed
Input schema / properties / print / properties / marks / oneOfPrevious value: -[ - { - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "crop": { - "description": "Corner crop (trim) marks. Default true.", - "type": "boolean" - }, - "length": { - "description": "Mark length in points. Default 14.", - "maximum": 100, - "minimum": 1, - "type": "number" - }, - "offset": { - "description": "Gap between TrimBox and marks in points. Default 5.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "registration": { - "description": "Edge-midpoint registration targets. Default true.", - "type": "boolean" - }, - "weight": { - "description": "Stroke width in points. Default 0.25.", - "maximum": 5, - "minimum": 0.05, - "type": "number" - } - }, - "type": "object" - } -]New value: +[ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "colourBars": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "size": { + "description": "Patch size in points. Default 12.", + "maximum": 72, + "minimum": 4, + "type": "number" + }, + "tints": { + "description": "Add the four 50 % tint patches. Default true.", + "type": "boolean" + } + }, + "type": "object" + } + ], + "description": "Colour control strip in the bleed (C M Y K solids + their 50 % tints): true for defaults. Off by default; needs a bleed of about 5 mm (14.17 pt) and is skipped when the strip would not fit." + }, + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } +] - added
Input schema / properties / series / items / properties / color / anyOfAdded value: +[ + { + "pattern": "^#?[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - removed
Input schema / properties / series / items / properties / color / patternRemoved value: -"^#?[0-9a-fA-F]{6}$" - removed
Input schema / properties / series / items / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / strict / descriptionPrevious value: -"Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true."New value: +"Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true." - added
Input schema / properties / typographyAdded value: +{ + "additionalProperties": false, + "description": "Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt.", + "properties": { + "bindShortWords": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "maxLength": { + "maximum": 3, + "minimum": 1, + "type": "integer" + }, + "words": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "Never end a line on a short word: up to maxLength letters (default 1), or exactly the listed words." + }, + "fontFeatures": { + "description": "OpenType features, later wins. tnum / lnum are no-ops on Noto Sans (TYPOGRAPHY_FEATURE_INEFFECTIVE).", + "items": { + "enum": [ + "tnum", + "pnum", + "lnum", + "onum", + "zero", + "ordn", + "sups", + "subs", + "smcp", + "c2sc", + "case" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array", + "uniqueItems": true + }, + "hyphenationLanguage": { + "description": "BCP 47 tag; no effect here (no hyphenation provider installed).", + "maxLength": 35, + "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$", + "type": "string" + }, + "keepHeadingsWithNext": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "minLines": { + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" + } + ], + "description": "Never strand a heading at a page foot. true = { minLines: 2 }." + }, + "kerning": { + "description": "Pair kerning (GPOS).", + "type": "boolean" + }, + "metrics": { + "description": "Base-14 text: 'exact' uses the AFM widths (different wraps). Default 'approximate'.", + "enum": [ + "approximate", + "exact" + ], + "type": "string" + }, + "opticalMargins": { + "description": "Hang punctuation into the margin of align:'justify' text.", + "type": "boolean" + }, + "orphans": { + "description": "Min lines left at a page foot (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + }, + "punctuationSpacing": { + "anyOf": [ + { + "enum": [ + "fr", + "fr-CA" + ], + "type": "string" + }, + { + "items": { + "additionalProperties": false, + "properties": { + "char": { + "maxLength": 2, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "space": { + "description": "U+00A0 / U+202F (narrow needs embedFonts).", + "enum": [ + "nbsp", + "narrow" + ], + "type": "string" + } + }, + "required": [ + "char", + "side", + "space" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + } + ], + "description": "No-break spaces next to punctuation (existing spaces only). 'fr': narrow before ; ! ?, no-break before ':' and inside « ». 'fr-CA': ':' and « » only. Or explicit rules." + }, + "splitParagraphs": { + "description": "Paragraphs may break across pages at a line boundary (default: atomic).", + "type": "boolean" + }, + "unitBinding": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "units": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "No-break space between a number and its unit ('150 €', '12 kg'); units replaces the built-in list." + }, + "widows": { + "description": "Min lines carried over (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" +} - changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
add_form24 fields changed- changed
Input schema / properties / creationDate / descriptionPrevious value: -"ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs."New value: +"ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs." - changed
Input schema / properties / embedFonts / descriptionPrevious value: -"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB."New value: +"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB." - changed
Input schema / properties / fields / items / properties / value / descriptionPrevious value: -"Default value pre-filled in the field."New value: +"Pre-filled value. The key is 'value' (there is no defaultValue)." - changed
Input schema / properties / footerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / footerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / footerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / footerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / footerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / footerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / footerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / headerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / headerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / headerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / headerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / headerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / includeDiagnostics / descriptionPrevious value: -"Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty)."New value: +"Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty)." - changed
Input schema / properties / outputIntent / descriptionPrevious value: -"Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected)."New value: +"Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space." - changed
Input schema / properties / outputIntent / properties / iccProfileBase64 / descriptionPrevious value: -"ICC profile bytes, base64 (RGB, ≤ 8 MiB)."New value: +"ICC profile bytes, base64 (RGB, CMYK or Gray; ≤ 8 MiB)." - changed
Input schema / properties / print / properties / marks / oneOfPrevious value: -[ - { - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "crop": { - "description": "Corner crop (trim) marks. Default true.", - "type": "boolean" - }, - "length": { - "description": "Mark length in points. Default 14.", - "maximum": 100, - "minimum": 1, - "type": "number" - }, - "offset": { - "description": "Gap between TrimBox and marks in points. Default 5.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "registration": { - "description": "Edge-midpoint registration targets. Default true.", - "type": "boolean" - }, - "weight": { - "description": "Stroke width in points. Default 0.25.", - "maximum": 5, - "minimum": 0.05, - "type": "number" - } - }, - "type": "object" - } -]New value: +[ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "colourBars": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "size": { + "description": "Patch size in points. Default 12.", + "maximum": 72, + "minimum": 4, + "type": "number" + }, + "tints": { + "description": "Add the four 50 % tint patches. Default true.", + "type": "boolean" + } + }, + "type": "object" + } + ], + "description": "Colour control strip in the bleed (C M Y K solids + their 50 % tints): true for defaults. Off by default; needs a bleed of about 5 mm (14.17 pt) and is skipped when the strip would not fit." + }, + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } +] - changed
Input schema / properties / strict / descriptionPrevious value: -"Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true."New value: +"Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true." - added
Input schema / properties / typographyAdded value: +{ + "additionalProperties": false, + "description": "Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt.", + "properties": { + "bindShortWords": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "maxLength": { + "maximum": 3, + "minimum": 1, + "type": "integer" + }, + "words": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "Never end a line on a short word: up to maxLength letters (default 1), or exactly the listed words." + }, + "fontFeatures": { + "description": "OpenType features, later wins. tnum / lnum are no-ops on Noto Sans (TYPOGRAPHY_FEATURE_INEFFECTIVE).", + "items": { + "enum": [ + "tnum", + "pnum", + "lnum", + "onum", + "zero", + "ordn", + "sups", + "subs", + "smcp", + "c2sc", + "case" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array", + "uniqueItems": true + }, + "hyphenationLanguage": { + "description": "BCP 47 tag; no effect here (no hyphenation provider installed).", + "maxLength": 35, + "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$", + "type": "string" + }, + "keepHeadingsWithNext": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "minLines": { + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" + } + ], + "description": "Never strand a heading at a page foot. true = { minLines: 2 }." + }, + "kerning": { + "description": "Pair kerning (GPOS).", + "type": "boolean" + }, + "metrics": { + "description": "Base-14 text: 'exact' uses the AFM widths (different wraps). Default 'approximate'.", + "enum": [ + "approximate", + "exact" + ], + "type": "string" + }, + "opticalMargins": { + "description": "Hang punctuation into the margin of align:'justify' text.", + "type": "boolean" + }, + "orphans": { + "description": "Min lines left at a page foot (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + }, + "punctuationSpacing": { + "anyOf": [ + { + "enum": [ + "fr", + "fr-CA" + ], + "type": "string" + }, + { + "items": { + "additionalProperties": false, + "properties": { + "char": { + "maxLength": 2, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "space": { + "description": "U+00A0 / U+202F (narrow needs embedFonts).", + "enum": [ + "nbsp", + "narrow" + ], + "type": "string" + } + }, + "required": [ + "char", + "side", + "space" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + } + ], + "description": "No-break spaces next to punctuation (existing spaces only). 'fr': narrow before ; ! ?, no-break before ':' and inside « ». 'fr-CA': ':' and « » only. Or explicit rules." + }, + "splitParagraphs": { + "description": "Paragraphs may break across pages at a line boundary (default: atomic).", + "type": "boolean" + }, + "unitBinding": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "units": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "No-break space between a number and its unit ('150 €', '12 kg'); units replaces the built-in list." + }, + "widows": { + "description": "Min lines carried over (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" +} - changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
add_international_text25 fields changed- changed
Input schema / properties / creationDate / descriptionPrevious value: -"ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs."New value: +"ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs." - changed
Input schema / properties / footerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / footerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / footerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / footerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / footerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / footerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / footerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / headerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / headerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / headerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / headerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / headerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / includeDiagnostics / descriptionPrevious value: -"Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty)."New value: +"Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty)." - changed
Input schema / properties / lang / anyOfPrevious value: -[ - { - "enum": [ - "ar", - "he", - "th", - "ja", - "zh", - "ko", - "el", - "hi", - "bn", - "ta", - "ru", - "ka", - "hy", - "tr", - "pl", - "vi", - "latin", - "te", - "si", - "bo", - "km", - "my", - "am", - "emoji", - "math" - ], - "type": "string" - }, - { - "items": { - "enum": [ - "ar", - "he", - "th", - "ja", - "zh", - "ko", - "el", - "hi", - "bn", - "ta", - "ru", - "ka", - "hy", - "tr", - "pl", - "vi", - "latin", - "te", - "si", - "bo", - "km", - "my", - "am", - "emoji", - "math" - ], - "type": "string" - }, - "maxItems": 25, - "minItems": 1, - "type": "array" - }, - { - "description": "Comma-separated list of supported codes.", - "maxLength": 80, - "minLength": 2, - "type": "string" - } -]New value: +[ + { + "enum": [ + "ar", + "he", + "th", + "ja", + "zh", + "ko", + "el", + "hi", + "bn", + "ta", + "ru", + "ka", + "hy", + "tr", + "pl", + "vi", + "latin", + "te", + "si", + "bo", + "km", + "my", + "am", + "emoji", + "math", + "lo", + "nod", + "khb", + "tdd", + "cjm", + "ha", + "yo", + "ig", + "sw" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "ar", + "he", + "th", + "ja", + "zh", + "ko", + "el", + "hi", + "bn", + "ta", + "ru", + "ka", + "hy", + "tr", + "pl", + "vi", + "latin", + "te", + "si", + "bo", + "km", + "my", + "am", + "emoji", + "math", + "lo", + "nod", + "khb", + "tdd", + "cjm", + "ha", + "yo", + "ig", + "sw" + ], + "type": "string" + }, + "maxItems": 34, + "minItems": 1, + "type": "array" + }, + { + "description": "Comma-separated list of supported codes.", + "maxLength": 80, + "minLength": 2, + "type": "string" + } +] - changed
Input schema / properties / lang / descriptionPrevious value: -"Language / script identifier. Either a single code (e.g. 'ar'), a comma-separated list ('ar,emoji'), or an array (['ar','emoji']). Multiple codes enable multi-font run splitting (script + emoji + Latin fallback)."New value: +"Language / script identifier. Either a single code (e.g. 'ar'), a comma-separated list ('ar,emoji'), or an array (['ar','emoji']). Multiple codes enable multi-font run splitting (script + emoji + Latin fallback). 27 scripts; ha / yo / ig / sw (Hausa, Yoruba, Igbo, Swahili) are aliases of latin, whose combining marks are anchored." - changed
Input schema / properties / outputIntent / descriptionPrevious value: -"Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected)."New value: +"Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space." - changed
Input schema / properties / outputIntent / properties / iccProfileBase64 / descriptionPrevious value: -"ICC profile bytes, base64 (RGB, ≤ 8 MiB)."New value: +"ICC profile bytes, base64 (RGB, CMYK or Gray; ≤ 8 MiB)." - added
Input schema / properties / pdfxAdded value: +{ + "description": "PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt.", + "enum": [ + "pdfx4" + ], + "type": "string" +} - changed
Input schema / properties / print / properties / marks / oneOfPrevious value: -[ - { - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "crop": { - "description": "Corner crop (trim) marks. Default true.", - "type": "boolean" - }, - "length": { - "description": "Mark length in points. Default 14.", - "maximum": 100, - "minimum": 1, - "type": "number" - }, - "offset": { - "description": "Gap between TrimBox and marks in points. Default 5.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "registration": { - "description": "Edge-midpoint registration targets. Default true.", - "type": "boolean" - }, - "weight": { - "description": "Stroke width in points. Default 0.25.", - "maximum": 5, - "minimum": 0.05, - "type": "number" - } - }, - "type": "object" - } -]New value: +[ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "colourBars": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "size": { + "description": "Patch size in points. Default 12.", + "maximum": 72, + "minimum": 4, + "type": "number" + }, + "tints": { + "description": "Add the four 50 % tint patches. Default true.", + "type": "boolean" + } + }, + "type": "object" + } + ], + "description": "Colour control strip in the bleed (C M Y K solids + their 50 % tints): true for defaults. Off by default; needs a bleed of about 5 mm (14.17 pt) and is skipped when the strip would not fit." + }, + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } +] - changed
Input schema / properties / strict / descriptionPrevious value: -"Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true."New value: +"Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true." - added
Input schema / properties / typographyAdded value: +{ + "additionalProperties": false, + "description": "Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt.", + "properties": { + "bindShortWords": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "maxLength": { + "maximum": 3, + "minimum": 1, + "type": "integer" + }, + "words": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "Never end a line on a short word: up to maxLength letters (default 1), or exactly the listed words." + }, + "fontFeatures": { + "description": "OpenType features, later wins. tnum / lnum are no-ops on Noto Sans (TYPOGRAPHY_FEATURE_INEFFECTIVE).", + "items": { + "enum": [ + "tnum", + "pnum", + "lnum", + "onum", + "zero", + "ordn", + "sups", + "subs", + "smcp", + "c2sc", + "case" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array", + "uniqueItems": true + }, + "hyphenationLanguage": { + "description": "BCP 47 tag; no effect here (no hyphenation provider installed).", + "maxLength": 35, + "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$", + "type": "string" + }, + "keepHeadingsWithNext": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "minLines": { + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" + } + ], + "description": "Never strand a heading at a page foot. true = { minLines: 2 }." + }, + "kerning": { + "description": "Pair kerning (GPOS).", + "type": "boolean" + }, + "metrics": { + "description": "Base-14 text: 'exact' uses the AFM widths (different wraps). Default 'approximate'.", + "enum": [ + "approximate", + "exact" + ], + "type": "string" + }, + "opticalMargins": { + "description": "Hang punctuation into the margin of align:'justify' text.", + "type": "boolean" + }, + "orphans": { + "description": "Min lines left at a page foot (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + }, + "punctuationSpacing": { + "anyOf": [ + { + "enum": [ + "fr", + "fr-CA" + ], + "type": "string" + }, + { + "items": { + "additionalProperties": false, + "properties": { + "char": { + "maxLength": 2, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "space": { + "description": "U+00A0 / U+202F (narrow needs embedFonts).", + "enum": [ + "nbsp", + "narrow" + ], + "type": "string" + } + }, + "required": [ + "char", + "side", + "space" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + } + ], + "description": "No-break spaces next to punctuation (existing spaces only). 'fr': narrow before ; ! ?, no-break before ':' and inside « ». 'fr-CA': ':' and « » only. Or explicit rules." + }, + "splitParagraphs": { + "description": "Paragraphs may break across pages at a line boundary (default: atomic).", + "type": "boolean" + }, + "unitBinding": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "units": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "No-break space between a number and its unit ('150 €', '12 kg'); units replaces the built-in list." + }, + "widows": { + "description": "Min lines carried over (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" +} - changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
add_ltv1 field changed- changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
add_table32 fields changed- added
Input schema / properties / cellBorders / properties / color / anyOfAdded value: +[ + { + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - removed
Input schema / properties / cellBorders / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / creationDate / descriptionPrevious value: -"ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs."New value: +"ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs." - changed
Input schema / properties / embedFonts / descriptionPrevious value: -"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB."New value: +"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB." - changed
Input schema / properties / footerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / footerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / footerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / footerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / footerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / footerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / footerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / headerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / headerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / headerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / headerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / headerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / includeDiagnostics / descriptionPrevious value: -"Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty)."New value: +"Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty)." - changed
Input schema / properties / outputIntent / descriptionPrevious value: -"Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected)."New value: +"Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space." - changed
Input schema / properties / outputIntent / properties / iccProfileBase64 / descriptionPrevious value: -"ICC profile bytes, base64 (RGB, ≤ 8 MiB)."New value: +"ICC profile bytes, base64 (RGB, CMYK or Gray; ≤ 8 MiB)." - added
Input schema / properties / pdfxAdded value: +{ + "description": "PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt.", + "enum": [ + "pdfx4" + ], + "type": "string" +} - changed
Input schema / properties / print / properties / marks / oneOfPrevious value: -[ - { - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "crop": { - "description": "Corner crop (trim) marks. Default true.", - "type": "boolean" - }, - "length": { - "description": "Mark length in points. Default 14.", - "maximum": 100, - "minimum": 1, - "type": "number" - }, - "offset": { - "description": "Gap between TrimBox and marks in points. Default 5.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "registration": { - "description": "Edge-midpoint registration targets. Default true.", - "type": "boolean" - }, - "weight": { - "description": "Stroke width in points. Default 0.25.", - "maximum": 5, - "minimum": 0.05, - "type": "number" - } - }, - "type": "object" - } -]New value: +[ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "colourBars": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "size": { + "description": "Patch size in points. Default 12.", + "maximum": 72, + "minimum": 4, + "type": "number" + }, + "tints": { + "description": "Add the four 50 % tint patches. Default true.", + "type": "boolean" + } + }, + "type": "object" + } + ], + "description": "Colour control strip in the bleed (C M Y K solids + their 50 % tints): true for defaults. Off by default; needs a bleed of about 5 mm (14.17 pt) and is skipped when the strip would not fit." + }, + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } +] - changed
Input schema / properties / strict / descriptionPrevious value: -"Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true."New value: +"Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true." - added
Input schema / properties / typographyAdded value: +{ + "additionalProperties": false, + "description": "Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt.", + "properties": { + "bindShortWords": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "maxLength": { + "maximum": 3, + "minimum": 1, + "type": "integer" + }, + "words": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "Never end a line on a short word: up to maxLength letters (default 1), or exactly the listed words." + }, + "fontFeatures": { + "description": "OpenType features, later wins. tnum / lnum are no-ops on Noto Sans (TYPOGRAPHY_FEATURE_INEFFECTIVE).", + "items": { + "enum": [ + "tnum", + "pnum", + "lnum", + "onum", + "zero", + "ordn", + "sups", + "subs", + "smcp", + "c2sc", + "case" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array", + "uniqueItems": true + }, + "hyphenationLanguage": { + "description": "BCP 47 tag; no effect here (no hyphenation provider installed).", + "maxLength": 35, + "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$", + "type": "string" + }, + "keepHeadingsWithNext": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "minLines": { + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" + } + ], + "description": "Never strand a heading at a page foot. true = { minLines: 2 }." + }, + "kerning": { + "description": "Pair kerning (GPOS).", + "type": "boolean" + }, + "metrics": { + "description": "Base-14 text: 'exact' uses the AFM widths (different wraps). Default 'approximate'.", + "enum": [ + "approximate", + "exact" + ], + "type": "string" + }, + "opticalMargins": { + "description": "Hang punctuation into the margin of align:'justify' text.", + "type": "boolean" + }, + "orphans": { + "description": "Min lines left at a page foot (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + }, + "punctuationSpacing": { + "anyOf": [ + { + "enum": [ + "fr", + "fr-CA" + ], + "type": "string" + }, + { + "items": { + "additionalProperties": false, + "properties": { + "char": { + "maxLength": 2, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "space": { + "description": "U+00A0 / U+202F (narrow needs embedFonts).", + "enum": [ + "nbsp", + "narrow" + ], + "type": "string" + } + }, + "required": [ + "char", + "side", + "space" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + } + ], + "description": "No-break spaces next to punctuation (existing spaces only). 'fr': narrow before ; ! ?, no-break before ':' and inside « ». 'fr-CA': ':' and « » only. Or explicit rules." + }, + "splitParagraphs": { + "description": "Paragraphs may break across pages at a line boundary (default: atomic).", + "type": "boolean" + }, + "unitBinding": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "units": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "No-break space between a number and its unit ('150 €', '12 kg'); units replaces the built-in list." + }, + "widows": { + "description": "Min lines carried over (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" +} - added
Input schema / properties / watermark / properties / color / anyOfAdded value: +[ + { + "items": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / watermark / properties / color / descriptionPrevious value: -"Text RGB colour as a [r, g, b] triple in the 0.0–1.0 range. Default light gray [0.75, 0.75, 0.75]."New value: +"Text colour. RGB as a [r, g, b] triple in the 0.0–1.0 range; default light gray [0.75, 0.75, 0.75]." - removed
Input schema / properties / watermark / properties / color / itemsRemoved value: -{ - "maximum": 1, - "minimum": 0, - "type": "number" -} - removed
Input schema / properties / watermark / properties / color / maxItemsRemoved value: -3 - removed
Input schema / properties / watermark / properties / color / minItemsRemoved value: -3 - removed
Input schema / properties / watermark / properties / color / typeRemoved value: -"array" - changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
annotate_pdf3 fields changed- changed
Input schema / properties / annotations / items / properties / color / oneOfPrevious value: -[ - { - "description": "Hex (e.g. \"#ffcc00\") or PDF operator string (\"R G B\").", - "type": "string" - }, - { - "description": "RGB tuple, 0.0–1.0.", - "items": { - "type": "number" - }, - "maxItems": 3, - "minItems": 3, - "type": "array" - } -]New value: +[ + { + "description": "Hex (e.g. \"#ffcc00\") or PDF operator string (\"R G B\", or \"C M Y K\" for DeviceCMYK), each operand 0.0–1.0.", + "type": "string" + }, + { + "description": "RGB tuple, 0.0–1.0.", + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / annotations / items / properties / interiorColor / oneOfPrevious value: -[ - { - "description": "Hex (e.g. \"#ffcc00\") or PDF operator string (\"R G B\").", - "type": "string" - }, - { - "description": "RGB tuple, 0.0–1.0.", - "items": { - "type": "number" - }, - "maxItems": 3, - "minItems": 3, - "type": "array" - } -]New value: +[ + { + "description": "Hex (e.g. \"#ffcc00\") or PDF operator string (\"R G B\", or \"C M Y K\" for DeviceCMYK), each operand 0.0–1.0.", + "type": "string" + }, + { + "description": "RGB tuple, 0.0–1.0.", + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
decrypt_pdf1 field changed- changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
embed_image24 fields changed- changed
Input schema / properties / creationDate / descriptionPrevious value: -"ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs."New value: +"ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs." - changed
Input schema / properties / embedFonts / descriptionPrevious value: -"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB."New value: +"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB." - changed
Input schema / properties / footerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / footerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / footerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / footerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / footerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / footerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / footerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / headerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / headerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / headerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / headerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / headerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / includeDiagnostics / descriptionPrevious value: -"Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty)."New value: +"Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty)." - changed
Input schema / properties / outputIntent / descriptionPrevious value: -"Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected)."New value: +"Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space." - changed
Input schema / properties / outputIntent / properties / iccProfileBase64 / descriptionPrevious value: -"ICC profile bytes, base64 (RGB, ≤ 8 MiB)."New value: +"ICC profile bytes, base64 (RGB, CMYK or Gray; ≤ 8 MiB)." - added
Input schema / properties / pdfxAdded value: +{ + "description": "PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt.", + "enum": [ + "pdfx4" + ], + "type": "string" +} - changed
Input schema / properties / print / properties / marks / oneOfPrevious value: -[ - { - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "crop": { - "description": "Corner crop (trim) marks. Default true.", - "type": "boolean" - }, - "length": { - "description": "Mark length in points. Default 14.", - "maximum": 100, - "minimum": 1, - "type": "number" - }, - "offset": { - "description": "Gap between TrimBox and marks in points. Default 5.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "registration": { - "description": "Edge-midpoint registration targets. Default true.", - "type": "boolean" - }, - "weight": { - "description": "Stroke width in points. Default 0.25.", - "maximum": 5, - "minimum": 0.05, - "type": "number" - } - }, - "type": "object" - } -]New value: +[ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "colourBars": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "size": { + "description": "Patch size in points. Default 12.", + "maximum": 72, + "minimum": 4, + "type": "number" + }, + "tints": { + "description": "Add the four 50 % tint patches. Default true.", + "type": "boolean" + } + }, + "type": "object" + } + ], + "description": "Colour control strip in the bleed (C M Y K solids + their 50 % tints): true for defaults. Off by default; needs a bleed of about 5 mm (14.17 pt) and is skipped when the strip would not fit." + }, + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } +] - changed
Input schema / properties / strict / descriptionPrevious value: -"Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true."New value: +"Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true." - added
Input schema / properties / typographyAdded value: +{ + "additionalProperties": false, + "description": "Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt.", + "properties": { + "bindShortWords": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "maxLength": { + "maximum": 3, + "minimum": 1, + "type": "integer" + }, + "words": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "Never end a line on a short word: up to maxLength letters (default 1), or exactly the listed words." + }, + "fontFeatures": { + "description": "OpenType features, later wins. tnum / lnum are no-ops on Noto Sans (TYPOGRAPHY_FEATURE_INEFFECTIVE).", + "items": { + "enum": [ + "tnum", + "pnum", + "lnum", + "onum", + "zero", + "ordn", + "sups", + "subs", + "smcp", + "c2sc", + "case" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array", + "uniqueItems": true + }, + "hyphenationLanguage": { + "description": "BCP 47 tag; no effect here (no hyphenation provider installed).", + "maxLength": 35, + "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$", + "type": "string" + }, + "keepHeadingsWithNext": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "minLines": { + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" + } + ], + "description": "Never strand a heading at a page foot. true = { minLines: 2 }." + }, + "kerning": { + "description": "Pair kerning (GPOS).", + "type": "boolean" + }, + "metrics": { + "description": "Base-14 text: 'exact' uses the AFM widths (different wraps). Default 'approximate'.", + "enum": [ + "approximate", + "exact" + ], + "type": "string" + }, + "opticalMargins": { + "description": "Hang punctuation into the margin of align:'justify' text.", + "type": "boolean" + }, + "orphans": { + "description": "Min lines left at a page foot (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + }, + "punctuationSpacing": { + "anyOf": [ + { + "enum": [ + "fr", + "fr-CA" + ], + "type": "string" + }, + { + "items": { + "additionalProperties": false, + "properties": { + "char": { + "maxLength": 2, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "space": { + "description": "U+00A0 / U+202F (narrow needs embedFonts).", + "enum": [ + "nbsp", + "narrow" + ], + "type": "string" + } + }, + "required": [ + "char", + "side", + "space" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + } + ], + "description": "No-break spaces next to punctuation (existing spaces only). 'fr': narrow before ; ! ?, no-break before ':' and inside « ». 'fr-CA': ':' and « » only. Or explicit rules." + }, + "splitParagraphs": { + "description": "Paragraphs may break across pages at a line boundary (default: atomic).", + "type": "boolean" + }, + "unitBinding": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "units": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "No-break space between a number and its unit ('150 €', '12 kg'); units replaces the built-in list." + }, + "widows": { + "description": "Min lines carried over (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" +} - changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
encrypt_pdf1 field changed- changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
extract_pages1 field changed- changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
fill_form1 field changed- changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
generate_basic_pdf32 fields changed- changed
Input schema / properties / blocks / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "level": { - "enum": [ - 1, - 2, - 3 - ], - "type": "integer" - }, - "text": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "heading" - } - }, - "required": [ - "type", - "text", - "level" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "text": { - "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.", - "maxLength": 50000, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "paragraph" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).", - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "style": { - "default": "bullet", - "enum": [ - "bullet", - "numbered" - ], - "type": "string" - }, - "type": { - "const": "list" - } - }, - "required": [ - "type", - "items" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "type": { - "const": "pageBreak" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "height": { - "maximum": 500, - "minimum": 1, - "type": "number" - }, - "type": { - "const": "spacer" - } - }, - "required": [ - "type", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Native vector chart rendered as pure PDF path operators — bar / horizontal-bar / stacked-bar / line / area / scatter / pie / donut (pdfnative 1.7 charts v2: time and log axes, data labels, secondary axis, legends). Same body as add_chart.", - "properties": { - "align": { - "description": "Horizontal alignment within the content width. Default 'left'.", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "altText": { - "description": "Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted.", - "maxLength": 500, - "type": "string" - }, - "axis": { - "additionalProperties": false, - "description": "Value-axis options (bar/line only).", - "properties": { - "grid": { - "description": "Draw horizontal gridlines.", - "type": "boolean" - }, - "scale": { - "description": "Value-axis scale. 'log' requires strictly positive values and is not available for stacked charts.", - "enum": [ - "linear", - "log" - ], - "type": "string" - }, - "ticks": { - "description": "Target tick count (nice 1/2/5×10ⁿ steps).", - "maximum": 20, - "minimum": 2, - "type": "integer" - }, - "yMax": { - "description": "Force the axis maximum (values are clamped to the plot band).", - "type": "number" - }, - "yMin": { - "description": "Force the axis minimum (values are clamped to the plot band).", - "type": "number" - } - }, - "type": "object" - }, - "axis2": { - "additionalProperties": false, - "description": "Secondary RIGHT value axis (drawn only when a series sets yAxis:'right').", - "properties": { - "scale": { - "enum": [ - "linear", - "log" - ], - "type": "string" - }, - "ticks": { - "maximum": 20, - "minimum": 2, - "type": "integer" - }, - "yMax": { - "type": "number" - }, - "yMin": { - "type": "number" - } - }, - "type": "object" - }, - "categories": { - "description": "Category / slice labels (x-axis). Defaults to 1-based indices when omitted.", - "items": { - "maxLength": 200, - "type": "string" - }, - "maxItems": 1000, - "type": "array" - }, - "chartType": { - "description": "Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'stackedBar'/'stackedBarH'/'line'/'area'/'scatter' support multiple series. 'scatter' requires xValues on every series and a positional xAxis.type ('linear' or 'time').", - "enum": [ - "bar", - "barH", - "stackedBar", - "stackedBarH", - "line", - "area", - "scatter", - "pie", - "donut" - ], - "type": "string" - }, - "colors": { - "description": "Palette override (per-series for bar/line, per-slice for pie/donut).", - "items": { - "description": "CSS-style hex colour, e.g. \"#3366cc\".", - "pattern": "^#?[0-9a-fA-F]{6}$", - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "dataLabels": { - "description": "Per-point value labels: true for defaults, or an object to format them.", - "oneOf": [ - { - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "decimals": { - "maximum": 6, - "minimum": 0, - "type": "integer" - }, - "prefix": { - "maxLength": 16, - "type": "string" - }, - "suffix": { - "maxLength": 16, - "type": "string" - } - }, - "type": "object" - } - ] - }, - "height": { - "description": "Plot-area height in points. Default 240.", - "maximum": 2000, - "minimum": 50, - "type": "number" - }, - "labelRotation": { - "description": "Rotate category labels counter-clockwise by this many degrees (disables the automatic stride).", - "maximum": 90, - "minimum": 0, - "type": "number" - }, - "labelStride": { - "description": "Draw every Nth category label. Default: automatic (measured non-overlap); 1 draws every label.", - "maximum": 1000, - "minimum": 1, - "type": "integer" - }, - "legend": { - "description": "Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'.", - "enum": [ - "bottom", - "none" - ], - "type": "string" - }, - "markers": { - "description": "Draw point markers on line series. Default false.", - "type": "boolean" - }, - "series": { - "description": "Data series. Pie/donut charts use exactly one series (each value becomes a slice).", - "items": { - "additionalProperties": false, - "properties": { - "color": { - "description": "CSS-style hex colour, e.g. \"#3366cc\".", - "pattern": "^#?[0-9a-fA-F]{6}$", - "type": "string" - }, - "label": { - "description": "Series label (shown in the legend).", - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "values": { - "description": "Numeric values, one per category. Negative values are supported for bar/line.", - "items": { - "type": "number" - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "xValues": { - "description": "Per-point x positions (same length as values) for scatter charts and for line/area charts with xAxis.type 'linear' or 'time'.", - "items": { - "description": "Positional x value: a number (linear axis) or an ISO-8601 date / epoch milliseconds (time axis).", - "maxLength": 64, - "type": [ - "number", - "string" - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "yAxis": { - "description": "Bind the series to the left (default) or the secondary right value axis (cartesian charts only; configure its range with 'axis2').", - "enum": [ - "left", - "right" - ], - "type": "string" - } - }, - "required": [ - "label", - "values" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "title": { - "description": "Chart title rendered above the plot.", - "maxLength": 200, - "type": "string" - }, - "type": { - "const": "chart" - }, - "width": { - "description": "Plot width in points (clamped to content width). Default 460.", - "maximum": 2000, - "minimum": 50, - "type": "number" - }, - "xAxis": { - "additionalProperties": false, - "description": "Horizontal axis. 'category' (default) positions points by index; 'linear' / 'time' position them by series xValues (line/area/scatter only). Time ticks are UTC-deterministic.", - "properties": { - "grid": { - "description": "Draw vertical gridlines.", - "type": "boolean" - }, - "max": { - "description": "Axis maximum (number, or ISO-8601 / epoch ms for time axes).", - "maxLength": 64, - "type": [ - "number", - "string" - ] - }, - "min": { - "description": "Axis minimum (number, or ISO-8601 / epoch ms for time axes).", - "maxLength": 64, - "type": [ - "number", - "string" - ] - }, - "ticks": { - "maximum": 20, - "minimum": 2, - "type": "integer" - }, - "type": { - "enum": [ - "category", - "linear", - "time" - ], - "type": "string" - } - }, - "type": "object" - } - }, - "required": [ - "type", - "chartType", - "series" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Inline smart table — same body as add_table (every row must have exactly as many cells as headers).", - "properties": { - "autoFitColumns": { - "description": "Auto-fit column widths to content. Output bytes then depend on text metrics (not byte-deterministic across content changes).", - "type": "boolean" - }, - "caption": { - "description": "Caption rendered above the table (tagged as /Caption under PDF/A).", - "maxLength": 200, - "type": "string" - }, - "cellBorders": { - "additionalProperties": false, - "description": "Per-cell vector borders (pure strokes, PDF/A-safe). Choose individual sides or `all`.", - "properties": { - "all": { - "description": "Draw all four edges (overrides the individual side flags).", - "type": "boolean" - }, - "bottom": { - "type": "boolean" - }, - "color": { - "description": "Stroke colour as a PDF operator string ('0.8 0.8 0.8') or hex. Default light grey.", - "type": "string" - }, - "left": { - "type": "boolean" - }, - "right": { - "type": "boolean" - }, - "style": { - "description": "Stroke style (default 'solid').", - "enum": [ - "solid", - "dashed", - "dotted" - ], - "type": "string" - }, - "top": { - "type": "boolean" - }, - "width": { - "description": "Stroke width in points (default 0.5).", - "maximum": 10, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "cellPadding": { - "description": "Horizontal cell padding in points (default 3).", - "maximum": 50, - "minimum": 0, - "type": "number" - }, - "cellVAlign": { - "description": "Vertical alignment of cell content.", - "enum": [ - "top", - "middle", - "bottom" - ], - "type": "string" - }, - "clipCells": { - "description": "Clip cell contents to the column bounds (PDF clip operators). Recommended for PDF/A and visual safety.", - "type": "boolean" - }, - "headers": { - "description": "Column header labels. Must have the same length as each row in `rows`.", - "items": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "minRowHeight": { - "description": "Minimum row height in points (default 12).", - "maximum": 200, - "minimum": 1, - "type": "number" - }, - "repeatHeader": { - "description": "Repeat the header row on every continuation page (default true).", - "type": "boolean" - }, - "rows": { - "description": "Data rows. Each row is an array of cell strings with the same length as `headers`.", - "items": { - "items": { - "maxLength": 500, - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "maxItems": 5000, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "table" - }, - "wrap": { - "description": "Cell wrap policy: 'auto' (default) wraps only overflowing cells; 'always' wraps every cell; 'never' truncates.", - "enum": [ - "auto", - "always", - "never" - ], - "type": "string" - }, - "zebra": { - "description": "Alternate-row light tint (static fill, PDF/A-1b safe).", - "type": "boolean" - } - }, - "required": [ - "type", - "headers", - "rows" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Inline JPEG/PNG image. Without width/height the pixel size is used as points and clamped to the content width; with one dimension the aspect ratio is kept. The decoded bytes of all image blocks in one call are capped at 24 MiB (a watermark image has its own 8 MiB cap).", - "properties": { - "align": { - "default": "left", - "description": "Horizontal placement inside the content width.", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "alt": { - "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.", - "maxLength": 500, - "type": "string" - }, - "height": { - "description": "Render height in points.", - "maximum": 1000, - "minimum": 10, - "type": "number" - }, - "imageBase64": { - "description": "Base64 image bytes. JPEG (baseline; 1, 3 or 4 components — CMYK raises PDFA_DEVICE_CMYK_IMAGE under PDF/A) or PNG (8-bit greyscale/RGB, non-interlaced; alpha-channel and palette PNGs are rejected with a remedy). No data: URI.", - "maxLength": 12000000, - "minLength": 4, - "type": "string" - }, - "mimeType": { - "description": "MIME type of the image. Must match the actual encoding of imageBase64 (magic bytes are checked).", - "enum": [ - "image/jpeg", - "image/png" - ], - "type": "string" - }, - "type": { - "const": "image" - }, - "width": { - "description": "Render width in points.", - "maximum": 800, - "minimum": 10, - "type": "number" - } - }, - "required": [ - "type", - "imageBase64", - "mimeType" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Clickable external link (/URI action). Only http:, https: and mailto: URLs are accepted.", - "properties": { - "color": { - "description": "Hex colour (#RGB or #RRGGBB).", - "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$", - "type": "string" - }, - "fontSize": { - "description": "Default 10.", - "maximum": 48, - "minimum": 6, - "type": "number" - }, - "text": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "link" - }, - "url": { - "description": "http(s):// or mailto: URL.", - "maxLength": 2048, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "type", - "text", - "url" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Printed table of contents generated from the document's heading blocks (internal /GoTo links with dot leaders). Pairs with outline:'auto' for the bookmark pane.", - "properties": { - "fontSize": { - "description": "Default 10.", - "maximum": 24, - "minimum": 6, - "type": "number" - }, - "indent": { - "description": "Points of indent per heading level (default 15).", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "maxLevel": { - "description": "Deepest heading level listed (default 3).", - "enum": [ - 1, - 2, - 3 - ], - "type": "integer" - }, - "title": { - "description": "Default 'Table of Contents'.", - "maxLength": 200, - "type": "string" - }, - "type": { - "const": "toc" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Inline barcode — same body as add_barcode (pure vector, no /Alt available in the engine).", - "properties": { - "align": { - "default": "left", - "description": "Horizontal placement inside the content width.", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "data": { - "description": "Raw payload to encode — do NOT URL-encode. For QR/URL pass e.g. \"https://example.com\" verbatim. EAN-13 must be 12 or 13 digits (13th is auto-computed). Code 128 accepts ASCII alphanumerics.", - "maxLength": 4296, - "minLength": 1, - "type": "string" - }, - "ecLevel": { - "default": "M", - "description": "QR ONLY. Error correction level (L=7%, M=15%, Q=25%, H=30%). Ignored for code128/ean13/datamatrix/pdf417. Use H for printed media that may get smudged or partially covered (e.g. logo overlay).", - "enum": [ - "L", - "M", - "Q", - "H" - ], - "type": "string" - }, - "format": { - "description": "Barcode symbology to render.", - "enum": [ - "qr", - "code128", - "ean13", - "datamatrix", - "pdf417" - ], - "type": "string" - }, - "height": { - "default": 200, - "description": "Barcode height in PDF points (ignored for square symbologies like QR/Data Matrix).", - "maximum": 500, - "minimum": 30, - "type": "number" - }, - "type": { - "const": "barcode" - }, - "width": { - "default": 200, - "description": "Barcode width in PDF points.", - "maximum": 500, - "minimum": 30, - "type": "number" - } - }, - "required": [ - "type", - "format", - "data" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Vector drawing from an SVG path `d` string or SVG markup. Supported: <path> <rect> (rx/ry) <circle> <ellipse> <line> <polyline> <polygon> and <text>/<tspan> (x, y, font-size, fill, text-anchor, dx/dy); fill / stroke / stroke-width attributes; double-quoted attributes only. NOT supported (silently ignored): transform, <g>, <use>, <image>, <defs>/<clipPath>, gradients, opacity, CSS/style, dash patterns, text word-wrap. No external reference is ever fetched (no XML parser: entities other than & < > " ' &#n; are dropped). Pure path operators — PDF/A-safe at every level.", - "properties": { - "align": { - "default": "left", - "description": "Horizontal placement inside the content width.", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "alt": { - "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.", - "maxLength": 500, - "type": "string" - }, - "data": { - "description": "Path `d` string or SVG markup (≤ 100 000 characters).", - "maxLength": 100000, - "minLength": 1, - "type": "string" - }, - "fill": { - "description": "Hex colour or 'none' (default black).", - "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$", - "type": "string" - }, - "height": { - "description": "Render height in points (default 200).", - "maximum": 1000, - "minimum": 10, - "type": "number" - }, - "stroke": { - "description": "Hex colour or 'none' (default none).", - "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$", - "type": "string" - }, - "strokeWidth": { - "description": "Stroke width in SVG user units (default 1).", - "maximum": 50, - "minimum": 0, - "type": "number" - }, - "type": { - "const": "svg" - }, - "viewBox": { - "description": "[minX, minY, width, height] — overrides the viewBox of the markup; required for a bare path string that is not 0-based.", - "items": { - "type": "number" - }, - "maxItems": 4, - "minItems": 4, - "type": "array" - }, - "width": { - "description": "Render width in points (default 200).", - "maximum": 800, - "minimum": 10, - "type": "number" - } - }, - "required": [ - "type", - "data" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Inline AcroForm field — same body as an add_form field. Under a PDF/A claim the widget appearance font is not embedded (PDFA_UNEMBEDDED_FORM_FONT; strict:true fails the call).", - "properties": { - "checked": { - "description": "Initial checked state for checkbox / radio fields.", - "type": "boolean" - }, - "fieldType": { - "description": "Type of form control to render. Radio fields sharing a name form one radio group.", - "enum": [ - "text", - "textarea", - "checkbox", - "radio", - "dropdown", - "listbox" - ], - "type": "string" - }, - "fontSize": { - "description": "Font size for text rendering inside the field.", - "maximum": 48, - "minimum": 6, - "type": "number" - }, - "height": { - "description": "Field height in points (default depends on the type).", - "maximum": 300, - "minimum": 10, - "type": "number" - }, - "label": { - "description": "Human-readable label shown above the field.", - "maxLength": 200, - "type": "string" - }, - "maxLength": { - "description": "Maximum character length for text/textarea fields.", - "maximum": 32767, - "minimum": 1, - "type": "integer" - }, - "name": { - "description": "Unique field name used as the PDF annotation identifier (/T).", - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "options": { - "description": "Choices for dropdown, listbox or radio fields.", - "items": { - "maxLength": 200, - "type": "string" - }, - "maxItems": 100, - "type": "array" - }, - "placeholder": { - "description": "Hint text shown while the field is empty.", - "maxLength": 200, - "type": "string" - }, - "readOnly": { - "description": "Prevent editing of this field.", - "type": "boolean" - }, - "required": { - "description": "Mark field as required.", - "type": "boolean" - }, - "type": { - "const": "formField" - }, - "value": { - "description": "Default value pre-filled in the field.", - "maxLength": 2000, - "type": "string" - }, - "width": { - "description": "Field width in points (default: full content width).", - "maximum": 500, - "minimum": 10, - "type": "number" - } - }, - "required": [ - "type", - "fieldType", - "name" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "keepWithNext": { + "description": "Keep this heading on the same page as the block that follows. Overrides typography.keepHeadingsWithNext for this block, either way.", + "type": "boolean" + }, + "level": { + "enum": [ + 1, + 2, + 3 + ], + "type": "integer" + }, + "text": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "heading" + } + }, + "required": [ + "type", + "text", + "level" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "align": { + "description": "Text alignment (default left). 'justify' spans every line but the last across the measure; pair it with typography.opticalMargins.", + "enum": [ + "left", + "right", + "center", + "justify" + ], + "type": "string" + }, + "keepWithNext": { + "description": "Keep this paragraph on the same page as the block that follows (a lead-in line before a table or figure). Default false.", + "type": "boolean" + }, + "splittable": { + "description": "Allow / forbid this paragraph breaking across pages, overriding typography.splitParagraphs for this block.", + "type": "boolean" + }, + "text": { + "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.", + "maxLength": 50000, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "paragraph" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).", + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "style": { + "default": "bullet", + "enum": [ + "bullet", + "numbered" + ], + "type": "string" + }, + "type": { + "const": "list" + } + }, + "required": [ + "type", + "items" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "type": { + "const": "pageBreak" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "height": { + "maximum": 500, + "minimum": 1, + "type": "number" + }, + "type": { + "const": "spacer" + } + }, + "required": [ + "type", + "height" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Native vector chart rendered as pure PDF path operators — bar / horizontal-bar / stacked-bar / line / area / scatter / pie / donut (pdfnative 1.7 charts v2: time and log axes, data labels, secondary axis, legends). Same body as add_chart.", + "properties": { + "align": { + "description": "Horizontal alignment within the content width. Default 'left'.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "altText": { + "description": "Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted.", + "maxLength": 500, + "type": "string" + }, + "axis": { + "additionalProperties": false, + "description": "Value-axis options (bar/line only).", + "properties": { + "grid": { + "description": "Draw horizontal gridlines.", + "type": "boolean" + }, + "scale": { + "description": "Value-axis scale. 'log' requires strictly positive values and is not available for stacked charts.", + "enum": [ + "linear", + "log" + ], + "type": "string" + }, + "ticks": { + "description": "Target tick count (nice 1/2/5×10ⁿ steps).", + "maximum": 20, + "minimum": 2, + "type": "integer" + }, + "yMax": { + "description": "Force the axis maximum (values are clamped to the plot band).", + "type": "number" + }, + "yMin": { + "description": "Force the axis minimum (values are clamped to the plot band).", + "type": "number" + } + }, + "type": "object" + }, + "axis2": { + "additionalProperties": false, + "description": "Secondary RIGHT value axis (drawn only when a series sets yAxis:'right').", + "properties": { + "scale": { + "enum": [ + "linear", + "log" + ], + "type": "string" + }, + "ticks": { + "maximum": 20, + "minimum": 2, + "type": "integer" + }, + "yMax": { + "type": "number" + }, + "yMin": { + "type": "number" + } + }, + "type": "object" + }, + "categories": { + "description": "Category / slice labels (x-axis). Defaults to 1-based indices when omitted.", + "items": { + "maxLength": 200, + "type": "string" + }, + "maxItems": 1000, + "type": "array" + }, + "chartType": { + "description": "Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'stackedBar'/'stackedBarH'/'line'/'area'/'scatter' support multiple series. 'scatter' requires xValues on every series and a positional xAxis.type ('linear' or 'time').", + "enum": [ + "bar", + "barH", + "stackedBar", + "stackedBarH", + "line", + "area", + "scatter", + "pie", + "donut" + ], + "type": "string" + }, + "colors": { + "description": "Palette override (per-series for bar/line, per-slice for pie/donut).", + "items": { + "anyOf": [ + { + "pattern": "^#?[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "CSS-style hex colour, e.g. \"#3366cc\"." + }, + "maxItems": 50, + "type": "array" + }, + "dataLabels": { + "description": "Per-point value labels: true for defaults, or an object to format them.", + "oneOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "decimals": { + "maximum": 6, + "minimum": 0, + "type": "integer" + }, + "prefix": { + "maxLength": 16, + "type": "string" + }, + "suffix": { + "maxLength": 16, + "type": "string" + } + }, + "type": "object" + } + ] + }, + "height": { + "description": "Plot-area height in points. Default 240.", + "maximum": 2000, + "minimum": 50, + "type": "number" + }, + "labelRotation": { + "description": "Rotate category labels counter-clockwise by this many degrees (disables the automatic stride).", + "maximum": 90, + "minimum": 0, + "type": "number" + }, + "labelStride": { + "description": "Draw every Nth category label. Default: automatic (measured non-overlap); 1 draws every label.", + "maximum": 1000, + "minimum": 1, + "type": "integer" + }, + "legend": { + "description": "Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'.", + "enum": [ + "bottom", + "none" + ], + "type": "string" + }, + "markers": { + "description": "Draw point markers on line series. Default false.", + "type": "boolean" + }, + "series": { + "description": "Data series. Pie/donut charts use exactly one series (each value becomes a slice).", + "items": { + "additionalProperties": false, + "properties": { + "color": { + "anyOf": [ + { + "pattern": "^#?[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "CSS-style hex colour, e.g. \"#3366cc\"." + }, + "label": { + "description": "Series label (shown in the legend).", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "values": { + "description": "Numeric values, one per category. Negative values are supported for bar/line.", + "items": { + "type": "number" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "xValues": { + "description": "Per-point x positions (same length as values) for scatter charts and for line/area charts with xAxis.type 'linear' or 'time'.", + "items": { + "description": "Positional x value: a number (linear axis) or an ISO-8601 date / epoch milliseconds (time axis).", + "maxLength": 64, + "type": [ + "number", + "string" + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "yAxis": { + "description": "Bind the series to the left (default) or the secondary right value axis (cartesian charts only; configure its range with 'axis2').", + "enum": [ + "left", + "right" + ], + "type": "string" + } + }, + "required": [ + "label", + "values" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "title": { + "description": "Chart title rendered above the plot.", + "maxLength": 200, + "type": "string" + }, + "type": { + "const": "chart" + }, + "width": { + "description": "Plot width in points (clamped to content width). Default 460.", + "maximum": 2000, + "minimum": 50, + "type": "number" + }, + "xAxis": { + "additionalProperties": false, + "description": "Horizontal axis. 'category' (default) positions points by index; 'linear' / 'time' position them by series xValues (line/area/scatter only). Time ticks are UTC-deterministic.", + "properties": { + "grid": { + "description": "Draw vertical gridlines.", + "type": "boolean" + }, + "max": { + "description": "Axis maximum (number, or ISO-8601 / epoch ms for time axes).", + "maxLength": 64, + "type": [ + "number", + "string" + ] + }, + "min": { + "description": "Axis minimum (number, or ISO-8601 / epoch ms for time axes).", + "maxLength": 64, + "type": [ + "number", + "string" + ] + }, + "ticks": { + "maximum": 20, + "minimum": 2, + "type": "integer" + }, + "type": { + "enum": [ + "category", + "linear", + "time" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "type", + "chartType", + "series" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Inline smart table — same body as add_table (every row must have exactly as many cells as headers).", + "properties": { + "autoFitColumns": { + "description": "Auto-fit column widths to content. Output bytes then depend on text metrics (not byte-deterministic across content changes).", + "type": "boolean" + }, + "caption": { + "description": "Caption rendered above the table (tagged as /Caption under PDF/A).", + "maxLength": 200, + "type": "string" + }, + "cellBorders": { + "additionalProperties": false, + "description": "Per-cell vector borders (pure strokes, PDF/A-safe). Choose individual sides or `all`.", + "properties": { + "all": { + "description": "Draw all four edges (overrides the individual side flags).", + "type": "boolean" + }, + "bottom": { + "type": "boolean" + }, + "color": { + "anyOf": [ + { + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Stroke colour as a PDF operator string ('0.8 0.8 0.8') or hex. Default light grey." + }, + "left": { + "type": "boolean" + }, + "right": { + "type": "boolean" + }, + "style": { + "description": "Stroke style (default 'solid').", + "enum": [ + "solid", + "dashed", + "dotted" + ], + "type": "string" + }, + "top": { + "type": "boolean" + }, + "width": { + "description": "Stroke width in points (default 0.5).", + "maximum": 10, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "cellPadding": { + "description": "Horizontal cell padding in points (default 3).", + "maximum": 50, + "minimum": 0, + "type": "number" + }, + "cellVAlign": { + "description": "Vertical alignment of cell content.", + "enum": [ + "top", + "middle", + "bottom" + ], + "type": "string" + }, + "clipCells": { + "description": "Clip cell contents to the column bounds (PDF clip operators). Recommended for PDF/A and visual safety.", + "type": "boolean" + }, + "headers": { + "description": "Column header labels. Must have the same length as each row in `rows`.", + "items": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "minRowHeight": { + "description": "Minimum row height in points (default 12).", + "maximum": 200, + "minimum": 1, + "type": "number" + }, + "repeatHeader": { + "description": "Repeat the header row on every continuation page (default true).", + "type": "boolean" + }, + "rows": { + "description": "Data rows. Each row is an array of cell strings with the same length as `headers`.", + "items": { + "items": { + "maxLength": 500, + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "maxItems": 5000, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "table" + }, + "wrap": { + "description": "Cell wrap policy: 'auto' (default) wraps only overflowing cells; 'always' wraps every cell; 'never' truncates.", + "enum": [ + "auto", + "always", + "never" + ], + "type": "string" + }, + "zebra": { + "description": "Alternate-row light tint (static fill, PDF/A-1b safe).", + "type": "boolean" + } + }, + "required": [ + "type", + "headers", + "rows" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Inline JPEG/PNG image. Without width/height the pixel size is used as points and clamped to the content width; with one dimension the aspect ratio is kept. The decoded bytes of all image blocks in one call are capped at 24 MiB (a watermark image has its own 8 MiB cap).", + "properties": { + "align": { + "default": "left", + "description": "Horizontal placement inside the content width.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "alt": { + "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.", + "maxLength": 500, + "type": "string" + }, + "height": { + "description": "Render height in points.", + "maximum": 1000, + "minimum": 10, + "type": "number" + }, + "imageBase64": { + "description": "Base64 image bytes. JPEG (baseline; 1, 3 or 4 components — CMYK raises PDFA_DEVICE_CMYK_IMAGE under PDF/A) or PNG (8-bit greyscale/RGB, non-interlaced; alpha-channel and palette PNGs are rejected with a remedy). No data: URI.", + "maxLength": 12000000, + "minLength": 4, + "type": "string" + }, + "mimeType": { + "description": "MIME type of the image. Must match the actual encoding of imageBase64 (magic bytes are checked).", + "enum": [ + "image/jpeg", + "image/png" + ], + "type": "string" + }, + "type": { + "const": "image" + }, + "width": { + "description": "Render width in points.", + "maximum": 800, + "minimum": 10, + "type": "number" + } + }, + "required": [ + "type", + "imageBase64", + "mimeType" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Clickable external link (/URI action). Only http:, https: and mailto: URLs are accepted.", + "properties": { + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Hex colour (#RGB or #RRGGBB)." + }, + "fontSize": { + "description": "Default 10.", + "maximum": 48, + "minimum": 6, + "type": "number" + }, + "text": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "link" + }, + "url": { + "description": "http(s):// or mailto: URL.", + "maxLength": 2048, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "type", + "text", + "url" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Printed table of contents generated from the document's heading blocks (internal /GoTo links with dot leaders). Pairs with outline:'auto' for the bookmark pane.", + "properties": { + "fontSize": { + "description": "Default 10.", + "maximum": 24, + "minimum": 6, + "type": "number" + }, + "indent": { + "description": "Points of indent per heading level (default 15).", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxLevel": { + "description": "Deepest heading level listed (default 3).", + "enum": [ + 1, + 2, + 3 + ], + "type": "integer" + }, + "title": { + "description": "Default 'Table of Contents'.", + "maxLength": 200, + "type": "string" + }, + "type": { + "const": "toc" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Inline barcode — same body as add_barcode (pure vector, no /Alt available in the engine).", + "properties": { + "align": { + "default": "left", + "description": "Horizontal placement inside the content width.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "data": { + "description": "Raw payload to encode — do NOT URL-encode. For QR/URL pass e.g. \"https://example.com\" verbatim. EAN-13 must be 12 or 13 digits (13th is auto-computed). Code 128 accepts ASCII alphanumerics.", + "maxLength": 4296, + "minLength": 1, + "type": "string" + }, + "ecLevel": { + "default": "M", + "description": "QR ONLY. Error correction level (L=7%, M=15%, Q=25%, H=30%). Ignored for code128/ean13/datamatrix/pdf417. Use H for printed media that may get smudged or partially covered (e.g. logo overlay).", + "enum": [ + "L", + "M", + "Q", + "H" + ], + "type": "string" + }, + "format": { + "description": "Barcode symbology to render.", + "enum": [ + "qr", + "code128", + "ean13", + "datamatrix", + "pdf417" + ], + "type": "string" + }, + "height": { + "default": 200, + "description": "Barcode height in PDF points (ignored for square symbologies like QR/Data Matrix).", + "maximum": 500, + "minimum": 30, + "type": "number" + }, + "type": { + "const": "barcode" + }, + "width": { + "default": 200, + "description": "Barcode width in PDF points.", + "maximum": 500, + "minimum": 30, + "type": "number" + } + }, + "required": [ + "type", + "format", + "data" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Vector drawing from an SVG path `d` string or SVG markup. Supported: <path> <rect> (rx/ry) <circle> <ellipse> <line> <polyline> <polygon> and <text>/<tspan> (x, y, font-size, fill, text-anchor, dx/dy); fill / stroke / stroke-width attributes; double-quoted attributes only. NOT supported (silently ignored): transform, <g>, <use>, <image>, <defs>/<clipPath>, gradients, opacity, CSS/style, dash patterns, text word-wrap. No external reference is ever fetched (no XML parser: entities other than & < > " ' &#n; are dropped). Pure path operators — PDF/A-safe at every level.", + "properties": { + "align": { + "default": "left", + "description": "Horizontal placement inside the content width.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "alt": { + "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.", + "maxLength": 500, + "type": "string" + }, + "data": { + "description": "Path `d` string or SVG markup (≤ 100 000 characters).", + "maxLength": 100000, + "minLength": 1, + "type": "string" + }, + "fill": { + "anyOf": [ + { + "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Hex colour or 'none' (default black)." + }, + "height": { + "description": "Render height in points (default 200).", + "maximum": 1000, + "minimum": 10, + "type": "number" + }, + "stroke": { + "anyOf": [ + { + "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Hex colour or 'none' (default none)." + }, + "strokeWidth": { + "description": "Stroke width in SVG user units (default 1).", + "maximum": 50, + "minimum": 0, + "type": "number" + }, + "type": { + "const": "svg" + }, + "viewBox": { + "description": "[minX, minY, width, height] — overrides the viewBox of the markup; required for a bare path string that is not 0-based.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "width": { + "description": "Render width in points (default 200).", + "maximum": 800, + "minimum": 10, + "type": "number" + } + }, + "required": [ + "type", + "data" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Inline AcroForm field — same body as an add_form field. Under a PDF/A claim pass embedFonts:true so the field font is embedded too (PDFA_UNEMBEDDED_FORM_FONT otherwise; strict:true then fails the call).", + "properties": { + "checked": { + "description": "Initial checked state for checkbox / radio fields.", + "type": "boolean" + }, + "fieldType": { + "description": "Type of form control to render. Radio fields sharing a name form one radio group.", + "enum": [ + "text", + "textarea", + "checkbox", + "radio", + "dropdown", + "listbox" + ], + "type": "string" + }, + "fontSize": { + "description": "Font size for text rendering inside the field.", + "maximum": 48, + "minimum": 6, + "type": "number" + }, + "height": { + "description": "Field height in points (default depends on the type).", + "maximum": 300, + "minimum": 10, + "type": "number" + }, + "label": { + "description": "Human-readable label shown above the field.", + "maxLength": 200, + "type": "string" + }, + "maxLength": { + "description": "Maximum character length for text/textarea fields.", + "maximum": 32767, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "Unique field name used as the PDF annotation identifier (/T).", + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "options": { + "description": "Choices for dropdown, listbox or radio fields.", + "items": { + "maxLength": 200, + "type": "string" + }, + "maxItems": 100, + "type": "array" + }, + "placeholder": { + "description": "Hint text shown while the field is empty.", + "maxLength": 200, + "type": "string" + }, + "readOnly": { + "description": "Prevent editing of this field.", + "type": "boolean" + }, + "required": { + "description": "Mark field as required.", + "type": "boolean" + }, + "type": { + "const": "formField" + }, + "value": { + "description": "Pre-filled value. The key is 'value' (there is no defaultValue).", + "maxLength": 2000, + "type": "string" + }, + "width": { + "description": "Field width in points (default: full content width).", + "maximum": 500, + "minimum": 10, + "type": "number" + } + }, + "required": [ + "type", + "fieldType", + "name" + ], + "type": "object" + } +] - changed
Input schema / properties / creationDate / descriptionPrevious value: -"ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs."New value: +"ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs." - changed
Input schema / properties / embedFonts / descriptionPrevious value: -"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB."New value: +"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB." - changed
Input schema / properties / footerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / footerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / footerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / footerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / footerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / footerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / footerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / headerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / headerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / headerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / headerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / headerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / includeDiagnostics / descriptionPrevious value: -"Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty)."New value: +"Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty)." - changed
Input schema / properties / outline / oneOfPrevious value: -[ - { - "enum": [ - "auto" - ], - "type": "string" - }, - { - "items": { - "additionalProperties": false, - "properties": { - "bold": { - "type": "boolean" - }, - "children": { - "items": { - "additionalProperties": false, - "properties": { - "bold": { - "type": "boolean" - }, - "children": { - "items": { - "additionalProperties": false, - "properties": { - "bold": { - "type": "boolean" - }, - "children": { - "items": { - "additionalProperties": false, - "properties": { - "bold": { - "type": "boolean" - }, - "children": { - "items": { - "additionalProperties": false, - "properties": { - "bold": { - "type": "boolean" - }, - "children": { - "items": { - "additionalProperties": false, - "properties": { - "bold": { - "type": "boolean" - }, - "color": { - "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').", - "type": "string" - }, - "italic": { - "type": "boolean" - }, - "open": { - "description": "Initial expansion state (default true). false renders the branch collapsed.", - "type": "boolean" - }, - "pageIndex": { - "description": "0-based destination page index.", - "minimum": 0, - "type": "integer" - }, - "title": { - "description": "Bookmark label.", - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "y": { - "description": "Destination Y coordinate in points (default: top of page).", - "type": "number" - } - }, - "required": [ - "title", - "pageIndex" - ], - "type": "object" - }, - "maxItems": 1000, - "type": "array" - }, - "color": { - "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').", - "type": "string" - }, - "italic": { - "type": "boolean" - }, - "open": { - "description": "Initial expansion state (default true). false renders the branch collapsed.", - "type": "boolean" - }, - "pageIndex": { - "description": "0-based destination page index.", - "minimum": 0, - "type": "integer" - }, - "title": { - "description": "Bookmark label.", - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "y": { - "description": "Destination Y coordinate in points (default: top of page).", - "type": "number" - } - }, - "required": [ - "title", - "pageIndex" - ], - "type": "object" - }, - "maxItems": 1000, - "type": "array" - }, - "color": { - "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').", - "type": "string" - }, - "italic": { - "type": "boolean" - }, - "open": { - "description": "Initial expansion state (default true). false renders the branch collapsed.", - "type": "boolean" - }, - "pageIndex": { - "description": "0-based destination page index.", - "minimum": 0, - "type": "integer" - }, - "title": { - "description": "Bookmark label.", - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "y": { - "description": "Destination Y coordinate in points (default: top of page).", - "type": "number" - } - }, - "required": [ - "title", - "pageIndex" - ], - "type": "object" - }, - "maxItems": 1000, - "type": "array" - }, - "color": { - "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').", - "type": "string" - }, - "italic": { - "type": "boolean" - }, - "open": { - "description": "Initial expansion state (default true). false renders the branch collapsed.", - "type": "boolean" - }, - "pageIndex": { - "description": "0-based destination page index.", - "minimum": 0, - "type": "integer" - }, - "title": { - "description": "Bookmark label.", - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "y": { - "description": "Destination Y coordinate in points (default: top of page).", - "type": "number" - } - }, - "required": [ - "title", - "pageIndex" - ], - "type": "object" - }, - "maxItems": 1000, - "type": "array" - }, - "color": { - "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').", - "type": "string" - }, - "italic": { - "type": "boolean" - }, - "open": { - "description": "Initial expansion state (default true). false renders the branch collapsed.", - "type": "boolean" - }, - "pageIndex": { - "description": "0-based destination page index.", - "minimum": 0, - "type": "integer" - }, - "title": { - "description": "Bookmark label.", - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "y": { - "description": "Destination Y coordinate in points (default: top of page).", - "type": "number" - } - }, - "required": [ - "title", - "pageIndex" - ], - "type": "object" - }, - "maxItems": 1000, - "type": "array" - }, - "color": { - "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').", - "type": "string" - }, - "italic": { - "type": "boolean" - }, - "open": { - "description": "Initial expansion state (default true). false renders the branch collapsed.", - "type": "boolean" - }, - "pageIndex": { - "description": "0-based destination page index.", - "minimum": 0, - "type": "integer" - }, - "title": { - "description": "Bookmark label.", - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "y": { - "description": "Destination Y coordinate in points (default: top of page).", - "type": "number" - } - }, - "required": [ - "title", - "pageIndex" - ], - "type": "object" - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - } -]New value: +[ + { + "enum": [ + "auto" + ], + "type": "string" + }, + { + "items": { + "additionalProperties": false, + "properties": { + "bold": { + "type": "boolean" + }, + "children": { + "items": { + "additionalProperties": false, + "properties": { + "bold": { + "type": "boolean" + }, + "children": { + "items": { + "additionalProperties": false, + "properties": { + "bold": { + "type": "boolean" + }, + "children": { + "items": { + "additionalProperties": false, + "properties": { + "bold": { + "type": "boolean" + }, + "children": { + "items": { + "additionalProperties": false, + "properties": { + "bold": { + "type": "boolean" + }, + "children": { + "items": { + "additionalProperties": false, + "properties": { + "bold": { + "type": "boolean" + }, + "color": { + "anyOf": [ + { + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1'). An outline label is RGB by definition (/C): a CMYK value is converted for on-screen display." + }, + "italic": { + "type": "boolean" + }, + "open": { + "description": "Initial expansion state (default true). false renders the branch collapsed.", + "type": "boolean" + }, + "pageIndex": { + "description": "0-based destination page index.", + "minimum": 0, + "type": "integer" + }, + "title": { + "description": "Bookmark label.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "y": { + "description": "Destination Y coordinate in points (default: top of page).", + "type": "number" + } + }, + "required": [ + "title", + "pageIndex" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" + }, + "color": { + "anyOf": [ + { + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1'). An outline label is RGB by definition (/C): a CMYK value is converted for on-screen display." + }, + "italic": { + "type": "boolean" + }, + "open": { + "description": "Initial expansion state (default true). false renders the branch collapsed.", + "type": "boolean" + }, + "pageIndex": { + "description": "0-based destination page index.", + "minimum": 0, + "type": "integer" + }, + "title": { + "description": "Bookmark label.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "y": { + "description": "Destination Y coordinate in points (default: top of page).", + "type": "number" + } + }, + "required": [ + "title", + "pageIndex" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" + }, + "color": { + "anyOf": [ + { + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1'). An outline label is RGB by definition (/C): a CMYK value is converted for on-screen display." + }, + "italic": { + "type": "boolean" + }, + "open": { + "description": "Initial expansion state (default true). false renders the branch collapsed.", + "type": "boolean" + }, + "pageIndex": { + "description": "0-based destination page index.", + "minimum": 0, + "type": "integer" + }, + "title": { + "description": "Bookmark label.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "y": { + "description": "Destination Y coordinate in points (default: top of page).", + "type": "number" + } + }, + "required": [ + "title", + "pageIndex" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" + }, + "color": { + "anyOf": [ + { + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1'). An outline label is RGB by definition (/C): a CMYK value is converted for on-screen display." + }, + "italic": { + "type": "boolean" + }, + "open": { + "description": "Initial expansion state (default true). false renders the branch collapsed.", + "type": "boolean" + }, + "pageIndex": { + "description": "0-based destination page index.", + "minimum": 0, + "type": "integer" + }, + "title": { + "description": "Bookmark label.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "y": { + "description": "Destination Y coordinate in points (default: top of page).", + "type": "number" + } + }, + "required": [ + "title", + "pageIndex" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" + }, + "color": { + "anyOf": [ + { + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1'). An outline label is RGB by definition (/C): a CMYK value is converted for on-screen display." + }, + "italic": { + "type": "boolean" + }, + "open": { + "description": "Initial expansion state (default true). false renders the branch collapsed.", + "type": "boolean" + }, + "pageIndex": { + "description": "0-based destination page index.", + "minimum": 0, + "type": "integer" + }, + "title": { + "description": "Bookmark label.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "y": { + "description": "Destination Y coordinate in points (default: top of page).", + "type": "number" + } + }, + "required": [ + "title", + "pageIndex" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" + }, + "color": { + "anyOf": [ + { + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1'). An outline label is RGB by definition (/C): a CMYK value is converted for on-screen display." + }, + "italic": { + "type": "boolean" + }, + "open": { + "description": "Initial expansion state (default true). false renders the branch collapsed.", + "type": "boolean" + }, + "pageIndex": { + "description": "0-based destination page index.", + "minimum": 0, + "type": "integer" + }, + "title": { + "description": "Bookmark label.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "y": { + "description": "Destination Y coordinate in points (default: top of page).", + "type": "number" + } + }, + "required": [ + "title", + "pageIndex" + ], + "type": "object" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + } +] - changed
Input schema / properties / outputIntent / descriptionPrevious value: -"Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected)."New value: +"Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space." - changed
Input schema / properties / outputIntent / properties / iccProfileBase64 / descriptionPrevious value: -"ICC profile bytes, base64 (RGB, ≤ 8 MiB)."New value: +"ICC profile bytes, base64 (RGB, CMYK or Gray; ≤ 8 MiB)." - added
Input schema / properties / pdfxAdded value: +{ + "description": "PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt.", + "enum": [ + "pdfx4" + ], + "type": "string" +} - changed
Input schema / properties / print / properties / marks / oneOfPrevious value: -[ - { - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "crop": { - "description": "Corner crop (trim) marks. Default true.", - "type": "boolean" - }, - "length": { - "description": "Mark length in points. Default 14.", - "maximum": 100, - "minimum": 1, - "type": "number" - }, - "offset": { - "description": "Gap between TrimBox and marks in points. Default 5.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "registration": { - "description": "Edge-midpoint registration targets. Default true.", - "type": "boolean" - }, - "weight": { - "description": "Stroke width in points. Default 0.25.", - "maximum": 5, - "minimum": 0.05, - "type": "number" - } - }, - "type": "object" - } -]New value: +[ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "colourBars": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "size": { + "description": "Patch size in points. Default 12.", + "maximum": 72, + "minimum": 4, + "type": "number" + }, + "tints": { + "description": "Add the four 50 % tint patches. Default true.", + "type": "boolean" + } + }, + "type": "object" + } + ], + "description": "Colour control strip in the bleed (C M Y K solids + their 50 % tints): true for defaults. Off by default; needs a bleed of about 5 mm (14.17 pt) and is skipped when the strip would not fit." + }, + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } +] - changed
Input schema / properties / strict / descriptionPrevious value: -"Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true."New value: +"Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true." - added
Input schema / properties / typographyAdded value: +{ + "additionalProperties": false, + "description": "Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt.", + "properties": { + "bindShortWords": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "maxLength": { + "maximum": 3, + "minimum": 1, + "type": "integer" + }, + "words": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "Never end a line on a short word: up to maxLength letters (default 1), or exactly the listed words." + }, + "fontFeatures": { + "description": "OpenType features, later wins. tnum / lnum are no-ops on Noto Sans (TYPOGRAPHY_FEATURE_INEFFECTIVE).", + "items": { + "enum": [ + "tnum", + "pnum", + "lnum", + "onum", + "zero", + "ordn", + "sups", + "subs", + "smcp", + "c2sc", + "case" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array", + "uniqueItems": true + }, + "hyphenationLanguage": { + "description": "BCP 47 tag; no effect here (no hyphenation provider installed).", + "maxLength": 35, + "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$", + "type": "string" + }, + "keepHeadingsWithNext": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "minLines": { + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" + } + ], + "description": "Never strand a heading at a page foot. true = { minLines: 2 }." + }, + "kerning": { + "description": "Pair kerning (GPOS).", + "type": "boolean" + }, + "metrics": { + "description": "Base-14 text: 'exact' uses the AFM widths (different wraps). Default 'approximate'.", + "enum": [ + "approximate", + "exact" + ], + "type": "string" + }, + "opticalMargins": { + "description": "Hang punctuation into the margin of align:'justify' text.", + "type": "boolean" + }, + "orphans": { + "description": "Min lines left at a page foot (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + }, + "punctuationSpacing": { + "anyOf": [ + { + "enum": [ + "fr", + "fr-CA" + ], + "type": "string" + }, + { + "items": { + "additionalProperties": false, + "properties": { + "char": { + "maxLength": 2, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "space": { + "description": "U+00A0 / U+202F (narrow needs embedFonts).", + "enum": [ + "nbsp", + "narrow" + ], + "type": "string" + } + }, + "required": [ + "char", + "side", + "space" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + } + ], + "description": "No-break spaces next to punctuation (existing spaces only). 'fr': narrow before ; ! ?, no-break before ':' and inside « ». 'fr-CA': ':' and « » only. Or explicit rules." + }, + "splitParagraphs": { + "description": "Paragraphs may break across pages at a line boundary (default: atomic).", + "type": "boolean" + }, + "unitBinding": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "units": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "No-break space between a number and its unit ('150 €', '12 kg'); units replaces the built-in list." + }, + "widows": { + "description": "Min lines carried over (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" +} - added
Input schema / properties / watermark / properties / color / anyOfAdded value: +[ + { + "items": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / watermark / properties / color / descriptionPrevious value: -"Text RGB colour as a [r, g, b] triple in the 0.0–1.0 range. Default light gray [0.75, 0.75, 0.75]."New value: +"Text colour. RGB as a [r, g, b] triple in the 0.0–1.0 range; default light gray [0.75, 0.75, 0.75]." - removed
Input schema / properties / watermark / properties / color / itemsRemoved value: -{ - "maximum": 1, - "minimum": 0, - "type": "number" -} - removed
Input schema / properties / watermark / properties / color / maxItemsRemoved value: -3 - removed
Input schema / properties / watermark / properties / color / minItemsRemoved value: -3 - removed
Input schema / properties / watermark / properties / color / typeRemoved value: -"array" - changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
inspect_layout17 fields changed- changed
Input schema / properties / blocks / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "level": { - "enum": [ - 1, - 2, - 3 - ], - "type": "integer" - }, - "text": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "heading" - } - }, - "required": [ - "type", - "text", - "level" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "text": { - "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.", - "maxLength": 50000, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "paragraph" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).", - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "style": { - "default": "bullet", - "enum": [ - "bullet", - "numbered" - ], - "type": "string" - }, - "type": { - "const": "list" - } - }, - "required": [ - "type", - "items" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "type": { - "const": "pageBreak" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "height": { - "maximum": 500, - "minimum": 1, - "type": "number" - }, - "type": { - "const": "spacer" - } - }, - "required": [ - "type", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Native vector chart rendered as pure PDF path operators — bar / horizontal-bar / stacked-bar / line / area / scatter / pie / donut (pdfnative 1.7 charts v2: time and log axes, data labels, secondary axis, legends). Same body as add_chart.", - "properties": { - "align": { - "description": "Horizontal alignment within the content width. Default 'left'.", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "altText": { - "description": "Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted.", - "maxLength": 500, - "type": "string" - }, - "axis": { - "additionalProperties": false, - "description": "Value-axis options (bar/line only).", - "properties": { - "grid": { - "description": "Draw horizontal gridlines.", - "type": "boolean" - }, - "scale": { - "description": "Value-axis scale. 'log' requires strictly positive values and is not available for stacked charts.", - "enum": [ - "linear", - "log" - ], - "type": "string" - }, - "ticks": { - "description": "Target tick count (nice 1/2/5×10ⁿ steps).", - "maximum": 20, - "minimum": 2, - "type": "integer" - }, - "yMax": { - "description": "Force the axis maximum (values are clamped to the plot band).", - "type": "number" - }, - "yMin": { - "description": "Force the axis minimum (values are clamped to the plot band).", - "type": "number" - } - }, - "type": "object" - }, - "axis2": { - "additionalProperties": false, - "description": "Secondary RIGHT value axis (drawn only when a series sets yAxis:'right').", - "properties": { - "scale": { - "enum": [ - "linear", - "log" - ], - "type": "string" - }, - "ticks": { - "maximum": 20, - "minimum": 2, - "type": "integer" - }, - "yMax": { - "type": "number" - }, - "yMin": { - "type": "number" - } - }, - "type": "object" - }, - "categories": { - "description": "Category / slice labels (x-axis). Defaults to 1-based indices when omitted.", - "items": { - "maxLength": 200, - "type": "string" - }, - "maxItems": 1000, - "type": "array" - }, - "chartType": { - "description": "Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'stackedBar'/'stackedBarH'/'line'/'area'/'scatter' support multiple series. 'scatter' requires xValues on every series and a positional xAxis.type ('linear' or 'time').", - "enum": [ - "bar", - "barH", - "stackedBar", - "stackedBarH", - "line", - "area", - "scatter", - "pie", - "donut" - ], - "type": "string" - }, - "colors": { - "description": "Palette override (per-series for bar/line, per-slice for pie/donut).", - "items": { - "description": "CSS-style hex colour, e.g. \"#3366cc\".", - "pattern": "^#?[0-9a-fA-F]{6}$", - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "dataLabels": { - "description": "Per-point value labels: true for defaults, or an object to format them.", - "oneOf": [ - { - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "decimals": { - "maximum": 6, - "minimum": 0, - "type": "integer" - }, - "prefix": { - "maxLength": 16, - "type": "string" - }, - "suffix": { - "maxLength": 16, - "type": "string" - } - }, - "type": "object" - } - ] - }, - "height": { - "description": "Plot-area height in points. Default 240.", - "maximum": 2000, - "minimum": 50, - "type": "number" - }, - "labelRotation": { - "description": "Rotate category labels counter-clockwise by this many degrees (disables the automatic stride).", - "maximum": 90, - "minimum": 0, - "type": "number" - }, - "labelStride": { - "description": "Draw every Nth category label. Default: automatic (measured non-overlap); 1 draws every label.", - "maximum": 1000, - "minimum": 1, - "type": "integer" - }, - "legend": { - "description": "Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'.", - "enum": [ - "bottom", - "none" - ], - "type": "string" - }, - "markers": { - "description": "Draw point markers on line series. Default false.", - "type": "boolean" - }, - "series": { - "description": "Data series. Pie/donut charts use exactly one series (each value becomes a slice).", - "items": { - "additionalProperties": false, - "properties": { - "color": { - "description": "CSS-style hex colour, e.g. \"#3366cc\".", - "pattern": "^#?[0-9a-fA-F]{6}$", - "type": "string" - }, - "label": { - "description": "Series label (shown in the legend).", - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "values": { - "description": "Numeric values, one per category. Negative values are supported for bar/line.", - "items": { - "type": "number" - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "xValues": { - "description": "Per-point x positions (same length as values) for scatter charts and for line/area charts with xAxis.type 'linear' or 'time'.", - "items": { - "description": "Positional x value: a number (linear axis) or an ISO-8601 date / epoch milliseconds (time axis).", - "maxLength": 64, - "type": [ - "number", - "string" - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "yAxis": { - "description": "Bind the series to the left (default) or the secondary right value axis (cartesian charts only; configure its range with 'axis2').", - "enum": [ - "left", - "right" - ], - "type": "string" - } - }, - "required": [ - "label", - "values" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "title": { - "description": "Chart title rendered above the plot.", - "maxLength": 200, - "type": "string" - }, - "type": { - "const": "chart" - }, - "width": { - "description": "Plot width in points (clamped to content width). Default 460.", - "maximum": 2000, - "minimum": 50, - "type": "number" - }, - "xAxis": { - "additionalProperties": false, - "description": "Horizontal axis. 'category' (default) positions points by index; 'linear' / 'time' position them by series xValues (line/area/scatter only). Time ticks are UTC-deterministic.", - "properties": { - "grid": { - "description": "Draw vertical gridlines.", - "type": "boolean" - }, - "max": { - "description": "Axis maximum (number, or ISO-8601 / epoch ms for time axes).", - "maxLength": 64, - "type": [ - "number", - "string" - ] - }, - "min": { - "description": "Axis minimum (number, or ISO-8601 / epoch ms for time axes).", - "maxLength": 64, - "type": [ - "number", - "string" - ] - }, - "ticks": { - "maximum": 20, - "minimum": 2, - "type": "integer" - }, - "type": { - "enum": [ - "category", - "linear", - "time" - ], - "type": "string" - } - }, - "type": "object" - } - }, - "required": [ - "type", - "chartType", - "series" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Inline smart table — same body as add_table (every row must have exactly as many cells as headers).", - "properties": { - "autoFitColumns": { - "description": "Auto-fit column widths to content. Output bytes then depend on text metrics (not byte-deterministic across content changes).", - "type": "boolean" - }, - "caption": { - "description": "Caption rendered above the table (tagged as /Caption under PDF/A).", - "maxLength": 200, - "type": "string" - }, - "cellBorders": { - "additionalProperties": false, - "description": "Per-cell vector borders (pure strokes, PDF/A-safe). Choose individual sides or `all`.", - "properties": { - "all": { - "description": "Draw all four edges (overrides the individual side flags).", - "type": "boolean" - }, - "bottom": { - "type": "boolean" - }, - "color": { - "description": "Stroke colour as a PDF operator string ('0.8 0.8 0.8') or hex. Default light grey.", - "type": "string" - }, - "left": { - "type": "boolean" - }, - "right": { - "type": "boolean" - }, - "style": { - "description": "Stroke style (default 'solid').", - "enum": [ - "solid", - "dashed", - "dotted" - ], - "type": "string" - }, - "top": { - "type": "boolean" - }, - "width": { - "description": "Stroke width in points (default 0.5).", - "maximum": 10, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "cellPadding": { - "description": "Horizontal cell padding in points (default 3).", - "maximum": 50, - "minimum": 0, - "type": "number" - }, - "cellVAlign": { - "description": "Vertical alignment of cell content.", - "enum": [ - "top", - "middle", - "bottom" - ], - "type": "string" - }, - "clipCells": { - "description": "Clip cell contents to the column bounds (PDF clip operators). Recommended for PDF/A and visual safety.", - "type": "boolean" - }, - "headers": { - "description": "Column header labels. Must have the same length as each row in `rows`.", - "items": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "minRowHeight": { - "description": "Minimum row height in points (default 12).", - "maximum": 200, - "minimum": 1, - "type": "number" - }, - "repeatHeader": { - "description": "Repeat the header row on every continuation page (default true).", - "type": "boolean" - }, - "rows": { - "description": "Data rows. Each row is an array of cell strings with the same length as `headers`.", - "items": { - "items": { - "maxLength": 500, - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "maxItems": 5000, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "table" - }, - "wrap": { - "description": "Cell wrap policy: 'auto' (default) wraps only overflowing cells; 'always' wraps every cell; 'never' truncates.", - "enum": [ - "auto", - "always", - "never" - ], - "type": "string" - }, - "zebra": { - "description": "Alternate-row light tint (static fill, PDF/A-1b safe).", - "type": "boolean" - } - }, - "required": [ - "type", - "headers", - "rows" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Inline JPEG/PNG image. Without width/height the pixel size is used as points and clamped to the content width; with one dimension the aspect ratio is kept. The decoded bytes of all image blocks in one call are capped at 24 MiB (a watermark image has its own 8 MiB cap).", - "properties": { - "align": { - "default": "left", - "description": "Horizontal placement inside the content width.", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "alt": { - "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.", - "maxLength": 500, - "type": "string" - }, - "height": { - "description": "Render height in points.", - "maximum": 1000, - "minimum": 10, - "type": "number" - }, - "imageBase64": { - "description": "Base64 image bytes. JPEG (baseline; 1, 3 or 4 components — CMYK raises PDFA_DEVICE_CMYK_IMAGE under PDF/A) or PNG (8-bit greyscale/RGB, non-interlaced; alpha-channel and palette PNGs are rejected with a remedy). No data: URI.", - "maxLength": 12000000, - "minLength": 4, - "type": "string" - }, - "mimeType": { - "description": "MIME type of the image. Must match the actual encoding of imageBase64 (magic bytes are checked).", - "enum": [ - "image/jpeg", - "image/png" - ], - "type": "string" - }, - "type": { - "const": "image" - }, - "width": { - "description": "Render width in points.", - "maximum": 800, - "minimum": 10, - "type": "number" - } - }, - "required": [ - "type", - "imageBase64", - "mimeType" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Clickable external link (/URI action). Only http:, https: and mailto: URLs are accepted.", - "properties": { - "color": { - "description": "Hex colour (#RGB or #RRGGBB).", - "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$", - "type": "string" - }, - "fontSize": { - "description": "Default 10.", - "maximum": 48, - "minimum": 6, - "type": "number" - }, - "text": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "link" - }, - "url": { - "description": "http(s):// or mailto: URL.", - "maxLength": 2048, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "type", - "text", - "url" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Printed table of contents generated from the document's heading blocks (internal /GoTo links with dot leaders). Pairs with outline:'auto' for the bookmark pane.", - "properties": { - "fontSize": { - "description": "Default 10.", - "maximum": 24, - "minimum": 6, - "type": "number" - }, - "indent": { - "description": "Points of indent per heading level (default 15).", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "maxLevel": { - "description": "Deepest heading level listed (default 3).", - "enum": [ - 1, - 2, - 3 - ], - "type": "integer" - }, - "title": { - "description": "Default 'Table of Contents'.", - "maxLength": 200, - "type": "string" - }, - "type": { - "const": "toc" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Inline barcode — same body as add_barcode (pure vector, no /Alt available in the engine).", - "properties": { - "align": { - "default": "left", - "description": "Horizontal placement inside the content width.", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "data": { - "description": "Raw payload to encode — do NOT URL-encode. For QR/URL pass e.g. \"https://example.com\" verbatim. EAN-13 must be 12 or 13 digits (13th is auto-computed). Code 128 accepts ASCII alphanumerics.", - "maxLength": 4296, - "minLength": 1, - "type": "string" - }, - "ecLevel": { - "default": "M", - "description": "QR ONLY. Error correction level (L=7%, M=15%, Q=25%, H=30%). Ignored for code128/ean13/datamatrix/pdf417. Use H for printed media that may get smudged or partially covered (e.g. logo overlay).", - "enum": [ - "L", - "M", - "Q", - "H" - ], - "type": "string" - }, - "format": { - "description": "Barcode symbology to render.", - "enum": [ - "qr", - "code128", - "ean13", - "datamatrix", - "pdf417" - ], - "type": "string" - }, - "height": { - "default": 200, - "description": "Barcode height in PDF points (ignored for square symbologies like QR/Data Matrix).", - "maximum": 500, - "minimum": 30, - "type": "number" - }, - "type": { - "const": "barcode" - }, - "width": { - "default": 200, - "description": "Barcode width in PDF points.", - "maximum": 500, - "minimum": 30, - "type": "number" - } - }, - "required": [ - "type", - "format", - "data" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Vector drawing from an SVG path `d` string or SVG markup. Supported: <path> <rect> (rx/ry) <circle> <ellipse> <line> <polyline> <polygon> and <text>/<tspan> (x, y, font-size, fill, text-anchor, dx/dy); fill / stroke / stroke-width attributes; double-quoted attributes only. NOT supported (silently ignored): transform, <g>, <use>, <image>, <defs>/<clipPath>, gradients, opacity, CSS/style, dash patterns, text word-wrap. No external reference is ever fetched (no XML parser: entities other than & < > " ' &#n; are dropped). Pure path operators — PDF/A-safe at every level.", - "properties": { - "align": { - "default": "left", - "description": "Horizontal placement inside the content width.", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "alt": { - "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.", - "maxLength": 500, - "type": "string" - }, - "data": { - "description": "Path `d` string or SVG markup (≤ 100 000 characters).", - "maxLength": 100000, - "minLength": 1, - "type": "string" - }, - "fill": { - "description": "Hex colour or 'none' (default black).", - "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$", - "type": "string" - }, - "height": { - "description": "Render height in points (default 200).", - "maximum": 1000, - "minimum": 10, - "type": "number" - }, - "stroke": { - "description": "Hex colour or 'none' (default none).", - "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$", - "type": "string" - }, - "strokeWidth": { - "description": "Stroke width in SVG user units (default 1).", - "maximum": 50, - "minimum": 0, - "type": "number" - }, - "type": { - "const": "svg" - }, - "viewBox": { - "description": "[minX, minY, width, height] — overrides the viewBox of the markup; required for a bare path string that is not 0-based.", - "items": { - "type": "number" - }, - "maxItems": 4, - "minItems": 4, - "type": "array" - }, - "width": { - "description": "Render width in points (default 200).", - "maximum": 800, - "minimum": 10, - "type": "number" - } - }, - "required": [ - "type", - "data" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Inline AcroForm field — same body as an add_form field. Under a PDF/A claim the widget appearance font is not embedded (PDFA_UNEMBEDDED_FORM_FONT; strict:true fails the call).", - "properties": { - "checked": { - "description": "Initial checked state for checkbox / radio fields.", - "type": "boolean" - }, - "fieldType": { - "description": "Type of form control to render. Radio fields sharing a name form one radio group.", - "enum": [ - "text", - "textarea", - "checkbox", - "radio", - "dropdown", - "listbox" - ], - "type": "string" - }, - "fontSize": { - "description": "Font size for text rendering inside the field.", - "maximum": 48, - "minimum": 6, - "type": "number" - }, - "height": { - "description": "Field height in points (default depends on the type).", - "maximum": 300, - "minimum": 10, - "type": "number" - }, - "label": { - "description": "Human-readable label shown above the field.", - "maxLength": 200, - "type": "string" - }, - "maxLength": { - "description": "Maximum character length for text/textarea fields.", - "maximum": 32767, - "minimum": 1, - "type": "integer" - }, - "name": { - "description": "Unique field name used as the PDF annotation identifier (/T).", - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "options": { - "description": "Choices for dropdown, listbox or radio fields.", - "items": { - "maxLength": 200, - "type": "string" - }, - "maxItems": 100, - "type": "array" - }, - "placeholder": { - "description": "Hint text shown while the field is empty.", - "maxLength": 200, - "type": "string" - }, - "readOnly": { - "description": "Prevent editing of this field.", - "type": "boolean" - }, - "required": { - "description": "Mark field as required.", - "type": "boolean" - }, - "type": { - "const": "formField" - }, - "value": { - "description": "Default value pre-filled in the field.", - "maxLength": 2000, - "type": "string" - }, - "width": { - "description": "Field width in points (default: full content width).", - "maximum": 500, - "minimum": 10, - "type": "number" - } - }, - "required": [ - "type", - "fieldType", - "name" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "keepWithNext": { + "description": "Keep this heading on the same page as the block that follows. Overrides typography.keepHeadingsWithNext for this block, either way.", + "type": "boolean" + }, + "level": { + "enum": [ + 1, + 2, + 3 + ], + "type": "integer" + }, + "text": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "heading" + } + }, + "required": [ + "type", + "text", + "level" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "align": { + "description": "Text alignment (default left). 'justify' spans every line but the last across the measure; pair it with typography.opticalMargins.", + "enum": [ + "left", + "right", + "center", + "justify" + ], + "type": "string" + }, + "keepWithNext": { + "description": "Keep this paragraph on the same page as the block that follows (a lead-in line before a table or figure). Default false.", + "type": "boolean" + }, + "splittable": { + "description": "Allow / forbid this paragraph breaking across pages, overriding typography.splitParagraphs for this block.", + "type": "boolean" + }, + "text": { + "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.", + "maxLength": 50000, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "paragraph" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).", + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "style": { + "default": "bullet", + "enum": [ + "bullet", + "numbered" + ], + "type": "string" + }, + "type": { + "const": "list" + } + }, + "required": [ + "type", + "items" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "type": { + "const": "pageBreak" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "height": { + "maximum": 500, + "minimum": 1, + "type": "number" + }, + "type": { + "const": "spacer" + } + }, + "required": [ + "type", + "height" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Native vector chart rendered as pure PDF path operators — bar / horizontal-bar / stacked-bar / line / area / scatter / pie / donut (pdfnative 1.7 charts v2: time and log axes, data labels, secondary axis, legends). Same body as add_chart.", + "properties": { + "align": { + "description": "Horizontal alignment within the content width. Default 'left'.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "altText": { + "description": "Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted.", + "maxLength": 500, + "type": "string" + }, + "axis": { + "additionalProperties": false, + "description": "Value-axis options (bar/line only).", + "properties": { + "grid": { + "description": "Draw horizontal gridlines.", + "type": "boolean" + }, + "scale": { + "description": "Value-axis scale. 'log' requires strictly positive values and is not available for stacked charts.", + "enum": [ + "linear", + "log" + ], + "type": "string" + }, + "ticks": { + "description": "Target tick count (nice 1/2/5×10ⁿ steps).", + "maximum": 20, + "minimum": 2, + "type": "integer" + }, + "yMax": { + "description": "Force the axis maximum (values are clamped to the plot band).", + "type": "number" + }, + "yMin": { + "description": "Force the axis minimum (values are clamped to the plot band).", + "type": "number" + } + }, + "type": "object" + }, + "axis2": { + "additionalProperties": false, + "description": "Secondary RIGHT value axis (drawn only when a series sets yAxis:'right').", + "properties": { + "scale": { + "enum": [ + "linear", + "log" + ], + "type": "string" + }, + "ticks": { + "maximum": 20, + "minimum": 2, + "type": "integer" + }, + "yMax": { + "type": "number" + }, + "yMin": { + "type": "number" + } + }, + "type": "object" + }, + "categories": { + "description": "Category / slice labels (x-axis). Defaults to 1-based indices when omitted.", + "items": { + "maxLength": 200, + "type": "string" + }, + "maxItems": 1000, + "type": "array" + }, + "chartType": { + "description": "Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'stackedBar'/'stackedBarH'/'line'/'area'/'scatter' support multiple series. 'scatter' requires xValues on every series and a positional xAxis.type ('linear' or 'time').", + "enum": [ + "bar", + "barH", + "stackedBar", + "stackedBarH", + "line", + "area", + "scatter", + "pie", + "donut" + ], + "type": "string" + }, + "colors": { + "description": "Palette override (per-series for bar/line, per-slice for pie/donut).", + "items": { + "anyOf": [ + { + "pattern": "^#?[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "CSS-style hex colour, e.g. \"#3366cc\"." + }, + "maxItems": 50, + "type": "array" + }, + "dataLabels": { + "description": "Per-point value labels: true for defaults, or an object to format them.", + "oneOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "decimals": { + "maximum": 6, + "minimum": 0, + "type": "integer" + }, + "prefix": { + "maxLength": 16, + "type": "string" + }, + "suffix": { + "maxLength": 16, + "type": "string" + } + }, + "type": "object" + } + ] + }, + "height": { + "description": "Plot-area height in points. Default 240.", + "maximum": 2000, + "minimum": 50, + "type": "number" + }, + "labelRotation": { + "description": "Rotate category labels counter-clockwise by this many degrees (disables the automatic stride).", + "maximum": 90, + "minimum": 0, + "type": "number" + }, + "labelStride": { + "description": "Draw every Nth category label. Default: automatic (measured non-overlap); 1 draws every label.", + "maximum": 1000, + "minimum": 1, + "type": "integer" + }, + "legend": { + "description": "Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'.", + "enum": [ + "bottom", + "none" + ], + "type": "string" + }, + "markers": { + "description": "Draw point markers on line series. Default false.", + "type": "boolean" + }, + "series": { + "description": "Data series. Pie/donut charts use exactly one series (each value becomes a slice).", + "items": { + "additionalProperties": false, + "properties": { + "color": { + "anyOf": [ + { + "pattern": "^#?[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "CSS-style hex colour, e.g. \"#3366cc\"." + }, + "label": { + "description": "Series label (shown in the legend).", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "values": { + "description": "Numeric values, one per category. Negative values are supported for bar/line.", + "items": { + "type": "number" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "xValues": { + "description": "Per-point x positions (same length as values) for scatter charts and for line/area charts with xAxis.type 'linear' or 'time'.", + "items": { + "description": "Positional x value: a number (linear axis) or an ISO-8601 date / epoch milliseconds (time axis).", + "maxLength": 64, + "type": [ + "number", + "string" + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "yAxis": { + "description": "Bind the series to the left (default) or the secondary right value axis (cartesian charts only; configure its range with 'axis2').", + "enum": [ + "left", + "right" + ], + "type": "string" + } + }, + "required": [ + "label", + "values" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "title": { + "description": "Chart title rendered above the plot.", + "maxLength": 200, + "type": "string" + }, + "type": { + "const": "chart" + }, + "width": { + "description": "Plot width in points (clamped to content width). Default 460.", + "maximum": 2000, + "minimum": 50, + "type": "number" + }, + "xAxis": { + "additionalProperties": false, + "description": "Horizontal axis. 'category' (default) positions points by index; 'linear' / 'time' position them by series xValues (line/area/scatter only). Time ticks are UTC-deterministic.", + "properties": { + "grid": { + "description": "Draw vertical gridlines.", + "type": "boolean" + }, + "max": { + "description": "Axis maximum (number, or ISO-8601 / epoch ms for time axes).", + "maxLength": 64, + "type": [ + "number", + "string" + ] + }, + "min": { + "description": "Axis minimum (number, or ISO-8601 / epoch ms for time axes).", + "maxLength": 64, + "type": [ + "number", + "string" + ] + }, + "ticks": { + "maximum": 20, + "minimum": 2, + "type": "integer" + }, + "type": { + "enum": [ + "category", + "linear", + "time" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "type", + "chartType", + "series" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Inline smart table — same body as add_table (every row must have exactly as many cells as headers).", + "properties": { + "autoFitColumns": { + "description": "Auto-fit column widths to content. Output bytes then depend on text metrics (not byte-deterministic across content changes).", + "type": "boolean" + }, + "caption": { + "description": "Caption rendered above the table (tagged as /Caption under PDF/A).", + "maxLength": 200, + "type": "string" + }, + "cellBorders": { + "additionalProperties": false, + "description": "Per-cell vector borders (pure strokes, PDF/A-safe). Choose individual sides or `all`.", + "properties": { + "all": { + "description": "Draw all four edges (overrides the individual side flags).", + "type": "boolean" + }, + "bottom": { + "type": "boolean" + }, + "color": { + "anyOf": [ + { + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Stroke colour as a PDF operator string ('0.8 0.8 0.8') or hex. Default light grey." + }, + "left": { + "type": "boolean" + }, + "right": { + "type": "boolean" + }, + "style": { + "description": "Stroke style (default 'solid').", + "enum": [ + "solid", + "dashed", + "dotted" + ], + "type": "string" + }, + "top": { + "type": "boolean" + }, + "width": { + "description": "Stroke width in points (default 0.5).", + "maximum": 10, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "cellPadding": { + "description": "Horizontal cell padding in points (default 3).", + "maximum": 50, + "minimum": 0, + "type": "number" + }, + "cellVAlign": { + "description": "Vertical alignment of cell content.", + "enum": [ + "top", + "middle", + "bottom" + ], + "type": "string" + }, + "clipCells": { + "description": "Clip cell contents to the column bounds (PDF clip operators). Recommended for PDF/A and visual safety.", + "type": "boolean" + }, + "headers": { + "description": "Column header labels. Must have the same length as each row in `rows`.", + "items": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "minRowHeight": { + "description": "Minimum row height in points (default 12).", + "maximum": 200, + "minimum": 1, + "type": "number" + }, + "repeatHeader": { + "description": "Repeat the header row on every continuation page (default true).", + "type": "boolean" + }, + "rows": { + "description": "Data rows. Each row is an array of cell strings with the same length as `headers`.", + "items": { + "items": { + "maxLength": 500, + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "maxItems": 5000, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "table" + }, + "wrap": { + "description": "Cell wrap policy: 'auto' (default) wraps only overflowing cells; 'always' wraps every cell; 'never' truncates.", + "enum": [ + "auto", + "always", + "never" + ], + "type": "string" + }, + "zebra": { + "description": "Alternate-row light tint (static fill, PDF/A-1b safe).", + "type": "boolean" + } + }, + "required": [ + "type", + "headers", + "rows" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Inline JPEG/PNG image. Without width/height the pixel size is used as points and clamped to the content width; with one dimension the aspect ratio is kept. The decoded bytes of all image blocks in one call are capped at 24 MiB (a watermark image has its own 8 MiB cap).", + "properties": { + "align": { + "default": "left", + "description": "Horizontal placement inside the content width.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "alt": { + "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.", + "maxLength": 500, + "type": "string" + }, + "height": { + "description": "Render height in points.", + "maximum": 1000, + "minimum": 10, + "type": "number" + }, + "imageBase64": { + "description": "Base64 image bytes. JPEG (baseline; 1, 3 or 4 components — CMYK raises PDFA_DEVICE_CMYK_IMAGE under PDF/A) or PNG (8-bit greyscale/RGB, non-interlaced; alpha-channel and palette PNGs are rejected with a remedy). No data: URI.", + "maxLength": 12000000, + "minLength": 4, + "type": "string" + }, + "mimeType": { + "description": "MIME type of the image. Must match the actual encoding of imageBase64 (magic bytes are checked).", + "enum": [ + "image/jpeg", + "image/png" + ], + "type": "string" + }, + "type": { + "const": "image" + }, + "width": { + "description": "Render width in points.", + "maximum": 800, + "minimum": 10, + "type": "number" + } + }, + "required": [ + "type", + "imageBase64", + "mimeType" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Clickable external link (/URI action). Only http:, https: and mailto: URLs are accepted.", + "properties": { + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Hex colour (#RGB or #RRGGBB)." + }, + "fontSize": { + "description": "Default 10.", + "maximum": 48, + "minimum": 6, + "type": "number" + }, + "text": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "link" + }, + "url": { + "description": "http(s):// or mailto: URL.", + "maxLength": 2048, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "type", + "text", + "url" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Printed table of contents generated from the document's heading blocks (internal /GoTo links with dot leaders). Pairs with outline:'auto' for the bookmark pane.", + "properties": { + "fontSize": { + "description": "Default 10.", + "maximum": 24, + "minimum": 6, + "type": "number" + }, + "indent": { + "description": "Points of indent per heading level (default 15).", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxLevel": { + "description": "Deepest heading level listed (default 3).", + "enum": [ + 1, + 2, + 3 + ], + "type": "integer" + }, + "title": { + "description": "Default 'Table of Contents'.", + "maxLength": 200, + "type": "string" + }, + "type": { + "const": "toc" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Inline barcode — same body as add_barcode (pure vector, no /Alt available in the engine).", + "properties": { + "align": { + "default": "left", + "description": "Horizontal placement inside the content width.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "data": { + "description": "Raw payload to encode — do NOT URL-encode. For QR/URL pass e.g. \"https://example.com\" verbatim. EAN-13 must be 12 or 13 digits (13th is auto-computed). Code 128 accepts ASCII alphanumerics.", + "maxLength": 4296, + "minLength": 1, + "type": "string" + }, + "ecLevel": { + "default": "M", + "description": "QR ONLY. Error correction level (L=7%, M=15%, Q=25%, H=30%). Ignored for code128/ean13/datamatrix/pdf417. Use H for printed media that may get smudged or partially covered (e.g. logo overlay).", + "enum": [ + "L", + "M", + "Q", + "H" + ], + "type": "string" + }, + "format": { + "description": "Barcode symbology to render.", + "enum": [ + "qr", + "code128", + "ean13", + "datamatrix", + "pdf417" + ], + "type": "string" + }, + "height": { + "default": 200, + "description": "Barcode height in PDF points (ignored for square symbologies like QR/Data Matrix).", + "maximum": 500, + "minimum": 30, + "type": "number" + }, + "type": { + "const": "barcode" + }, + "width": { + "default": 200, + "description": "Barcode width in PDF points.", + "maximum": 500, + "minimum": 30, + "type": "number" + } + }, + "required": [ + "type", + "format", + "data" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Vector drawing from an SVG path `d` string or SVG markup. Supported: <path> <rect> (rx/ry) <circle> <ellipse> <line> <polyline> <polygon> and <text>/<tspan> (x, y, font-size, fill, text-anchor, dx/dy); fill / stroke / stroke-width attributes; double-quoted attributes only. NOT supported (silently ignored): transform, <g>, <use>, <image>, <defs>/<clipPath>, gradients, opacity, CSS/style, dash patterns, text word-wrap. No external reference is ever fetched (no XML parser: entities other than & < > " ' &#n; are dropped). Pure path operators — PDF/A-safe at every level.", + "properties": { + "align": { + "default": "left", + "description": "Horizontal placement inside the content width.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "alt": { + "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.", + "maxLength": 500, + "type": "string" + }, + "data": { + "description": "Path `d` string or SVG markup (≤ 100 000 characters).", + "maxLength": 100000, + "minLength": 1, + "type": "string" + }, + "fill": { + "anyOf": [ + { + "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Hex colour or 'none' (default black)." + }, + "height": { + "description": "Render height in points (default 200).", + "maximum": 1000, + "minimum": 10, + "type": "number" + }, + "stroke": { + "anyOf": [ + { + "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } + ], + "description": "Hex colour or 'none' (default none)." + }, + "strokeWidth": { + "description": "Stroke width in SVG user units (default 1).", + "maximum": 50, + "minimum": 0, + "type": "number" + }, + "type": { + "const": "svg" + }, + "viewBox": { + "description": "[minX, minY, width, height] — overrides the viewBox of the markup; required for a bare path string that is not 0-based.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "width": { + "description": "Render width in points (default 200).", + "maximum": 800, + "minimum": 10, + "type": "number" + } + }, + "required": [ + "type", + "data" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Inline AcroForm field — same body as an add_form field. Under a PDF/A claim pass embedFonts:true so the field font is embedded too (PDFA_UNEMBEDDED_FORM_FONT otherwise; strict:true then fails the call).", + "properties": { + "checked": { + "description": "Initial checked state for checkbox / radio fields.", + "type": "boolean" + }, + "fieldType": { + "description": "Type of form control to render. Radio fields sharing a name form one radio group.", + "enum": [ + "text", + "textarea", + "checkbox", + "radio", + "dropdown", + "listbox" + ], + "type": "string" + }, + "fontSize": { + "description": "Font size for text rendering inside the field.", + "maximum": 48, + "minimum": 6, + "type": "number" + }, + "height": { + "description": "Field height in points (default depends on the type).", + "maximum": 300, + "minimum": 10, + "type": "number" + }, + "label": { + "description": "Human-readable label shown above the field.", + "maxLength": 200, + "type": "string" + }, + "maxLength": { + "description": "Maximum character length for text/textarea fields.", + "maximum": 32767, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "Unique field name used as the PDF annotation identifier (/T).", + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "options": { + "description": "Choices for dropdown, listbox or radio fields.", + "items": { + "maxLength": 200, + "type": "string" + }, + "maxItems": 100, + "type": "array" + }, + "placeholder": { + "description": "Hint text shown while the field is empty.", + "maxLength": 200, + "type": "string" + }, + "readOnly": { + "description": "Prevent editing of this field.", + "type": "boolean" + }, + "required": { + "description": "Mark field as required.", + "type": "boolean" + }, + "type": { + "const": "formField" + }, + "value": { + "description": "Pre-filled value. The key is 'value' (there is no defaultValue).", + "maxLength": 2000, + "type": "string" + }, + "width": { + "description": "Field width in points (default: full content width).", + "maximum": 500, + "minimum": 10, + "type": "number" + } + }, + "required": [ + "type", + "fieldType", + "name" + ], + "type": "object" + } +] - changed
Input schema / properties / embedFonts / descriptionPrevious value: -"Measure with the embedded Noto Sans Latin metrics instead of Helvetica — pass the same value you will give generate_basic_pdf. (Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB.)"New value: +"Measure with the embedded Noto Sans Latin metrics instead of Helvetica — pass the same value you will give generate_basic_pdf. (Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB.)" - changed
Input schema / properties / footerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / footerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / footerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / footerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / footerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / footerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / footerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / headerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / headerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / headerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / headerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / headerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / typographyAdded value: +{ + "additionalProperties": false, + "description": "Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt.", + "properties": { + "bindShortWords": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "maxLength": { + "maximum": 3, + "minimum": 1, + "type": "integer" + }, + "words": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "Never end a line on a short word: up to maxLength letters (default 1), or exactly the listed words." + }, + "fontFeatures": { + "description": "OpenType features, later wins. tnum / lnum are no-ops on Noto Sans (TYPOGRAPHY_FEATURE_INEFFECTIVE).", + "items": { + "enum": [ + "tnum", + "pnum", + "lnum", + "onum", + "zero", + "ordn", + "sups", + "subs", + "smcp", + "c2sc", + "case" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array", + "uniqueItems": true + }, + "hyphenationLanguage": { + "description": "BCP 47 tag; no effect here (no hyphenation provider installed).", + "maxLength": 35, + "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$", + "type": "string" + }, + "keepHeadingsWithNext": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "minLines": { + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" + } + ], + "description": "Never strand a heading at a page foot. true = { minLines: 2 }." + }, + "kerning": { + "description": "Pair kerning (GPOS).", + "type": "boolean" + }, + "metrics": { + "description": "Base-14 text: 'exact' uses the AFM widths (different wraps). Default 'approximate'.", + "enum": [ + "approximate", + "exact" + ], + "type": "string" + }, + "opticalMargins": { + "description": "Hang punctuation into the margin of align:'justify' text.", + "type": "boolean" + }, + "orphans": { + "description": "Min lines left at a page foot (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + }, + "punctuationSpacing": { + "anyOf": [ + { + "enum": [ + "fr", + "fr-CA" + ], + "type": "string" + }, + { + "items": { + "additionalProperties": false, + "properties": { + "char": { + "maxLength": 2, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "space": { + "description": "U+00A0 / U+202F (narrow needs embedFonts).", + "enum": [ + "nbsp", + "narrow" + ], + "type": "string" + } + }, + "required": [ + "char", + "side", + "space" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + } + ], + "description": "No-break spaces next to punctuation (existing spaces only). 'fr': narrow before ; ! ?, no-break before ':' and inside « ». 'fr-CA': ':' and « » only. Or explicit rules." + }, + "splitParagraphs": { + "description": "Paragraphs may break across pages at a line boundary (default: atomic).", + "type": "boolean" + }, + "unitBinding": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "units": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "No-break space between a number and its unit ('150 €', '12 kg'); units replaces the built-in list." + }, + "widows": { + "description": "Min lines carried over (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" +}
- Changed
inspect_pdf5 fields changed- changed
Input schema / properties / check / descriptionPrevious value: -"CI assertions → checks (requested keys only) + checksPassed (all hold). 'signed' = a signature field with signed content exists (structural; validity is verify_pdf's job), 'placeholder' = an unsigned placeholder exists, 'dss' = /DSS present, 'docTimestamp' = a /DocTimeStamp exists, 'trapped' = /Info /Trapped set, 'annotations' = at least one page annotation exists."New value: +"CI assertions → checks (requested keys only) + checksPassed (all hold). 'signed' = a signature field with signed content exists (structural; validity is verify_pdf's job), 'placeholder' = an unsigned placeholder exists, 'dss' = /DSS present, 'docTimestamp' = a /DocTimeStamp exists, 'trapped' = /Info /Trapped set, 'annotations' = at least one page annotation exists, 'pdfx' = the XMP claims PDF/X (the claim, not its validity — validate_pdf standard:'pdf-x-4')." - changed
Input schema / properties / check / items / enumPrevious value: -[ - "pdfa", - "signed", - "encrypted", - "placeholder", - "attachments", - "dss", - "docTimestamp", - "trapped", - "annotations" -]New value: +[ + "pdfa", + "signed", + "encrypted", + "placeholder", + "attachments", + "dss", + "docTimestamp", + "trapped", + "annotations", + "pdfx" +] - changed
Input schema / properties / check / maxItemsPrevious value: -9New value: +10 - changed
Input schema / properties / verbosity / descriptionPrevious value: -"'full' (default) or 'summary' (scalars only: version, pageCount, encryption, pdfA, signatureCount, hasSignaturePlaceholder, attachmentCount, + docTimestampCount / trapped / checksPassed when present; arrays and dss dropped)."New value: +"'full' (default) or 'summary' (scalars only: version, pageCount, encryption, pdfA, signatureCount, hasSignaturePlaceholder, attachmentCount, + docTimestampCount / trapped / pdfX / checksPassed when present; arrays and dss dropped)." - added
Output schema / properties / pdfXAdded value: +{ + "description": "PDF/X claim from XMP (pdfxid:GTS_PDFXVersion, e.g. 'PDF/X-4'), present only when the document makes one. A claim, not a verdict: validate_pdf standard:'pdf-x-4' checks it.", + "type": "string" +}
- Changed
merge_pdfs1 field changed- changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
prepare_signature_placeholder23 fields changed- changed
Input schema / properties / creationDate / descriptionPrevious value: -"ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs."New value: +"ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs." - changed
Input schema / properties / embedFonts / descriptionPrevious value: -"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB."New value: +"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB." - changed
Input schema / properties / footerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / footerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / footerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / footerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / footerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / footerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / footerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / center / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - added
Input schema / properties / headerTemplate / properties / color / anyOfAdded value: +[ + { + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + { + "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.", + "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$", + "type": "string" + }, + { + "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.", + "items": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +] - changed
Input schema / properties / headerTemplate / properties / color / descriptionPrevious value: -"Hex colour."New value: +"Hex colour (#RRGGBB)." - removed
Input schema / properties / headerTemplate / properties / color / patternRemoved value: -"^#[0-9a-fA-F]{6}$" - removed
Input schema / properties / headerTemplate / properties / color / typeRemoved value: -"string" - changed
Input schema / properties / headerTemplate / properties / left / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / headerTemplate / properties / right / descriptionPrevious value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)." - changed
Input schema / properties / includeDiagnostics / descriptionPrevious value: -"Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty)."New value: +"Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty)." - changed
Input schema / properties / outputIntent / descriptionPrevious value: -"Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected)."New value: +"Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space." - changed
Input schema / properties / outputIntent / properties / iccProfileBase64 / descriptionPrevious value: -"ICC profile bytes, base64 (RGB, ≤ 8 MiB)."New value: +"ICC profile bytes, base64 (RGB, CMYK or Gray; ≤ 8 MiB)." - changed
Input schema / properties / print / properties / marks / oneOfPrevious value: -[ - { - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "crop": { - "description": "Corner crop (trim) marks. Default true.", - "type": "boolean" - }, - "length": { - "description": "Mark length in points. Default 14.", - "maximum": 100, - "minimum": 1, - "type": "number" - }, - "offset": { - "description": "Gap between TrimBox and marks in points. Default 5.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "registration": { - "description": "Edge-midpoint registration targets. Default true.", - "type": "boolean" - }, - "weight": { - "description": "Stroke width in points. Default 0.25.", - "maximum": 5, - "minimum": 0.05, - "type": "number" - } - }, - "type": "object" - } -]New value: +[ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "colourBars": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "size": { + "description": "Patch size in points. Default 12.", + "maximum": 72, + "minimum": 4, + "type": "number" + }, + "tints": { + "description": "Add the four 50 % tint patches. Default true.", + "type": "boolean" + } + }, + "type": "object" + } + ], + "description": "Colour control strip in the bleed (C M Y K solids + their 50 % tints): true for defaults. Off by default; needs a bleed of about 5 mm (14.17 pt) and is skipped when the strip would not fit." + }, + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } +] - changed
Input schema / properties / strict / descriptionPrevious value: -"Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true."New value: +"Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true." - added
Input schema / properties / typographyAdded value: +{ + "additionalProperties": false, + "description": "Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt.", + "properties": { + "bindShortWords": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "maxLength": { + "maximum": 3, + "minimum": 1, + "type": "integer" + }, + "words": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "Never end a line on a short word: up to maxLength letters (default 1), or exactly the listed words." + }, + "fontFeatures": { + "description": "OpenType features, later wins. tnum / lnum are no-ops on Noto Sans (TYPOGRAPHY_FEATURE_INEFFECTIVE).", + "items": { + "enum": [ + "tnum", + "pnum", + "lnum", + "onum", + "zero", + "ordn", + "sups", + "subs", + "smcp", + "c2sc", + "case" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array", + "uniqueItems": true + }, + "hyphenationLanguage": { + "description": "BCP 47 tag; no effect here (no hyphenation provider installed).", + "maxLength": 35, + "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$", + "type": "string" + }, + "keepHeadingsWithNext": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "minLines": { + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" + } + ], + "description": "Never strand a heading at a page foot. true = { minLines: 2 }." + }, + "kerning": { + "description": "Pair kerning (GPOS).", + "type": "boolean" + }, + "metrics": { + "description": "Base-14 text: 'exact' uses the AFM widths (different wraps). Default 'approximate'.", + "enum": [ + "approximate", + "exact" + ], + "type": "string" + }, + "opticalMargins": { + "description": "Hang punctuation into the margin of align:'justify' text.", + "type": "boolean" + }, + "orphans": { + "description": "Min lines left at a page foot (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + }, + "punctuationSpacing": { + "anyOf": [ + { + "enum": [ + "fr", + "fr-CA" + ], + "type": "string" + }, + { + "items": { + "additionalProperties": false, + "properties": { + "char": { + "maxLength": 2, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "before", + "after" + ], + "type": "string" + }, + "space": { + "description": "U+00A0 / U+202F (narrow needs embedFonts).", + "enum": [ + "nbsp", + "narrow" + ], + "type": "string" + } + }, + "required": [ + "char", + "side", + "space" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + } + ], + "description": "No-break spaces next to punctuation (existing spaces only). 'fr': narrow before ; ! ?, no-break before ':' and inside « ». 'fr-CA': ':' and « » only. Or explicit rules." + }, + "splitParagraphs": { + "description": "Paragraphs may break across pages at a line boundary (default: atomic).", + "type": "boolean" + }, + "unitBinding": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "units": { + "items": { + "maxLength": 16, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "No-break space between a number and its unit ('150 €', '12 kg'); units replaces the built-in list." + }, + "widows": { + "description": "Min lines carried over (default 2; needs splitParagraphs).", + "maximum": 10, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" +} - changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
sign_pdf4 fields changed- changed
Input schema / properties / certDerBase64 / descriptionPrevious value: -"Base64 of the signer X.509 certificate in DER form. Convert from PEM with: openssl x509 -in cert.pem -outform DER | base64 -w0"New value: +"Base64 of the signer X.509 certificate in DER form. Convert from PEM with: openssl x509 -in cert.pem -outform DER | openssl base64 -A" - changed
Input schema / properties / ecPrivateKeyDerBase64 / descriptionPrevious value: -"Base64 of an ECDSA P-256 private key in SEC1 (RFC 5915) or PKCS#8 (RFC 5208) DER form. Convert from PEM with: openssl pkey -in key.pem -outform DER | base64 -w0 Mutually exclusive with ecPrivateScalarHex."New value: +"Base64 of an ECDSA P-256 private key in SEC1 (RFC 5915) or PKCS#8 (RFC 5208) DER form. Convert from PEM with: openssl pkey -in key.pem -outform DER | openssl base64 -A Mutually exclusive with ecPrivateScalarHex." - changed
Input schema / properties / rsaKeyPkcs1DerBase64 / descriptionPrevious value: -"Base64 of the RSA private key in DER form — PKCS#1 RSAPrivateKey (openssl rsa -in key.pem -outform DER -traditional | base64 -w0) or PKCS#8 PrivateKeyInfo (openssl pkey -in key.pem -outform DER | base64 -w0). NOT PEM. Required for the rsa-* algorithms."New value: +"Base64 of the RSA private key in DER form — PKCS#1 RSAPrivateKey (openssl rsa -in key.pem -outform DER -traditional | openssl base64 -A) or PKCS#8 PrivateKeyInfo (openssl pkey -in key.pem -outform DER | openssl base64 -A). NOT PEM. Required for the rsa-* algorithms." - changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
timestamp_pdf1 field changed- changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
update_metadata1 field changed- changed
Output schema / properties / diagnostics / descriptionPrevious value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
- Changed
validate_pdf7 fields changed- changed
Input schema / properties / pdfBase64 / descriptionPrevious value: -"Base64-encoded PDF bytes to validate for PDF/UA (ISO 14289-1) structural conformance."New value: +"Base64-encoded PDF bytes to validate for structural conformance." - added
Input schema / properties / standardAdded value: +{ + "default": "pdf-ua-1", + "description": "Rule set. 'pdf-ua-1' (default): PDF/UA accessibility structure (ISO 14289-1). 'pdf-x-4': PDF/X-4 print exchange (ISO 15930-7) — OutputIntent + prtr ICC profile, TrimBox, embedded fonts, no annotations / JavaScript / embedded files; structural prerequisites only, not a certified preflight (see caveats[]).", + "enum": [ + "pdf-ua-1", + "pdf-x-4" + ], + "type": "string" +} - changed
Output schema / descriptionPrevious value: -"Structured PDF/UA validation result. Every property is optional because the result can be projected: verbosity:'summary' returns only the scalar summary fields, fields:[...] keeps a dot-path subset. Defaults return the full shape."New value: +"Structured PDF/UA or PDF/X-4 validation result. Every property is optional because the result can be projected: verbosity:'summary' returns only the scalar summary fields, fields:[...] keeps a dot-path subset. Defaults return the full shape." - added
Output schema / properties / caveatsAdded value: +{ + "description": "standard 'pdf-x-4' only: what a valid verdict does NOT establish.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / errors / descriptionPrevious value: -"Blocking PDF/UA conformance violations. Empty when valid is true."New value: +"Blocking conformance violations. Empty when valid is true." - changed
Output schema / properties / standard / descriptionPrevious value: -"Conformance standard checked (ISO 14289-1)."New value: +"Conformance standard checked (ISO 14289-1 or ISO 15930-7)." - changed
Output schema / properties / standard / enumPrevious value: -[ - "pdf-ua-1" -]New value: +[ + "pdf-ua-1", + "pdf-x-4" +]
27 tool updates
- Changed
add_attachment19 fields changed- added
Input schema / properties / compressAdded value: +{ + "description": "FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false.", + "type": "boolean" +} - added
Input schema / properties / creationDateAdded value: +{ + "description": "ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / debugAdded value: +{ + "description": "Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false.", + "type": "boolean" +} - added
Input schema / properties / embedFontsAdded value: +{ + "default": false, + "description": "Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB.", + "type": "boolean" +} - added
Input schema / properties / footerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / headerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running header on every page (left / center / right zones); reserves 15 pt.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / includeDiagnosticsAdded value: +{ + "default": false, + "description": "Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty).", + "type": "boolean" +} - added
Input schema / properties / marginsAdded value: +{ + "additionalProperties": false, + "description": "Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36.", + "properties": { + "bottom": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "right": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 200, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "top", + "right", + "bottom", + "left" + ], + "type": "object" +} - added
Input schema / properties / metadataAdded value: +{ + "additionalProperties": false, + "description": "/Info (+ XMP under PDF/A): author, subject, keywords, /Trapped.", + "properties": { + "author": { + "maxLength": 500, + "type": "string" + }, + "keywords": { + "maxLength": 1000, + "type": "string" + }, + "subject": { + "maxLength": 1000, + "type": "string" + }, + "trapped": { + "description": "/Trapped print flag.", + "enum": [ + "True", + "False", + "Unknown" + ], + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / outputIntentAdded value: +{ + "additionalProperties": false, + "description": "Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected).", + "properties": { + "iccProfileBase64": { + "description": "ICC profile bytes, base64 (RGB, ≤ 8 MiB).", + "maxLength": 11000000, + "minLength": 1, + "type": "string" + }, + "info": { + "maxLength": 500, + "type": "string" + }, + "outputCondition": { + "maxLength": 200, + "type": "string" + }, + "outputConditionIdentifier": { + "description": "e.g. \"sRGB IEC61966-2.1\".", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "registryName": { + "description": "Default \"http://www.color.org\".", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "iccProfileBase64", + "outputConditionIdentifier" + ], + "type": "object" +} - added
Input schema / properties / outputMode / descriptionAdded value: +"'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured)." - added
Input schema / properties / outputPath / descriptionAdded value: +"Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..')." - added
Input schema / properties / pageSizeAdded value: +{ + "description": "Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it.", + "enum": [ + "A4", + "Letter", + "Legal", + "A3", + "Tabloid" + ], + "type": "string" +} - added
Input schema / properties / printAdded value: +{ + "additionalProperties": false, + "description": "Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md.", + "properties": { + "artBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "bleed": { + "description": "Bleed in points (8.5 = 3 mm); sets TrimBox = MediaBox inset. Exclusive with trimBox.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "bleedBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "cropBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "marks": { + "description": "Printer's marks (needs bleed or trimBox): true for defaults, or an object.", + "oneOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } + ] + }, + "trimBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "userUnit": { + "description": "/UserUnit (multiples of 1/72 in) for pages over 14400 pt. Rejected under pdfa1b.", + "maximum": 75000, + "minimum": 1, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / strictAdded value: +{ + "default": false, + "description": "Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true.", + "type": "boolean" +} - changed
Output schema / descriptionPrevious value: -"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."New value: +"Result of a PDF-producing tool. base64 mode: the PDF arrives as an embedded `resource` content block (not duplicated here); file mode: `filePath`." - added
Output schema / properties / diagnosticsAdded value: +{ + "description": "PDF/A diagnostics (when includeDiagnostics=true).", + "items": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "warning" + ], + "type": "string" + } + }, + "required": [ + "code", + "message", + "severity" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / filePath / descriptionPrevious value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)." - added
Output schema / properties / summaryAdded value: +{ + "additionalProperties": true, + "description": "Tool-specific summary, when produced.", + "type": "object" +}
- Changed
add_barcode21 fields changed- added
Input schema / properties / compressAdded value: +{ + "description": "FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false.", + "type": "boolean" +} - added
Input schema / properties / creationDateAdded value: +{ + "description": "ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / debugAdded value: +{ + "description": "Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false.", + "type": "boolean" +} - added
Input schema / properties / embedFontsAdded value: +{ + "default": false, + "description": "Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB.", + "type": "boolean" +} - added
Input schema / properties / encryptAdded value: +{ + "additionalProperties": false, + "description": "Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached.", + "properties": { + "algorithm": { + "default": "aes128", + "description": "aes128 (V4/R4, widest compatibility) or aes256 (V5/R6).", + "enum": [ + "aes128", + "aes256" + ], + "type": "string" + }, + "ownerPassword": { + "description": "Owner password (full access).", + "maxLength": 4096, + "minLength": 1, + "type": "string" + }, + "permissions": { + "additionalProperties": false, + "description": "Permission flags; each defaults to allowed.", + "properties": { + "copy": { + "type": "boolean" + }, + "extractText": { + "type": "boolean" + }, + "modify": { + "type": "boolean" + }, + "print": { + "type": "boolean" + } + }, + "type": "object" + }, + "userPassword": { + "description": "Open password; omitted/empty = opens without a prompt.", + "maxLength": 4096, + "type": "string" + } + }, + "required": [ + "ownerPassword" + ], + "type": "object" +} - added
Input schema / properties / footerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / headerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running header on every page (left / center / right zones); reserves 15 pt.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / includeDiagnosticsAdded value: +{ + "default": false, + "description": "Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty).", + "type": "boolean" +} - added
Input schema / properties / marginsAdded value: +{ + "additionalProperties": false, + "description": "Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36.", + "properties": { + "bottom": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "right": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 200, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "top", + "right", + "bottom", + "left" + ], + "type": "object" +} - added
Input schema / properties / metadataAdded value: +{ + "additionalProperties": false, + "description": "/Info (+ XMP under PDF/A): author, subject, keywords, /Trapped.", + "properties": { + "author": { + "maxLength": 500, + "type": "string" + }, + "keywords": { + "maxLength": 1000, + "type": "string" + }, + "subject": { + "maxLength": 1000, + "type": "string" + }, + "trapped": { + "description": "/Trapped print flag.", + "enum": [ + "True", + "False", + "Unknown" + ], + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / outputIntentAdded value: +{ + "additionalProperties": false, + "description": "Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected).", + "properties": { + "iccProfileBase64": { + "description": "ICC profile bytes, base64 (RGB, ≤ 8 MiB).", + "maxLength": 11000000, + "minLength": 1, + "type": "string" + }, + "info": { + "maxLength": 500, + "type": "string" + }, + "outputCondition": { + "maxLength": 200, + "type": "string" + }, + "outputConditionIdentifier": { + "description": "e.g. \"sRGB IEC61966-2.1\".", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "registryName": { + "description": "Default \"http://www.color.org\".", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "iccProfileBase64", + "outputConditionIdentifier" + ], + "type": "object" +} - added
Input schema / properties / outputMode / descriptionAdded value: +"'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured)." - added
Input schema / properties / outputPath / descriptionAdded value: +"Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..')." - added
Input schema / properties / pageSizeAdded value: +{ + "description": "Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it.", + "enum": [ + "A4", + "Letter", + "Legal", + "A3", + "Tabloid" + ], + "type": "string" +} - changed
Input schema / properties / pdfA / descriptionPrevious value: -"Optional PDF/A conformance level (powered by pdfnative v1.2). Use 'pdfa1b' for archival of simple text+images, 'pdfa2b'/'pdfa2u' for richer content (2u guarantees Unicode mapping), 'pdfa3b' when embedding source attachments (Factur-X / ZUGFeRD). Mutually exclusive with PDF encryption. See docs/guides/PDFA.md."New value: +"PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md." - added
Input schema / properties / printAdded value: +{ + "additionalProperties": false, + "description": "Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md.", + "properties": { + "artBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "bleed": { + "description": "Bleed in points (8.5 = 3 mm); sets TrimBox = MediaBox inset. Exclusive with trimBox.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "bleedBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "cropBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "marks": { + "description": "Printer's marks (needs bleed or trimBox): true for defaults, or an object.", + "oneOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } + ] + }, + "trimBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "userUnit": { + "description": "/UserUnit (multiples of 1/72 in) for pages over 14400 pt. Rejected under pdfa1b.", + "maximum": 75000, + "minimum": 1, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / strictAdded value: +{ + "default": false, + "description": "Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true.", + "type": "boolean" +} - changed
Output schema / descriptionPrevious value: -"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."New value: +"Result of a PDF-producing tool. base64 mode: the PDF arrives as an embedded `resource` content block (not duplicated here); file mode: `filePath`." - added
Output schema / properties / diagnosticsAdded value: +{ + "description": "PDF/A diagnostics (when includeDiagnostics=true).", + "items": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "warning" + ], + "type": "string" + } + }, + "required": [ + "code", + "message", + "severity" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / filePath / descriptionPrevious value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)." - added
Output schema / properties / summaryAdded value: +{ + "additionalProperties": true, + "description": "Tool-specific summary, when produced.", + "type": "object" +}
- Changed
add_chart29 fields changed- added
Input schema / properties / axis / properties / scaleAdded value: +{ + "description": "Value-axis scale. 'log' requires strictly positive values and is not available for stacked charts.", + "enum": [ + "linear", + "log" + ], + "type": "string" +} - added
Input schema / properties / axis2Added value: +{ + "additionalProperties": false, + "description": "Secondary RIGHT value axis (drawn only when a series sets yAxis:'right').", + "properties": { + "scale": { + "enum": [ + "linear", + "log" + ], + "type": "string" + }, + "ticks": { + "maximum": 20, + "minimum": 2, + "type": "integer" + }, + "yMax": { + "type": "number" + }, + "yMin": { + "type": "number" + } + }, + "type": "object" +} - changed
Input schema / properties / chartType / descriptionPrevious value: -"Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'line' support multiple series."New value: +"Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'stackedBar'/'stackedBarH'/'line'/'area'/'scatter' support multiple series. 'scatter' requires xValues on every series and a positional xAxis.type ('linear' or 'time')." - changed
Input schema / properties / chartType / enumPrevious value: -[ - "bar", - "barH", - "line", - "pie", - "donut" -]New value: +[ + "bar", + "barH", + "stackedBar", + "stackedBarH", + "line", + "area", + "scatter", + "pie", + "donut" +] - added
Input schema / properties / compressAdded value: +{ + "description": "FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false.", + "type": "boolean" +} - added
Input schema / properties / creationDateAdded value: +{ + "description": "ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / dataLabelsAdded value: +{ + "description": "Per-point value labels: true for defaults, or an object to format them.", + "oneOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "decimals": { + "maximum": 6, + "minimum": 0, + "type": "integer" + }, + "prefix": { + "maxLength": 16, + "type": "string" + }, + "suffix": { + "maxLength": 16, + "type": "string" + } + }, + "type": "object" + } + ] +} - added
Input schema / properties / debugAdded value: +{ + "description": "Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false.", + "type": "boolean" +} - added
Input schema / properties / embedFontsAdded value: +{ + "default": false, + "description": "Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB.", + "type": "boolean" +} - added
Input schema / properties / encryptAdded value: +{ + "additionalProperties": false, + "description": "Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached.", + "properties": { + "algorithm": { + "default": "aes128", + "description": "aes128 (V4/R4, widest compatibility) or aes256 (V5/R6).", + "enum": [ + "aes128", + "aes256" + ], + "type": "string" + }, + "ownerPassword": { + "description": "Owner password (full access).", + "maxLength": 4096, + "minLength": 1, + "type": "string" + }, + "permissions": { + "additionalProperties": false, + "description": "Permission flags; each defaults to allowed.", + "properties": { + "copy": { + "type": "boolean" + }, + "extractText": { + "type": "boolean" + }, + "modify": { + "type": "boolean" + }, + "print": { + "type": "boolean" + } + }, + "type": "object" + }, + "userPassword": { + "description": "Open password; omitted/empty = opens without a prompt.", + "maxLength": 4096, + "type": "string" + } + }, + "required": [ + "ownerPassword" + ], + "type": "object" +} - added
Input schema / properties / footerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / headerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running header on every page (left / center / right zones); reserves 15 pt.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / includeDiagnosticsAdded value: +{ + "default": false, + "description": "Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty).", + "type": "boolean" +} - added
Input schema / properties / labelRotationAdded value: +{ + "description": "Rotate category labels counter-clockwise by this many degrees (disables the automatic stride).", + "maximum": 90, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / labelStrideAdded value: +{ + "description": "Draw every Nth category label. Default: automatic (measured non-overlap); 1 draws every label.", + "maximum": 1000, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / marginsAdded value: +{ + "additionalProperties": false, + "description": "Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36.", + "properties": { + "bottom": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "right": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 200, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "top", + "right", + "bottom", + "left" + ], + "type": "object" +} - added
Input schema / properties / metadataAdded value: +{ + "additionalProperties": false, + "description": "/Info (+ XMP under PDF/A): author, subject, keywords, /Trapped.", + "properties": { + "author": { + "maxLength": 500, + "type": "string" + }, + "keywords": { + "maxLength": 1000, + "type": "string" + }, + "subject": { + "maxLength": 1000, + "type": "string" + }, + "trapped": { + "description": "/Trapped print flag.", + "enum": [ + "True", + "False", + "Unknown" + ], + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / outputIntentAdded value: +{ + "additionalProperties": false, + "description": "Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected).", + "properties": { + "iccProfileBase64": { + "description": "ICC profile bytes, base64 (RGB, ≤ 8 MiB).", + "maxLength": 11000000, + "minLength": 1, + "type": "string" + }, + "info": { + "maxLength": 500, + "type": "string" + }, + "outputCondition": { + "maxLength": 200, + "type": "string" + }, + "outputConditionIdentifier": { + "description": "e.g. \"sRGB IEC61966-2.1\".", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "registryName": { + "description": "Default \"http://www.color.org\".", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "iccProfileBase64", + "outputConditionIdentifier" + ], + "type": "object" +} - added
Input schema / properties / pageSizeAdded value: +{ + "description": "Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it.", + "enum": [ + "A4", + "Letter", + "Legal", + "A3", + "Tabloid" + ], + "type": "string" +} - changed
Input schema / properties / pdfA / descriptionPrevious value: -"Optional PDF/A conformance level (powered by pdfnative v1.2). Use 'pdfa1b' for archival of simple text+images, 'pdfa2b'/'pdfa2u' for richer content (2u guarantees Unicode mapping), 'pdfa3b' when embedding source attachments (Factur-X / ZUGFeRD). Mutually exclusive with PDF encryption. See docs/guides/PDFA.md."New value: +"PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md." - added
Input schema / properties / printAdded value: +{ + "additionalProperties": false, + "description": "Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md.", + "properties": { + "artBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "bleed": { + "description": "Bleed in points (8.5 = 3 mm); sets TrimBox = MediaBox inset. Exclusive with trimBox.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "bleedBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "cropBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "marks": { + "description": "Printer's marks (needs bleed or trimBox): true for defaults, or an object.", + "oneOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } + ] + }, + "trimBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "userUnit": { + "description": "/UserUnit (multiples of 1/72 in) for pages over 14400 pt. Rejected under pdfa1b.", + "maximum": 75000, + "minimum": 1, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / series / items / properties / xValuesAdded value: +{ + "description": "Per-point x positions (same length as values) for scatter charts and for line/area charts with xAxis.type 'linear' or 'time'.", + "items": { + "description": "Positional x value: a number (linear axis) or an ISO-8601 date / epoch milliseconds (time axis).", + "maxLength": 64, + "type": [ + "number", + "string" + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / series / items / properties / yAxisAdded value: +{ + "description": "Bind the series to the left (default) or the secondary right value axis (cartesian charts only; configure its range with 'axis2').", + "enum": [ + "left", + "right" + ], + "type": "string" +} - added
Input schema / properties / strictAdded value: +{ + "default": false, + "description": "Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true.", + "type": "boolean" +} - added
Input schema / properties / xAxisAdded value: +{ + "additionalProperties": false, + "description": "Horizontal axis. 'category' (default) positions points by index; 'linear' / 'time' position them by series xValues (line/area/scatter only). Time ticks are UTC-deterministic.", + "properties": { + "grid": { + "description": "Draw vertical gridlines.", + "type": "boolean" + }, + "max": { + "description": "Axis maximum (number, or ISO-8601 / epoch ms for time axes).", + "maxLength": 64, + "type": [ + "number", + "string" + ] + }, + "min": { + "description": "Axis minimum (number, or ISO-8601 / epoch ms for time axes).", + "maxLength": 64, + "type": [ + "number", + "string" + ] + }, + "ticks": { + "maximum": 20, + "minimum": 2, + "type": "integer" + }, + "type": { + "enum": [ + "category", + "linear", + "time" + ], + "type": "string" + } + }, + "type": "object" +} - changed
Output schema / descriptionPrevious value: -"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."New value: +"Result of a PDF-producing tool. base64 mode: the PDF arrives as an embedded `resource` content block (not duplicated here); file mode: `filePath`." - added
Output schema / properties / diagnosticsAdded value: +{ + "description": "PDF/A diagnostics (when includeDiagnostics=true).", + "items": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "warning" + ], + "type": "string" + } + }, + "required": [ + "code", + "message", + "severity" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / filePath / descriptionPrevious value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)." - added
Output schema / properties / summaryAdded value: +{ + "additionalProperties": true, + "description": "Tool-specific summary, when produced.", + "type": "object" +}
- Changed
add_form27 fields changed- added
Input schema / properties / compressAdded value: +{ + "description": "FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false.", + "type": "boolean" +} - added
Input schema / properties / creationDateAdded value: +{ + "description": "ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / debugAdded value: +{ + "description": "Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false.", + "type": "boolean" +} - added
Input schema / properties / embedFontsAdded value: +{ + "default": false, + "description": "Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB.", + "type": "boolean" +} - added
Input schema / properties / encryptAdded value: +{ + "additionalProperties": false, + "description": "Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached.", + "properties": { + "algorithm": { + "default": "aes128", + "description": "aes128 (V4/R4, widest compatibility) or aes256 (V5/R6).", + "enum": [ + "aes128", + "aes256" + ], + "type": "string" + }, + "ownerPassword": { + "description": "Owner password (full access).", + "maxLength": 4096, + "minLength": 1, + "type": "string" + }, + "permissions": { + "additionalProperties": false, + "description": "Permission flags; each defaults to allowed.", + "properties": { + "copy": { + "type": "boolean" + }, + "extractText": { + "type": "boolean" + }, + "modify": { + "type": "boolean" + }, + "print": { + "type": "boolean" + } + }, + "type": "object" + }, + "userPassword": { + "description": "Open password; omitted/empty = opens without a prompt.", + "maxLength": 4096, + "type": "string" + } + }, + "required": [ + "ownerPassword" + ], + "type": "object" +} - changed
Input schema / properties / fields / items / properties / checked / descriptionPrevious value: -"Initial checked state for checkbox fields."New value: +"Initial checked state for checkbox / radio fields." - changed
Input schema / properties / fields / items / properties / fieldType / descriptionPrevious value: -"Type of form control to render."New value: +"Type of form control to render. Radio fields sharing a name form one radio group." - changed
Input schema / properties / fields / items / properties / fieldType / enumPrevious value: -[ - "text", - "textarea", - "checkbox", - "radio", - "dropdown" -]New value: +[ + "text", + "textarea", + "checkbox", + "radio", + "dropdown", + "listbox" +] - changed
Input schema / properties / fields / items / properties / height / descriptionPrevious value: -"Field height in points (optional)."New value: +"Field height in points (default depends on the type)." - changed
Input schema / properties / fields / items / properties / name / descriptionPrevious value: -"Unique field name used as the PDF annotation identifier."New value: +"Unique field name used as the PDF annotation identifier (/T)." - changed
Input schema / properties / fields / items / properties / options / descriptionPrevious value: -"Choices for dropdown or radio fields."New value: +"Choices for dropdown, listbox or radio fields." - added
Input schema / properties / fields / items / properties / placeholderAdded value: +{ + "description": "Hint text shown while the field is empty.", + "maxLength": 200, + "type": "string" +} - changed
Input schema / properties / fields / items / properties / width / descriptionPrevious value: -"Field width in points (optional)."New value: +"Field width in points (default: full content width)." - added
Input schema / properties / footerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / headerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running header on every page (left / center / right zones); reserves 15 pt.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / includeDiagnosticsAdded value: +{ + "default": false, + "description": "Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty).", + "type": "boolean" +} - added
Input schema / properties / marginsAdded value: +{ + "additionalProperties": false, + "description": "Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36.", + "properties": { + "bottom": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "right": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 200, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "top", + "right", + "bottom", + "left" + ], + "type": "object" +} - added
Input schema / properties / metadataAdded value: +{ + "additionalProperties": false, + "description": "/Info (+ XMP under PDF/A): author, subject, keywords, /Trapped.", + "properties": { + "author": { + "maxLength": 500, + "type": "string" + }, + "keywords": { + "maxLength": 1000, + "type": "string" + }, + "subject": { + "maxLength": 1000, + "type": "string" + }, + "trapped": { + "description": "/Trapped print flag.", + "enum": [ + "True", + "False", + "Unknown" + ], + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / outputIntentAdded value: +{ + "additionalProperties": false, + "description": "Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected).", + "properties": { + "iccProfileBase64": { + "description": "ICC profile bytes, base64 (RGB, ≤ 8 MiB).", + "maxLength": 11000000, + "minLength": 1, + "type": "string" + }, + "info": { + "maxLength": 500, + "type": "string" + }, + "outputCondition": { + "maxLength": 200, + "type": "string" + }, + "outputConditionIdentifier": { + "description": "e.g. \"sRGB IEC61966-2.1\".", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "registryName": { + "description": "Default \"http://www.color.org\".", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "iccProfileBase64", + "outputConditionIdentifier" + ], + "type": "object" +} - added
Input schema / properties / pageSizeAdded value: +{ + "description": "Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it.", + "enum": [ + "A4", + "Letter", + "Legal", + "A3", + "Tabloid" + ], + "type": "string" +} - changed
Input schema / properties / pdfA / descriptionPrevious value: -"Optional PDF/A conformance level (powered by pdfnative v1.2). Use 'pdfa1b' for archival of simple text+images, 'pdfa2b'/'pdfa2u' for richer content (2u guarantees Unicode mapping), 'pdfa3b' when embedding source attachments (Factur-X / ZUGFeRD). Mutually exclusive with PDF encryption. See docs/guides/PDFA.md."New value: +"PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md." - added
Input schema / properties / printAdded value: +{ + "additionalProperties": false, + "description": "Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md.", + "properties": { + "artBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "bleed": { + "description": "Bleed in points (8.5 = 3 mm); sets TrimBox = MediaBox inset. Exclusive with trimBox.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "bleedBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "cropBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "marks": { + "description": "Printer's marks (needs bleed or trimBox): true for defaults, or an object.", + "oneOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } + ] + }, + "trimBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "userUnit": { + "description": "/UserUnit (multiples of 1/72 in) for pages over 14400 pt. Rejected under pdfa1b.", + "maximum": 75000, + "minimum": 1, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / strictAdded value: +{ + "default": false, + "description": "Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true.", + "type": "boolean" +} - changed
Output schema / descriptionPrevious value: -"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."New value: +"Result of a PDF-producing tool. base64 mode: the PDF arrives as an embedded `resource` content block (not duplicated here); file mode: `filePath`." - added
Output schema / properties / diagnosticsAdded value: +{ + "description": "PDF/A diagnostics (when includeDiagnostics=true).", + "items": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "warning" + ], + "type": "string" + } + }, + "required": [ + "code", + "message", + "severity" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / filePath / descriptionPrevious value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)." - added
Output schema / properties / summaryAdded value: +{ + "additionalProperties": true, + "description": "Tool-specific summary, when produced.", + "type": "object" +}
- Changed
add_international_text27 fields changed- added
Input schema / properties / compressAdded value: +{ + "description": "FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false.", + "type": "boolean" +} - added
Input schema / properties / creationDateAdded value: +{ + "description": "ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / debugAdded value: +{ + "description": "Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false.", + "type": "boolean" +} - added
Input schema / properties / encryptAdded value: +{ + "additionalProperties": false, + "description": "Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached.", + "properties": { + "algorithm": { + "default": "aes128", + "description": "aes128 (V4/R4, widest compatibility) or aes256 (V5/R6).", + "enum": [ + "aes128", + "aes256" + ], + "type": "string" + }, + "ownerPassword": { + "description": "Owner password (full access).", + "maxLength": 4096, + "minLength": 1, + "type": "string" + }, + "permissions": { + "additionalProperties": false, + "description": "Permission flags; each defaults to allowed.", + "properties": { + "copy": { + "type": "boolean" + }, + "extractText": { + "type": "boolean" + }, + "modify": { + "type": "boolean" + }, + "print": { + "type": "boolean" + } + }, + "type": "object" + }, + "userPassword": { + "description": "Open password; omitted/empty = opens without a prompt.", + "maxLength": 4096, + "type": "string" + } + }, + "required": [ + "ownerPassword" + ], + "type": "object" +} - added
Input schema / properties / footerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / headerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running header on every page (left / center / right zones); reserves 15 pt.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / includeDiagnosticsAdded value: +{ + "default": false, + "description": "Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty).", + "type": "boolean" +} - added
Input schema / properties / lang / anyOfAdded value: +[ + { + "enum": [ + "ar", + "he", + "th", + "ja", + "zh", + "ko", + "el", + "hi", + "bn", + "ta", + "ru", + "ka", + "hy", + "tr", + "pl", + "vi", + "latin", + "te", + "si", + "bo", + "km", + "my", + "am", + "emoji", + "math" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "ar", + "he", + "th", + "ja", + "zh", + "ko", + "el", + "hi", + "bn", + "ta", + "ru", + "ka", + "hy", + "tr", + "pl", + "vi", + "latin", + "te", + "si", + "bo", + "km", + "my", + "am", + "emoji", + "math" + ], + "type": "string" + }, + "maxItems": 25, + "minItems": 1, + "type": "array" + }, + { + "description": "Comma-separated list of supported codes.", + "maxLength": 80, + "minLength": 2, + "type": "string" + } +] - removed
Input schema / properties / lang / oneOfRemoved value: -[ - { - "enum": [ - "ar", - "he", - "th", - "ja", - "zh", - "ko", - "el", - "hi", - "bn", - "ta", - "ru", - "ka", - "hy", - "tr", - "pl", - "vi", - "latin", - "te", - "si", - "bo", - "km", - "my", - "am", - "emoji", - "math" - ], - "type": "string" - }, - { - "items": { - "enum": [ - "ar", - "he", - "th", - "ja", - "zh", - "ko", - "el", - "hi", - "bn", - "ta", - "ru", - "ka", - "hy", - "tr", - "pl", - "vi", - "latin", - "te", - "si", - "bo", - "km", - "my", - "am", - "emoji", - "math" - ], - "type": "string" - }, - "maxItems": 25, - "minItems": 1, - "type": "array" - }, - { - "description": "Comma-separated list of supported codes.", - "maxLength": 80, - "minLength": 2, - "type": "string" - } -] - added
Input schema / properties / marginsAdded value: +{ + "additionalProperties": false, + "description": "Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36.", + "properties": { + "bottom": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "right": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 200, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "top", + "right", + "bottom", + "left" + ], + "type": "object" +} - added
Input schema / properties / metadataAdded value: +{ + "additionalProperties": false, + "description": "/Info (+ XMP under PDF/A): author, subject, keywords, /Trapped.", + "properties": { + "author": { + "maxLength": 500, + "type": "string" + }, + "keywords": { + "maxLength": 1000, + "type": "string" + }, + "subject": { + "maxLength": 1000, + "type": "string" + }, + "trapped": { + "description": "/Trapped print flag.", + "enum": [ + "True", + "False", + "Unknown" + ], + "type": "string" + } + }, + "type": "object" +} - changed
Input schema / properties / normalize / descriptionPrevious value: -"Unicode normalization form applied before shaping. Defaults to 'NFC' (recommended for international scripts: composes decomposed sequences for the widest glyph coverage). Override with 'NFD'/'NFKC'/'NFKD' only for specialised needs."New value: +"Unicode normalization before shaping. Default 'NFC' (widest glyph coverage); NFD/NFKC/NFKD or false for special needs." - added
Input schema / properties / outputIntentAdded value: +{ + "additionalProperties": false, + "description": "Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected).", + "properties": { + "iccProfileBase64": { + "description": "ICC profile bytes, base64 (RGB, ≤ 8 MiB).", + "maxLength": 11000000, + "minLength": 1, + "type": "string" + }, + "info": { + "maxLength": 500, + "type": "string" + }, + "outputCondition": { + "maxLength": 200, + "type": "string" + }, + "outputConditionIdentifier": { + "description": "e.g. \"sRGB IEC61966-2.1\".", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "registryName": { + "description": "Default \"http://www.color.org\".", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "iccProfileBase64", + "outputConditionIdentifier" + ], + "type": "object" +} - added
Input schema / properties / outputMode / descriptionAdded value: +"'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured)." - added
Input schema / properties / outputPath / descriptionAdded value: +"Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..')." - added
Input schema / properties / pageSizeAdded value: +{ + "description": "Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it.", + "enum": [ + "A4", + "Letter", + "Legal", + "A3", + "Tabloid" + ], + "type": "string" +} - changed
Input schema / properties / pdfA / descriptionPrevious value: -"Optional PDF/A conformance level. When set, Tagged PDF + sRGB OutputIntent + XMP metadata are emitted; the 'latin' Noto Sans fallback is auto-registered for non-WinAnsi Latin (ISO 19005-1 §6.3.4). See docs/guides/PDFA.md for the full authoring guide."New value: +"PDF/A level (Tagged PDF + sRGB OutputIntent + XMP). Fonts are embedded here, so the claim is valid as-is. See docs/guides/PDFA.md." - added
Input schema / properties / printAdded value: +{ + "additionalProperties": false, + "description": "Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md.", + "properties": { + "artBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "bleed": { + "description": "Bleed in points (8.5 = 3 mm); sets TrimBox = MediaBox inset. Exclusive with trimBox.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "bleedBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "cropBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "marks": { + "description": "Printer's marks (needs bleed or trimBox): true for defaults, or an object.", + "oneOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } + ] + }, + "trimBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "userUnit": { + "description": "/UserUnit (multiples of 1/72 in) for pages over 14400 pt. Rejected under pdfa1b.", + "maximum": 75000, + "minimum": 1, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / strictAdded value: +{ + "default": false, + "description": "Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true.", + "type": "boolean" +} - added
Input schema / properties / viewerPreferences / properties / duplexAdded value: +{ + "description": "Print-dialog paper handling default (/Duplex): single-sided or double-sided flipping on the short/long edge.", + "enum": [ + "simplex", + "duplexFlipShortEdge", + "duplexFlipLongEdge" + ], + "type": "string" +} - added
Input schema / properties / viewerPreferences / properties / numCopiesAdded value: +{ + "description": "Default number of copies for the Print dialog (/NumCopies; viewers honour 2-5 per ISO 32000 Table 150).", + "maximum": 1000, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / viewerPreferences / properties / pickTrayByPDFSizeAdded value: +{ + "description": "Ask the printer to pick the input tray from the PDF page size (/PickTrayByPDFSize).", + "type": "boolean" +} - added
Input schema / properties / viewerPreferences / properties / printPageRangeAdded value: +{ + "description": "Default page ranges for the Print dialog (/PrintPageRange) as inclusive 1-based [first, last] pairs, e.g. [[1, 4], [7, 7]].", + "items": { + "items": { + "minimum": 1, + "type": "integer" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "maxItems": 100, + "type": "array" +} - changed
Output schema / descriptionPrevious value: -"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."New value: +"Result of a PDF-producing tool. base64 mode: the PDF arrives as an embedded `resource` content block (not duplicated here); file mode: `filePath`." - added
Output schema / properties / diagnosticsAdded value: +{ + "description": "PDF/A diagnostics (when includeDiagnostics=true).", + "items": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "warning" + ], + "type": "string" + } + }, + "required": [ + "code", + "message", + "severity" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / filePath / descriptionPrevious value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)." - added
Output schema / properties / summaryAdded value: +{ + "additionalProperties": true, + "description": "Tool-specific summary, when produced.", + "type": "object" +}
- Added
add_ltv - Changed
add_table42 fields changed- changed
Input schema / properties / autoFitColumns / descriptionPrevious value: -"When true, column widths auto-fit content (pdfnative v1.1). Switches the backend to buildDocumentPDFBytes; byte output differs from the default path."New value: +"Auto-fit column widths to content. Output bytes then depend on text metrics (not byte-deterministic across content changes)." - changed
Input schema / properties / caption / descriptionPrevious value: -"Caption rendered above the table (and emitted as /Caption structure element in tagged/PDF/A mode). pdfnative v1.2."New value: +"Caption rendered above the table (tagged as /Caption under PDF/A)." - changed
Input schema / properties / cellBorders / descriptionPrevious value: -"Per-cell vector borders (pdfnative v1.4). Switches the backend to buildDocumentPDFBytes. Choose individual sides or `all`."New value: +"Per-cell vector borders (pure strokes, PDF/A-safe). Choose individual sides or `all`." - changed
Input schema / properties / cellPadding / descriptionPrevious value: -"Horizontal cell padding in points applied to both insets (default 3). pdfnative v1.2."New value: +"Horizontal cell padding in points (default 3)." - changed
Input schema / properties / cellVAlign / descriptionPrevious value: -"Vertical alignment of cell content (pdfnative v1.4). Switches the backend to buildDocumentPDFBytes."New value: +"Vertical alignment of cell content." - changed
Input schema / properties / clipCells / descriptionPrevious value: -"When true, cell contents are clipped to column bounds via PDF clip-path operators (pdfnative v1.1). Recommended for PDF/A and visual safety. Switches the backend to buildDocumentPDFBytes."New value: +"Clip cell contents to the column bounds (PDF clip operators). Recommended for PDF/A and visual safety." - added
Input schema / properties / compressAdded value: +{ + "description": "FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false.", + "type": "boolean" +} - added
Input schema / properties / creationDateAdded value: +{ + "description": "ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / debugAdded value: +{ + "description": "Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false.", + "type": "boolean" +} - added
Input schema / properties / embedFontsAdded value: +{ + "default": false, + "description": "Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB.", + "type": "boolean" +} - added
Input schema / properties / encryptAdded value: +{ + "additionalProperties": false, + "description": "Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached.", + "properties": { + "algorithm": { + "default": "aes128", + "description": "aes128 (V4/R4, widest compatibility) or aes256 (V5/R6).", + "enum": [ + "aes128", + "aes256" + ], + "type": "string" + }, + "ownerPassword": { + "description": "Owner password (full access).", + "maxLength": 4096, + "minLength": 1, + "type": "string" + }, + "permissions": { + "additionalProperties": false, + "description": "Permission flags; each defaults to allowed.", + "properties": { + "copy": { + "type": "boolean" + }, + "extractText": { + "type": "boolean" + }, + "modify": { + "type": "boolean" + }, + "print": { + "type": "boolean" + } + }, + "type": "object" + }, + "userPassword": { + "description": "Open password; omitted/empty = opens without a prompt.", + "maxLength": 4096, + "type": "string" + } + }, + "required": [ + "ownerPassword" + ], + "type": "object" +} - added
Input schema / properties / footerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / headerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running header on every page (left / center / right zones); reserves 15 pt.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / includeDiagnosticsAdded value: +{ + "default": false, + "description": "Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty).", + "type": "boolean" +} - added
Input schema / properties / marginsAdded value: +{ + "additionalProperties": false, + "description": "Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36.", + "properties": { + "bottom": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "right": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 200, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "top", + "right", + "bottom", + "left" + ], + "type": "object" +} - added
Input schema / properties / metadataAdded value: +{ + "additionalProperties": false, + "description": "/Info (+ XMP under PDF/A): author, subject, keywords, /Trapped.", + "properties": { + "author": { + "maxLength": 500, + "type": "string" + }, + "keywords": { + "maxLength": 1000, + "type": "string" + }, + "subject": { + "maxLength": 1000, + "type": "string" + }, + "trapped": { + "description": "/Trapped print flag.", + "enum": [ + "True", + "False", + "Unknown" + ], + "type": "string" + } + }, + "type": "object" +} - changed
Input schema / properties / minRowHeight / descriptionPrevious value: -"Minimum row height in points (default 12). pdfnative v1.2."New value: +"Minimum row height in points (default 12)." - added
Input schema / properties / outputIntentAdded value: +{ + "additionalProperties": false, + "description": "Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected).", + "properties": { + "iccProfileBase64": { + "description": "ICC profile bytes, base64 (RGB, ≤ 8 MiB).", + "maxLength": 11000000, + "minLength": 1, + "type": "string" + }, + "info": { + "maxLength": 500, + "type": "string" + }, + "outputCondition": { + "maxLength": 200, + "type": "string" + }, + "outputConditionIdentifier": { + "description": "e.g. \"sRGB IEC61966-2.1\".", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "registryName": { + "description": "Default \"http://www.color.org\".", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "iccProfileBase64", + "outputConditionIdentifier" + ], + "type": "object" +} - added
Input schema / properties / pageSizeAdded value: +{ + "description": "Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it.", + "enum": [ + "A4", + "Letter", + "Legal", + "A3", + "Tabloid" + ], + "type": "string" +} - changed
Input schema / properties / pdfA / descriptionPrevious value: -"Optional PDF/A conformance level (powered by pdfnative v1.2). Use 'pdfa1b' for archival of simple text+images, 'pdfa2b'/'pdfa2u' for richer content (2u guarantees Unicode mapping), 'pdfa3b' when embedding source attachments (Factur-X / ZUGFeRD). Mutually exclusive with PDF encryption. See docs/guides/PDFA.md."New value: +"PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md." - added
Input schema / properties / printAdded value: +{ + "additionalProperties": false, + "description": "Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md.", + "properties": { + "artBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "bleed": { + "description": "Bleed in points (8.5 = 3 mm); sets TrimBox = MediaBox inset. Exclusive with trimBox.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "bleedBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "cropBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "marks": { + "description": "Printer's marks (needs bleed or trimBox): true for defaults, or an object.", + "oneOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } + ] + }, + "trimBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "userUnit": { + "description": "/UserUnit (multiples of 1/72 in) for pages over 14400 pt. Rejected under pdfa1b.", + "maximum": 75000, + "minimum": 1, + "type": "number" + } + }, + "type": "object" +} - changed
Input schema / properties / repeatHeader / descriptionPrevious value: -"Repeat the header row on every continuation page (pdfnative v1.2). Default true."New value: +"Repeat the header row on every continuation page (default true)." - added
Input schema / properties / strictAdded value: +{ + "default": false, + "description": "Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true.", + "type": "boolean" +} - added
Input schema / properties / viewerPreferences / properties / duplexAdded value: +{ + "description": "Print-dialog paper handling default (/Duplex): single-sided or double-sided flipping on the short/long edge.", + "enum": [ + "simplex", + "duplexFlipShortEdge", + "duplexFlipLongEdge" + ], + "type": "string" +} - added
Input schema / properties / viewerPreferences / properties / numCopiesAdded value: +{ + "description": "Default number of copies for the Print dialog (/NumCopies; viewers honour 2-5 per ISO 32000 Table 150).", + "maximum": 1000, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / viewerPreferences / properties / pickTrayByPDFSizeAdded value: +{ + "description": "Ask the printer to pick the input tray from the PDF page size (/PickTrayByPDFSize).", + "type": "boolean" +} - added
Input schema / properties / viewerPreferences / properties / printPageRangeAdded value: +{ + "description": "Default page ranges for the Print dialog (/PrintPageRange) as inclusive 1-based [first, last] pairs, e.g. [[1, 4], [7, 7]].", + "items": { + "items": { + "minimum": 1, + "type": "integer" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "maxItems": 100, + "type": "array" +} - changed
Input schema / properties / watermark / descriptionPrevious value: -"Optional semi-transparent text watermark rendered on every page (e.g. 'DRAFT', 'CONFIDENTIAL'). Text only in this version. opacity < 1.0 is rejected under pdfA='pdfa1b' (ISO 19005-1 forbids transparency)."New value: +"Optional semi-transparent watermark rendered centred on every page: `text` (e.g. 'DRAFT'), `image` (JPEG/PNG), or both combined. At least one of text / image is required. opacity < 1.0 (text or image, including the defaults) is rejected under pdfA='pdfa1b' (ISO 19005-1 forbids transparency)." - changed
Input schema / properties / watermark / properties / angle / descriptionPrevious value: -"Rotation in degrees (counterclockwise). Default -45."New value: +"Text rotation in degrees (counterclockwise). Default -45." - changed
Input schema / properties / watermark / properties / color / descriptionPrevious value: -"RGB colour as a [r, g, b] triple in the 0.0–1.0 range. Default light gray [0.75, 0.75, 0.75]."New value: +"Text RGB colour as a [r, g, b] triple in the 0.0–1.0 range. Default light gray [0.75, 0.75, 0.75]." - changed
Input schema / properties / watermark / properties / fontSize / descriptionPrevious value: -"Font size in points. Default 60, auto-fit to the page."New value: +"Text font size in points. Default 60, auto-fit to the page." - added
Input schema / properties / watermark / properties / imageAdded value: +{ + "additionalProperties": false, + "description": "Image watermark (JPEG or PNG) centred on every page, optionally combined with `text`. Bytes are validated against the JPEG/PNG magic numbers; mimeType must match.", + "properties": { + "height": { + "description": "Display height in points (default: from the image pixel size).", + "exclusiveMinimum": 0, + "maximum": 14400, + "type": "number" + }, + "imageBase64": { + "description": "Base64-encoded JPEG or 8-bit opaque PNG bytes (max 8 MiB decoded; alpha-channel, palette and interlaced PNGs are rejected with a remedy). Plain base64, no data: URI prefix.", + "maxLength": 12000000, + "minLength": 4, + "type": "string" + }, + "mimeType": { + "description": "'image/jpeg' or 'image/png' — must match the actual bytes.", + "enum": [ + "image/jpeg", + "image/png" + ], + "type": "string" + }, + "opacity": { + "description": "Image opacity 0.0–1.0. Default 0.10.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "width": { + "description": "Display width in points (default: from the image pixel size).", + "exclusiveMinimum": 0, + "maximum": 14400, + "type": "number" + } + }, + "required": [ + "imageBase64", + "mimeType" + ], + "type": "object" +} - changed
Input schema / properties / watermark / properties / opacity / descriptionPrevious value: -"Opacity 0.0–1.0. Default 0.15."New value: +"Text opacity 0.0–1.0. Default 0.15. (Image opacity is image.opacity.)" - changed
Input schema / properties / watermark / properties / position / descriptionPrevious value: -"'background' (behind page content, default) or 'foreground' (above it)."New value: +"'background' (behind page content, default) or 'foreground' (above it). Applies to text and image alike." - changed
Input schema / properties / watermark / properties / text / descriptionPrevious value: -"Watermark text."New value: +"Watermark text. Optional when `image` is given." - removed
Input schema / properties / watermark / requiredRemoved value: -[ - "text" -] - changed
Input schema / properties / wrap / descriptionPrevious value: -"Cell wrap policy (pdfnative v1.2). 'auto' (default) wraps only when a cell overflows; 'always' wraps every cell; 'never' uses v1.1 character truncation."New value: +"Cell wrap policy: 'auto' (default) wraps only overflowing cells; 'always' wraps every cell; 'never' truncates." - changed
Input schema / properties / zebra / descriptionPrevious value: -"Enable zebra striping (alternate-row light tint, PDF/A-1b safe). pdfnative v1.2."New value: +"Alternate-row light tint (static fill, PDF/A-1b safe)." - changed
Output schema / descriptionPrevious value: -"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."New value: +"Result of a PDF-producing tool. base64 mode: the PDF arrives as an embedded `resource` content block (not duplicated here); file mode: `filePath`." - added
Output schema / properties / diagnosticsAdded value: +{ + "description": "PDF/A diagnostics (when includeDiagnostics=true).", + "items": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "warning" + ], + "type": "string" + } + }, + "required": [ + "code", + "message", + "severity" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / filePath / descriptionPrevious value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)." - added
Output schema / properties / summaryAdded value: +{ + "additionalProperties": true, + "description": "Tool-specific summary, when produced.", + "type": "object" +}
- Changed
annotate_pdf6 fields changed- added
Input schema / properties / outputMode / descriptionAdded value: +"'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured)." - added
Input schema / properties / outputPath / descriptionAdded value: +"Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..')." - changed
Output schema / descriptionPrevious value: -"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."New value: +"Result of a PDF-producing tool. base64 mode: the PDF arrives as an embedded `resource` content block (not duplicated here); file mode: `filePath`." - added
Output schema / properties / diagnosticsAdded value: +{ + "description": "PDF/A diagnostics (when includeDiagnostics=true).", + "items": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "warning" + ], + "type": "string" + } + }, + "required": [ + "code", + "message", + "severity" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / filePath / descriptionPrevious value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)." - added
Output schema / properties / summaryAdded value: +{ + "additionalProperties": true, + "description": "Tool-specific summary, when produced.", + "type": "object" +}
- Changed
decrypt_pdf5 fields changed- added
Input schema / properties / outputMode / descriptionAdded value: +"'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured)." - changed
Output schema / descriptionPrevious value: -"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."New value: +"Result of a PDF-producing tool. base64 mode: the PDF arrives as an embedded `resource` content block (not duplicated here); file mode: `filePath`." - added
Output schema / properties / diagnosticsAdded value: +{ + "description": "PDF/A diagnostics (when includeDiagnostics=true).", + "items": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "warning" + ], + "type": "string" + } + }, + "required": [ + "code", + "message", + "severity" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / filePath / descriptionPrevious value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)." - added
Output schema / properties / summaryAdded value: +{ + "additionalProperties": true, + "description": "Tool-specific summary, when produced.", + "type": "object" +}
- Changed
embed_image23 fields changed- added
Input schema / properties / alignAdded value: +{ + "default": "left", + "description": "Horizontal placement of the image inside the content width.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" +} - added
Input schema / properties / altAdded value: +{ + "description": "Accessible description of the image (tagged /Figure /Alt). Provide it for non-decorative images under PDF/A or PDF/UA.", + "maxLength": 500, + "type": "string" +} - added
Input schema / properties / compressAdded value: +{ + "description": "FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false.", + "type": "boolean" +} - added
Input schema / properties / creationDateAdded value: +{ + "description": "ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / debugAdded value: +{ + "description": "Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false.", + "type": "boolean" +} - added
Input schema / properties / embedFontsAdded value: +{ + "default": false, + "description": "Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB.", + "type": "boolean" +} - added
Input schema / properties / encryptAdded value: +{ + "additionalProperties": false, + "description": "Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached.", + "properties": { + "algorithm": { + "default": "aes128", + "description": "aes128 (V4/R4, widest compatibility) or aes256 (V5/R6).", + "enum": [ + "aes128", + "aes256" + ], + "type": "string" + }, + "ownerPassword": { + "description": "Owner password (full access).", + "maxLength": 4096, + "minLength": 1, + "type": "string" + }, + "permissions": { + "additionalProperties": false, + "description": "Permission flags; each defaults to allowed.", + "properties": { + "copy": { + "type": "boolean" + }, + "extractText": { + "type": "boolean" + }, + "modify": { + "type": "boolean" + }, + "print": { + "type": "boolean" + } + }, + "type": "object" + }, + "userPassword": { + "description": "Open password; omitted/empty = opens without a prompt.", + "maxLength": 4096, + "type": "string" + } + }, + "required": [ + "ownerPassword" + ], + "type": "object" +} - added
Input schema / properties / footerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / headerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running header on every page (left / center / right zones); reserves 15 pt.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - changed
Input schema / properties / imageBase64 / descriptionPrevious value: -"Base64-encoded image bytes. Supports JPEG and PNG formats."New value: +"Base64 image bytes. JPEG (baseline; 1, 3 or 4 components — CMYK raises PDFA_DEVICE_CMYK_IMAGE under PDF/A) or PNG (8-bit greyscale/RGB, non-interlaced; alpha-channel and palette PNGs are rejected with a remedy). No data: URI." - added
Input schema / properties / includeDiagnosticsAdded value: +{ + "default": false, + "description": "Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty).", + "type": "boolean" +} - added
Input schema / properties / marginsAdded value: +{ + "additionalProperties": false, + "description": "Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36.", + "properties": { + "bottom": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "right": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 200, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "top", + "right", + "bottom", + "left" + ], + "type": "object" +} - added
Input schema / properties / metadataAdded value: +{ + "additionalProperties": false, + "description": "/Info (+ XMP under PDF/A): author, subject, keywords, /Trapped.", + "properties": { + "author": { + "maxLength": 500, + "type": "string" + }, + "keywords": { + "maxLength": 1000, + "type": "string" + }, + "subject": { + "maxLength": 1000, + "type": "string" + }, + "trapped": { + "description": "/Trapped print flag.", + "enum": [ + "True", + "False", + "Unknown" + ], + "type": "string" + } + }, + "type": "object" +} - changed
Input schema / properties / mimeType / descriptionPrevious value: -"MIME type of the image. Must match the actual encoding of imageBase64."New value: +"MIME type of the image. Must match the actual encoding of imageBase64 (magic bytes are checked)." - added
Input schema / properties / outputIntentAdded value: +{ + "additionalProperties": false, + "description": "Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected).", + "properties": { + "iccProfileBase64": { + "description": "ICC profile bytes, base64 (RGB, ≤ 8 MiB).", + "maxLength": 11000000, + "minLength": 1, + "type": "string" + }, + "info": { + "maxLength": 500, + "type": "string" + }, + "outputCondition": { + "maxLength": 200, + "type": "string" + }, + "outputConditionIdentifier": { + "description": "e.g. \"sRGB IEC61966-2.1\".", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "registryName": { + "description": "Default \"http://www.color.org\".", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "iccProfileBase64", + "outputConditionIdentifier" + ], + "type": "object" +} - added
Input schema / properties / pageSizeAdded value: +{ + "description": "Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it.", + "enum": [ + "A4", + "Letter", + "Legal", + "A3", + "Tabloid" + ], + "type": "string" +} - changed
Input schema / properties / pdfA / descriptionPrevious value: -"Optional PDF/A conformance level (powered by pdfnative v1.2). Use 'pdfa1b' for archival of simple text+images, 'pdfa2b'/'pdfa2u' for richer content (2u guarantees Unicode mapping), 'pdfa3b' when embedding source attachments (Factur-X / ZUGFeRD). Mutually exclusive with PDF encryption. See docs/guides/PDFA.md."New value: +"PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md." - added
Input schema / properties / printAdded value: +{ + "additionalProperties": false, + "description": "Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md.", + "properties": { + "artBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "bleed": { + "description": "Bleed in points (8.5 = 3 mm); sets TrimBox = MediaBox inset. Exclusive with trimBox.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "bleedBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "cropBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "marks": { + "description": "Printer's marks (needs bleed or trimBox): true for defaults, or an object.", + "oneOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } + ] + }, + "trimBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "userUnit": { + "description": "/UserUnit (multiples of 1/72 in) for pages over 14400 pt. Rejected under pdfa1b.", + "maximum": 75000, + "minimum": 1, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / strictAdded value: +{ + "default": false, + "description": "Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true.", + "type": "boolean" +} - changed
Output schema / descriptionPrevious value: -"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."New value: +"Result of a PDF-producing tool. base64 mode: the PDF arrives as an embedded `resource` content block (not duplicated here); file mode: `filePath`." - added
Output schema / properties / diagnosticsAdded value: +{ + "description": "PDF/A diagnostics (when includeDiagnostics=true).", + "items": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "warning" + ], + "type": "string" + } + }, + "required": [ + "code", + "message", + "severity" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / filePath / descriptionPrevious value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)." - added
Output schema / properties / summaryAdded value: +{ + "additionalProperties": true, + "description": "Tool-specific summary, when produced.", + "type": "object" +}
- Changed
encrypt_pdf9 fields changed- changed
Input schema / properties / algorithm / descriptionPrevious value: -"Content cipher: aes128 (V4/R4, widest compatibility) or aes256 (V5/R6, strongest)."New value: +"aes128 (V4/R4, widest compatibility) or aes256 (V5/R6)." - added
Input schema / properties / outputMode / descriptionAdded value: +"'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured)." - changed
Input schema / properties / ownerPassword / descriptionPrevious value: -"Owner password (required, non-empty). Controls permissions and full access."New value: +"Owner password (full access)." - changed
Input schema / properties / permissions / descriptionPrevious value: -"Access permission flags (enforced by conforming readers). Each defaults to allowed when omitted."New value: +"Permission flags; each defaults to allowed." - changed
Input schema / properties / userPassword / descriptionPrevious value: -"User (open) password. Omitted or empty string means the document opens without a password prompt."New value: +"Open password; omitted/empty = opens without a prompt." - changed
Output schema / descriptionPrevious value: -"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."New value: +"Result of a PDF-producing tool. base64 mode: the PDF arrives as an embedded `resource` content block (not duplicated here); file mode: `filePath`." - added
Output schema / properties / diagnosticsAdded value: +{ + "description": "PDF/A diagnostics (when includeDiagnostics=true).", + "items": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "warning" + ], + "type": "string" + } + }, + "required": [ + "code", + "message", + "severity" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / filePath / descriptionPrevious value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)." - added
Output schema / properties / summaryAdded value: +{ + "additionalProperties": true, + "description": "Tool-specific summary, when produced.", + "type": "object" +}
- Added
extract_attachments - Added
extract_pages - Changed
extract_text7 fields changed- changed
Input schema / properties / password / descriptionPrevious value: -"Password to open an encrypted source PDF (user or owner — both are tried). Omit for unencrypted documents. Never logged or echoed back."New value: +"Password (user or owner) of an encrypted source. Never logged or echoed." - added
Output schema / descriptionAdded value: +"Structured text-extraction result. Every property is optional because the result can be projected: verbosity:'summary' returns only the scalar summary fields, fields:[...] keeps a dot-path subset. Defaults return the full shape." - added
Output schema / properties / charCountAdded value: +{ + "description": "summary only: length of fullText.", + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / extractableReason / descriptionPrevious value: -"Human-readable explanation when extractable=false. Absent when extractable=true."New value: +"Present when extractable is false: why no text could be decoded." - removed
Output schema / properties / pages / items / properties / runs / items / requiredRemoved value: -[ - "text", - "x", - "y", - "fontSize", - "fontName" -] - removed
Output schema / properties / pages / items / requiredRemoved value: -[ - "index", - "text" -] - removed
Output schema / requiredRemoved value: -[ - "pageCount", - "extractedPageCount", - "extractable", - "pages", - "fullText" -]
- Added
fill_form - Changed
generate_basic_pdf34 fields changed- changed
Input schema / properties / blocks / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "level": { - "enum": [ - 1, - 2, - 3 - ], - "type": "integer" - }, - "text": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "heading" - } - }, - "required": [ - "type", - "text", - "level" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "text": { - "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.", - "maxLength": 50000, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "paragraph" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).", - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "style": { - "default": "bullet", - "enum": [ - "bullet", - "numbered" - ], - "type": "string" - }, - "type": { - "const": "list" - } - }, - "required": [ - "type", - "items" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "type": { - "const": "pageBreak" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "height": { - "maximum": 500, - "minimum": 1, - "type": "number" - }, - "type": { - "const": "spacer" - } - }, - "required": [ - "type", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Native vector chart (pdfnative v1.6.0) — bar / horizontal-bar / line / pie / donut, rendered as pure PDF path operators.", - "properties": { - "align": { - "description": "Horizontal alignment within the content width. Default 'left'.", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "altText": { - "description": "Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted.", - "maxLength": 500, - "type": "string" - }, - "axis": { - "additionalProperties": false, - "description": "Value-axis options (bar/line only).", - "properties": { - "grid": { - "description": "Draw horizontal gridlines.", - "type": "boolean" - }, - "ticks": { - "description": "Target tick count (nice 1/2/5×10ⁿ steps).", - "maximum": 20, - "minimum": 2, - "type": "integer" - }, - "yMax": { - "description": "Force the axis maximum (values are clamped to the plot band).", - "type": "number" - }, - "yMin": { - "description": "Force the axis minimum (values are clamped to the plot band).", - "type": "number" - } - }, - "type": "object" - }, - "categories": { - "description": "Category / slice labels (x-axis). Defaults to 1-based indices when omitted.", - "items": { - "maxLength": 200, - "type": "string" - }, - "maxItems": 1000, - "type": "array" - }, - "chartType": { - "description": "Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'line' support multiple series.", - "enum": [ - "bar", - "barH", - "line", - "pie", - "donut" - ], - "type": "string" - }, - "colors": { - "description": "Palette override (per-series for bar/line, per-slice for pie/donut).", - "items": { - "description": "CSS-style hex colour, e.g. \"#3366cc\".", - "pattern": "^#?[0-9a-fA-F]{6}$", - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "height": { - "description": "Plot-area height in points. Default 240.", - "maximum": 2000, - "minimum": 50, - "type": "number" - }, - "legend": { - "description": "Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'.", - "enum": [ - "bottom", - "none" - ], - "type": "string" - }, - "markers": { - "description": "Draw point markers on line series. Default false.", - "type": "boolean" - }, - "series": { - "description": "Data series. Pie/donut charts use exactly one series (each value becomes a slice).", - "items": { - "additionalProperties": false, - "properties": { - "color": { - "description": "CSS-style hex colour, e.g. \"#3366cc\".", - "pattern": "^#?[0-9a-fA-F]{6}$", - "type": "string" - }, - "label": { - "description": "Series label (shown in the legend).", - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "values": { - "description": "Numeric values, one per category. Negative values are supported for bar/line.", - "items": { - "type": "number" - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "label", - "values" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "title": { - "description": "Chart title rendered above the plot.", - "maxLength": 200, - "type": "string" - }, - "type": { - "const": "chart" - }, - "width": { - "description": "Plot width in points (clamped to content width). Default 460.", - "maximum": 2000, - "minimum": 50, - "type": "number" - } - }, - "required": [ - "type", - "chartType", - "series" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "level": { + "enum": [ + 1, + 2, + 3 + ], + "type": "integer" + }, + "text": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "heading" + } + }, + "required": [ + "type", + "text", + "level" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "text": { + "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.", + "maxLength": 50000, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "paragraph" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).", + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "style": { + "default": "bullet", + "enum": [ + "bullet", + "numbered" + ], + "type": "string" + }, + "type": { + "const": "list" + } + }, + "required": [ + "type", + "items" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "type": { + "const": "pageBreak" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "height": { + "maximum": 500, + "minimum": 1, + "type": "number" + }, + "type": { + "const": "spacer" + } + }, + "required": [ + "type", + "height" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Native vector chart rendered as pure PDF path operators — bar / horizontal-bar / stacked-bar / line / area / scatter / pie / donut (pdfnative 1.7 charts v2: time and log axes, data labels, secondary axis, legends). Same body as add_chart.", + "properties": { + "align": { + "description": "Horizontal alignment within the content width. Default 'left'.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "altText": { + "description": "Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted.", + "maxLength": 500, + "type": "string" + }, + "axis": { + "additionalProperties": false, + "description": "Value-axis options (bar/line only).", + "properties": { + "grid": { + "description": "Draw horizontal gridlines.", + "type": "boolean" + }, + "scale": { + "description": "Value-axis scale. 'log' requires strictly positive values and is not available for stacked charts.", + "enum": [ + "linear", + "log" + ], + "type": "string" + }, + "ticks": { + "description": "Target tick count (nice 1/2/5×10ⁿ steps).", + "maximum": 20, + "minimum": 2, + "type": "integer" + }, + "yMax": { + "description": "Force the axis maximum (values are clamped to the plot band).", + "type": "number" + }, + "yMin": { + "description": "Force the axis minimum (values are clamped to the plot band).", + "type": "number" + } + }, + "type": "object" + }, + "axis2": { + "additionalProperties": false, + "description": "Secondary RIGHT value axis (drawn only when a series sets yAxis:'right').", + "properties": { + "scale": { + "enum": [ + "linear", + "log" + ], + "type": "string" + }, + "ticks": { + "maximum": 20, + "minimum": 2, + "type": "integer" + }, + "yMax": { + "type": "number" + }, + "yMin": { + "type": "number" + } + }, + "type": "object" + }, + "categories": { + "description": "Category / slice labels (x-axis). Defaults to 1-based indices when omitted.", + "items": { + "maxLength": 200, + "type": "string" + }, + "maxItems": 1000, + "type": "array" + }, + "chartType": { + "description": "Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'stackedBar'/'stackedBarH'/'line'/'area'/'scatter' support multiple series. 'scatter' requires xValues on every series and a positional xAxis.type ('linear' or 'time').", + "enum": [ + "bar", + "barH", + "stackedBar", + "stackedBarH", + "line", + "area", + "scatter", + "pie", + "donut" + ], + "type": "string" + }, + "colors": { + "description": "Palette override (per-series for bar/line, per-slice for pie/donut).", + "items": { + "description": "CSS-style hex colour, e.g. \"#3366cc\".", + "pattern": "^#?[0-9a-fA-F]{6}$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "dataLabels": { + "description": "Per-point value labels: true for defaults, or an object to format them.", + "oneOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "decimals": { + "maximum": 6, + "minimum": 0, + "type": "integer" + }, + "prefix": { + "maxLength": 16, + "type": "string" + }, + "suffix": { + "maxLength": 16, + "type": "string" + } + }, + "type": "object" + } + ] + }, + "height": { + "description": "Plot-area height in points. Default 240.", + "maximum": 2000, + "minimum": 50, + "type": "number" + }, + "labelRotation": { + "description": "Rotate category labels counter-clockwise by this many degrees (disables the automatic stride).", + "maximum": 90, + "minimum": 0, + "type": "number" + }, + "labelStride": { + "description": "Draw every Nth category label. Default: automatic (measured non-overlap); 1 draws every label.", + "maximum": 1000, + "minimum": 1, + "type": "integer" + }, + "legend": { + "description": "Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'.", + "enum": [ + "bottom", + "none" + ], + "type": "string" + }, + "markers": { + "description": "Draw point markers on line series. Default false.", + "type": "boolean" + }, + "series": { + "description": "Data series. Pie/donut charts use exactly one series (each value becomes a slice).", + "items": { + "additionalProperties": false, + "properties": { + "color": { + "description": "CSS-style hex colour, e.g. \"#3366cc\".", + "pattern": "^#?[0-9a-fA-F]{6}$", + "type": "string" + }, + "label": { + "description": "Series label (shown in the legend).", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "values": { + "description": "Numeric values, one per category. Negative values are supported for bar/line.", + "items": { + "type": "number" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "xValues": { + "description": "Per-point x positions (same length as values) for scatter charts and for line/area charts with xAxis.type 'linear' or 'time'.", + "items": { + "description": "Positional x value: a number (linear axis) or an ISO-8601 date / epoch milliseconds (time axis).", + "maxLength": 64, + "type": [ + "number", + "string" + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "yAxis": { + "description": "Bind the series to the left (default) or the secondary right value axis (cartesian charts only; configure its range with 'axis2').", + "enum": [ + "left", + "right" + ], + "type": "string" + } + }, + "required": [ + "label", + "values" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "title": { + "description": "Chart title rendered above the plot.", + "maxLength": 200, + "type": "string" + }, + "type": { + "const": "chart" + }, + "width": { + "description": "Plot width in points (clamped to content width). Default 460.", + "maximum": 2000, + "minimum": 50, + "type": "number" + }, + "xAxis": { + "additionalProperties": false, + "description": "Horizontal axis. 'category' (default) positions points by index; 'linear' / 'time' position them by series xValues (line/area/scatter only). Time ticks are UTC-deterministic.", + "properties": { + "grid": { + "description": "Draw vertical gridlines.", + "type": "boolean" + }, + "max": { + "description": "Axis maximum (number, or ISO-8601 / epoch ms for time axes).", + "maxLength": 64, + "type": [ + "number", + "string" + ] + }, + "min": { + "description": "Axis minimum (number, or ISO-8601 / epoch ms for time axes).", + "maxLength": 64, + "type": [ + "number", + "string" + ] + }, + "ticks": { + "maximum": 20, + "minimum": 2, + "type": "integer" + }, + "type": { + "enum": [ + "category", + "linear", + "time" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "type", + "chartType", + "series" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Inline smart table — same body as add_table (every row must have exactly as many cells as headers).", + "properties": { + "autoFitColumns": { + "description": "Auto-fit column widths to content. Output bytes then depend on text metrics (not byte-deterministic across content changes).", + "type": "boolean" + }, + "caption": { + "description": "Caption rendered above the table (tagged as /Caption under PDF/A).", + "maxLength": 200, + "type": "string" + }, + "cellBorders": { + "additionalProperties": false, + "description": "Per-cell vector borders (pure strokes, PDF/A-safe). Choose individual sides or `all`.", + "properties": { + "all": { + "description": "Draw all four edges (overrides the individual side flags).", + "type": "boolean" + }, + "bottom": { + "type": "boolean" + }, + "color": { + "description": "Stroke colour as a PDF operator string ('0.8 0.8 0.8') or hex. Default light grey.", + "type": "string" + }, + "left": { + "type": "boolean" + }, + "right": { + "type": "boolean" + }, + "style": { + "description": "Stroke style (default 'solid').", + "enum": [ + "solid", + "dashed", + "dotted" + ], + "type": "string" + }, + "top": { + "type": "boolean" + }, + "width": { + "description": "Stroke width in points (default 0.5).", + "maximum": 10, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "cellPadding": { + "description": "Horizontal cell padding in points (default 3).", + "maximum": 50, + "minimum": 0, + "type": "number" + }, + "cellVAlign": { + "description": "Vertical alignment of cell content.", + "enum": [ + "top", + "middle", + "bottom" + ], + "type": "string" + }, + "clipCells": { + "description": "Clip cell contents to the column bounds (PDF clip operators). Recommended for PDF/A and visual safety.", + "type": "boolean" + }, + "headers": { + "description": "Column header labels. Must have the same length as each row in `rows`.", + "items": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "minRowHeight": { + "description": "Minimum row height in points (default 12).", + "maximum": 200, + "minimum": 1, + "type": "number" + }, + "repeatHeader": { + "description": "Repeat the header row on every continuation page (default true).", + "type": "boolean" + }, + "rows": { + "description": "Data rows. Each row is an array of cell strings with the same length as `headers`.", + "items": { + "items": { + "maxLength": 500, + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "maxItems": 5000, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "table" + }, + "wrap": { + "description": "Cell wrap policy: 'auto' (default) wraps only overflowing cells; 'always' wraps every cell; 'never' truncates.", + "enum": [ + "auto", + "always", + "never" + ], + "type": "string" + }, + "zebra": { + "description": "Alternate-row light tint (static fill, PDF/A-1b safe).", + "type": "boolean" + } + }, + "required": [ + "type", + "headers", + "rows" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Inline JPEG/PNG image. Without width/height the pixel size is used as points and clamped to the content width; with one dimension the aspect ratio is kept. The decoded bytes of all image blocks in one call are capped at 24 MiB (a watermark image has its own 8 MiB cap).", + "properties": { + "align": { + "default": "left", + "description": "Horizontal placement inside the content width.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "alt": { + "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.", + "maxLength": 500, + "type": "string" + }, + "height": { + "description": "Render height in points.", + "maximum": 1000, + "minimum": 10, + "type": "number" + }, + "imageBase64": { + "description": "Base64 image bytes. JPEG (baseline; 1, 3 or 4 components — CMYK raises PDFA_DEVICE_CMYK_IMAGE under PDF/A) or PNG (8-bit greyscale/RGB, non-interlaced; alpha-channel and palette PNGs are rejected with a remedy). No data: URI.", + "maxLength": 12000000, + "minLength": 4, + "type": "string" + }, + "mimeType": { + "description": "MIME type of the image. Must match the actual encoding of imageBase64 (magic bytes are checked).", + "enum": [ + "image/jpeg", + "image/png" + ], + "type": "string" + }, + "type": { + "const": "image" + }, + "width": { + "description": "Render width in points.", + "maximum": 800, + "minimum": 10, + "type": "number" + } + }, + "required": [ + "type", + "imageBase64", + "mimeType" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Clickable external link (/URI action). Only http:, https: and mailto: URLs are accepted.", + "properties": { + "color": { + "description": "Hex colour (#RGB or #RRGGBB).", + "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$", + "type": "string" + }, + "fontSize": { + "description": "Default 10.", + "maximum": 48, + "minimum": 6, + "type": "number" + }, + "text": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "link" + }, + "url": { + "description": "http(s):// or mailto: URL.", + "maxLength": 2048, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "type", + "text", + "url" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Printed table of contents generated from the document's heading blocks (internal /GoTo links with dot leaders). Pairs with outline:'auto' for the bookmark pane.", + "properties": { + "fontSize": { + "description": "Default 10.", + "maximum": 24, + "minimum": 6, + "type": "number" + }, + "indent": { + "description": "Points of indent per heading level (default 15).", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "maxLevel": { + "description": "Deepest heading level listed (default 3).", + "enum": [ + 1, + 2, + 3 + ], + "type": "integer" + }, + "title": { + "description": "Default 'Table of Contents'.", + "maxLength": 200, + "type": "string" + }, + "type": { + "const": "toc" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Inline barcode — same body as add_barcode (pure vector, no /Alt available in the engine).", + "properties": { + "align": { + "default": "left", + "description": "Horizontal placement inside the content width.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "data": { + "description": "Raw payload to encode — do NOT URL-encode. For QR/URL pass e.g. \"https://example.com\" verbatim. EAN-13 must be 12 or 13 digits (13th is auto-computed). Code 128 accepts ASCII alphanumerics.", + "maxLength": 4296, + "minLength": 1, + "type": "string" + }, + "ecLevel": { + "default": "M", + "description": "QR ONLY. Error correction level (L=7%, M=15%, Q=25%, H=30%). Ignored for code128/ean13/datamatrix/pdf417. Use H for printed media that may get smudged or partially covered (e.g. logo overlay).", + "enum": [ + "L", + "M", + "Q", + "H" + ], + "type": "string" + }, + "format": { + "description": "Barcode symbology to render.", + "enum": [ + "qr", + "code128", + "ean13", + "datamatrix", + "pdf417" + ], + "type": "string" + }, + "height": { + "default": 200, + "description": "Barcode height in PDF points (ignored for square symbologies like QR/Data Matrix).", + "maximum": 500, + "minimum": 30, + "type": "number" + }, + "type": { + "const": "barcode" + }, + "width": { + "default": 200, + "description": "Barcode width in PDF points.", + "maximum": 500, + "minimum": 30, + "type": "number" + } + }, + "required": [ + "type", + "format", + "data" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Vector drawing from an SVG path `d` string or SVG markup. Supported: <path> <rect> (rx/ry) <circle> <ellipse> <line> <polyline> <polygon> and <text>/<tspan> (x, y, font-size, fill, text-anchor, dx/dy); fill / stroke / stroke-width attributes; double-quoted attributes only. NOT supported (silently ignored): transform, <g>, <use>, <image>, <defs>/<clipPath>, gradients, opacity, CSS/style, dash patterns, text word-wrap. No external reference is ever fetched (no XML parser: entities other than & < > " ' &#n; are dropped). Pure path operators — PDF/A-safe at every level.", + "properties": { + "align": { + "default": "left", + "description": "Horizontal placement inside the content width.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "alt": { + "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.", + "maxLength": 500, + "type": "string" + }, + "data": { + "description": "Path `d` string or SVG markup (≤ 100 000 characters).", + "maxLength": 100000, + "minLength": 1, + "type": "string" + }, + "fill": { + "description": "Hex colour or 'none' (default black).", + "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$", + "type": "string" + }, + "height": { + "description": "Render height in points (default 200).", + "maximum": 1000, + "minimum": 10, + "type": "number" + }, + "stroke": { + "description": "Hex colour or 'none' (default none).", + "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$", + "type": "string" + }, + "strokeWidth": { + "description": "Stroke width in SVG user units (default 1).", + "maximum": 50, + "minimum": 0, + "type": "number" + }, + "type": { + "const": "svg" + }, + "viewBox": { + "description": "[minX, minY, width, height] — overrides the viewBox of the markup; required for a bare path string that is not 0-based.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "width": { + "description": "Render width in points (default 200).", + "maximum": 800, + "minimum": 10, + "type": "number" + } + }, + "required": [ + "type", + "data" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Inline AcroForm field — same body as an add_form field. Under a PDF/A claim the widget appearance font is not embedded (PDFA_UNEMBEDDED_FORM_FONT; strict:true fails the call).", + "properties": { + "checked": { + "description": "Initial checked state for checkbox / radio fields.", + "type": "boolean" + }, + "fieldType": { + "description": "Type of form control to render. Radio fields sharing a name form one radio group.", + "enum": [ + "text", + "textarea", + "checkbox", + "radio", + "dropdown", + "listbox" + ], + "type": "string" + }, + "fontSize": { + "description": "Font size for text rendering inside the field.", + "maximum": 48, + "minimum": 6, + "type": "number" + }, + "height": { + "description": "Field height in points (default depends on the type).", + "maximum": 300, + "minimum": 10, + "type": "number" + }, + "label": { + "description": "Human-readable label shown above the field.", + "maxLength": 200, + "type": "string" + }, + "maxLength": { + "description": "Maximum character length for text/textarea fields.", + "maximum": 32767, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "Unique field name used as the PDF annotation identifier (/T).", + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "options": { + "description": "Choices for dropdown, listbox or radio fields.", + "items": { + "maxLength": 200, + "type": "string" + }, + "maxItems": 100, + "type": "array" + }, + "placeholder": { + "description": "Hint text shown while the field is empty.", + "maxLength": 200, + "type": "string" + }, + "readOnly": { + "description": "Prevent editing of this field.", + "type": "boolean" + }, + "required": { + "description": "Mark field as required.", + "type": "boolean" + }, + "type": { + "const": "formField" + }, + "value": { + "description": "Default value pre-filled in the field.", + "maxLength": 2000, + "type": "string" + }, + "width": { + "description": "Field width in points (default: full content width).", + "maximum": 500, + "minimum": 10, + "type": "number" + } + }, + "required": [ + "type", + "fieldType", + "name" + ], + "type": "object" + } +] - added
Input schema / properties / compressAdded value: +{ + "description": "FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false.", + "type": "boolean" +} - added
Input schema / properties / creationDateAdded value: +{ + "description": "ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / debugAdded value: +{ + "description": "Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false.", + "type": "boolean" +} - added
Input schema / properties / embedFontsAdded value: +{ + "default": false, + "description": "Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB.", + "type": "boolean" +} - added
Input schema / properties / encryptAdded value: +{ + "additionalProperties": false, + "description": "Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached.", + "properties": { + "algorithm": { + "default": "aes128", + "description": "aes128 (V4/R4, widest compatibility) or aes256 (V5/R6).", + "enum": [ + "aes128", + "aes256" + ], + "type": "string" + }, + "ownerPassword": { + "description": "Owner password (full access).", + "maxLength": 4096, + "minLength": 1, + "type": "string" + }, + "permissions": { + "additionalProperties": false, + "description": "Permission flags; each defaults to allowed.", + "properties": { + "copy": { + "type": "boolean" + }, + "extractText": { + "type": "boolean" + }, + "modify": { + "type": "boolean" + }, + "print": { + "type": "boolean" + } + }, + "type": "object" + }, + "userPassword": { + "description": "Open password; omitted/empty = opens without a prompt.", + "maxLength": 4096, + "type": "string" + } + }, + "required": [ + "ownerPassword" + ], + "type": "object" +} - added
Input schema / properties / footerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / headerTemplateAdded value: +{ + "additionalProperties": false, + "description": "Running header on every page (left / center / right zones); reserves 15 pt.", + "properties": { + "center": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "color": { + "description": "Hex colour.", + "pattern": "^#[0-9a-fA-F]{6}$", + "type": "string" + }, + "fontSize": { + "description": "Default 7.", + "maximum": 14, + "minimum": 6, + "type": "number" + }, + "left": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + }, + "right": { + "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / includeDiagnosticsAdded value: +{ + "default": false, + "description": "Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty).", + "type": "boolean" +} - added
Input schema / properties / marginsAdded value: +{ + "additionalProperties": false, + "description": "Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36.", + "properties": { + "bottom": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "right": { + "maximum": 200, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 200, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "top", + "right", + "bottom", + "left" + ], + "type": "object" +} - added
Input schema / properties / metadataAdded value: +{ + "additionalProperties": false, + "description": "/Info (+ XMP under PDF/A): author, subject, keywords, /Trapped.", + "properties": { + "author": { + "maxLength": 500, + "type": "string" + }, + "keywords": { + "maxLength": 1000, + "type": "string" + }, + "subject": { + "maxLength": 1000, + "type": "string" + }, + "trapped": { + "description": "/Trapped print flag.", + "enum": [ + "True", + "False", + "Unknown" + ], + "type": "string" + } + }, + "type": "object" +} - changed
Input schema / properties / normalize / descriptionPrevious value: -"Optional Unicode normalization applied to all rendered text before shaping. 'NFC' (recommended) composes base + combining marks into precomposed code points for better glyph coverage; 'NFD'/'NFKC'/'NFKD' are also accepted. Omit for byte-stable output (no normalization)."New value: +"Unicode normalization before shaping ('NFC' recommended for glyph coverage; NFD/NFKC/NFKD accepted). Omit = none." - added
Input schema / properties / outputIntentAdded value: +{ + "additionalProperties": false, + "description": "Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected).", + "properties": { + "iccProfileBase64": { + "description": "ICC profile bytes, base64 (RGB, ≤ 8 MiB).", + "maxLength": 11000000, + "minLength": 1, + "type": "string" + }, + "info": { + "maxLength": 500, + "type": "string" + }, + "outputCondition": { + "maxLength": 200, + "type": "string" + }, + "outputConditionIdentifier": { + "description": "e.g. \"sRGB IEC61966-2.1\".", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "registryName": { + "description": "Default \"http://www.color.org\".", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "iccProfileBase64", + "outputConditionIdentifier" + ], + "type": "object" +} - added
Input schema / properties / pageSizeAdded value: +{ + "description": "Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it.", + "enum": [ + "A4", + "Letter", + "Legal", + "A3", + "Tabloid" + ], + "type": "string" +} - changed
Input schema / properties / pdfA / descriptionPrevious value: -"Optional PDF/A conformance level (powered by pdfnative v1.2). Use 'pdfa1b' for archival of simple text+images, 'pdfa2b'/'pdfa2u' for richer content (2u guarantees Unicode mapping), 'pdfa3b' when embedding source attachments (Factur-X / ZUGFeRD). Mutually exclusive with PDF encryption. See docs/guides/PDFA.md."New value: +"PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md." - added
Input schema / properties / printAdded value: +{ + "additionalProperties": false, + "description": "Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md.", + "properties": { + "artBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "bleed": { + "description": "Bleed in points (8.5 = 3 mm); sets TrimBox = MediaBox inset. Exclusive with trimBox.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "bleedBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "cropBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "marks": { + "description": "Printer's marks (needs bleed or trimBox): true for defaults, or an object.", + "oneOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "crop": { + "description": "Corner crop (trim) marks. Default true.", + "type": "boolean" + }, + "length": { + "description": "Mark length in points. Default 14.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "offset": { + "description": "Gap between TrimBox and marks in points. Default 5.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "registration": { + "description": "Edge-midpoint registration targets. Default true.", + "type": "boolean" + }, + "weight": { + "description": "Stroke width in points. Default 0.25.", + "maximum": 5, + "minimum": 0.05, + "type": "number" + } + }, + "type": "object" + } + ] + }, + "trimBox": { + "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.", + "items": { + "type": "number" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "userUnit": { + "description": "/UserUnit (multiples of 1/72 in) for pages over 14400 pt. Rejected under pdfa1b.", + "maximum": 75000, + "minimum": 1, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / strictAdded value: +{ + "default": false, + "description": "Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true.", + "type": "boolean" +} - added
Input schema / properties / viewerPreferences / properties / duplexAdded value: +{ + "description": "Print-dialog paper handling default (/Duplex): single-sided or double-sided flipping on the short/long edge.", + "enum": [ + "simplex", + "duplexFlipShortEdge", + "duplexFlipLongEdge" + ], + "type": "string" +} - added
Input schema / properties / viewerPreferences / properties / numCopiesAdded value: +{ + "description": "Default number of copies for the Print dialog (/NumCopies; viewers honour 2-5 per ISO 32000 Table 150).", + "maximum": 1000, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / viewerPreferences / properties / pickTrayByPDFSizeAdded value: +{ + "description": "Ask the printer to pick the input tray from the PDF page size (/PickTrayByPDFSize).", + "type": "boolean" +} - added
Input schema / properties / viewerPreferences / properties / printPageRangeAdded value: +{ + "description": "Default page ranges for the Print dialog (/PrintPageRange) as inclusive 1-based [first, last] pairs, e.g. [[1, 4], [7, 7]].", + "items": { + "items": { + "minimum": 1, + "type": "integer" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "maxItems": 100, + "type": "array" +} - changed
Input schema / properties / watermark / descriptionPrevious value: -"Optional semi-transparent text watermark rendered on every page (e.g. 'DRAFT', 'CONFIDENTIAL'). Text only in this version. opacity < 1.0 is rejected under pdfA='pdfa1b' (ISO 19005-1 forbids transparency)."New value: +"Optional semi-transparent watermark rendered centred on every page: `text` (e.g. 'DRAFT'), `image` (JPEG/PNG), or both combined. At least one of text / image is required. opacity < 1.0 (text or image, including the defaults) is rejected under pdfA='pdfa1b' (ISO 19005-1 forbids transparency)." - changed
Input schema / properties / watermark / properties / angle / descriptionPrevious value: -"Rotation in degrees (counterclockwise). Default -45."New value: +"Text rotation in degrees (counterclockwise). Default -45." - changed
Input schema / properties / watermark / properties / color / descriptionPrevious value: -"RGB colour as a [r, g, b] triple in the 0.0–1.0 range. Default light gray [0.75, 0.75, 0.75]."New value: +"Text RGB colour as a [r, g, b] triple in the 0.0–1.0 range. Default light gray [0.75, 0.75, 0.75]." - changed
Input schema / properties / watermark / properties / fontSize / descriptionPrevious value: -"Font size in points. Default 60, auto-fit to the page."New value: +"Text font size in points. Default 60, auto-fit to the page." - added
Input schema / properties / watermark / properties / imageAdded value: +{ + "additionalProperties": false, + "description": "Image watermark (JPEG or PNG) centred on every page, optionally combined with `text`. Bytes are validated against the JPEG/PNG magic numbers; mimeType must match.", + "properties": { + "height": { + "description": "Display height in points (default: from the image pixel size).", + "exclusiveMinimum": 0, + "maximum": 14400, + "type": "number" + }, + "imageBase64": { + "description": "Base64-encoded JPEG or 8-bit opaque PNG bytes (max 8 MiB decoded; alpha-channel, palette and interlaced PNGs are rejected with a remedy). Plain base64, no data: URI prefix.", + "maxLength": 12000000, + "minLength": 4, + "type": "string" + }, + "mimeType": { + "description": "'image/jpeg' or 'image/png' — must match the actual bytes.", + "enum": [ + "image/jpeg", + "image/png" + ], + "type": "string" + }, + "opacity": { + "description": "Image opacity 0.0–1.0. Default 0.10.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "width": { + "description": "Display width in points (default: from the image pixel size).", + "exclusiveMinimum": 0, + "maximum": 14400, + "type": "number" + } + }, + "required": [ + "imageBase64", + "mimeType" + ], + "type": "object" +} - changed
Input schema / properties / watermark / properties / opacity / descriptionPrevious value: -"Opacity 0.0–1.0. Default 0.15."New value: +"Text opacity 0.0–1.0. Default 0.15. (Image opacity is image.opacity.)" - changed
Input schema / properties / watermark / properties / position / descriptionPrevious value: -"'background' (behind page content, default) or 'foreground' (above it)."New value: +"'background' (behind page content, default) or 'foreground' (above it). Applies to text and image alike." - changed
Input schema / properties / watermark / properties / text / descriptionPrevious value: -"Watermark text."New value: +"Watermark text. Optional when `image` is given." - removed
Input schema / properties / watermark / requiredRemoved value: -[ - "text" -] - changed
Output schema / descriptionPrevious value: -"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."New value: +"Result of a PDF-producing tool. base64 mode: the PDF arrives as an embedded `resource` content block (not duplicated here); file mode: `filePath`." - added
Output schema / properties / diagnosticsAdded value: +{ + "description": "PDF/A diagnostics (when includeDiagnostics=true).", + "items": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "warning" + ], + "type": "string" + } + }, + "required": [ + "code", + "message", + "severity" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / filePath / descriptionPrevious value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)." - added
Output schema / properties / summaryAdded value: +{ + "additionalProperties": true, + "description": "Tool-specific summary, when produced.", + "type": "object" +}
- Added
inspect_layout - Added
inspect_pdf - Added
merge_pdfs - Added
prepare_signature_placeholder - Added
read_form_fields - Added
sign_pdf - Changed
split_pdf8 fields changed- changed
Input schema / properties / encrypt / descriptionPrevious value: -"Re-encrypt the produced PDF with the PDF Standard Security Handler (AES-128 V4/R4 default, or AES-256 V5/R6). RC4 is never emitted. Requires a Web Crypto CSPRNG. Applied to every produced range."New value: +"Re-encrypt the output (Standard Security Handler; AES-128 default or AES-256; RC4 never emitted). Applied to every produced range." - changed
Input schema / properties / encrypt / properties / algorithm / descriptionPrevious value: -"Content cipher: aes128 (V4/R4, widest compatibility) or aes256 (V5/R6, strongest)."New value: +"aes128 (V4/R4, widest compatibility) or aes256 (V5/R6)." - changed
Input schema / properties / encrypt / properties / ownerPassword / descriptionPrevious value: -"Owner password (required, non-empty). Controls permissions and full access."New value: +"Owner password (full access)." - changed
Input schema / properties / encrypt / properties / permissions / descriptionPrevious value: -"Access permission flags (enforced by conforming readers). Each defaults to allowed when omitted."New value: +"Permission flags; each defaults to allowed." - changed
Input schema / properties / encrypt / properties / userPassword / descriptionPrevious value: -"User (open) password. Omitted or empty string means the document opens without a password prompt."New value: +"Open password; omitted/empty = opens without a prompt." - added
Input schema / properties / outputMode / descriptionAdded value: +"'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured)." - changed
Input schema / properties / password / descriptionPrevious value: -"Password to open an encrypted source PDF (user or owner — both are tried). Omit for unencrypted documents. Never logged or echoed back."New value: +"Password (user or owner) of an encrypted source. Never logged or echoed." - changed
Output schema / properties / parts / items / properties / filePath / descriptionPrevious value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)."
- Added
timestamp_pdf - Added
update_metadata - Added
validate_pdf - Added
verify_pdf
14 tool updates
v1.6.0- Added
add_chart - Added
decrypt_pdf - Added
encrypt_pdf - Removed
extract_attachments - Removed
extract_pages - Changed
extract_text5 fields changed- added
Input schema / properties / includeRunsAdded value: +{ + "default": false, + "description": "When true, each page also carries `runs[]` — positioned text-showing operations `{ text, x, y, fontSize, fontName }` in device space (content-stream order). Useful for layout-aware extraction; larger responses.", + "type": "boolean" +} - added
Input schema / properties / maxTextLengthAdded value: +{ + "description": "Hard cap on total extracted characters across all pages (memory bound for adversarial input). Default 16000000. Exceeding it fails with OUTPUT_TOO_LARGE.", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / passwordAdded value: +{ + "description": "Password to open an encrypted source PDF (user or owner — both are tried). Omit for unencrypted documents. Never logged or echoed back.", + "maxLength": 4096, + "minLength": 1, + "type": "string" +} - changed
Output schema / properties / extractable / descriptionPrevious value: -"False when one or more requested pages had a non-empty content stream but yielded no extractable text (likely subset fonts without /ToUnicode)."New value: +"False when one or more requested pages produced text that is entirely U+FFFD replacement characters — a font with no usable /ToUnicode CMap or base encoding. Blank pages are still considered extractable." - added
Output schema / properties / pages / items / properties / runsAdded value: +{ + "description": "Positioned text runs (present only when includeRuns is true).", + "items": { + "additionalProperties": false, + "properties": { + "fontName": { + "type": "string" + }, + "fontSize": { + "type": "number" + }, + "text": { + "type": "string" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "text", + "x", + "y", + "fontSize", + "fontName" + ], + "type": "object" + }, + "type": "array" +}
- Changed
generate_basic_pdf1 field changed- changed
Input schema / properties / blocks / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "level": { - "enum": [ - 1, - 2, - 3 - ], - "type": "integer" - }, - "text": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "heading" - } - }, - "required": [ - "type", - "text", - "level" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "text": { - "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.", - "maxLength": 50000, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "paragraph" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).", - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "oneOf": [ - { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "text": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - } - ] - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "style": { - "default": "bullet", - "enum": [ - "bullet", - "numbered" - ], - "type": "string" - }, - "type": { - "const": "list" - } - }, - "required": [ - "type", - "items" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "type": { - "const": "pageBreak" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "height": { - "maximum": 500, - "minimum": 1, - "type": "number" - }, - "type": { - "const": "spacer" - } - }, - "required": [ - "type", - "height" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "level": { + "enum": [ + 1, + 2, + 3 + ], + "type": "integer" + }, + "text": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "heading" + } + }, + "required": [ + "type", + "text", + "level" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "text": { + "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.", + "maxLength": 50000, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "paragraph" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).", + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "style": { + "default": "bullet", + "enum": [ + "bullet", + "numbered" + ], + "type": "string" + }, + "type": { + "const": "list" + } + }, + "required": [ + "type", + "items" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "type": { + "const": "pageBreak" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "height": { + "maximum": 500, + "minimum": 1, + "type": "number" + }, + "type": { + "const": "spacer" + } + }, + "required": [ + "type", + "height" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Native vector chart (pdfnative v1.6.0) — bar / horizontal-bar / line / pie / donut, rendered as pure PDF path operators.", + "properties": { + "align": { + "description": "Horizontal alignment within the content width. Default 'left'.", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "altText": { + "description": "Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted.", + "maxLength": 500, + "type": "string" + }, + "axis": { + "additionalProperties": false, + "description": "Value-axis options (bar/line only).", + "properties": { + "grid": { + "description": "Draw horizontal gridlines.", + "type": "boolean" + }, + "ticks": { + "description": "Target tick count (nice 1/2/5×10ⁿ steps).", + "maximum": 20, + "minimum": 2, + "type": "integer" + }, + "yMax": { + "description": "Force the axis maximum (values are clamped to the plot band).", + "type": "number" + }, + "yMin": { + "description": "Force the axis minimum (values are clamped to the plot band).", + "type": "number" + } + }, + "type": "object" + }, + "categories": { + "description": "Category / slice labels (x-axis). Defaults to 1-based indices when omitted.", + "items": { + "maxLength": 200, + "type": "string" + }, + "maxItems": 1000, + "type": "array" + }, + "chartType": { + "description": "Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'line' support multiple series.", + "enum": [ + "bar", + "barH", + "line", + "pie", + "donut" + ], + "type": "string" + }, + "colors": { + "description": "Palette override (per-series for bar/line, per-slice for pie/donut).", + "items": { + "description": "CSS-style hex colour, e.g. \"#3366cc\".", + "pattern": "^#?[0-9a-fA-F]{6}$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "height": { + "description": "Plot-area height in points. Default 240.", + "maximum": 2000, + "minimum": 50, + "type": "number" + }, + "legend": { + "description": "Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'.", + "enum": [ + "bottom", + "none" + ], + "type": "string" + }, + "markers": { + "description": "Draw point markers on line series. Default false.", + "type": "boolean" + }, + "series": { + "description": "Data series. Pie/donut charts use exactly one series (each value becomes a slice).", + "items": { + "additionalProperties": false, + "properties": { + "color": { + "description": "CSS-style hex colour, e.g. \"#3366cc\".", + "pattern": "^#?[0-9a-fA-F]{6}$", + "type": "string" + }, + "label": { + "description": "Series label (shown in the legend).", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "values": { + "description": "Numeric values, one per category. Negative values are supported for bar/line.", + "items": { + "type": "number" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "label", + "values" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "title": { + "description": "Chart title rendered above the plot.", + "maxLength": 200, + "type": "string" + }, + "type": { + "const": "chart" + }, + "width": { + "description": "Plot width in points (clamped to content width). Default 460.", + "maximum": 2000, + "minimum": 50, + "type": "number" + } + }, + "required": [ + "type", + "chartType", + "series" + ], + "type": "object" + } +]
- Removed
inspect_pdf - Removed
merge_pdfs - Removed
prepare_signature_placeholder - Removed
sign_pdf - Changed
split_pdf3 fields changed- added
Input schema / properties / encryptAdded value: +{ + "additionalProperties": false, + "description": "Re-encrypt the produced PDF with the PDF Standard Security Handler (AES-128 V4/R4 default, or AES-256 V5/R6). RC4 is never emitted. Requires a Web Crypto CSPRNG. Applied to every produced range.", + "properties": { + "algorithm": { + "default": "aes128", + "description": "Content cipher: aes128 (V4/R4, widest compatibility) or aes256 (V5/R6, strongest).", + "enum": [ + "aes128", + "aes256" + ], + "type": "string" + }, + "ownerPassword": { + "description": "Owner password (required, non-empty). Controls permissions and full access.", + "maxLength": 4096, + "minLength": 1, + "type": "string" + }, + "permissions": { + "additionalProperties": false, + "description": "Access permission flags (enforced by conforming readers). Each defaults to allowed when omitted.", + "properties": { + "copy": { + "type": "boolean" + }, + "extractText": { + "type": "boolean" + }, + "modify": { + "type": "boolean" + }, + "print": { + "type": "boolean" + } + }, + "type": "object" + }, + "userPassword": { + "description": "User (open) password. Omitted or empty string means the document opens without a password prompt.", + "maxLength": 4096, + "type": "string" + } + }, + "required": [ + "ownerPassword" + ], + "type": "object" +} - added
Input schema / properties / passwordAdded value: +{ + "description": "Password to open an encrypted source PDF (user or owner — both are tried). Omit for unencrypted documents. Never logged or echoed back.", + "maxLength": 4096, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / pdfBase64 / descriptionPrevious value: -"Base64-encoded source PDF. Must not be encrypted."New value: +"Base64-encoded source PDF. Pass `password` for an encrypted source."
- Removed
validate_pdf - Removed
verify_pdf
4 tool updates
v1.4.0- Changed
add_international_text1 field changed- changed
Input schema / properties / lang / oneOfPrevious value: -[ - { - "enum": [ - "ar", - "he", - "th", - "ja", - "zh", - "ko", - "el", - "hi", - "bn", - "ta", - "ru", - "ka", - "hy", - "tr", - "pl", - "vi", - "latin", - "te", - "si", - "bo", - "km", - "my", - "am", - "emoji" - ], - "type": "string" - }, - { - "items": { - "enum": [ - "ar", - "he", - "th", - "ja", - "zh", - "ko", - "el", - "hi", - "bn", - "ta", - "ru", - "ka", - "hy", - "tr", - "pl", - "vi", - "latin", - "te", - "si", - "bo", - "km", - "my", - "am", - "emoji" - ], - "type": "string" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - { - "description": "Comma-separated list of supported codes.", - "maxLength": 80, - "minLength": 2, - "type": "string" - } -]New value: +[ + { + "enum": [ + "ar", + "he", + "th", + "ja", + "zh", + "ko", + "el", + "hi", + "bn", + "ta", + "ru", + "ka", + "hy", + "tr", + "pl", + "vi", + "latin", + "te", + "si", + "bo", + "km", + "my", + "am", + "emoji", + "math" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "ar", + "he", + "th", + "ja", + "zh", + "ko", + "el", + "hi", + "bn", + "ta", + "ru", + "ka", + "hy", + "tr", + "pl", + "vi", + "latin", + "te", + "si", + "bo", + "km", + "my", + "am", + "emoji", + "math" + ], + "type": "string" + }, + "maxItems": 25, + "minItems": 1, + "type": "array" + }, + { + "description": "Comma-separated list of supported codes.", + "maxLength": 80, + "minLength": 2, + "type": "string" + } +]
- Added
annotate_pdf - Added
draft_governance_issue - Changed
inspect_pdf1 field changed- added
Output schema / properties / pageLabelsAdded value: +{ + "description": "Logical page-numbering ranges from the /PageLabels number tree (ISO 32000-1 §12.4.2), or absent when the document has none. Each range gives the 0-based first page, numbering style, optional prefix and start value.", + "items": { + "additionalProperties": false, + "properties": { + "prefix": { + "type": "string" + }, + "start": { + "type": "integer" + }, + "startPage": { + "minimum": 0, + "type": "integer" + }, + "style": { + "enum": [ + "decimal", + "roman", + "Roman", + "alpha", + "Alpha", + "none" + ], + "type": "string" + } + }, + "required": [ + "startPage" + ], + "type": "object" + }, + "type": "array" +}
6 tool updates
v1.2.2- Changed
add_international_text1 field changed- added
Input schema / properties / viewerPreferencesAdded value: +{ + "additionalProperties": false, + "description": "Reader presentation hints (catalog /PageLayout, /PageMode, /ViewerPreferences). PDF/A-safe; all optional.", + "properties": { + "centerWindow": { + "type": "boolean" + }, + "direction": { + "enum": [ + "l2r", + "r2l" + ], + "type": "string" + }, + "displayDocTitle": { + "type": "boolean" + }, + "fitWindow": { + "type": "boolean" + }, + "hideMenubar": { + "type": "boolean" + }, + "hideToolbar": { + "type": "boolean" + }, + "hideWindowUI": { + "type": "boolean" + }, + "nonFullScreenPageMode": { + "enum": [ + "useNone", + "useOutlines", + "useThumbs", + "useOC" + ], + "type": "string" + }, + "pageLayout": { + "enum": [ + "singlePage", + "oneColumn", + "twoColumnLeft", + "twoColumnRight", + "twoPageLeft", + "twoPageRight" + ], + "type": "string" + }, + "pageMode": { + "enum": [ + "useNone", + "useOutlines", + "useThumbs", + "fullScreen", + "useOC", + "useAttachments" + ], + "type": "string" + }, + "printScaling": { + "enum": [ + "none", + "appDefault" + ], + "type": "string" + } + }, + "type": "object" +}
- Changed
add_table3 fields changed- added
Input schema / properties / cellBordersAdded value: +{ + "additionalProperties": false, + "description": "Per-cell vector borders (pdfnative v1.4). Switches the backend to buildDocumentPDFBytes. Choose individual sides or `all`.", + "properties": { + "all": { + "description": "Draw all four edges (overrides the individual side flags).", + "type": "boolean" + }, + "bottom": { + "type": "boolean" + }, + "color": { + "description": "Stroke colour as a PDF operator string ('0.8 0.8 0.8') or hex. Default light grey.", + "type": "string" + }, + "left": { + "type": "boolean" + }, + "right": { + "type": "boolean" + }, + "style": { + "description": "Stroke style (default 'solid').", + "enum": [ + "solid", + "dashed", + "dotted" + ], + "type": "string" + }, + "top": { + "type": "boolean" + }, + "width": { + "description": "Stroke width in points (default 0.5).", + "maximum": 10, + "minimum": 0, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / cellVAlignAdded value: +{ + "description": "Vertical alignment of cell content (pdfnative v1.4). Switches the backend to buildDocumentPDFBytes.", + "enum": [ + "top", + "middle", + "bottom" + ], + "type": "string" +} - added
Input schema / properties / viewerPreferencesAdded value: +{ + "additionalProperties": false, + "description": "Reader presentation hints (catalog /PageLayout, /PageMode, /ViewerPreferences). PDF/A-safe; all optional.", + "properties": { + "centerWindow": { + "type": "boolean" + }, + "direction": { + "enum": [ + "l2r", + "r2l" + ], + "type": "string" + }, + "displayDocTitle": { + "type": "boolean" + }, + "fitWindow": { + "type": "boolean" + }, + "hideMenubar": { + "type": "boolean" + }, + "hideToolbar": { + "type": "boolean" + }, + "hideWindowUI": { + "type": "boolean" + }, + "nonFullScreenPageMode": { + "enum": [ + "useNone", + "useOutlines", + "useThumbs", + "useOC" + ], + "type": "string" + }, + "pageLayout": { + "enum": [ + "singlePage", + "oneColumn", + "twoColumnLeft", + "twoColumnRight", + "twoPageLeft", + "twoPageRight" + ], + "type": "string" + }, + "pageMode": { + "enum": [ + "useNone", + "useOutlines", + "useThumbs", + "fullScreen", + "useOC", + "useAttachments" + ], + "type": "string" + }, + "printScaling": { + "enum": [ + "none", + "appDefault" + ], + "type": "string" + } + }, + "type": "object" +}
- Added
extract_pages - Changed
generate_basic_pdf4 fields changed- changed
Input schema / properties / blocks / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "level": { - "enum": [ - 1, - 2, - 3 - ], - "type": "integer" - }, - "text": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "heading" - } - }, - "required": [ - "type", - "text", - "level" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "text": { - "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.", - "maxLength": 50000, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "paragraph" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "items": { - "items": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - }, - "style": { - "default": "bullet", - "enum": [ - "bullet", - "numbered" - ], - "type": "string" - }, - "type": { - "const": "list" - } - }, - "required": [ - "type", - "items" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "type": { - "const": "pageBreak" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "height": { - "maximum": 500, - "minimum": 1, - "type": "number" - }, - "type": { - "const": "spacer" - } - }, - "required": [ - "type", - "height" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "level": { + "enum": [ + 1, + 2, + 3 + ], + "type": "integer" + }, + "text": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "heading" + } + }, + "required": [ + "type", + "text", + "level" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "text": { + "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.", + "maxLength": 50000, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "paragraph" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).", + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "items": { + "items": { + "oneOf": [ + { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "text": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + ] + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + }, + "style": { + "default": "bullet", + "enum": [ + "bullet", + "numbered" + ], + "type": "string" + }, + "type": { + "const": "list" + } + }, + "required": [ + "type", + "items" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "type": { + "const": "pageBreak" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "height": { + "maximum": 500, + "minimum": 1, + "type": "number" + }, + "type": { + "const": "spacer" + } + }, + "required": [ + "type", + "height" + ], + "type": "object" + } +] - added
Input schema / properties / outlineAdded value: +{ + "description": "Document outline (bookmarks panel). Either 'auto' (derive a flat outline from heading blocks) or an explicit nested bookmark tree.", + "oneOf": [ + { + "enum": [ + "auto" + ], + "type": "string" + }, + { + "items": { + "additionalProperties": false, + "properties": { + "bold": { + "type": "boolean" + }, + "children": { + "items": { + "additionalProperties": false, + "properties": { + "bold": { + "type": "boolean" + }, + "children": { + "items": { + "additionalProperties": false, + "properties": { + "bold": { + "type": "boolean" + }, + "children": { + "items": { + "additionalProperties": false, + "properties": { + "bold": { + "type": "boolean" + }, + "children": { + "items": { + "additionalProperties": false, + "properties": { + "bold": { + "type": "boolean" + }, + "children": { + "items": { + "additionalProperties": false, + "properties": { + "bold": { + "type": "boolean" + }, + "color": { + "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').", + "type": "string" + }, + "italic": { + "type": "boolean" + }, + "open": { + "description": "Initial expansion state (default true). false renders the branch collapsed.", + "type": "boolean" + }, + "pageIndex": { + "description": "0-based destination page index.", + "minimum": 0, + "type": "integer" + }, + "title": { + "description": "Bookmark label.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "y": { + "description": "Destination Y coordinate in points (default: top of page).", + "type": "number" + } + }, + "required": [ + "title", + "pageIndex" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" + }, + "color": { + "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').", + "type": "string" + }, + "italic": { + "type": "boolean" + }, + "open": { + "description": "Initial expansion state (default true). false renders the branch collapsed.", + "type": "boolean" + }, + "pageIndex": { + "description": "0-based destination page index.", + "minimum": 0, + "type": "integer" + }, + "title": { + "description": "Bookmark label.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "y": { + "description": "Destination Y coordinate in points (default: top of page).", + "type": "number" + } + }, + "required": [ + "title", + "pageIndex" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" + }, + "color": { + "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').", + "type": "string" + }, + "italic": { + "type": "boolean" + }, + "open": { + "description": "Initial expansion state (default true). false renders the branch collapsed.", + "type": "boolean" + }, + "pageIndex": { + "description": "0-based destination page index.", + "minimum": 0, + "type": "integer" + }, + "title": { + "description": "Bookmark label.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "y": { + "description": "Destination Y coordinate in points (default: top of page).", + "type": "number" + } + }, + "required": [ + "title", + "pageIndex" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" + }, + "color": { + "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').", + "type": "string" + }, + "italic": { + "type": "boolean" + }, + "open": { + "description": "Initial expansion state (default true). false renders the branch collapsed.", + "type": "boolean" + }, + "pageIndex": { + "description": "0-based destination page index.", + "minimum": 0, + "type": "integer" + }, + "title": { + "description": "Bookmark label.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "y": { + "description": "Destination Y coordinate in points (default: top of page).", + "type": "number" + } + }, + "required": [ + "title", + "pageIndex" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" + }, + "color": { + "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').", + "type": "string" + }, + "italic": { + "type": "boolean" + }, + "open": { + "description": "Initial expansion state (default true). false renders the branch collapsed.", + "type": "boolean" + }, + "pageIndex": { + "description": "0-based destination page index.", + "minimum": 0, + "type": "integer" + }, + "title": { + "description": "Bookmark label.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "y": { + "description": "Destination Y coordinate in points (default: top of page).", + "type": "number" + } + }, + "required": [ + "title", + "pageIndex" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" + }, + "color": { + "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').", + "type": "string" + }, + "italic": { + "type": "boolean" + }, + "open": { + "description": "Initial expansion state (default true). false renders the branch collapsed.", + "type": "boolean" + }, + "pageIndex": { + "description": "0-based destination page index.", + "minimum": 0, + "type": "integer" + }, + "title": { + "description": "Bookmark label.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "y": { + "description": "Destination Y coordinate in points (default: top of page).", + "type": "number" + } + }, + "required": [ + "title", + "pageIndex" + ], + "type": "object" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + } + ] +} - added
Input schema / properties / pageLabelsAdded value: +{ + "description": "Page-label ranges (the visible page numbers in the viewer, e.g. roman front-matter then decimal body). startPage values must be unique and strictly increasing.", + "items": { + "additionalProperties": false, + "properties": { + "prefix": { + "description": "Optional label prefix (e.g. 'A-').", + "maxLength": 64, + "type": "string" + }, + "start": { + "description": "First numeric value in the range (default 1).", + "minimum": 1, + "type": "integer" + }, + "startPage": { + "description": "0-based index of the first page in this range.", + "minimum": 0, + "type": "integer" + }, + "style": { + "description": "Numbering style. 'none' (or omitted with a prefix) yields prefix-only labels.", + "enum": [ + "decimal", + "roman", + "Roman", + "alpha", + "Alpha", + "none" + ], + "type": "string" + } + }, + "required": [ + "startPage" + ], + "type": "object" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / viewerPreferencesAdded value: +{ + "additionalProperties": false, + "description": "Reader presentation hints (catalog /PageLayout, /PageMode, /ViewerPreferences). PDF/A-safe; all optional.", + "properties": { + "centerWindow": { + "type": "boolean" + }, + "direction": { + "enum": [ + "l2r", + "r2l" + ], + "type": "string" + }, + "displayDocTitle": { + "type": "boolean" + }, + "fitWindow": { + "type": "boolean" + }, + "hideMenubar": { + "type": "boolean" + }, + "hideToolbar": { + "type": "boolean" + }, + "hideWindowUI": { + "type": "boolean" + }, + "nonFullScreenPageMode": { + "enum": [ + "useNone", + "useOutlines", + "useThumbs", + "useOC" + ], + "type": "string" + }, + "pageLayout": { + "enum": [ + "singlePage", + "oneColumn", + "twoColumnLeft", + "twoColumnRight", + "twoPageLeft", + "twoPageRight" + ], + "type": "string" + }, + "pageMode": { + "enum": [ + "useNone", + "useOutlines", + "useThumbs", + "fullScreen", + "useOC", + "useAttachments" + ], + "type": "string" + }, + "printScaling": { + "enum": [ + "none", + "appDefault" + ], + "type": "string" + } + }, + "type": "object" +}
- Added
merge_pdfs - Added
split_pdf
14 tool updates
v1.2.0- Changed
add_attachment2 fields changed- added
Output schema / descriptionAdded value: +"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path." - removed
Output schema / properties / base64Removed value: -{ - "description": "Base64-encoded PDF bytes (when mode='base64').", - "type": "string" -}
- Changed
add_barcode2 fields changed- added
Output schema / descriptionAdded value: +"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path." - removed
Output schema / properties / base64Removed value: -{ - "description": "Base64-encoded PDF bytes (when mode='base64').", - "type": "string" -}
- Changed
add_form2 fields changed- added
Output schema / descriptionAdded value: +"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path." - removed
Output schema / properties / base64Removed value: -{ - "description": "Base64-encoded PDF bytes (when mode='base64').", - "type": "string" -}
- Changed
add_international_text3 fields changed- added
Input schema / properties / normalizeAdded value: +{ + "description": "Unicode normalization form applied before shaping. Defaults to 'NFC' (recommended for international scripts: composes decomposed sequences for the widest glyph coverage). Override with 'NFD'/'NFKC'/'NFKD' only for specialised needs.", + "enum": [ + "NFC", + "NFD", + "NFKC", + "NFKD" + ], + "type": "string" +} - added
Output schema / descriptionAdded value: +"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path." - removed
Output schema / properties / base64Removed value: -{ - "description": "Base64-encoded PDF bytes (when mode='base64').", - "type": "string" -}
- Changed
add_table3 fields changed- added
Input schema / properties / watermarkAdded value: +{ + "additionalProperties": false, + "description": "Optional semi-transparent text watermark rendered on every page (e.g. 'DRAFT', 'CONFIDENTIAL'). Text only in this version. opacity < 1.0 is rejected under pdfA='pdfa1b' (ISO 19005-1 forbids transparency).", + "properties": { + "angle": { + "description": "Rotation in degrees (counterclockwise). Default -45.", + "maximum": 360, + "minimum": -360, + "type": "number" + }, + "color": { + "description": "RGB colour as a [r, g, b] triple in the 0.0–1.0 range. Default light gray [0.75, 0.75, 0.75].", + "items": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + "fontSize": { + "description": "Font size in points. Default 60, auto-fit to the page.", + "maximum": 300, + "minimum": 6, + "type": "number" + }, + "opacity": { + "description": "Opacity 0.0–1.0. Default 0.15.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "position": { + "default": "background", + "description": "'background' (behind page content, default) or 'foreground' (above it).", + "enum": [ + "background", + "foreground" + ], + "type": "string" + }, + "text": { + "description": "Watermark text.", + "maxLength": 100, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" +} - added
Output schema / descriptionAdded value: +"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path." - removed
Output schema / properties / base64Removed value: -{ - "description": "Base64-encoded PDF bytes (when mode='base64').", - "type": "string" -}
- Changed
embed_image2 fields changed- added
Output schema / descriptionAdded value: +"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path." - removed
Output schema / properties / base64Removed value: -{ - "description": "Base64-encoded PDF bytes (when mode='base64').", - "type": "string" -}
- Added
extract_attachments - Changed
extract_text2 fields changed- added
Input schema / properties / fieldsAdded value: +{ + "description": "Optional dot-path projection applied to the structured result (e.g. ['fullText'] or ['extractable']). Composes after verbosity. Unknown paths are omitted.", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "type": "array" +} - added
Input schema / properties / verbosityAdded value: +{ + "default": "full", + "description": "Response verbosity. 'full' (default) returns the per-page pages[] array and fullText; 'summary' returns a token-frugal { pageCount, extractedPageCount, extractable, charCount } and drops the text payloads.", + "enum": [ + "summary", + "full" + ], + "type": "string" +}
- Changed
generate_basic_pdf4 fields changed- added
Input schema / properties / normalizeAdded value: +{ + "description": "Optional Unicode normalization applied to all rendered text before shaping. 'NFC' (recommended) composes base + combining marks into precomposed code points for better glyph coverage; 'NFD'/'NFKC'/'NFKD' are also accepted. Omit for byte-stable output (no normalization).", + "enum": [ + "NFC", + "NFD", + "NFKC", + "NFKD" + ], + "type": "string" +} - added
Input schema / properties / watermarkAdded value: +{ + "additionalProperties": false, + "description": "Optional semi-transparent text watermark rendered on every page (e.g. 'DRAFT', 'CONFIDENTIAL'). Text only in this version. opacity < 1.0 is rejected under pdfA='pdfa1b' (ISO 19005-1 forbids transparency).", + "properties": { + "angle": { + "description": "Rotation in degrees (counterclockwise). Default -45.", + "maximum": 360, + "minimum": -360, + "type": "number" + }, + "color": { + "description": "RGB colour as a [r, g, b] triple in the 0.0–1.0 range. Default light gray [0.75, 0.75, 0.75].", + "items": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + "fontSize": { + "description": "Font size in points. Default 60, auto-fit to the page.", + "maximum": 300, + "minimum": 6, + "type": "number" + }, + "opacity": { + "description": "Opacity 0.0–1.0. Default 0.15.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "position": { + "default": "background", + "description": "'background' (behind page content, default) or 'foreground' (above it).", + "enum": [ + "background", + "foreground" + ], + "type": "string" + }, + "text": { + "description": "Watermark text.", + "maxLength": 100, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" +} - added
Output schema / descriptionAdded value: +"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path." - removed
Output schema / properties / base64Removed value: -{ - "description": "Base64-encoded PDF bytes (when mode='base64').", - "type": "string" -}
- Changed
inspect_pdf2 fields changed- added
Input schema / properties / fieldsAdded value: +{ + "description": "Optional dot-path projection applied to the structured result (e.g. ['pageCount','signatureCount']). Composes after verbosity. Unknown paths are omitted.", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "type": "array" +} - added
Input schema / properties / verbosityAdded value: +{ + "default": "full", + "description": "Response verbosity. 'full' (default) returns every field; 'summary' returns a token-frugal scalar subset (version, pageCount, encryption, pdfA, signatureCount, hasSignaturePlaceholder, attachmentCount) — drops the attachments[], info and perPage arrays.", + "enum": [ + "summary", + "full" + ], + "type": "string" +}
- Changed
prepare_signature_placeholder2 fields changed- added
Output schema / descriptionAdded value: +"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path." - removed
Output schema / properties / base64Removed value: -{ - "description": "Base64-encoded PDF bytes (when mode='base64').", - "type": "string" -}
- Changed
sign_pdf2 fields changed- added
Output schema / descriptionAdded value: +"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path." - removed
Output schema / properties / base64Removed value: -{ - "description": "Base64-encoded PDF bytes (when mode='base64').", - "type": "string" -}
- Changed
validate_pdf2 fields changed- added
Input schema / properties / fieldsAdded value: +{ + "description": "Optional dot-path projection applied to the structured result (e.g. ['valid']). Composes after verbosity. Unknown paths are omitted.", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "type": "array" +} - added
Input schema / properties / verbosityAdded value: +{ + "default": "full", + "description": "Response verbosity. 'full' (default) returns errors[] and warnings[]; 'summary' returns a token-frugal verdict { standard, valid, errorCount, warningCount, summary } and drops the message arrays.", + "enum": [ + "summary", + "full" + ], + "type": "string" +}
- Changed
verify_pdf2 fields changed- added
Input schema / properties / fieldsAdded value: +{ + "description": "Optional dot-path projection applied to the structured result (e.g. ['allValid'] or ['signatures.valid']). Composes after verbosity. Unknown paths are omitted.", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "type": "array" +} - added
Input schema / properties / verbosityAdded value: +{ + "default": "full", + "description": "Response verbosity. 'full' (default) returns the per-signature signatures[] array; 'summary' returns a token-frugal verdict { signatureCount, allValid, invalid, summary } and drops signatures[].", + "enum": [ + "summary", + "full" + ], + "type": "string" +}
13 tool updates
v1.1.0- First observed
add_attachment - First observed
add_barcode - First observed
add_form - First observed
add_international_text - First observed
add_table - First observed
embed_image - First observed
extract_text - First observed
generate_basic_pdf - First observed
inspect_pdf - First observed
prepare_signature_placeholder - First observed
sign_pdf - First observed
validate_pdf - First observed
verify_pdf
TDQS
Scored across 28 tools
Most tools target clearly distinct PDF operations, and descriptions repeatedly clarify boundaries (e.g. generate_basic_pdf as default vs standalone add_table/embed_image/add_barcode/add_form/add_chart). The intentional overlap between the general builder and five dedicated artefact tools creates some selection ambiguity, but it is well documented rather than confusing.
Names are consistently snake_case with a verb-object pattern across creation, extraction, inspection, security, and signing tools (generate_basic_pdf, add_table, extract_text, validate_pdf, sign_pdf, verify_pdf, etc.). Minor variations like generate_basic_pdf do not disrupt an otherwise predictable convention.
At 28 tools the server is well beyond the typical 3-15 well-scoped range, and several add_* tools duplicate block types already supported by generate_basic_pdf. It also includes a governance-drafting tool unrelated to PDF processing, so the surface feels over-expanded rather than tightly scoped.
The surface is very complete for PDF generation, forms, signing, encryption, validation, attachments, extraction, merge/split, metadata, LTV/timestamping, and layout inspection. Remaining gaps include true redaction (annotate_pdf is visual-only) and image extraction or PDF-to-image conversion.
Maintenance
Related MCP Connectors
Deterministic PDF tools for AI agents: inspect fields, fill forms, merge PDFs, invoices.
- PDFLeanOAuthcom.pdflean
PDF tools for AI agents: validate, extract, merge, split, compress, OCR, sign and redact.
Generate and read PDFs for AI agents: a generate_pdf and a read_pdf tool, priced per document.
Compliant PDFs (PDF/A-2A + PDF/UA-1) from markdown or a compact DSL - fast, no headless browser.
Related MCP Servers
- AlicenseAqualityCmaintenanceGenerate professional PDFs from Claude, Cursor, and other AI tools. Create invoices, contracts, reports, and certificates from templates or inline HTML markup.742 npm1MIT
- AlicenseNot gradedqualityDmaintenanceLocal document intelligence for AI agents — extract text, detect tables, read metadata, analyze structure, search keywords, and detect language from PDF and DOCX files. No cloud API required, no API key needed.MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to perform comprehensive PDF operations locally, including compression, text extraction, PII redaction, page organization, splitting, merging, watermarking, creation, and form filling, all without cloud uploads.11 npm-
- AlicenseAqualityBmaintenanceEnables AI agents to inspect PDFs, merge or extract pages, and clean text entirely offline through the Model Context Protocol, with no uploads, API keys, or network calls.410 npmMIT