Skip to main content
Glama
shuji-bonji

pdf-writer-mcp

by shuji-bonji

pdf-writer-mcp

CI npm version License: MIT

日本語

MCP server that creates PDFs from text, Markdown, or tabular data and edits existing ones (metadata and page operations). Built on normativepdf — a clause-driven PDF library in which every behaviour is tied to an ISO 32000 clause — with CJK font embedding via harfbuzz subsetting.

Part of the PDF family alongside pdf-reader-mcp (structure analysis) and pdf-verify-mcp (authenticity verification). Where pdf-reader-mcp tells you what is in a PDF and pdf-verify-mcp tells you whether it is genuine, pdf-writer-mcp is the one that writes it.

Tools

IMPORTANT

All file paths must be absolute (since v0.7.0). Relative paths and paths containing .. are rejected — a relative path would resolve against the MCP host's working directory, which is not the directory you think it is. This applies to inputPath, inputPaths, outputPath, outputDir, fontPath and attachmentPath. Input PDFs larger than 100 MB are also rejected.

Creation

Tool

Purpose

create_text_pdf

Plain text — honours \n, blank lines separate paragraphs, long lines wrap

create_markdown_pdf

Markdown — headings, paragraphs, bullet/ordered lists, code blocks, quotes, rules, tables

create_table_pdf

Ruled tables — automatic column widths, cell wrapping, headers repeated across page breaks

Shared options: outputPath, returnBase64, fontPath, fontSize, pageSize (A4/A3/A5/LETTER/LEGAL), margin, title, author, onMissingGlyph, tagged, lang, pdfVersion.

PDF 2.0 output (v0.16.0)

Pass pdfVersion: "2.0" to write an ISO 32000-2 file. The default stays "1.7", and its bytes are unchanged.

The version is not only a header. ISO 32000-2 attaches two obligations to it, and both are met:

  • trailer /ID becomes Required (Table 15). Both elements are equal on a first write (R-14.4-6), and the value stays deterministic under SOURCE_DATE_EPOCH.

  • the Info dictionary keeps only CreationDate and ModDate (§14.3.3); the title, author and producer move to the XMP metadata stream, where PDF 2.0 says document metadata belongs.

{ "text": "Body.", "title": "Report", "pdfVersion": "2.0" }

tagged: true cannot be combined with it. The only accessibility declaration this server writes is PDF/UA-1 (ISO 14289-1), which is built on PDF 1.7 — putting it in a 2.0 file would be a claim nothing could measure. PDF/UA-2 output is not implemented, so the combination is refused rather than silently produced.

Tagged PDF / PDF/UA (v0.5.0)

Pass tagged: true to produce an accessible, tagged PDF conforming to PDF/UA-1 (ISO 14289). Output is verified compliant by veraPDF (--flavour ua1, 106/106 rules).

{ "markdown": "# Title\n\nBody.", "title": "Report", "tagged": true, "lang": "en" }

Markdown maps onto the structure tree: headings → H1H6, lists → L/LI/LBody, tables → Table/TR/TH/TD (headers get /Scope), quotes → BlockQuote, code → Code. Rules, borders and code backgrounds become artifacts. Heading levels are normalised so they start at H1 and never skip — a Markdown # → ### jump becomes H1 → H2 in the structure, while visual sizes stay as authored.

PDF/UA mandates a document title, so tagged: true requires title. lang (BCP 47) is inferred from the text when omitted and reported via warnings — pass it explicitly when you know it, since a wrong /Lang makes screen readers mispronounce the text.

NOTE

Tagging is opt-in — default output is unchanged.

Machine validation (veraPDF) only sees whether things exist. It cannot judge whether reading order or alt text are appropriate — human review still matters.

Editing — page operations

Tool

Purpose

merge_pdfs

Concatenate 2–50 PDFs in order; metadata inherited from the first file

split_pdf

One output file per page range

extract_pages

Extract pages in the requested order (doubles as reordering)

delete_pages

Remove pages (deleting every page is rejected)

reorder_pages

Reorder by an explicit permutation of all pages

rotate_pages

Rotate clockwise (90/180/270), accumulating over existing rotation. Edits in place, so the warning below does not apply

WARNING

The five tools other than rotate_pages rebuild the document from its pages.

  • Carried over: attachments (/Names /EmbeddedFiles, /AF), /Lang, /ViewerPreferences, /OutputIntents

  • Not carried over: the tagged structure tree, XMP, and anything tied to page numbers or page references (bookmarks, page labels, named destinations)

  • Whatever is lost is reported in warnings — nothing disappears silently

Page specs use "1,3-5,8-" (1-based; -3 means up to page 3, 8- means page 8 to the end). Order is preserved and duplicates are removed.

Editing — adding to and repairing documents

Tool

Purpose

set_metadata

Update Info dictionary fields (title / author / subject / keywords / creator), preserving the rest. On documents carrying XMP, dc:title etc. are kept in sync (PDF/UA and PDF/A declarations preserved)

add_bookmarks

Set the outline (bookmarks); nestable via children, replaces any existing outline

add_annotation

Add a sticky note (text), highlight, or square annotation. On tagged PDFs the annotation is nested in an Annot element and stays PDF/UA conformant — pass alt to describe it

attach_file

Embed a file (/Names /EmbeddedFiles + catalog /AF + /AFRelationship) — the PDF/A-3 shape

stamp_page_numbers

Stamp page numbers ({n} / {total}, six positions, pages, startAt). Becomes an artifact on tagged PDFs, so conformance holds

fill_form

Fill AcroForm fields. Japanese values via an embedded font; can flatten in the same pass

flatten_form

Flatten a form into static content. Refuses tagged PDFs by default (breaks PDF/UA)

tag_form_fields

Repair the form inside a tagged PDF for PDF/UA-1 (nest widgets in Form, set /Tabs S, add /TU alternate names; pass labels for human-readable names). Idempotent

ensure_tagged

Put an existing PDF into the PDF/UA-1 container → Scaffolding an untagged PDF

ensure_pdfa

Put an existing PDF into the PDF/A-3b / PDF/A-4 / PDF/A-4f container (flavour) → The archival container

add_watermark

Overlay a diagonal watermark ("社外秘" / "DRAFT"). Behind the body content by default; artifact on tagged PDFs

Shared options: outputPath, returnBase64, allowBreakingSignatures.

IMPORTANT

Editing signed PDFs: an ordinary save rewrites the whole file, so editing normally invalidates existing signatures. PDFs containing /ByteRange are rejected by default.

  • preserveSignatures: true — appends an ISO 32000 incremental update that keeps every signature valid (the original bytes are untouched). Supported by every editing tool that adds to a document: add_annotation, set_metadata, add_bookmarks, tag_form_fields, ensure_tagged, attach_file, stamp_page_numbers, add_watermark (on tagged PDFs the structure-tree changes ride the same increment)

  • allowBreakingSignatures: true — proceed destructively, invalidating signatures

  • Certified documents (DocMDP) are refused when the change type is not permitted by the certification level (§12.8.2.2)

Measured: stacked increments on a really-signed PDF keep pdf-verify-mcp reporting VALID, and incremental structure updates on tagged PDFs stay veraPDF COMPLIANT (106/106).

Scaffolding an untagged PDF (ensure_tagged)

ensure_tagged puts an existing PDF into the PDF/UA-1 container. On tagged input the structure tree is left untouched and only missing document-level requirements are repaired (MarkInfo, /Lang, DisplayDocTitle, XMP). On a document that never had a structure tree, a minimal scaffold is created — each page's content wrapped in a single P element, which makes the text reachable by assistive technology and passes veraPDF (measured: 106/106).

WARNING

This is a scaffold, not accessibility. A machine cannot infer meaning, so headings, lists, tables, reading order and figure alt text are not produced. The tool says so in its warnings. (Wrapping the content in Artifact would also pass veraPDF while hiding the body from screen readers — conformance theatre, deliberately not implemented.) Where you control the source, create_* with tagged: true produces real structure; ensure_tagged is for documents you were handed.

The archival container (ensure_pdfa)

ensure_pdfa is the archival (PDF/A-3b) counterpart of ensure_tagged. It adds only the document-level requirements:

  • trailer /ID (ISO 32000-1 §14.4)

  • an sRGB output intent (GTS_PDFA1; ICC profile generated and embedded)

  • the XMP pdfaid declaration (the creation date is inherited from Info /CreationDate)

WARNING

Content streams, fonts and the structure tree are untouched — so thisdoes not make a PDF conform. Write the declaration, then measure it: verify with pdf-verify-mcp's validate_conformance(flavour: "pdfa-3b"). Measured on the electronic-bookkeeping sample: veraPDF 146/146 COMPLIANT, PDF/UA-1 still 106/106, attachment preserved.

Since v0.17.0 the result also carries declarationRisks when the claim is already known to be false. The only risk reported today is FONT_NOT_EMBEDDED: PDF/A requires every font to be embedded and ensure_pdfa does not embed fonts, so a document drawn with the standard 14 faces fails validation regardless of how correct its document-level structure is. The declaration is still written — the verdict belongs to veraPDF — but the caller can now branch on the risk instead of parsing the warning text.

PDF/A-4 (v0.16.0)

flavour: "pdfa-4" targets ISO 19005-4 instead. It is built on PDF 2.0, so on top of the three items above it rewrites the header to 2.0 and removes the Info dictionary — PDF/A-4 does not allow one unless the catalog has /PieceInfo, which is stricter than ISO 32000-2 §14.3.3. pdfaid:rev is written and pdfaid:conformance is not, because PDF/A-4 has no conformance level.

If the document carries attachments, use "pdfa-4f". Plain PDF/A-4 requires every embedded file to be PDF/A itself, so attaching a CSV or JSON — the electronic-bookkeeping case — makes it non-conformant. "pdfa-4f" is the variant for exactly that.

Measured with veraPDF 1.30.0: pdfa-4 109/109 COMPLIANT, and the same document with a CSV attached is 108/109 as pdfa-4 but 109/109 as pdfa-4f.

preserveSignatures is refused with a PDF/A-4 flavour unless the input is already PDF 2.0: an incremental update cannot rewrite byte 0 of the file, and doing so anyway would break the signature it was meant to preserve.

Related MCP server: MCP PDF

Install

{
  "mcpServers": {
    "pdf-writer": {
      "command": "npx",
      "args": ["-y", "@shuji-bonji/pdf-writer-mcp@latest"],
      "env": {
        "PDF_WRITER_FONT": "/absolute/path/to/NotoSansJP-Regular.otf"
      }
    }
  }
}

PDF_WRITER_FONT lets every tool omit fontPath and still render CJK text.

TIP

Use @latest (or pin a version). npx -y <pkg> without a version keeps running whatever it cached the first time — -y only skips the install prompt, it does not check for updates. A bare specifier will happily run a months-old release. @latest makes npx check the registry on each start; pin @0.5.0 instead if you want reproducibility. To clear a stale cache: rm -rf ~/.npm/_npx.

Fonts

The standard PDF font (Helvetica) covers ASCII only. To render Japanese or any non-Latin text, point fontPath or PDF_WRITER_FONT at an embeddable single-face font (.ttf / .otf).

  • Recommended source: Noto Sans JP (SubsetOTF/JP) — static, single-face, SIL OFL.

  • .ttc (TrueType Collection) is not supported — the file is detected and rejected. Extract a single face first:

    python3 -c "from fontTools.ttLib import TTCollection; \
      TTCollection('NotoSansCJK-Regular.ttc').fonts[0].save('NotoSansCJKjp-Regular.otf')"

Missing glyphs

Characters absent from the font (e.g. ✔ U+2714, which Noto Sans JP does not include) would otherwise be embedded as .notdef and render as silent blanks. onMissingGlyph controls this:

Value

Behaviour

error (default)

Fail, listing the offending characters as "✔" (U+2714)

replace

Substitute 〓 and report via warnings

ignore

Render as blanks and report via warnings

Result

{
  "path": "/abs/out.pdf",     // when outputPath is given
  "base64": "JVBERi0xLj...",  // when returnBase64, or outputPath is omitted
  "pageCount": 3,
  "bytes": 91788,
  "font": "NotoSansJP-Regular.otf",
  "warnings": ["Replaced 1 unsupported character(s) with \"〓\": \"✔\" (U+2714)"]
}

Editing tools return the same shape without font; split_pdf returns { files: [...], count }.

Errors (v0.7.0)

Errors are structured, following the same contract as pdf-reader-mcp: a stable code for programs, plus next_actions an LLM agent can act on. Writer-specific guards are all expressed as retryable with an explicit flag:

{
  "error": "\"/in/signed.pdf\" appears to be digitally signed (/ByteRange found). …",
  "code": "SIGNED_PDF",
  "retryable": true,
  "next_actions": [
    {
      "action": "retry_with_allowBreakingSignatures",
      "reason": "Only if invalidating the signature is acceptable…",
      "example": { "allowBreakingSignatures": true }
    }
  ]
}

Codes: INVALID_ARGUMENT, DOC_NOT_FOUND, FONT_NOT_FOUND, INVALID_PDF, ENCRYPTED_PDF, UNSUPPORTED_PDF_FEATURE (XFA), FILE_TOO_LARGE, INTERNAL_ERROR, and the writer guards SIGNED_PDF (allowBreakingSignatures), TAGGED_PDF (allowBreakingTags), FONT_REQUIRED (fontPath), MISSING_GLYPH (onMissingGlyph).

Deterministic output (v0.7.0)

Set the SOURCE_DATE_EPOCH environment variable (UNIX seconds, per the reproducible-builds.org convention) to pin CreationDate, ModificationDate and XMP timestamps. The same input then yields byte-identical output — useful for diffing, caching, and reproducible tests. Invalid values raise an error rather than being ignored.

Text extraction

Generated PDFs are selectable, copyable, searchable, and screen-reader accessible: a ToUnicode CMap (§9.10.3) is written even for embedded subset fonts. This is covered by regression tests (extract.test.ts, render.test.ts).

NOTE

Output from v0.13.x and earlier could make poppler-based viewers printMismatch between font type and embedded font file. That was a symptom of a real conformance defect (W-2: CFF fonts embedded via FontFile2), fixed in v0.14.0 — current output produces no such warning.

Development

npm install
npm run build      # emits dist/
npm test           # vitest
npm run typecheck  # tsc --noEmit

Font-dependent tests activate when TEST_FONT_PATH points at a CJK font:

TEST_FONT_PATH=/path/to/NotoSansJP-Regular.otf npm test

Known limitations

  • Inline styling: bold/italic affect size and glyph text only, not typeface — a single font is embedded per document.

  • .ttc fonts require extracting a single face (see above).

  • title and the first body heading both become H1 (B-19). This satisfies PDF/UA 7.4.2 (start at H1, skip no levels) and passes veraPDF, but headings duplicate if you read the structure tree back and regenerate.

  • List /Lbl is not emitted (B-18). Bullets and numbers are baked into the body text. ISO 32000-2 §14.8.4.8.2 makes Lbl a NOTE (often include), not a requirement, so this conforms — but regenerating from a read-back duplicates the markers.

Resolved:

  • The subset name prefix (ABCDEF+) is applied as of v0.14.0 (W-3). The earlier limitation stating otherwise no longer holds.

  • Underscores in snake_case being dropped (B-17) was fixed on 2026-07-21 (ships in the next release). _ emphasis now requires a non-intraword position and code spans are protected first, so non-ASCII identifiers such as 日本語_変数名 survive too.

Roadmap

  • Editing Tier A wave 1 — metadata and page operations (v0.2.0)

  • Editing Tier A wave 2 — bookmarks and annotations (v0.4.0)

  • Tagged PDF / PDF/UA-1 — verified by veraPDF (v0.5.0)

  • Annotations nested in Annot tags on tagged output (v0.5.1)

  • Editing Tier B — file attachments, form filling/flattening, watermarks, page-number stamping (v0.6.0)

  • Code hygiene / family alignment — McpServer + Zod, structured errors, absolute-path enforcement, stdout guard, tool annotations, deterministic output (v0.7.0)

  • tag_form_fields — PDF/UA repair for forms in tagged PDFs, verified COMPLIANT by veraPDF (v0.8.0)

  • Tier C first milestone — signature-preserving incremental updates for add_annotation, verified by pdf-verify-mcp against a real CMS signature (v0.9.0)

  • Incremental updates extended to set_metadata / add_bookmarks, full trailer carry-over (§7.5.6), XMP kept in sync with Info (v0.10.0)

  • Incremental updates on tagged PDFs — generalised dirty tracking over the structure tree; tag_form_fields gains preserveSignatures (v0.11.0)

  • Incremental updates across every editing tool, and ensure_tagged — PDF/UA scaffold & repair (v0.12.0)

  • Page operations report and carry over document-level information; three shall violations found by re-auditing against ISO 32000-2 (v0.13.0)

  • Carrying the structure tree through page operations (which also unlocks MarkInfo, conformance-declaring XMP, /AcroForm and merging attachments across inputs)

  • Tier C remainder — edit_text (body text editing/reflow)

  • Publish-pipeline skill (write → read back with pdf-reader → gate with pdf-verify)

  • Images with alt text (Figure + /Alt)

  • Automatic face extraction from .ttc

  • Separate faces for headings and body (bold face embedding)

  • Image embedding, headers/footers

  • Tier C — signature-preserving incremental updates, body text editing, tag tree maintenance

  • PDF/A conversion

License

MIT © shuji-bonji

Available Tools

20 tools
add_annotationAdd AnnotationA

Add one annotation to a page: sticky note (text), highlight, or rectangle (square). Coordinates are in PDF space (origin bottom-left, pt). For signed PDFs, preserveSignatures: true appends an incremental update without invalidating existing signatures (in tagged documents the enclosure in an Annot structure element rides the same update, preserving PDF/UA conformance).

ParametersJSON Schema
NameRequiredDescriptionDefault
altNoAlt text for assistive technology. In tagged PDFs the annotation is enclosed in an Annot structure element (PDF/UA 7.18.1-1) and this becomes that element's /Alt. Ignored in untagged documents.
iconNoIcon for text notes. Default Note.
openNoWhether the text note starts open. Default false.
pageYesTarget page (1-based).
rectYesAnnotation rectangle in PDF space (origin bottom-left, pt). Must satisfy x1<x2 and y1<y2.
typeYestext = sticky note icon / highlight = highlight / square = rectangle.
colorNo#rrggbb. Defaults per type (text=#ffd400 / highlight=#ffff00 / square=#ff0000).
authorNoAuthor name.
contentsNoAnnotation body text (CJK fine).
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
interiorColorNoFill colour for square (#rrggbb).
preserveSignaturesNoAdd the annotation to a signed PDF via an incremental update (appending) without invalidating existing signatures. Default false. The original bytes are untouched, so /ByteRange holds. In tagged PDFs the enclosure in an Annot structure element rides the same update, preserving PDF/UA conformance. Under a certification signature (DocMDP), allowed only at P=3.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false, which already signal this is a mutating, non-idempotent operation. The description adds valuable behavioral context: coordinate system (PDF space, origin bottom-left, pt), the incremental-update behavior for signed PDFs, the default error on signed PDFs unless allowBreakingSignatures is set, and the PDF/UA conformance preservation. It does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences and front-loads the core purpose and annotation types. The second sentence adds important behavioral context about signed PDFs and PDF/UA conformance. It is efficient, though the signed-PDF sentence is dense and could be split for readability. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter tool with no output schema, the description covers the key behavioral aspects: what the tool does, coordinate system, signed-PDF handling, and PDF/UA conformance. The schema covers all parameter semantics. The description does not explain the return value when outputPath is omitted, but the schema's outputPath description covers that. Overall, the description is complete enough for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 15 parameters. The description adds meaning beyond the schema by explaining the coordinate system (PDF space, origin bottom-left, pt), the three annotation types, and the signed-PDF behavior. It also clarifies the relationship between preserveSignatures and allowBreakingSignatures, which is not fully captured in the individual parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Add') and resource ('one annotation to a page'), and enumerates the three supported annotation types (sticky note, highlight, rectangle). It also names the coordinate system, which distinguishes it from any other annotation-like tool. The title and description align, and the description clearly differentiates this from sibling tools like add_watermark or stamp_page_numbers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: adding sticky notes, highlights, or rectangles to a page. It does not explicitly name sibling alternatives or state when not to use it, but the sibling list shows no other annotation tool, so the usage context is clear. The signed-PDF guidance (preserveSignatures vs allowBreakingSignatures) provides important conditional usage direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_bookmarksAdd Bookmarks (Outline)A
Idempotent

Set the bookmarks (outline) of a PDF. Existing bookmarks are replaced. Nest with children. For signed PDFs, preserveSignatures: true sets them while keeping the signatures intact.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookmarksYesArray of bookmarks, each { title, page, open?, children? }. page is 1-based. Nest via children — up to 8 levels and 2000 entries in total.
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
preserveSignaturesNoEdit a signed PDF via an incremental update (appending) without invalidating existing signatures. Default false. The original bytes are untouched, so /ByteRange holds. Changes beyond the certification (DocMDP) permission level are refused.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate non-readonly, not idempotent, and non-destructive. The description adds valuable behavior: existing bookmarks are replaced, signed PDFs can be edited incrementally without invalidating signatures, and breaking signatures is an opt-in behavior. These go beyond annotation hints and set proper expectations about destructive/replacement semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise but a bit dense. It front-loads the core action and replacement behavior, then covers nested children and the signed-PDF edge case in two sentences. Every clause is informative, but the signed-PDF detail could be clearer for agents unfamiliar with PDF signature semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a complete schema (100% coverage), no output schema, and clear annotations, the description sufficiently covers the tool's purpose, key behavioral semantics (replacement, signatures, nesting limits are in schema), and defaults. Missing only an explicit note that outputPath omission returns base64, but that is present in the schema, so the description need not repeat it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all parameters. The description adds minimal extra parameter meaning beyond what the schema provides, though it clarifies the overall bookmark hierarchy and replacement behavior. Baseline 3 is appropriate given the schema already carries the burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Set') and resource ('bookmarks (outline) of a PDF'), clearly distinguishes its replace-existing-bookmarks behavior, and mentions nesting and the signed-PDF preservation option. This is sufficient to differentiate it from sibling tools like stamp_page_numbers or set_metadata.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys when to use it: for setting PDF bookmarks/outlines, including for signed PDFs when preserveSignatures is used, and it notes existing bookmarks are replaced. It doesn't explicitly name sibling alternatives or state when not to use it, but the context is clear enough for a tool that is semantically unique among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_watermarkAdd WatermarkA
Idempotent

Overlay a diagonal watermark across the middle of each page ("社外秘" / "DRAFT" / "COPY", etc.). Drawn faintly behind the content by default. In tagged PDFs it is wrapped as an Artifact, preserving PDF/UA conformance. CJK watermarks need fontPath or the PDF_WRITER_FONT environment variable.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesWatermark text, e.g. "社外秘" / "DRAFT" / "COPY".
angleNoCounter-clockwise angle (degrees). Default 45. 0 = horizontal.
colorNo#rrggbb. Default #808080 (grey).
pagesNoTarget pages, "1,3-5,8-" (1-based). All when omitted.
behindNoDraw behind the content. Default true. false draws over it (to strengthen the tamper-deterrent claim).
opacityNoOpacity, 0 (transparent) to 1 (opaque). Default 0.15 — faint enough to keep the content readable.
fontPathNoFont to embed (.ttf/.otf). Falls back to the PDF_WRITER_FONT environment variable, then the standard font. Required for CJK watermarks.
fontSizeNoFont size (pt). Default 60. Range 4-96.
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
preserveSignaturesNoEdit a signed PDF via an incremental update (appending) without invalidating existing signatures. Default false. The original bytes are untouched, so /ByteRange holds. Changes beyond the certification (DocMDP) permission level are refused.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it as non-read-only, non-destructive, and idempotent. The description adds valuable context: default faint behind-content drawing, Artifact wrapping for tagged PDFs, and fontPath dependency for CJK. This goes beyond the annotations and clarifies operational behavior. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, with the core action stated first, followed by key behavioral notes. Every sentence earns its place—no redundant phrasing. It is efficiently structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 13 parameters, the description covers the main purpose, defaults (faint, behind), and special cases (tagged PDFs, CJK fonts). The schema handles parameter-level detail, and there is no output schema to explain. The description is sufficiently complete for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are already documented in the schema. The description adds value by pointing out the CJK font requirement, which is a cross-parameter dependency not apparent from individual schema entries. It doesn't need to repeat schema details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Overlay a diagonal watermark') and the target resource ('each page'), with concrete examples of typical watermark text. This distinguishes it from sibling tools like add_annotation or stamp_page_numbers, which serve different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides context such as the Artifact wrapping in tagged PDFs for PDF/UA conformance and the fontPath requirement for CJK watermarks, which informs when to use it or what to prepare. However, it doesn't explicitly compare to alternative tools or state when this tool is not appropriate, 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.

attach_fileAttach File (Embedded File)A
Idempotent

Embed (attach) a file into a PDF. Registers it under /Names /EmbeddedFiles and the catalog /AF, with an AFRelationship. For PDF/A-3 (ISO 19005-3) and Japanese e-bookkeeping-law (電子帳簿保存法) workflows that bundle "a human-readable invoice PDF + machine-readable data (CSV/XML)" into one file.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDisplay name inside the PDF. Defaults to the original filename. Must not duplicate an existing attachment.
mimeTypeNoMIME type. Inferred from the extension when omitted (e.g. .csv → text/csv).
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
descriptionNoDescription of the attachment (/Desc; CJK fine).
relationshipNoRelation to the document content (PDF/A-3 §6.8). Data = machine-readable data with the same content as the document (invoice XML/CSV etc.) / Source = the source data of the document / Alternative = an alternative representation / Supplement = supplementary material / Unspecified = unknown (default). PDF/A-3 requires a meaningful value, so omission warns.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
attachmentPathYesAbsolute path of the file to embed.
preserveSignaturesNoEdit a signed PDF via an incremental update (appending) without invalidating existing signatures. Default false. The original bytes are untouched, so /ByteRange holds. Changes beyond the certification (DocMDP) permission level are refused.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already indicating readOnlyHint=false and destructiveHint=false, the description adds meaningful behavioral detail: it says the file is registered under specific PDF name trees and the catalog with an AFRelationship. This explains the underlying mutation mechanism without repeating annotation facts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. The core action is front-loaded, followed by technical registration details and then a concise use-case context. Every sentence adds useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with no output schema, the description gives enough high-level context to select the tool correctly handed off to the schema for parameter details. It does not describe return behavior, but the schema documents outputPath and returnBase64, so the gap is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 does not explain individual parameters, but it does tie the tool's purpose to the relationship field by mentioning AFRelationship and the invoice/CSV/XML bundling use case. The schema itself carries most parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and resource: 'Embed (attach) a file into a PDF.' It further clarifies the operation by naming the PDF structures involved (/Names /EmbeddedFiles, /AF, AFRelationship). This clearly distinguishes it from sibling tools like merge_pdfs or add_annotation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a concrete use context: PDF/A-3 and Japanese e-bookkeeping-law workflows that bundle invoice PDFs with machine-readable CSV/XML data. It does not explicitly state when not to use it or name an alternative, but the context is specific enough for an agent to decide when this tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_markdown_pdfCreate PDF from MarkdownA
Idempotent

Create a PDF from Markdown. Supports headings, paragraphs, bullet/numbered lists, code blocks, quotes, horizontal rules and tables. Inline decoration markers are stripped and the text rendered plain (single font).

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoNatural language of the document (BCP 47, e.g. "ja" / "en-US"). When omitted with tagged, it is inferred from the text and the guess is reported in warnings. A wrong language declaration makes screen readers misread — state it explicitly when you know it.
titleNoPDF title. Set in the metadata and also drawn as a heading at the top of the body.
authorNoPDF author (metadata).
marginNoMargin on all sides (pt). Default 56 (about 20 mm). Range 0-300.
taggedNoGenerate as a tagged PDF (PDF/UA-1, ISO 14289). Default false. When true, a structure tree, the PDF/UA declaration, /Lang and DisplayDocTitle are added, making the document readable by screen readers. PDF/UA requires a title, so title becomes required.
fontPathNoAbsolute path of the font file to embed (.ttf / .otf). Required for non-Latin text such as Japanese. .ttc (TrueType Collection) is not supported. Can also be set via the PDF_WRITER_FONT environment variable.
fontSizeNoBody font size (pt). Default 11. Range 4-96.
markdownYesMarkdown string.
pageSizeNoPage size. Default A4.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
pdfVersionNoPDF version to output. Default "1.7". "2.0" (ISO 32000-2) satisfies not just the version claim but the duties bound to it: a trailer /ID is added (Required per Table 15), and the Info dictionary is trimmed to CreationDate / ModDate with title, author and Producer moved to XMP (§14.3.3). Cannot be combined with tagged: true (the only declaration the writer can produce is PDF/UA-1, built on PDF 1.7).
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
onMissingGlyphNoWhat to do with characters the font lacks (e.g. ✔ U+2714, missing from Noto Sans JP). error (default) = fail, listing the missing characters / replace = substitute 〓 with a warning / ignore = render as blanks with a warning.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is not read-only and is idempotent; the description adds a valuable behavioral disclosure: inline decoration markers are stripped and text is rendered plain in a single font. This is non-obvious and helps set expectations, though it does not detail file output behavior or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose, and then adds a compact list of supported features plus an important behavioral caveat. Every sentence earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the detailed schema descriptions for all 13 parameters, the description does not need to repeat them. It covers the supported Markdown feature set and a key rendering behavior, which is sufficient for invocation. A small gap is the absence of any guidance about output modes or when to use sibling PDF creation tools, but the schema fills most operational details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are already well documented individually. The description adds no parameter-specific meaning beyond the schema; it only gives a general overview of Markdown support. Baseline 3 is appropriate because the schema carries the burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create a PDF from Markdown,' and enumerates the supported Markdown constructs (headings, lists, code blocks, tables, etc.). It is clear about what the tool does, though it does not explicitly differentiate itself from the sibling tools create_text_pdf or create_table_pdf beyond implying Markdown input.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: use this tool when you have Markdown content and want a PDF. It lists supported elements, which gives some scope, but it gives no explicit guidance about when to choose this over create_text_pdf or create_table_pdf, and no mention of limitations or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_table_pdfCreate Table PDFA
Idempotent

Create a ruled table PDF from headers and row data. Column widths are computed from the content, cells wrap, and the header row is redrawn after page breaks.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoNatural language of the document (BCP 47, e.g. "ja" / "en-US"). When omitted with tagged, it is inferred from the text and the guess is reported in warnings. A wrong language declaration makes screen readers misread — state it explicitly when you know it.
rowsYesData rows. Each row is an array of strings; the same column count as headers is recommended.
titleNoPDF title. Set in the metadata and also drawn as a heading at the top of the body.
authorNoPDF author (metadata).
marginNoMargin on all sides (pt). Default 56 (about 20 mm). Range 0-300.
taggedNoGenerate as a tagged PDF (PDF/UA-1, ISO 14289). Default false. When true, a structure tree, the PDF/UA declaration, /Lang and DisplayDocTitle are added, making the document readable by screen readers. PDF/UA requires a title, so title becomes required.
headersYesHeader row (column titles).
fontPathNoAbsolute path of the font file to embed (.ttf / .otf). Required for non-Latin text such as Japanese. .ttc (TrueType Collection) is not supported. Can also be set via the PDF_WRITER_FONT environment variable.
fontSizeNoBody font size (pt). Default 11. Range 4-96.
pageSizeNoPage size. Default A4.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
pdfVersionNoPDF version to output. Default "1.7". "2.0" (ISO 32000-2) satisfies not just the version claim but the duties bound to it: a trailer /ID is added (Required per Table 15), and the Info dictionary is trimmed to CreationDate / ModDate with title, author and Producer moved to XMP (§14.3.3). Cannot be combined with tagged: true (the only declaration the writer can produce is PDF/UA-1, built on PDF 1.7).
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
onMissingGlyphNoWhat to do with characters the font lacks (e.g. ✔ U+2714, missing from Noto Sans JP). error (default) = fail, listing the missing characters / replace = substitute 〓 with a warning / ignore = render as blanks with a warning.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide idempotentHint=true and non-destructive/read-only flags. The description adds useful behaviors beyond annotations: automatic column widths, cell wrapping, and header redrawing after page breaks. It does not mention file side effects, but outputPath and returnBase64 in the schema cover that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The core purpose is front-loaded, and each clause adds meaningful behavior. It is compact while still informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter tool, the schema is exhaustive and the description adds table-specific rendering semantics. There is no output schema, but outputPath and returnBase64 explain result delivery well enough. The definition is complete for practical invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline applies; the prose mostly repeats the notion of headers and row data. The schema itself thoroughly documents all parameters, defaults, enums, and requirements, so the description adds little parameter-level value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb and resource: create a ruled table PDF from headers and row data. This clearly distinguishes it from the sibling text/markdown PDF tools and gives an unambiguous account of what the tool produces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies use for tabular data via headers and rows, and sibling names like create_text_pdf and create_markdown_pdf make the contrast obvious. However, it never explicitly names alternatives or states when not to use it, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_text_pdfCreate PDF from Plain TextA
Idempotent

Create a PDF from plain text. Honours line breaks (\n) and treats blank lines as paragraph breaks. Long lines wrap automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoNatural language of the document (BCP 47, e.g. "ja" / "en-US"). When omitted with tagged, it is inferred from the text and the guess is reported in warnings. A wrong language declaration makes screen readers misread — state it explicitly when you know it.
textYesBody text. \n breaks lines; blank lines separate paragraphs.
titleNoPDF title. Set in the metadata and also drawn as a heading at the top of the body.
authorNoPDF author (metadata).
marginNoMargin on all sides (pt). Default 56 (about 20 mm). Range 0-300.
taggedNoGenerate as a tagged PDF (PDF/UA-1, ISO 14289). Default false. When true, a structure tree, the PDF/UA declaration, /Lang and DisplayDocTitle are added, making the document readable by screen readers. PDF/UA requires a title, so title becomes required.
fontPathNoAbsolute path of the font file to embed (.ttf / .otf). Required for non-Latin text such as Japanese. .ttc (TrueType Collection) is not supported. Can also be set via the PDF_WRITER_FONT environment variable.
fontSizeNoBody font size (pt). Default 11. Range 4-96.
pageSizeNoPage size. Default A4.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
pdfVersionNoPDF version to output. Default "1.7". "2.0" (ISO 32000-2) satisfies not just the version claim but the duties bound to it: a trailer /ID is added (Required per Table 15), and the Info dictionary is trimmed to CreationDate / ModDate with title, author and Producer moved to XMP (§14.3.3). Cannot be combined with tagged: true (the only declaration the writer can produce is PDF/UA-1, built on PDF 1.7).
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
onMissingGlyphNoWhat to do with characters the font lacks (e.g. ✔ U+2714, missing from Noto Sans JP). error (default) = fail, listing the missing characters / replace = substitute 〓 with a warning / ignore = render as blanks with a warning.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses layout behavior—honoring \n, treating blank lines as paragraph breaks, and auto-wrapping long lines—which goes beyond the annotations' readOnly/idempotent/destructive hints. It does not mention output side effects like writing to outputPath or base64 return, but those are covered in the rich parameter schema, and there is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, with the core purpose first and formatting details following. Every sentence adds useful behavioral context, and there is no filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 13 parameters and no output schema, but the parameter descriptions are exhaustive, covering defaults, ranges, required conditions (e.g., title for tagged PDF, fontPath for non-Latin). The main description provides the essential plain-text formatting context. Minor context like base64 return or font requirements is fully specified in the schema, so the overall definition is complete enough for an agent to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter descriptions carry the semantic load. The tool description's line-break and paragraph information largely duplicates what the text parameter already states, adding no new meaning beyond the schema. This matches the baseline of 3 for full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create a PDF from plain text.' It further clarifies behavior with line breaks, paragraph breaks, and auto-wrapping, which sets it apart from siblings like create_markdown_pdf and create_table_pdf based on input format. This is a clear, non-tautological statement of the tool's function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: use this when input is plain text, as opposed to markdown or table data, but it never names alternatives or states when not to use it. The sibling list provides context, but the description itself does not give explicit routing or exclusion guidance, so this is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_pagesDelete PagesA
DestructiveIdempotent

Create a new PDF with the given pages removed. Deleting every page is an error. Pages are copied into a new document, so document-level information (tagged structure, XMP, attachments, AcroForm, bookmarks, etc.) is not carried over. Anything lost is reported in warnings; follow up on the output with attach_file / ensure_tagged / add_bookmarks / set_metadata as needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
pagesYesPages to delete, "1,3-5,8-" (1-based).
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already marking the tool as destructive and non-read-only, the description adds substantial behavioral context: it states that pages are copied into a new document, that document-level information (tagged structure, XMP, attachments, AcroForm, bookmarks) is not carried over, that losses are reported in warnings, and that follow-up actions are needed. It also discloses the error condition for deleting all pages and the signature-breaking behavior via the allowBreakingSignatures parameter. This goes well 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long and front-loads the primary action immediately. Every clause contributes value: the operation, the error condition, the loss of metadata, and the follow-up guidance. There is zero redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential behavioral aspects: what the tool does, what it destroys, error conditions, and what to do afterward. The return format is not explicitly described, but the schema covers outputPath and returnBase64, so that gap is acceptable. Given the tool's complexity (5 params, no output schema), the description is thorough and leaves little ambiguity for an agent deciding to call it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are already documented. The description adds a meaningful constraint ('Deleting every page is an error') that isn't in the schema, but it does not elaborate on parameter meaning or format beyond that. The description adds marginal value over the schema, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair ('Create a new PDF with the given pages removed') that precisely defines the operation. It also states a key error condition ('Deleting every page is an error') and explicitly distinguishes the tool from siblings by describing the outcome as a new PDF with pages removed, which is distinct from extract or reorder. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly tell the agent when to choose this tool over alternatives like extract_pages or reorder_pages. It implies the use case (removing pages) but provides no comparison or conditions for selection. It also doesn't mention any prerequisites or complementary tools, only suggests follow-up tools for lost metadata, which is post-processing advice rather than selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ensure_pdfaEnsure PDF/A (archival conformance scaffold)A
Idempotent

Put an existing PDF onto the PDF/A "vessel" (the PDF/A counterpart of ensure_tagged). Choose the flavour: "pdfa-3b" (default) / "pdfa-4" / "pdfa-4f". Supplies only the missing document-level requirements: the trailer /ID (ISO 32000-1 14.4), an sRGB OutputIntent (GTS_PDFA1; an ICC profile is generated and embedded), and XMP pdfaid. The -4 flavours additionally set the header to PDF 2.0 and delete the Info dictionary (-4 forbids Info unless the catalog has /PieceInfo — stricter than ISO 32000-2 14.3.3). Content, structure tree and fonts are never touched. Documents with attachments must use "pdfa-4f" — plain "pdfa-4" requires every attachment to be PDF/A itself, so bundling CSV or JSON (the Japanese e-bookkeeping-law pattern) would not conform. IMPORTANT: this is preparation for claiming PDF/A, not a guarantee of conformance. Violations such as unembedded fonts, encryption, JavaScript or LZW are not repaired. Writing pdfaid into XMP is the document claiming "I am PDF/A" — applied to a non-conforming document it produces a PDF that lies about itself (which is why a warning is always returned). Always confirm with pdf-verify-mcp's validate_conformance (flavour: the same value) — the verdict is veraPDF's, and since ISO 19005 clauses cannot be quoted, the strongest statement is "veraPDF judged it so". In the e-bookkeeping-law context, apply it after attaching machine-readable data with attach_file. For signed PDFs, preserveSignatures: true (approval signatures only; certification signatures are refused). However, the -4 flavours combined with preserveSignatures are refused unless the input is already PDF 2.0 (an incremental update cannot rewrite the file header, and rewriting it would break the signatures).

ParametersJSON Schema
NameRequiredDescriptionDefault
flavourNoThe PDF/A to claim. Default "pdfa-3b". "pdfa-4" (ISO 19005-4) is built on PDF 2.0, so beyond /ID, OutputIntent and XMP pdfaid it **sets the header to 2.0 and drops the Info dictionary** (-4 forbids Info unless PieceInfo is present). **-4 has no conformance level**, so pdfaid:rev is written instead of pdfaid:conformance. **Documents with attachments must use "pdfa-4f"** — plain "pdfa-4" requires every attachment to be PDF/A itself, so bundling JSON or CSV (the Japanese e-bookkeeping-law pattern) would not conform. Combination with preserveSignatures is refused unless the input is already PDF 2.0 (an incremental update cannot rewrite the header, and rewriting it would break the signatures).
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
preserveSignaturesNoEdit a signed PDF via an incremental update (appending) without invalidating existing signatures. Default false. The original bytes are untouched, so /ByteRange holds. Changes beyond the certification (DocMDP) permission level are refused.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations by disclosing that the tool is only a scaffold, not a conformance guarantee; that writing pdfaid creates a 'PDF that lies about itself' on non-conforming input; and that a warning is always returned. It also details signature handling (incremental update, approval-only, refusal conditions) and explicitly states content, structure tree, and fonts are never touched.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and often redundant with the schema's parameter descriptions, especially the flavour explanation which is nearly duplicated verbatim. While the caveats are important and the bolded emphasis aids navigation, the text is a wall of detail that could be tightened by removing schema-echoed content without losing risk-critical guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description covers all essential operational context: prerequisites, limitations, post-verification steps, signature edge cases, and the non-conformance warning behavior. No output schema exists, but the input schema already documents return behavior, so the absence of return-type detail is not a gap; the description fully equips an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds meaningful cross-parameter constraints, most notably the refusal of -4 flavours combined with preserveSignatures unless the input is already PDF 2.0. It also clarifies the flavour-attachment relationship and reinforces the base64-return behavior, providing value beyond the individual parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Put an existing PDF onto the PDF/A vessel', and explicitly positions itself as 'the PDF/A counterpart of ensure_tagged', distinguishing it from that sibling. It enumerates the exact document-level requirements supplied (trailer /ID, sRGB OutputIntent, XMP pdfaid), leaving no ambiguity about scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: apply after attach_file in the e-bookkeeping context, and always confirm with pdf-verify-mcp's validate_conformance. It spells out exclusions — certification signatures are refused, and -4 flavours with preserveSignatures are refused unless the input is already PDF 2.0 — and explains flavour selection for attachments, making alternative choices concrete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ensure_taggedEnsure Tagged (PDF/UA scaffold & repair)A
Idempotent

Put an existing PDF onto the PDF/UA-1 "vessel". If it is already tagged, the structure tree is untouched and only missing document-level requirements are supplied (MarkInfo / Lang / DisplayDocTitle / XMP pdfuaid:part and dc:title). For untagged documents, a minimal structure tree (each page = one P element) is created so the content becomes reachable by assistive technology. IMPORTANT: machines cannot infer meaning — headings, tables, lists, reading order and figure alt text are NOT created. The new tree is a scaffold, not an accessible document; it needs human review. If you can build the structure right from the start, use the create tools' tagged: true. For signed PDFs, preserveSignatures: true (approval signatures only; certification signatures are refused).

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoNatural language of the document (BCP 47, e.g. "ja"). Required by PDF/UA-1 7.2.
titleNoDocument title (required by PDF/UA-1 7.1). Falls back to the existing Info Title.
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
preserveSignaturesNoEdit a signed PDF via an incremental update (appending) without invalidating existing signatures. Default false. The original bytes are untouched, so /ByteRange holds. Changes beyond the certification (DocMDP) permission level are refused.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description explains exactly what mutates: tagged files get only document-level requirements, untagged files get a minimal per-page P-element tree. It also discloses the critical limitation that real semantics (headings, tables, lists, reading order, alt text) are not created and that human review is required. No contradiction with 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then branches into tagged vs untagged behavior, the important human-review warning, the alternative tool guidance, and signed-PDF handling. Every sentence carries useful decision-relevant information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the important branches: already tagged, untagged, signed, and certification-restricted. Output behavior is handled by the schema's outputPath/returnBase64 descriptions, so an agent has everything needed to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, so all seven parameters are already documented structurally. The description adds only incidental context around preserveSignatures and the lang/title mapping to PDF/UA requirements, not enough to raise it above the baseline for full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: putting an existing PDF onto the PDF/UA-1 'vessel' and repairing or scaffolding its tag structure. It distinguishes between already-tagged and untagged inputs, and explicitly contrasts itself with the create tools by mentioning their tagged: true option.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives actionable selection guidance: use this when an existing PDF needs PDF/UA structure, and prefer the create tools with tagged: true when building structure from scratch. It also covers the signed-PDF branch by directing use of preserveSignatures: true and warning that certification signatures are refused.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extract_pagesExtract PagesA
Idempotent

Create a new PDF containing only the given pages. The given order is preserved, so extraction doubles as reordering. Pages are copied into a new document, so document-level information (tagged structure, XMP, attachments, AcroForm, bookmarks, etc.) is not carried over. Anything lost is reported in warnings; follow up on the output with attach_file / ensure_tagged / add_bookmarks / set_metadata as needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
pagesYesPages to extract, "1,3-5,8-" (1-based). The given order becomes the output order.
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond annotations by disclosing that document-level information (tagged structure, XMP, attachments, AcroForm, bookmarks) is stripped, that losses are surfaced in warnings, and that follow-up tools may be needed. This is valuable and consistent with idempotentHint=true, readOnlyHint=false, and destructiveHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences with the core purpose first, then behavioral caveats, then actionable follow-up. No filler; each sentence adds unique information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-param tool with no output schema, the description plus fully documented schema covers the outcome, side effects, warnings, and follow-up. Missing explicit sibling differentiation is a usage gap, but not a completeness gap for calling the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100% with detailed descriptions for all five parameters, so baseline is 3. The description reiterates the pages-order concept but doesn't add new parameter semantics beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('Create a new PDF') and resource ('only the given pages'), and adds the order-preservation detail. It is clear but does not explicitly name or contrast sibling tools such as split_pdf/delete_pages/reorder_pages, so it earns 4 rather than 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: to extract a subset of pages, and explicitly notes that order preservation means it can also reorder. It provides no explicit when-not-to-use or alternatives, and the follow-up guidance is after-use rather than tool-selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fill_formFill Form (AcroForm)A
Idempotent

Fill field values into an existing PDF's interactive form (AcroForm). If you do not know the field names, pass a nonexistent one — the error lists every field name and type. CJK values need fontPath or the PDF_WRITER_FONT environment variable. flatten: true makes the form non-interactive after filling, but on a tagged PDF that breaks PDF/UA conformance and additionally requires allowBreakingTags: true. XFA forms are not supported.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYesObject of field name → value. Value type matches the field kind: text = string or number / checkbox = boolean / dropdown, optionlist = string or string array / radio = string. Example: {"user.name": "山田 太郎", "agree": true, "plan": "A"}
flattenNoFlatten to non-interactive after filling. Default false. When true, values can no longer be edited.
fontPathNoFont used to render values (.ttf/.otf). Falls back to the PDF_WRITER_FONT environment variable, then the standard font. Required for CJK values.
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
allowBreakingTagsNoAllow flattening even on a tagged PDF. Default false. When true, PDF/UA-1 conformance breaks.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as a non-read-only, idempotent, non-destructive operation. The description adds valuable behavior beyond that: flattening breaks PDF/UA conformance on tagged PDFs and requires allowBreakingTags: true, CJK values need a font, and the error response lists all field names/types when given an unknown field. It does not mention signature-breaking behavior (covered in the schema) or the base64 return option (also in schema), but it covers the most consequential side effects and requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a compact paragraph of four sentences, each earning its place: main purpose, field-discovery tip, CJK requirement, and flatten side-effect warning. It is front-loaded with the core action and keeps the most important caveats early. No redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 no output schema, the description covers the essential behavioral and usage context an agent needs: how to discover field names, font requirements for non-Latin text, the flattening caveat, and the unsupported XFA case. Output format and signature-breaking behavior are already documented in the schema, so they do not need repetition. The description is complete for successful invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes all 8 parameters with 100% coverage, so the baseline is 3. The description enhances this by explaining cross-parameter dependencies (CJK requires fontPath or the PDF_WRITER_FONT env var, flatten on a tagged PDF requires allowBreakingTags), and it explains the field-naming trick that affects how the fields parameter is used. This goes beyond simply restating the schema and gives the agent practical guidance on parameter usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair ('Fill field values into an existing PDF's interactive form (AcroForm)') and explicitly scopes the tool to AcroForm, distinguishing it from the sibling flatten_form and other PDF tools. It also notes XFA forms are unsupported, further clarifying its domain. An agent can unambiguously identify this as the tool for populating interactive form fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives practical guidance: a trick for discovering field names by passing a nonexistent one, a prerequisite for CJK values (fontPath or env var), and a clear exclusion (XFA not supported). It does not explicitly point to the sibling flatten_form for flatten-only workflows, and it does not contrast with other form-related tools, but the scope and exclusions are sufficient for most selection decisions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

flatten_formFlatten FormA
DestructiveIdempotent

Flatten an existing PDF's interactive form (AcroForm), keeping the filled appearance while removing interactivity. Use it to freeze values before distribution. If existing values contain CJK text, set fontPath or PDF_WRITER_FONT in case appearances must be regenerated. On tagged PDFs, Widget annotations disappear and Form structure elements are left dangling, so it refuses by default (allowBreakingTags: true to force).

ParametersJSON Schema
NameRequiredDescriptionDefault
fontPathNoFont for appearance regeneration. Falls back to the PDF_WRITER_FONT environment variable, then the standard font. Not needed when existing appearances can be reused, but required for CJK forms that need regeneration.
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
allowBreakingTagsNoAllow flattening even on a tagged PDF. Default false.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral detail beyond the annotations: it discloses side effects (removal of interactivity, Widget annotation disappearance, dangling Form structure), refusal behavior on tagged PDFs, and signature-breaking consequences. This is especially valuable given destructiveHint and idempotentHint are already present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the primary purpose, followed by targeted usage notes. Every sentence contributes meaningful information and there is no redundant repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main purpose, key side effects, refusal conditions, and font caveats. Since the input schema thoroughly explains parameters including base64 return behavior, the description does not need to repeat that; it is complete enough for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 six parameters and their meanings. The description adds helpful context for fontPath and allowBreakingTags, but this is augmentative rather than necessary; the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('flatten') and a clear resource ('an existing PDF's interactive form (AcroForm)'), and distinguishes the action from fill-related siblings by emphasizing removal of interactivity while preserving filled appearance. It is immediately obvious what the tool accomplishes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a concrete use case ('freeze values before distribution') and provides conditional guidance for special cases such as CJK text, fontPath, and tagged PDFs. It does not explicitly name an alternative sibling like fill_form, but the context clearly implies when flattening is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

merge_pdfsMerge PDFsA
Idempotent

Merge multiple PDFs into one, in the given order. Document metadata is carried over from the first file. Pages are copied into a new document, so document-level information (tagged structure, XMP, attachments, AcroForm, bookmarks, etc.) is not carried over. Anything lost is reported in warnings; follow up on the output with attach_file / ensure_tagged / add_bookmarks / set_metadata as needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputPathsYesAbsolute paths of the PDFs to merge (in merge order, 2 or more).
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by detailing what is retained (metadata from the first file), what is lost (tagged structure, XMP, attachments, AcroForm, bookmarks), and how to detect or remediate losses via warnings and follow-up tools. This is rich, accurate behavioral disclosure and matches 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence contributes: the first states the action, the second discloses metadata and document-level loss, and the third provides actionable remediation. The structure front-loads the core behavior and uses the remaining space for high-value caveats. It is dense but not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the schema fully documents all four parameters and annotations cover idempotence and read/write intent, the description completes the picture with merge order, metadata carry-over, page copying semantics, and loss remediation. Nothing essential to invoking the tool correctly or interpreting its behavior is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all parameters with 100% coverage, including inputPaths ordering, outputPath behavior, returnBase64, and allowBreakingSignatures. The description adds little parameter-specific meaning beyond reinforcing that merge order matters, which is already in the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb (merge) with a clear resource (multiple PDFs) and scope (in the given order). It is immediately distinguishable from sibling tools like split_pdf, extract_pages, and create_text_pdf. The core action and result are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies that the tool is for combining multiple PDFs into one, and it suggests follow-up tools for restoring lost document-level features. However, it does not explicitly state when to use this tool versus alternatives or mention exclusions. The usage context is understandable but left largely to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reorder_pagesReorder PagesA
Idempotent

Reorder pages. order must list every page exactly once, in the new order. Pages are copied into a new document, so document-level information (tagged structure, XMP, attachments, AcroForm, bookmarks, etc.) is not carried over. Anything lost is reported in warnings; follow up on the output with attach_file / ensure_tagged / add_bookmarks / set_metadata as needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
orderYesNew page order (1-based). Example: [5,4,3,2,1] reverses a 5-page document.
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly discloses that pages are copied into a new document, that document-level information such as tagged structure, XMP, attachments, AcroForm, and bookmarks is not carried over, and that lost items are reported in warnings. This goes well beyond what the annotations provide and helps the agent anticipate important side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the core operation, and every sentence carries meaningful guidance. It communicates the requirement, the data-loss behavior, and the remediation steps in three sentences without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has five parameters but the schema fully documents them, while the description covers the main behavioral caveat and follow-up actions. There is no output schema, but the description mentions warnings, and the returnBase64/outputPath parameter descriptions clarify output behavior. Minor gaps such as return-value detailing are adequately covered by schema and context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameter names and types are already documented. The description adds crucial semantics not enforced by the schema—that 'order' must be a permutation listing every page exactly once—which is essential for calling the tool correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the specific operation ('Reorder pages') and the essential constraint on the 'order' array (every page exactly once). This clearly distinguishes the tool from sibling operations like rotate_pages, extract_pages, and delete_pages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for use: reordering pages in a new document and following up with other tools to restore lost document-level features. It does not explicitly state when not to use this tool versus alternatives, but the lossiness caveat effectively communicates the tradeoff.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rotate_pagesRotate PagesB
Idempotent

Rotate pages clockwise (90/180/270 degrees). All pages when pages is omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
pagesNoTarget pages, "1,3-5" (1-based). All pages when omitted.
rotationYesClockwise rotation (degrees): 90 / 180 / 270.
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

B3.2/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotation contradiction: idempotentHint=true is inconsistent with a rotation operation, because a second identical 90-degree call produces a 180-degree result rather than the same result as the first call. The description also does not disclose side effects beyond the schema, such as signed-PDF handling or output behavior when outputPath is omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single concise sentence that front-loads the operation, degree range, and default page scope. Every phrase carries useful information and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the six-parameter schema with full descriptions for outputPath, returnBase64, and allowBreakingSignatures, the terse description is largely sufficient for invocation. It loses one point because there is no output schema and the description itself leaves return-value behavior unstated, though the parameter docs compensate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all six parameters. The description's 'All pages when pages is omitted' only restates the pages parameter's existing schema description and adds no new parameter meaning, which matches the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: rotate pages, with explicit clockwise directions (90/180/270 degrees) and default scope. This clearly distinguishes it from page-manipulation siblings like extract_pages, delete_pages, and reorder_pages without needing to open the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use rotate_pages versus alternatives such as reorder_pages or extract_pages. The only usage nuance provided, 'All pages when pages is omitted', describes parameter scope rather than tool selection, so the agent is left to infer when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_metadataSet PDF MetadataA
Idempotent

Update an existing PDF's metadata (the Info dictionary). Only the given fields change; the rest are preserved. At least one of title / author / subject / keywords / creator is required. In documents with XMP (/Metadata), dc:title etc. are synchronized to prevent divergence. For signed PDFs, preserveSignatures: true updates while keeping the signatures intact.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoTitle.
authorNoAuthor.
creatorNoCreating application name.
subjectNoSubject.
keywordsNoArray of keywords.
inputPathYesAbsolute path of the PDF to edit.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
preserveSignaturesNoEdit a signed PDF via an incremental update (appending) without invalidating existing signatures. Default false. The original bytes are untouched, so /ByteRange holds. Changes beyond the certification (DocMDP) permission level are refused.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds valuable behavioral context: the partial-update preservation rule, XMP synchronization to prevent divergence, and the two distinct signed-PDF behaviors (preserveSignatures vs allowBreakingSignatures). These details go well beyond the annotations and help an agent predict side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no fluff. The purpose is front-loaded, followed by the non-destructive update nuance, the XMP sync detail, and the signed-PDF handling. Each sentence earns its place, and the structure leads with the core action before edge cases.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 10 parameters and no output schema, the description covers the essential behavioral decisions an agent needs: partial updates, input requirement, XMP handling, and signature preservation. It omits the output/return behavior (base64 when outputPath omitted), but that is documented in the schema, so the description does not need to repeat it. Given the complexity, this is adequately complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 enriches parameter understanding by stating that omitted fields are preserved, clarifying the effect of not passing title/author/etc. It also explains the interplay between preserveSignatures and allowBreakingSignatures (default error for signed PDFs). This adds meaning beyond the static schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates an existing PDF's metadata (the Info dictionary), exactly specifying the resource and action. It also clarifies that only given fields change, distinguishing it from any creation or transformation tools. No ambiguity exists among siblings since none perform metadata updates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly states when to use it (when updating PDF metadata) and gives concrete usage conditions: 'At least one of title / author / subject / keywords / creator is required.' It also addresses the special case of signed PDFs with preserveSignatures. It does not explicitly exclude other tools, but no sibling operates on metadata, so the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

split_pdfSplit PDFA
Idempotent

Split a PDF into multiple files by page range. Each element of ranges becomes one file, named "1.pdf", "2.pdf", and so on. Pages are copied into a new document, so document-level information (tagged structure, XMP, attachments, AcroForm, bookmarks, etc.) is not carried over. Anything lost is reported in warnings; follow up on the output with attach_file / ensure_tagged / add_bookmarks / set_metadata as needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
prefixNoOutput filename prefix. Default "<input name>-part".
rangesYesArray of page ranges. Each element is "1-3" / "5" / "7-" / "-2" (1-based). Example: ["1-3", "4-"].
inputPathYesAbsolute path of the PDF to split.
outputDirYesOutput directory (absolute path).
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by disclosing that document-level information is not carried over, that losses are reported in warnings, and by naming specific follow-up tools for repair. This is rich behavioral context that an agent would not otherwise know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, each earning its place: the core action, the file naming behavior, and the critical caveat with remediation. Information is front-loaded and there is no repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-file creation tool with no output schema, the description covers naming, output location context, data-loss behavior, warnings, and recommended follow-ups. Combined with the fully documented input schema, an agent has enough to invoke it correctly and anticipate side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 meaningful parameter semantics: it explains that each ranges element becomes one file and defines the naming pattern as '<prefix>1.pdf', '<prefix>2.pdf', etc. This connects ranges and prefix in a way the schema alone does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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 a PDF into multiple files by page range.' It also explains the one-file-per-range behavior, which is precise. However, it does not explicitly distinguish itself from the sibling tool 'extract_pages,' so it stops short of the full 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage is implied through the description of splitting by page range and generating multiple files. There is no explicit when-to-use or when-not-to-use guidance, nor are alternatives like 'extract_pages' mentioned. The follow-up tool list is about post-processing, not selection among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stamp_page_numbersStamp Page NumbersA
Idempotent

Stamp a page number on each page. In tagged PDFs the stamp is wrapped as an Artifact, preserving PDF/UA conformance. Formats containing CJK text need fontPath or the PDF_WRITER_FONT environment variable.

ParametersJSON Schema
NameRequiredDescriptionDefault
colorNo#rrggbb. Default #666666.
pagesNoPages to stamp, "1,3-5,8-" (1-based). All when omitted. Use "2-" to skip a cover page.
formatNoFormat. {n} = current page, {total} = total pages. Default "{n}". Examples: "- {n} -" / "{n} / {total}" / "Page {n}". Must contain {n}.
marginNoMargin from the edge (pt). Default 24. Range 0-300.
startAtNoFirst number to stamp. Default 1. Useful to start at 1 after skipping a cover page.
fontPathNoFont to embed (.ttf/.otf). Falls back to the PDF_WRITER_FONT environment variable, then the standard font. Required for formats containing CJK text.
fontSizeNoFont size (pt). Default 9. Range 4-96.
positionNoPlacement. Default bottom-center. Visual position, taking page /Rotate into account.
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
preserveSignaturesNoEdit a signed PDF via an incremental update (appending) without invalidating existing signatures. Default false. The original bytes are untouched, so /ByteRange holds. Changes beyond the certification (DocMDP) permission level are refused.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a non-read-only, idempotent, non-destructive operation. The description adds useful behavioral context beyond those hints: tagged PDFs keep PDF/UA conformance via Artifact wrapping, and CJK formats require a fontPath or environment variable. This does not contradict 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences carry the core action first and the key exceptions second. Every sentence adds information without repeating schema defaults or parameter details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema fully documents parameters, defaults, ranges, enum, and base64-output behavior, and the description contributes the non-obvious PDF/UA and CJK caveats. The main missing piece is alternative-selection guidance, but that is more a usage-guidelines gap than an invocation-completeness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 adds no real parameter meaning beyond the schema; the note about CJK and fontPath essentially repeats what the fontPath parameter already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the specific action and resource: 'Stamp a page number on each page.' This distinguishes the tool from siblings like add_watermark or add_annotation, and the additional tagged-PDF/Artifact detail reinforces its niche.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to choose this tool over sibling tools such as add_watermark or add_annotation, and no when-not-to-use conditions. The CJK font requirement is a prerequisite, not guidance about choosing among alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tag_form_fieldsTag Form Fields (PDF/UA repair)A
Idempotent

Repair a tagged PDF's form to PDF/UA-1: enclose Widget annotations in Form structure elements (7.18.4-1), set /Tabs S on the affected pages (7.18.3-1), and give fields alternate names /TU (7.18.1-3). Pass human-readable names for screen readers via labels. Widgets already bound to the structure tree are skipped, so it is safe to run repeatedly. Untagged documents are out of scope (rebuild with the create tools' tagged: true, or run ensure_tagged first). For signed PDFs, preserveSignatures: true repairs while keeping the signatures intact (approval signatures only; certification signatures are refused).

ParametersJSON Schema
NameRequiredDescriptionDefault
labelsNoField name → human-readable alternate name (/TU) — what a screen reader speaks. Example: {"user.name": "氏名", "agree": "利用規約に同意する"}. Omitted fields fall back to the field name as /TU, reported in warnings. A nonexistent field name errors, listing every field name.
inputPathYesAbsolute path of the target PDF.
outputPathNoDestination file path (absolute). When omitted, a base64 string is returned instead.
returnBase64NoWhen true, include a base64 string in the result in addition to saving.
preserveSignaturesNoEdit a signed PDF via an incremental update (appending) without invalidating existing signatures. Default false. The original bytes are untouched, so /ByteRange holds. Changes beyond the certification (DocMDP) permission level are refused.
allowBreakingSignaturesNoWhen the target is digitally signed (detected via /ByteRange), the default is an error. Set true to proceed, accepting that the signatures become invalid.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare mutation (readOnlyHint false) and idempotency (idempotentHint true). The description reinforces idempotency and adds crucial behavior not in annotations: signature handling (preserveSignatures vs allowBreakingSignatures, certification refusal) and skipping of already-bound widgets. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph but well-organized, front-loading the core action and then layering idempotency, scope, and signature behavior. Every sentence carries information; no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 parameters, nested labels object, no output schema), the description covers scope, idempotency, signature rules, and outputPath fallback behavior. An agent has enough context to invoke it correctly without seeking external details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 tool description adds only a brief summary of the labels parameter ('Pass human-readable names for screen readers via labels') which is already elaborated in the schema. It does not materially extend parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise action ('Repair a tagged PDF's form to PDF/UA-1') and enumerates the exact technical steps (enclose Widget annotations, set /Tabs S, set /TU). It clearly separates this from siblings like fill_form, flatten_form, and ensure_tagged, which have different goals.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states untagged documents are out of scope and directs to run ensure_tagged first or use create tools with tagged: true. Also notes idempotency ('safe to run repeatedly'), giving agents clear when-to-use and when-not-to-use guidance, though it doesn't explicitly compare to form-filling tools.

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.

  1. 20 tool updatesv0.21.2
    • First observedadd_annotation
    • First observedadd_bookmarks
    • First observedadd_watermark
    • First observedattach_file
    • First observedcreate_markdown_pdf
    • First observedcreate_table_pdf
    • First observedcreate_text_pdf
    • First observeddelete_pages
    • First observedensure_pdfa
    • First observedensure_tagged
    • First observedextract_pages
    • First observedfill_form
    • First observedflatten_form
    • First observedmerge_pdfs
    • First observedreorder_pages
    • First observedrotate_pages
    • First observedset_metadata
    • First observedsplit_pdf
    • First observedstamp_page_numbers
    • First observedtag_form_fields

TDQS

A4/5.0

Scored across 20 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: creation tools differ by input format, page manipulation tools (split, extract, delete, reorder) are well-separated, and annotation tools (bookmarks, annotations, watermark, page numbers) are unambiguous. Even tightly related operations like fill_form vs flatten_form are clearly delineated.

Naming Consistency5/5

All 20 tool names follow a consistent verb_noun snake_case pattern (e.g., create_text_pdf, rotate_pages, set_metadata, ensure_pdfa). No camelCase or unpredictable verb forms appear, making the API highly predictable.

Tool Count4/5

At 20 tools, this exceeds the typical 3-15 sweet spot and edges into 'borderline heavy', but each tool fills a distinct need within the broad PDF manipulation domain. The count is justified by the wide feature set (creation, page ops, forms, accessibility, archiving), so it earns its place despite being slightly over the ideal range.

Completeness4/5

The tool surface covers creation, page manipulation, metadata, bookmarks, annotations, forms, tagging, PDF/A, and attachments, which is comprehensive for a PDF writer. Minor gaps exist (e.g., image insertion, digital signing, or text extraction), but these are generally outside the stated purpose and do not cause dead ends in typical workflows.

Maintenance

ActivityNo data
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables PDF generation from HTML, text, and Markdown content with customizable formatting options. Provides secure cross-platform PDF creation tools that automatically save to user directories like Downloads, Documents, or Desktop.
    4
    33 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables creative PDF generation with full design control including colors, shapes, emoji, and Unicode support. Supports everything from simple documents to artistic masterpieces using PDFKit's powerful API.
    5
    546 npm
    1
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides tools for converting Markdown content and files into professional PDF documents with full support for Mermaid diagrams and LaTeX rendering. It allows for high-quality output customization, including paper size, table of contents, and syntax highlighting styles.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables PDF file manipulation including merging, splitting, extracting pages, extracting text, excluding pages, and reordering pages.
    33 npm
    1
    MIT