pdfnative MCP — PDF generation, PAdES signing & introspection
NPM · PDFNATIVE-MCP · SCANNED SEP 20
PDF MCP server: generate PDF/A, sign & verify PAdES (LTV), forms, merge, split, encrypt. 28 tools
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 0 of 4 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to Nizoka/pdfnative-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 27 days ago).Pass
- Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability72
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 19177 tokens (~684/item across 28 items; 28 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management93
- Stability observed for 28 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 29 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the pdfnative MCP — PDF generation, PAdES signing… server?
pdfnative MCP — PDF generation, PAdES signing… runs locally as an npm package, launched with npx -y pdfnative-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · pdfnative-mcp
claude mcp add nizoka-pdfnative-mcp -- npx -y pdfnative-mcp
{
"mcpServers": {
"nizoka-pdfnative-mcp": {
"command": "npx",
"args": [
"-y",
"pdfnative-mcp"
]
}
}
} {
"servers": {
"nizoka-pdfnative-mcp": {
"command": "npx",
"args": [
"-y",
"pdfnative-mcp"
]
}
}
} codex mcp add nizoka-pdfnative-mcp -- npx -y pdfnative-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"nizoka-pdfnative-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"pdfnative-mcp"
],
"enabled": true
}
}
} openclaw mcp add nizoka-pdfnative-mcp --command npx --arg -y --arg pdfnative-mcp
mcp_servers:
nizoka-pdfnative-mcp:
command: "npx"
args: ["-y", "pdfnative-mcp"] {
"McpServers": {
"nizoka-pdfnative-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"pdfnative-mcp"
]
}
}
} assistant mcp add nizoka-pdfnative-mcp -t stdio -c npx -a -y pdfnative-mcp
{
"mcpServers": {
"nizoka-pdfnative-mcp": {
"command": "npx",
"args": [
"-y",
"pdfnative-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 −1
- Security disclosure: pass → unverified ▼ functional
- 19 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Sept 26 −2
- Stability: pass → 0.83 functional
- 16 Sept 26 +1
- Stability: 0.97 → pass security
- Security disclosure: unverified → pass ▲ functional
- 15 Sept 26 0
- Security disclosure: pass → unverified ▼ functional
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 10 Sept 26 −3
- Stability: pass → 0.80 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed npm/pdfnative-mcp@1.6.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | Nizoka/pdfnative-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/Nizoka/pdfnative-mcp/.github/workflows/publish.yml@refs/tags/v1.6.0 |
| Rekor log index | 2573844352 |
| Predicate type | https://slsa.dev/provenance/v1 |
| Subject digest | sha512:81eb005adac501c634c683f2e4be3bc59d82b45138efc92321fb355772a6a59c9bdec78d43411b2956f6ac5910d471f8a866a583ddbf4a796ced4eaa9 |
Background: How many MCP packages publish verified provenance →
Dependencies 4 packages
| Packages resolved | 4 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_attachment Add embedded file attachment (PDF/A-3, Factur-X) ~839
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 | Type | Req | Description |
|---|---|---|---|
| attachments | array | 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. |
| blocks | array | – | 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. |
| compress | boolean | – | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. |
| creationDate | string | – | ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs. |
| debug | boolean | – | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. |
| embedFonts | boolean | – | 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. |
| footerTemplate | object | – | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. |
| footerText | string | – | Optional footer text rendered on every page. |
| headerTemplate | object | – | Running header on every page (left / center / right zones); reserves 15 pt. |
| includeDiagnostics | boolean | – | Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty). |
| margins | object | – | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. |
| metadata | object | – | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. |
| outputIntent | object | – | Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected). |
| outputMode | string | – | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). |
| pageSize | string | – | 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. |
| object | – | 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).… | |
| strict | boolean | – | 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. |
| title | string | yes | Document title (also written to the /Info dictionary). |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
add_barcode Add barcode / QR code ~1,068
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 | Type | Req | Description |
|---|---|---|---|
| caption | string | – | Optional caption rendered above the barcode. |
| compress | boolean | – | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. |
| creationDate | string | – | ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs. |
| data | string | 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. |
| debug | boolean | – | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. |
| ecLevel | string | – | 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). |
| embedFonts | boolean | – | 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. |
| encrypt | object | – | 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. |
| footerTemplate | object | – | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. |
| format | string | yes | Barcode symbology to render. |
| headerTemplate | object | – | Running header on every page (left / center / right zones); reserves 15 pt. |
| height | number | – | Barcode height in PDF points (ignored for square symbologies like QR/Data Matrix). |
| includeDiagnostics | boolean | – | Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty). |
| margins | object | – | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. |
| metadata | object | – | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. |
| outputIntent | object | – | Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected). |
| outputMode | string | – | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). |
| pageSize | string | – | 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. |
| pdfA | string | – | 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 do… |
| object | – | 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).… | |
| strict | boolean | – | 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. |
| title | string | – | PDF document title (also rendered as page heading). |
| width | number | – | Barcode width in PDF points. |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
add_chart Add native vector chart ~1,376
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 | Type | Req | Description |
|---|---|---|---|
| align | string | – | Horizontal alignment within the content width. Default 'left'. |
| altText | string | – | Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted. |
| axis | object | – | Value-axis options (bar/line only). |
| axis2 | object | – | Secondary RIGHT value axis (drawn only when a series sets yAxis:'right'). |
| categories | array | – | Category / slice labels (x-axis). Defaults to 1-based indices when omitted. |
| chartType | string | 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… |
| colors | array | – | Palette override (per-series for bar/line, per-slice for pie/donut). |
| compress | boolean | – | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. |
| creationDate | string | – | ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs. |
| dataLabels | – | – | Per-point value labels: true for defaults, or an object to format them. |
| debug | boolean | – | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. |
| embedFonts | boolean | – | 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. |
| encrypt | object | – | 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. |
| footerTemplate | object | – | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. |
| headerTemplate | object | – | Running header on every page (left / center / right zones); reserves 15 pt. |
| height | number | – | Plot-area height in points. Default 240. |
| includeDiagnostics | boolean | – | Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty). |
| intro | string | – | Optional introductory paragraph rendered above the chart. The chart `title` (if any) is also used as the PDF metadata title. |
| labelRotation | number | – | Rotate category labels counter-clockwise by this many degrees (disables the automatic stride). |
| labelStride | integer | – | Draw every Nth category label. Default: automatic (measured non-overlap); 1 draws every label. |
| legend | string | – | Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'. |
| margins | object | – | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. |
| markers | boolean | – | Draw point markers on line series. Default false. |
| metadata | object | – | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. |
| outputIntent | object | – | Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected). |
| outputMode | string | – | Either 'base64' (returns the PDF inline) or 'file' (writes into the PDFNATIVE_MCP_OUTPUT_DIR sandbox). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. |
| pageSize | string | – | 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. |
| pdfA | string | – | 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 do… |
| object | – | 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).… | |
| series | array | yes | Data series. Pie/donut charts use exactly one series (each value becomes a slice). |
| strict | boolean | – | 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. |
| title | string | – | Chart title rendered above the plot. |
| width | number | – | Plot width in points (clamped to content width). Default 460. |
| xAxis | object | – | Horizontal axis. 'category' (default) positions points by index; 'linear' / 'time' position them by series xValues (line/area/scatter only). Time ticks are UTC-deterministic. |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
add_form Add interactive form ~835
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 | Type | Req | Description |
|---|---|---|---|
| compress | boolean | – | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. |
| creationDate | string | – | ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs. |
| debug | boolean | – | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. |
| embedFonts | boolean | – | 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. |
| encrypt | object | – | 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. |
| fields | array | yes | Ordered list of form field definitions. |
| footerTemplate | object | – | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. |
| footerText | string | – | Optional footer text rendered at the bottom of every page. |
| headerTemplate | object | – | Running header on every page (left / center / right zones); reserves 15 pt. |
| includeDiagnostics | boolean | – | Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty). |
| margins | object | – | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. |
| metadata | object | – | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. |
| outputIntent | object | – | Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected). |
| outputMode | string | – | Either 'base64' (returns the PDF inline) or 'file' (writes to a sandboxed path inside PDFNATIVE_MCP_OUTPUT_DIR). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. |
| pageSize | string | – | 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. |
| pdfA | string | – | 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 do… |
| object | – | 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).… | |
| strict | boolean | – | 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. |
| title | string | yes | Form title rendered at the top of the document. |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
add_international_text Add international text ~969
PDF rendering text in 24 scripts (Arabic, Hebrew, Thai, CJK, Devanagari, Bengali, Tamil, Telugu, Sinhala, Tibetan, Khmer, Myanmar, Ethiopic, Cyrillic, Greek, Georgian, Armenian, Vietnamese, …), 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 | Type | Req | Description |
|---|---|---|---|
| compress | boolean | – | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. |
| creationDate | string | – | ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs. |
| debug | boolean | – | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. |
| encrypt | object | – | 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. |
| footerTemplate | object | – | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. |
| headerTemplate | object | – | Running header on every page (left / center / right zones); reserves 15 pt. |
| includeDiagnostics | boolean | – | Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty). |
| 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 + Lat… |
| margins | object | – | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. |
| metadata | object | – | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. |
| normalize | string | – | Unicode normalization before shaping. Default 'NFC' (widest glyph coverage); NFD/NFKC/NFKD or false for special needs. |
| outputIntent | object | – | Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected). |
| outputMode | string | – | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). |
| pageSize | string | – | 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. |
| paragraphs | array | yes | Ordered list of paragraphs to render in the chosen script. |
| pdfA | string | – | PDF/A level (Tagged PDF + sRGB OutputIntent + XMP). Fonts are embedded here, so the claim is valid as-is. See docs/guides/PDFA.md. |
| object | – | 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).… | |
| strict | boolean | – | 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. |
| title | string | yes | PDF title (rendered as page heading and stored as document metadata). |
| viewerPreferences | object | – | Reader presentation hints (catalog /PageLayout, /PageMode, /ViewerPreferences). PDF/A-safe; all optional. |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
add_ltv Embed LTV validation material (PAdES B-LT) ~482
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 | Type | Req | Description |
|---|---|---|---|
| certificatesDerBase64 | array | – | offline: DER X.509 certificates to embed in /DSS /Certs. |
| crlsDerBase64 | array | – | offline: DER CertificateList (RFC 5280) blobs to embed in /DSS /CRLs. |
| extraCertificatesDerBase64 | array | – | online: additional DER certificates (intermediates / roots) to complete chains the CMS does not carry. |
| mode | string | – | '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. |
| ocspResponsesDerBase64 | array | – | offline: DER OCSPResponse (RFC 6960) blobs to embed in /DSS /OCSPs. |
| outputMode | string | – | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). |
| outputPath | string | – | Relative path inside PDFNATIVE_MCP_OUTPUT_DIR (required when outputMode='file'). |
| pdfBase64 | string | yes | Base64-encoded SIGNED PDF (unencrypted). Sign with sign_pdf (profile=pades recommended) first. |
| preferOcsp | boolean | – | online: try OCSP before CRL for each certificate (default true). |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
add_table Add table / report ~1,284
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 | Type | Req | Description |
|---|---|---|---|
| autoFitColumns | boolean | – | Auto-fit column widths to content. Output bytes then depend on text metrics (not byte-deterministic across content changes). |
| caption | string | – | Caption rendered above the table (tagged as /Caption under PDF/A). |
| cellBorders | object | – | Per-cell vector borders (pure strokes, PDF/A-safe). Choose individual sides or `all`. |
| cellPadding | number | – | Horizontal cell padding in points (default 3). |
| cellVAlign | string | – | Vertical alignment of cell content. |
| clipCells | boolean | – | Clip cell contents to the column bounds (PDF clip operators). Recommended for PDF/A and visual safety. |
| compress | boolean | – | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. |
| creationDate | string | – | ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs. |
| debug | boolean | – | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. |
| embedFonts | boolean | – | 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. |
| encrypt | object | – | 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. |
| footerTemplate | object | – | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. |
| footerText | string | – | Optional text rendered at the bottom of every page. |
| headerTemplate | object | – | Running header on every page (left / center / right zones); reserves 15 pt. |
| headers | array | yes | Column header labels. Must have the same length as each row in `rows`. |
| includeDiagnostics | boolean | – | Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty). |
| infoItems | array | – | Optional key-value metadata rows rendered below the title (e.g. date, author). |
| margins | object | – | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. |
| metadata | object | – | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. |
| minRowHeight | number | – | Minimum row height in points (default 12). |
| outputIntent | object | – | Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected). |
| outputMode | string | – | Either 'base64' (returns the PDF inline) or 'file' (writes to a sandboxed path inside PDFNATIVE_MCP_OUTPUT_DIR). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. |
| pageSize | string | – | 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. |
| pdfA | string | – | 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 do… |
| object | – | 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).… | |
| repeatHeader | boolean | – | Repeat the header row on every continuation page (default true). |
| rows | array | yes | Data rows. Each row is an array of cell strings with the same length as `headers`. |
| strict | boolean | – | 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. |
| title | string | yes | Report title rendered at the top of the document and used as PDF metadata title. |
| viewerPreferences | object | – | Reader presentation hints (catalog /PageLayout, /PageMode, /ViewerPreferences). PDF/A-safe; all optional. |
| watermark | object | – | 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… |
| wrap | string | – | Cell wrap policy: 'auto' (default) wraps only overflowing cells; 'always' wraps every cell; 'never' truncates. |
| zebra | boolean | – | Alternate-row light tint (static fill, PDF/A-1b safe). |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
annotate_pdf Annotate PDF (markup / drawing) ~262
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 | Type | Req | Description |
|---|---|---|---|
| annotations | array | yes | Markup / drawing annotations to add. Each is attached to a 0-based page index. |
| outputMode | string | – | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). |
| pdfBase64 | string | yes | Base64-encoded source PDF to annotate. |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
decrypt_pdf Decrypt a PDF ~233
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 | Type | Req | Description |
|---|---|---|---|
| outputMode | string | – | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. |
| password | string | – | Password to open the encrypted source (user or owner). Omit only for documents with an empty user password. |
| pdfBase64 | string | yes | Base64-encoded encrypted PDF to decrypt. NOTE: signatures and AcroForm are dropped (page-tree rebuild). |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
draft_governance_issue Draft a governance-compliant GitHub issue (HITL) ~413
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 | Type | Req | Description |
|---|---|---|---|
| actualBehavior | string | – | What actually happened (defaults to the reproduction result when omitted). |
| affectedPackages | array | – | Packages impacted by this issue (e.g. ["pdfnative-mcp"], ["pdfnative"]). |
| duplicateSearchPerformed | boolean | yes | MUST be true: confirms you searched open AND closed issues/PRs for duplicates before drafting. |
| expectedBehavior | string | yes | What you expected to happen instead. |
| issueType | string | yes | Issue category: 'bug' | 'feature' | 'security' | 'docs' | 'performance'. |
| outputMode | string | – | '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. |
| outputPath | string | – | Relative .md path inside the sandbox (only when outputMode='file'). |
| reproduction | object | yes | The minimal, locally-executed reproduction that justifies this issue. |
| summary | string | yes | One or two paragraphs describing the problem or proposal. |
| targetRepo | string | – | Destination repository label for the draft (documentation only — the server never contacts it). Typically 'pdfnative-mcp' or 'pdfnative'. |
| title | string | yes | Concise issue title (imperative, no trailing period). |
| Name | Type | Req | Description |
|---|---|---|---|
| compliance | object | yes | – |
| draftMarkdown | string | yes | The full draft, ready for a human to review and submit. |
| filePath | string | – | Sandboxed absolute path (when outputMode='file'). |
| issueType | string | yes | – |
| outputMode | string | yes | – |
| sizeBytes | integer | yes | – |
| targetRepo | string | yes | – |
| title | string | yes | – |
| warnings | array | yes | – |
No examples provided.
embed_image Embed image in PDF ~1,008
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 | Type | Req | Description |
|---|---|---|---|
| align | string | – | Horizontal placement of the image inside the content width. |
| alt | string | – | Accessible description of the image (tagged /Figure /Alt). Provide it for non-decorative images under PDF/A or PDF/UA. |
| caption | string | – | Optional caption rendered below the image. |
| compress | boolean | – | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. |
| creationDate | string | – | ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs. |
| debug | boolean | – | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. |
| embedFonts | boolean | – | 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. |
| encrypt | object | – | 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. |
| footerTemplate | object | – | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. |
| headerTemplate | object | – | Running header on every page (left / center / right zones); reserves 15 pt. |
| height | number | – | Render height in points. If omitted, aspect ratio is preserved. |
| imageBase64 | string | 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 wit… |
| includeDiagnostics | boolean | – | Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty). |
| margins | object | – | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. |
| metadata | object | – | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. |
| mimeType | string | yes | MIME type of the image. Must match the actual encoding of imageBase64 (magic bytes are checked). |
| outputIntent | object | – | Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected). |
| outputMode | string | – | Either 'base64' (returns the PDF inline) or 'file' (writes to a sandboxed path inside PDFNATIVE_MCP_OUTPUT_DIR). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. |
| pageSize | string | – | 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. |
| pdfA | string | – | 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 do… |
| object | – | 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).… | |
| strict | boolean | – | 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. |
| title | string | yes | Document title rendered at the top and used as PDF metadata title. |
| width | number | – | Render width in points. If omitted, the image is auto-sized to fit the page. |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
encrypt_pdf Encrypt / re-secure a PDF ~311
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 | Type | Req | Description |
|---|---|---|---|
| algorithm | string | – | aes128 (V4/R4, widest compatibility) or aes256 (V5/R6). |
| outputMode | string | – | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. |
| ownerPassword | string | yes | Owner password (full access). |
| password | string | – | Current password of an already-encrypted source (enables password rotation). Omit for an unencrypted source. |
| pdfBase64 | string | yes | Base64-encoded source PDF to encrypt. NOTE: existing signatures and AcroForm are dropped (page-tree rebuild). |
| permissions | object | – | Permission flags; each defaults to allowed. |
| userPassword | string | – | Open password; omitted/empty = opens without a prompt. |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
extract_attachments Extract embedded files from PDF ~263
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 | Type | Req | Description |
|---|---|---|---|
| fields | array | – | Optional dot-path projection applied to the structured result (e.g. ['attachments.name']). Composes after verbosity. Unknown paths are omitted. |
| filename | string | – | Optional exact attachment name to extract. When omitted, every embedded file is returned. |
| includeData | boolean | – | 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. |
| password | string | – | Password (user or owner) of an encrypted source. Never logged or echoed. |
| pdfBase64 | string | yes | Base64-encoded PDF bytes to read embedded files from. |
| verbosity | string | – | Response verbosity. 'full' (default) returns the attachments[] array; 'summary' returns a token-frugal { attachmentCount } and drops the array. |
| Name | Type | Req | Description |
|---|---|---|---|
| attachmentCount | integer | – | – |
| attachments | array | – | – |
No examples provided.
extract_pages Extract pages into one PDF ~320
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 | Type | Req | Description |
|---|---|---|---|
| dropAnnotations | boolean | – | When true, drop ALL annotations. Default keeps self-contained URI link annotations. |
| encrypt | object | – | Re-encrypt the output (Standard Security Handler; AES-128 default or AES-256; RC4 never emitted). |
| maxOutputSizeBytes | integer | – | Maximum size, in bytes, of the produced PDF. Defaults to 268435456 (256 MiB). |
| outputMode | string | – | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). |
| pages | array | yes | 0-based page indices to keep, in output order. Duplicates and out-of-range indices are rejected. |
| password | string | – | Password (user or owner) of an encrypted source. Never logged or echoed. |
| pdfBase64 | string | yes | Base64-encoded source PDF. Pass `password` for an encrypted source. |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
extract_text Extract plain text from PDF ~382
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). Encrypted sources: pass `password` (PASSWORD_REQUIRED / PASSWORD_INVALID otherwise). Token-frugal: verbosity:'summary', fields:[…].
| Name | Type | Req | Description |
|---|---|---|---|
| fields | array | – | Optional dot-path projection applied to the structured result (e.g. ['fullText'] or ['extractable']). Composes after verbosity. Unknown paths are omitted. |
| includeRuns | boolean | – | 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… |
| maxTextLength | integer | – | Hard cap on total extracted characters across all pages (memory bound for adversarial input). Default 16000000. Exceeding it fails with OUTPUT_TOO_LARGE. |
| pages | array | – | Optional 0-based page indices to extract. When omitted, every page is extracted. |
| password | string | – | Password (user or owner) of an encrypted source. Never logged or echoed. |
| pdfBase64 | string | yes | Base64-encoded PDF bytes. |
| verbosity | string | – | 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 pay… |
| Name | Type | Req | Description |
|---|---|---|---|
| charCount | integer | – | summary only: length of fullText. |
| extractable | boolean | – | 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 extracta… |
| extractableReason | string | – | Present when extractable is false: why no text could be decoded. |
| extractedPageCount | integer | – | – |
| fullText | string | – | – |
| pageCount | integer | – | – |
| pages | array | – | – |
No examples provided.
fill_form Fill / flatten an existing AcroForm ~414
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 | Type | Req | Description |
|---|---|---|---|
| flatten | boolean | – | When true, stamp appearances into page content and remove the interactive fields after filling. |
| nonWinAnsi | string | – | 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… |
| onUnknownField | string | – | Behaviour for a value key that matches no field. 'throw' (default) → FORM_FIELD_NOT_FOUND; 'ignore' skips it. |
| outputMode | string | – | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. |
| password | string | – | Password (user or owner) of an encrypted source. Never logged or echoed. |
| pdfBase64 | string | yes | Base64-encoded source PDF containing the AcroForm to fill. Use read_form_fields first to discover field names. |
| values | object | – | 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:tr… |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
generate_basic_pdf Generate basic PDF ~1,204
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 | Type | Req | Description |
|---|---|---|---|
| blocks | array | yes | Ordered list of content blocks composing the document body. |
| compress | boolean | – | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. |
| creationDate | string | – | ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs. |
| debug | boolean | – | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. |
| embedFonts | boolean | – | 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. |
| encrypt | object | – | 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. |
| footerTemplate | object | – | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. |
| footerText | string | – | Optional footer text rendered at the bottom of every page. |
| headerTemplate | object | – | Running header on every page (left / center / right zones); reserves 15 pt. |
| includeDiagnostics | boolean | – | Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty). |
| margins | object | – | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. |
| metadata | object | – | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. |
| normalize | string | – | Unicode normalization before shaping ('NFC' recommended for glyph coverage; NFD/NFKC/NFKD accepted). Omit = none. |
| outline | – | – | Document outline (bookmarks panel). Either 'auto' (derive a flat outline from heading blocks) or an explicit nested bookmark tree. |
| outputIntent | object | – | Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected). |
| outputMode | string | – | Either 'base64' (returns the PDF inline as a base64 string) or 'file' (writes to a path inside the configured PDFNATIVE_MCP_OUTPUT_DIR sandbox). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. |
| pageLabels | array | – | 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. |
| pageSize | string | – | 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. |
| pdfA | string | – | 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 do… |
| object | – | 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).… | |
| strict | boolean | – | 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. |
| title | string | yes | Document title (rendered at top of page 1 and used as PDF metadata title). |
| viewerPreferences | object | – | Reader presentation hints (catalog /PageLayout, /PageMode, /ViewerPreferences). PDF/A-safe; all optional. |
| watermark | object | – | 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… |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
inspect_layout Inspect document layout (dry run) ~654
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. Known engine gap: a 'toc' block is measured as 0 pt here (its real height depends on the headings), so documents with a toc may paginate one page later. Read-only, deterministic. Token-frugal: verbosity:'summary', fields:['totalPages'].
| Name | Type | Req | Description |
|---|---|---|---|
| blocks | array | yes | Ordered list of content blocks composing the document body. |
| embedFonts | boolean | – | 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… |
| fields | array | – | Optional dot-path projection applied to the structured result (e.g. ['totalPages'] or ['pages.blocks.type']). Composes after verbosity. Unknown paths are omitted. |
| footerTemplate | object | – | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. |
| footerText | string | – | Footer text as you would pass it to generate_basic_pdf (reserves the footer band). |
| headerTemplate | object | – | Running header on every page (left / center / right zones); reserves 15 pt. |
| margins | object | – | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. |
| normalize | string | – | Unicode normalization before shaping ('NFC' recommended for glyph coverage; NFD/NFKC/NFKD accepted). Omit = none. |
| pageSize | string | – | 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. |
| pdfA | string | – | 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 w… |
| title | string | yes | Document title — reserves the title band on page 1 exactly as generate_basic_pdf does. |
| verbosity | string | – | 'full' (default) or 'summary' (scalars only: pageWidth, pageHeight, totalPages, blockCount; pages[] and margins dropped). |
| Name | Type | Req | Description |
|---|---|---|---|
| blockCount | integer | – | summary only: number of placed blocks (table slices count once each). |
| margins | object | – | Page margins { top, right, bottom, left } in points. |
| pageHeight | number | – | Page height in points (841.89 = A4). |
| pageWidth | number | – | Page width in points (595.28 = A4). |
| pages | array | – | Per-page block placement, in render order. A table that spans pages appears once per slice. |
| totalPages | integer | – | Number of pages the blocks paginate into. |
No examples provided.
inspect_pdf Inspect PDF metadata ~540
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 | Type | Req | Description |
|---|---|---|---|
| annotations | boolean | – | 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 (tr… |
| check | array | – | 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… |
| fields | array | – | Optional dot-path projection applied to the structured result (e.g. ['pageCount','signatureCount']). Composes after verbosity. Unknown paths are omitted. |
| pages | boolean | – | When true, include per-page metadata in the response. |
| password | string | – | Password (user or owner) of an encrypted source. Never logged or echoed. |
| pdfBase64 | string | yes | Base64-encoded PDF bytes to inspect. |
| signatures | boolean | – | 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 k… |
| verbosity | string | – | 'full' (default) or 'summary' (scalars only: version, pageCount, encryption, pdfA, signatureCount, hasSignaturePlaceholder, attachmentCount, + docTimestampCount / trapped / checksPassed when present;… |
| Name | Type | Req | Description |
|---|---|---|---|
| annotationCount | integer | – | Total number of page annotations (opt-in via the `annotations` input). |
| annotations | array | – | Page annotations (opt-in via the `annotations` input), in page order then /Annots order. Only the keys the annotation actually carries are emitted. |
| attachmentCount | integer | – | summary only: number of embedded files. |
| attachments | array | – | Embedded files exposed via /Names → /EmbeddedFiles (PDF/A-3, Factur-X). |
| checks | object | – | One boolean per REQUESTED check (keys = the check[] you passed, nothing else). |
| checksPassed | boolean | – | Present when check[] was supplied: true when every requested check holds. |
| docTimestampCount | integer | – | Number of /DocTimeStamp signature fields, present only when at least one exists. |
| dss | object | – | Document Security Store summary (ISO 32000-2 §12.8.4.3), present only when the catalog has a /DSS. |
| encryption | string | – | – |
| encryptionInfo | object | – | 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. |
| hasSignaturePlaceholder | boolean | – | True when at least one signature widget exists with empty /Contents — i.e. an unsigned placeholder awaiting `sign_pdf`. |
| info | object | – | Document /Info dictionary entries decoded as strings. |
| pageCount | integer | – | – |
| pageLabels | array | – | 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 a… |
| pdfA | string|null | – | Detected PDF/A claim (e.g. '1B', '2B', '2U', '3B') from XMP metadata, or null when absent. |
| perPage | array | – | – |
| signatureCount | integer | – | – |
| signatures | array | – | Signature fields (opt-in via the `signatures` input). Document timestamps are listed inline with isDocTimestamp=true. |
| trapped | string | – | /Info /Trapped flag, present only when the document carries one. |
| version | string | – | PDF version (e.g. "1.7"). |
No examples provided.
merge_pdfs Merge PDFs ~428
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 | Type | Req | Description |
|---|---|---|---|
| dropAnnotations | boolean | – | When true, drop ALL annotations. Default (false) keeps self-contained URI link annotations and drops cross-document/widget annotations. |
| encrypt | object | – | Re-encrypt the output (Standard Security Handler; AES-128 default or AES-256; RC4 never emitted). |
| maxOutputSizeBytes | integer | – | 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… |
| outputMode | string | – | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). |
| password | string | – | 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. |
| pdfsBase64 | array | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
prepare_signature_placeholder Prepare signature placeholder ~1,219
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 | Type | Req | Description |
|---|---|---|---|
| blocks | array | – | Optional document body blocks rendered before the signature field. |
| compress | boolean | – | FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false. |
| contactInfo | string | – | Contact information for the signer. |
| creationDate | string | – | ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs. |
| debug | boolean | – | Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false. |
| embedFonts | boolean | – | 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. |
| fieldName | string | – | Optional AcroForm field name for the signature widget (default 'Signature1'). |
| footerTemplate | object | – | Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}. |
| headerTemplate | object | – | Running header on every page (left / center / right zones); reserves 15 pt. |
| includeDiagnostics | boolean | – | Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty). |
| location | string | – | Signing location (city / country). |
| margins | object | – | Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36. |
| metadata | object | – | /Info (+ XMP under PDF/A): author, subject, keywords, /Trapped. |
| outputIntent | object | – | Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected). |
| outputMode | string | – | Either 'base64' (returns the PDF inline) or 'file' (writes to a sandboxed path inside PDFNATIVE_MCP_OUTPUT_DIR). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf. |
| pageIndex | integer | – | Zero-based page index the (invisible) widget attaches to (default 0). |
| pageSize | string | – | 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. |
| pdfA | string | – | 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 do… |
| placeholderBytes | integer | – | 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. |
| object | – | 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).… | |
| reason | string | – | Reason for signing (e.g. "Approved", "I agree to the terms"). |
| reserveTimestamp | boolean | – | 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. |
| signerName | string | – | Name of the intended signer, embedded in the /Sig dictionary. |
| signingTime | string | – | /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 call… |
| strict | boolean | – | 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. |
| subFilter | string | – | 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'. |
| title | string | yes | Document title. Used as the PDF metadata title and rendered at the top of page 1. |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
read_form_fields Read AcroForm fields ~212
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 | Type | Req | Description |
|---|---|---|---|
| fields | array | – | Optional dot-path projection applied to the structured result (e.g. ['fields.name','fields.type']). Composes after verbosity. Unknown paths are omitted. |
| password | string | – | Password (user or owner) of an encrypted source. Never logged or echoed. |
| pdfBase64 | string | yes | Base64-encoded PDF bytes whose AcroForm fields should be enumerated. |
| verbosity | string | – | Response verbosity. 'full' (default) returns the fields[] array; 'summary' returns a token-frugal { fieldCount } and drops the array. |
| Name | Type | Req | Description |
|---|---|---|---|
| fieldCount | integer | – | – |
| fields | array | – | – |
No examples provided.
sign_pdf Sign PDF (RSA / ECDSA, PAdES) ~1,112
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 | Type | Req | Description |
|---|---|---|---|
| algorithm | string | yes | Signature algorithm. 'rsa-sha384' / 'rsa-sha512' (pdfnative 1.7) upgrade the whole CMS digest chain. ECDSA only supports P-256 with SHA-256. |
| allowMultiple | boolean | – | 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. |
| autoInjectPlaceholder | boolean | – | When true (default) and the input PDF has no /Sig widget, pdfnative.addSignaturePlaceholder is called before signing — enabling single-call signing of any PDF. |
| certChainDerBase64 | array | – | Optional intermediate CA certificates (DER base64) embedded in the CMS so verifiers and add_ltv can build the chain without fetching caIssuers. |
| certDerBase64 | string | yes | Base64 of the signer X.509 certificate in DER form. Convert from PEM with: openssl x509 -in cert.pem -outform DER | base64 -w0 |
| contactInfo | string | – | /Sig /ContactInfo — baked into the placeholder when this call injects it. |
| ecPrivateKeyDerBase64 | string | – | 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 ecPrivateScal… |
| ecPrivateScalarHex | string | – | 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. |
| fieldName | string | – | Name of the signature field to sign (required when several unsigned placeholders exist) and of the placeholder injected by this call. |
| location | string | – | /Sig /Location — baked into the placeholder when this call injects it. |
| outputMode | string | – | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). |
| outputPath | string | – | Required when outputMode='file'. Relative path inside the sandbox; must end with .pdf (no absolute paths, no '..'). |
| pdfBase64 | string | 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). |
| profile | string | – | '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. |
| reason | string | – | /Sig /Reason — baked into the placeholder when this call injects it. |
| rsaKeyPkcs1DerBase64 | string | – | 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 | bas… |
| signerName | string | – | /Sig /Name — baked into the placeholder when this call injects it. |
| signingTime | string | – | 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. |
| timestamp | boolean | – | 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 ne… |
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | array | – | PDF/A diagnostics (when includeDiagnostics=true). |
| filePath | string | – | Sandboxed absolute path (file mode). |
| mode | string | yes | – |
| sizeBytes | integer | yes | – |
| summary | object | – | Tool-specific summary, when produced. |
No examples provided.
split_pdf Split PDF into ranges ~378
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 | Type | Req | Description |
|---|---|---|---|
| dropAnnotations | boolean | – | When true, drop ALL annotations. Default keeps self-contained URI link annotations. |
| encrypt | object | – | Re-encrypt the output (Standard Security Handler; AES-128 default or AES-256; RC4 never emitted). Applied to every produced range. |
| maxOutputSizeBytes | integer | – | Maximum size, in bytes, of each produced PDF. Defaults to 268435456 (256 MiB). |
| outputMode | string | – | 'base64' (default) returns the PDF inline; 'file' writes it inside the PDFNATIVE_MCP_OUTPUT_DIR sandbox (SECURITY_VIOLATION when the sandbox is not configured). |
| outputPath | string | – | Base output path (file mode). Each PDF is written to an indexed sibling: 'out.pdf' → 'out-1.pdf', 'out-2.pdf', … |
| password | string | – | Password (user or owner) of an encrypted source. Never logged or echoed. |
| pdfBase64 | string | yes | Base64-encoded source PDF. Pass `password` for an encrypted source. |
| ranges | array | yes | Page ranges to extract, one output PDF per range. 0-based, inclusive; `end` defaults to `start` (a single page). |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| mode | string | yes | – |
| parts | array | yes | – |
| totalBytes | integer | yes | – |
No examples provided.
What is the pdfnative MCP — PDF generation, PAdES signing… server?
pdfnative MCP — PDF generation, PAdES signing… is listed in the public MCP registry as io.github.Nizoka/pdfnative-mcp. PDF MCP server: generate PDF/A, sign & verify PAdES (LTV), forms, merge, split, encrypt. 28 tools. This page covers its npm package (pdfnative-mcp).
Is the pdfnative MCP — PDF generation, PAdES signing… server safe to use?
pdfnative MCP — PDF generation, PAdES signing… scores 93 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the pdfnative MCP — PDF generation, PAdES signing… server expose?
pdfnative MCP — PDF generation, PAdES signing… exposes 28 tools: generate_basic_pdf, add_barcode, sign_pdf, add_international_text, add_table, and 23 more. Their descriptions and schemas cost roughly 17,553 tokens of context every time the server is loaded.
Is the pdfnative MCP — PDF generation, PAdES signing… server still maintained?
pdfnative MCP — PDF generation, PAdES signing… is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the pdfnative MCP — PDF generation, PAdES signing… server under?
pdfnative MCP — PDF generation, PAdES signing… declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.