Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

com.yaktool/pdf

NPM · YAKTOOL-PDF-MCP · SCANNED SEP 24

Merge, split, compress, unlock, organize, extract, fill forms and check PDFs — 12 local tools.

Available components

+3 this week 76 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 0 of 13 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency19
Schema Quality & AI Usability64
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 4586 tokens (~382/item across 12 items; 12 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "merge_pdfs" implies "merge" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 12 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the com.yaktool/pdf MCP server?

com.yaktool/pdf runs locally as an npm package, launched with npx -y yaktool-pdf-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · yaktool-pdf-mcp

# add to Claude Code
claude mcp add com-yaktool-pdf -- npx -y yaktool-pdf-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "com-yaktool-pdf": {
      "command": "npx",
      "args": [
        "-y",
        "yaktool-pdf-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-yaktool-pdf": {
      "command": "npx",
      "args": [
        "-y",
        "yaktool-pdf-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add com-yaktool-pdf -- npx -y yaktool-pdf-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-yaktool-pdf": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "yaktool-pdf-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-yaktool-pdf --command npx --arg -y --arg yaktool-pdf-mcp
# ~/.hermes/config.yaml
mcp_servers:
  com-yaktool-pdf:
    command: "npx"
    args: ["-y", "yaktool-pdf-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-yaktool-pdf": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "yaktool-pdf-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add com-yaktool-pdf -t stdio -c npx -a -y yaktool-pdf-mcp
// mcp.json
{
  "mcpServers": {
    "com-yaktool-pdf": {
      "command": "npx",
      "args": [
        "-y",
        "yaktool-pdf-mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 24 Sept 26 +1
    • Stability: 0.97 → pass security
  • 22 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

  • 20 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 17 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.

  • 15 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

  • 13 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

  • 11 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

  • 9 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 24 Sept 2026 · Analysed npm/yaktool-pdf-mcp@0.7.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 13 packages
Packages resolved 13
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 12 exposed · ~4,586 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
check_pdf_form ~394

List every AcroForm field in a local PDF — name, type, current value, options, required and read-only flags, MaxLen — and judge the form against 8 documented rules. Runs locally; nothing is uploaded. FILLING FORMS IS COMMODITY; JUDGING THEM IS NOT. What this answers is whether the filled form will come back rejected: a required field left empty (readers show required fields exactly like any other until submission fails), a value that is not one of the field's options (it can be written into the file and then renders blank), a value longer than MaxLen (a reader truncates on typing, a tool does not), and FIELDS THAT SHARE A NAME — those are one field with several widgets, so typing in one changes the others, and that is indistinguishable from a copy-paste accident until someone watches a different page change. Pass `fill` to check a PLANNED fill before touching the file: the same rules run against the values you are about to write, so you learn the form would be rejected before you write it. THE ONE PEOPLE MISS: an AcroForm stores a value and, separately, the appearance stream that draws it. Writing values without regenerating appearances produces a file that shows them in some readers and empty boxes in others, including in print. That is reported as PFF-008 when the NeedAppearances flag is off. Returns { fields[{name, type, value, options, required, readOnly, maxLength, pendingValue, findings[]}], findings[], summary{fields, filled, emptyRequired, duplicateNames[], hasSignature, errors, warnings, infos, byRule} }.

NameTypeReqDescription
fillobject–A planned fill (field name → value) to check before writing. Nothing is written by this tool.
pathstringyesAbsolute path to the PDF on this machine.

No output schema declared.

No examples provided.

check_pdf_hidden_content ~542

Pull out the content a PDF still carries but does not show: text outside the crop box, layers that are off by default, document properties, save history and embedded files — 6 documented checks. Runs locally; nothing is uploaded. THE HEADLINE CHECK IS CROPPING, and it is the reason this tool exists. Cropping a PDF page deletes nothing: it sets a CropBox and readers draw only what falls inside it, while every glyph outside stays in the file. People crop to hide — a price, a name, a margin note — and the text comes back the moment anyone selects it. READING A CROPPED PDF DOES NOT SHOW YOU THIS. pdfjs (and every reader) clips text extraction to the crop box, so extract_pdf_text on a cropped file returns the visible text and silently omits what was cropped away. This tool re-opens the document with each CropBox pushed back out to the MediaBox and reads it again, then reports the text that falls outside the original crop — VERBATIM, in outsideText per page, not as a count. WHY VERBATIM MATTERS: sanitizers report categories ("12 metadata fields, 3 hidden layers removed"). That does not answer the only question a sender has, which is whether what leaked matters. A layer called "Draft" is nothing; a cropped line reading "internal cost EUR 12.40" is the whole problem. ALSO REPORTED: optional-content groups that are off when the document opens (by name — what is drawn inside them is NOT extracted, that needs the content stream split by its optional-content marks); document properties shown as values, with local file paths flagged; how many incremental save rounds the file contains (earlier versions are still in it, though this tool does not reconstruct their text); and files embedded in the document. DELIBERATE LIMITS, state them when reporting: the judgement covers the TEXT LAYER only. Images and vector art outside the crop are equally recoverable and are not visible to this check — a cropped page with no text finding gets REC-002 saying exactly that, and it must not be rep…

NameTypeReqDescription
pathstringyesAbsolute path to the PDF on this machine.

No output schema declared.

No examples provided.

check_pdf_redaction ~354

Check a local PDF for ineffective redaction, against 8 documented rules — the same engine as the yaktool web checker. THE CORE CHECK (RED-001): dark filled rectangles (grey ≤ 0.25) in the page content that cover extractable text (≥ 60% of the word box). The result returns the covered text VERBATIM in recovered[] — show it to the user; a count is easy to dismiss, their own words are not. ALSO CHECKED: /Redact annotations that were marked but never applied (RED-002 — the content is intact and the marks say where to look); annotation text such as comments and sticky notes (RED-003); document metadata Title/Author/Creator/Producer (RED-004); incremental-save history — more than one startxref means earlier generations of objects are still in the file (RED-005); embedded attachments (RED-006); bookmark titles (RED-007). HONEST LIMITS: scanned pages have no text layer — reported as RED-008, because pixel content under a box on a scan is outside what a structure check can judge. Encrypted files are refused with guidance to unlock first (unlock_pdf, also local). Fill paths whose geometry cannot be parsed are counted in summary and never silently skipped. Thresholds are published, deterministic and part of the rule text. The input file is never modified; nothing is written. Returns { verdict: recoverable|clean|nothing-to-check, findings[], recovered[{page, text, rect}], scannedPages[], summary{pages, darkRects, unappliedRedactions, unparsedFills} }.

NameTypeReqDescription
pathstringyesAbsolute path to the PDF file to check.

No output schema declared.

No examples provided.

compress_pdf ~395

Shrink an image-heavy PDF (scans, photo documents) by decoding each embedded JPEG, resampling it and re-encoding it with mozjpeg, then write the result to `out`. Levels: "balanced" (1600 px, quality 75) and "smaller" (1200 px, quality 60). IT NEVER FAKES A SAVING — two guards: an image whose re-encode would be larger is kept byte-for-byte, and if the rebuilt file would not be smaller overall the ORIGINAL IS LEFT ALONE and `wrote` is null. A text-only PDF reports PDFC-001 (nothing to recompress) instead of being re-saved. Relay that honestly; do not claim a compression that did not happen. EVERY CHANGE IS ITEMISED: per image, the before/after bytes, the resolution change and the PSNR in decibels (above ~30 dB differences are hard to see on a document scan). Images in colour spaces the codec cannot handle (some CMYK press files) are skipped and named (PDFC-004) — a wrong re-encode would corrupt the page. SCOPE: this is image recompression, not a full rebuild — text, vectors and fonts pass through untouched, so text-heavy files barely change. Structural optimisation (object streams) is a separate, planned step. Encrypted or truncated files are refused up front by the same structure diagnosis as the other tools here. Returns { summary{beforeBytes,afterBytes,savedPercent,imagesTotal,imagesRecompressed}, images[{id,action,beforeBytes,afterBytes,beforeWidth,afterWidth,psnr?,reason?}], inspection, findings[], wrote }.

NameTypeReqDescription
levelstring–Default "balanced".
outstringyesAbsolute path of the compressed PDF. Never overwrites.
pathstringyesAbsolute path of the source PDF.

No output schema declared.

No examples provided.

extract_pdf_attachments ~545

List every file embedded in a local PDF, and when it is a hybrid e-invoice (Factur-X / ZUGFeRD / Order-X) check the container against 8 documented rules and run the invoice itself through the Article 226 engine. Runs locally; nothing is uploaded. PULLING THE XML OUT IS THE EASY PART and several free tools do it. Two things here that they do not: (1) THE CONTAINER. A hybrid invoice is not "a PDF with an XML in it". The embedded file must carry the prescribed name (factur-x.xml for ZUGFeRD 2.1 and Factur-X; zugferd-invoice.xml for 2.0), the right /AFRelationship (Alternative — or Source, which ZUGFeRD 2.1 requires for BASIC, EN 16931 and EXTENDED when the recipient is outside Germany and the PDF was produced from the XML), and it must be registered BOTH as an associated file in /AF and as an ordinary attachment in /EmbeddedFiles, because a lot of software does not implement PDF/A-3 associated files at all. Get these wrong and the XML is present but unreachable — the sender sees a valid invoice and the receiver sees none. (2) THE INVOICE. When the embedded XML is a Cross Industry Invoice it is mapped into the same draft model the invoice tools use and run through checkInvoiceDraft: Article 226 particulars, totals computed per VAT rate rather than copied from the file, and forwarded VAT / IBAN format rules. Amounts in the result are CALCULATED, so a file whose stated totals disagree with its own lines surfaces here. It also lists any non-invoice attachments, because files ride inside a PDF without appearing on any page — that is a privacy check of ours, not a requirement of the specification, and it is labelled as such. Honesty contract: the CII reader takes a bounded set of paths by local element name; it is NOT a full EN 16931 semantic mapping, and whatever it could not read comes back in cii.missingFields rather than being guessed. Returns { attachments[{name, size, relationship, inEmbeddedFiles, inAssociatedFiles}], invoiceAttachment, standard, xmlProfile, cii{draf…

NameTypeReqDescription
checkInvoiceboolean–Run the embedded invoice through the Article 226 engine as well (default true when a Cross Industry Invoice is found).
pathstringyesAbsolute path to the PDF on this machine.

No output schema declared.

No examples provided.

extract_pdf_text ~426

Extract the text layer of a local PDF, reflowed into reading order, with 4 documented checks on the result itself. Runs locally; nothing is uploaded. WHAT MAKES THIS WORTH CALLING rather than reading the file yourself: it tells you when the text you got back cannot be trusted. PAGES WITH NO TEXT LAYER are reported by number (summary.scannedPages) instead of coming back as an empty string — an empty string reads as "this page is blank" when the truth is "this page is a scan and has not been read at all". Those pages need OCR first. A TEXT LAYER THAT DECODES TO GIBBERISH is reported too (summary.garbledPages): when a font is embedded without a ToUnicode map the glyphs draw correctly while the characters behind them are private-use codepoints. That output looks like text and will be read as text unless something says otherwise. TRUNCATION IS NEVER SILENT: pass maxChars to bound the output and the result states how many characters were dropped and which pages produced nothing (summary.truncated, summary.omittedPages). A silently shortened extraction is indistinguishable from a short document. DELIBERATE LIMITS, state them when reporting: no table reconstruction and no layout analysis — for tables, multi-column reading order or chart data, a dedicated extraction server does more. What this gives you is the text, the page-level truth about it, and no Python toolchain to install. Returns { pages[{page, text, lines, chars, scanned, garbled, truncatedChars}], text, findings[], summary{pages, chars, scannedPages[], garbledPages[], truncated, omittedPages[], byRule} }.

NameTypeReqDescription
maxCharsnumber–Character budget for the whole result. What gets dropped is reported rather than silently cut.
pagesarray–1-based page numbers to read. Omit for the whole document; a page outside the document is reported, not ignored.
pathstringyesAbsolute path to the PDF on this machine.

No output schema declared.

No examples provided.

fill_pdf_form ~261

Write values into an AcroForm and save to a new file. Never overwrites an existing output. Runs locally; nothing is uploaded. IT CHECKS BEFORE IT WRITES: the same rules as check_pdf_form run against the planned values first, and the write is refused when any of them is an error — an unknown field name, a value outside a dropdown's options, a value past MaxLen. Silently ignoring an unknown field name is how a form goes out with half its answers missing. IT REGENERATES APPEARANCES, which is the step that separates a filled form from a form that merely contains values: without it, some readers and most printers show empty boxes. That is why PFF-008 does not apply to output from this tool. Signature fields are left alone — fill first, sign last, because signing and then changing anything invalidates the signature. Returns { written, path, fieldsFilled, check{...} } or a refusal with the findings that caused it.

NameTypeReqDescription
fillobjectyesField name → value. Names are case-sensitive and fully qualified.
outputstringyesAbsolute path for the filled PDF. Must not already exist.
pathstringyesAbsolute path to the source PDF.

No output schema declared.

No examples provided.

images_to_pdf ~430

Turn local JPEG and PNG files into a PDF, one image per page, against 5 documented layout rules. Never overwrites an existing output. Runs locally; nothing is uploaded. THE LAYOUT DECISIONS ARE STATED RATHER THAN APPLIED SILENTLY. By default an image SMALLER than the page is placed at its own size rather than stretched — enlarging adds pixels and no detail, and asking for it is a deliberate flag (IMP-001). "cover" fitting fills the page and CROPS whatever does not fit, and how much is being cut is reported (IMP-003) because that is right for a photo and wrong for a scanned document. With a fixed paper size, the effective print resolution is computed and flagged below 150 DPI (IMP-004) — the same image is sharp on a small page and soft on a large one. Only JPEG and PNG can go into a PDF directly. Anything else — HEIC, WebP, AVIF, TIFF — is REFUSED with its name rather than converted behind your back (IMP-002); convert it first. pageSize "fit" (the default) makes each page exactly the size of its image, which is what you want for scans and screenshots; "a4" or "letter" chooses orientation per image automatically. Returns { written, path, plan{pages[{name, pageWidth, pageHeight, draw, scale, dpi, cropped, findings[]}], rejected[], summary{...}} }.

NameTypeReqDescription
allowUpscaleboolean–Allow enlarging an image to fill the page. Off by default, deliberately.
fitstring–contain (default) shows the whole image; cover fills the page and crops.
imagesarrayyesAbsolute paths to the images, in the order they should appear.
marginnumber–Margin in points, for fixed paper sizes.
outputstringyesAbsolute path for the PDF. Must not already exist.
pageSizestring–"fit" (default) makes each page the size of its image.

No output schema declared.

No examples provided.

merge_pdfs ~221

Merge PDFs in the given order into `out`. EVERY INPUT IS DIAGNOSED FIRST: missing %PDF header, truncation (no %%EOF — an interrupted download), encryption (/Encrypt — deliberately not processed), damaged cross-reference — each as a numbered PDFI-* finding with a plain-language fix. A file that fails its diagnosis is SKIPPED WITH THE DIAGNOSIS ATTACHED (PDFO-001) and the merge continues with the rest — nothing is silently dropped, and the per-file report says exactly what happened. Relay the diagnosis for skipped files. HONEST LIMITATION: page content, images and fonts survive; document outlines (bookmarks) are not carried over by the engine — say so if the user asks. Returns { summary{requested,merged,skipped,totalPages}, files[{name,inspection,pages?,findings[]}], findings[], wrote }.

NameTypeReqDescription
outstringyesAbsolute path of the merged PDF. Never overwrites.
pathsarrayyesAbsolute paths of the PDFs, in merge order.

No output schema declared.

No examples provided.

organize_pdf ~419

Rewrite a PDF's page sequence: `pages` is the output order (same range language as split_pdf — "3,1-2", "7-", "last"; repeating a page duplicates it, omitting one deletes it), and `rotate` turns pages ("2:90", "1-3:180", "all:90"). Empty `pages` keeps every page in order, so `rotate` alone is a pure rotation pass. ROTATION IS RELATIVE, WHICH MATTERS: scanned pages usually already carry their own /Rotate, and every reader turns them before showing them. "90" here means one quarter turn clockwise FROM HOW THE PAGE CURRENTLY DISPLAYS — a page stored at 270 rotated by 90 comes out at 0, not 90. Tools that set the angle absolutely silently un-rotate scans. Only quarter turns exist in the format; 45 is refused, not rounded. A page that does not exist, or an angle that is not a multiple of 90, REFUSES THE WHOLE PLAN (PDFG-001/003) — in a reorder, a page quietly dropped is invisible in the result. Removing every page is refused too (PDFG-002). HONEST LIMITATION (PDFG-005): page content, images, annotations and form fields are carried over; document outlines (bookmarks) are not. Returns { summary{sourcePages,outputPages,deleted,rotated,duplicated,reordered}, pages[{source,rotation}], inspection, findings[], wrote }.

NameTypeReqDescription
outstringyesAbsolute path of the new PDF. Never overwrites.
pagesstring–Output page order, e.g. "3,1-2" or "1-5,last". Empty = every page in its current order.
pathstringyesAbsolute path of the source PDF.
rotatestring–Relative rotations, e.g. "2:90,5:180" or "all:90". Keys are SOURCE page numbers.

No output schema declared.

No examples provided.

split_pdf ~291

Extract pages from a PDF. RANGE LANGUAGE: "3" is a page, "1-5" a range, "7-" to the end, "-4" from the start, "last" the last page; "1,1" legitimately means two copies. Errors are numbered PDFR-* findings that name the real problem — a backwards range comes back with the swap suggestion, out-of-bounds names the document's true page count. Empty `pages` selects all. THE FILE IS DIAGNOSED FIRST (same PDFI-* structure checks as merge_pdfs); encrypted or truncated files are refused with the diagnosis, not a parser stack trace. MODES: "extract" writes one PDF with the selected pages to `out`; "each" writes one PDF per selected page into `outDir` (named <base>-p<N>.pdf, never overwriting). Returns { summary{sourcePages,selected,outputs}, inspection, findings[], wrote }.

NameTypeReqDescription
modestring–Default "extract".
outstring–extract mode: absolute path of the output PDF.
outDirstring–each mode: absolute directory for the per-page PDFs.
pagesstring–Page selection, e.g. "1-3,5,9-" or "last". Empty = all pages.
pathstringyesAbsolute path of the source PDF.

No output schema declared.

No examples provided.

unlock_pdf ~308

Decrypt a password-protected PDF **with the password provided by the user** and write an unencrypted copy to `out`. HARD POLICY — THIS TOOL NEVER CRACKS OR BYPASSES ANYTHING. It decrypts only with a supplied password; it does not brute-force, guess, or use library options that skip decryption. A PDF may carry two passwords: the one that opens the document, and a permissions ("owner") password that only restricts printing/copying — **both require the password here**, unlike sites that silently strip the second one (that is circumvention). If the user asks you to remove protection without a password, say plainly that this tool will not do it. Never invent, guess or brute-force a password; pass through exactly what the user gave you. OUTPUT IS CLEAN: the underlying library leaves a stale reference to the old encryption dictionary; this tool removes it so the result passes strict structure checks and can be fed to the other PDF tools. Findings: PDFU-001 not encrypted (nothing to do) · PDFU-002 password required · PDFU-003 wrong password · PDFU-004 decrypted · PDFU-005 rebuild failed. Returns { pages?, inspection, findings[], wrote }.

NameTypeReqDescription
outstringyesAbsolute path of the decrypted PDF. Never overwrites.
passwordstringyesThe password that opens the document, exactly as the user supplied it.
pathstringyesAbsolute path of the encrypted PDF.

No output schema declared.

No examples provided.

Common questions

What is the com.yaktool/pdf MCP server?

com.yaktool/pdf is an MCP server listed in the public MCP registry as com.yaktool/pdf. Merge, split, compress, unlock, organize, extract, fill forms and check PDFs, 12 local tools. This page covers its npm package (yaktool-pdf-mcp).

Is the com.yaktool/pdf MCP server safe to use?

com.yaktool/pdf scores 76 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 24 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the com.yaktool/pdf MCP server expose?

com.yaktool/pdf exposes 12 tools: merge_pdfs, split_pdf, compress_pdf, unlock_pdf, organize_pdf, and 7 more. Their descriptions and schemas cost roughly 4,586 tokens of context every time the server is loaded.

Is the com.yaktool/pdf MCP server still maintained?

com.yaktool/pdf is still listed as active in the MCP registry. We last reached this channel on 24 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the com.yaktool/pdf MCP server under?

com.yaktool/pdf declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.