mcp-pdf
Merge, split and fill PDF forms from Claude
MCP server for PDF tools that merge, split, stamp and read PDF files; merges and splits pages on your own machine. Merge, split, stamp and read PDFs, pure JavaScript.
Works with Claude Desktop, Claude Code, Cursor and any Model Context Protocol client. Runs on your own machine, or hosted with no install.
Product page: https://mcp.zovo.one/s/pdf — what it does, the tools it exposes, and a live token endpoint.
Install
Hosted, nothing to install. Get a token from https://mcp.zovo.one/mcp/connect (the connect page) or https://mcp.zovo.one/mcp/token (the same token as JSON); a free anonymous one is issued on the spot and a Pro key works the same way. Then point an MCP client at https://mcp.zovo.one/mcp/pdf over streamable-http and send the token as Authorization: Bearer <token>.
If your client cannot set headers, put the token in the path instead: https://mcp.zovo.one/mcp/pdf/t/<token>. Both forms work. The bare URL with no token answers 401 on tools/call, so the token is not optional.
Claude Desktop, one click. Download pdf.mcpb from the latest release and double-click it.
From source. The mirror is self-contained: every @theluckystrike/* dependency is vendored, so a fresh clone builds with no extra setup.
git clone https://github.com/theluckystrike/mcp-pdf.git
cd mcp-pdf
npm install && npm run buildThen point your client at the built entry point:
{
"mcpServers": {
"pdf": {
"command": "node",
"args": ["/absolute/path/to/mcp-pdf/dist/index.js"]
}
}
}
@theluckystrike/mcp-pdfis not published on npm yet, so annpx -y @theluckystrike/mcp-pdfcommand will fail. The three paths above are the working ones and each is exercised by CI.

Read-only mirror of mcp-servers/servers/pdf. See MIRROR.md.
Say "stamp PAID on that invoice and save a copy" or "pull pages 2 to 6 out of this scan and merge them with the contract" and it happens, on your machine, in a second. This MCP server does the small PDF jobs that otherwise send you to a web uploader: merge, split by page range, extract or reorder pages, rotate a sideways scan, stamp PAID or DRAFT or any text you like, put your business name and VAT id in the footer, count pages across a folder of files, and read a PDF's text back as text. No upload, no account, no native dependency, no office install.
In the official MCP Registry (io.github.theluckystrike/pdf-merge-split-stamp-extract-pages).
Listed on the AI Product Index — live remote endpoint at mcp.zovo.one/s/pdf, free tier, no signup.
The PDF chores of a freelance business, done from chat instead of from a browser tab you do not trust with an invoice.
Related MCP server: pdfeverything
60-second install
npm publish for @theluckystrike/mcp-pdf is pending. Until then, the .mcpb one-click bundle or a clone+build
is the working path, both are verified below.
One-click (.mcpb): download pdf.mcpb from the latest release and double-click it in Claude Desktop:
https://github.com/theluckystrike/mcp-servers/releases/latest
(claude_desktop_config.json):
{
"mcpServers": {
"pdf": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-pdf"]
}
}
}Claude Code:
claude mcp add pdf -- npx -y @theluckystrike/mcp-pdf(.cursor/mcp.json):
{
"mcpServers": {
"pdf": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-pdf"]
}
}
}The npx form above starts working the moment the package is published. Until then, use the .mcpb bundle above, or
build from source with exactly these three commands:
git clone https://github.com/theluckystrike/mcp-servers.git && cd mcp-servers
npm install
npm run build -w packages/mcp-license -w servers/pdfThen point your client's command at node with one arg: the absolute path to servers/pdf/dist/index.js.
To run in Pro mode set MCP_LICENSE_KEY in the same config block, or call license_activate once with your key.
Tools
Tool | What it does |
| Page count, every page's size in points and millimetres, the paper name (A4, Letter, custom), the rotation already on each page, the metadata (title, author, producer, dates) and whether the file is encrypted |
| Page count per file plus the total, for any number of PDFs. A file it cannot read is reported per file; the rest still count |
| Join PDFs into one, in the order given. Page sizes are kept as they are, and a merged file with mixed sizes says so |
| One new file per range. |
| Extract selected pages into one new PDF, in the order you write them. |
| Turn pages by a multiple of 90 degrees, added to the rotation the page already had, which is what a sideways scan needs |
| Draw text on the pages: |
| Your business name and VAT id in the footer of every page, from the shared profile mcp-invoice and mcp-docx write |
| Best-effort text extraction from the page content streams. See the honest caveats below |
| Write a new PDF with the pages in a new order. The order must name every page exactly once, so nothing is dropped by accident |
| Show free or Pro mode |
| Activate a Pro key (verified offline) |
Resource: pdf://recent returns the last 25 operations, newest first, with the inputs, the files written and when.
Prompt: mark_invoice_paid chains mcp-invoice's invoice_get into pdf_stamp PAID and saves the stamped copy beside the original.
What you can say
You say | Tool |
"Mark invoice INV-2026-0007 as paid." |
|
"Stamp DRAFT across this contract before I send it." |
|
"Join these three PDFs into one file." |
|
"Split the scan: pages 1-3 are the invoice, 4 onwards is the receipt." |
|
"Pull pages 2 to 6 out of this and save them separately." |
|
"This scan is sideways, turn it." |
|
"How many pages are in all of these?" |
|
"What does page 1 of this PDF say?" |
|
"Put my company name and VAT number in the footer." |
|
"Move the cover page to the front." |
|
Worked example
You: Stamp PAID on ~/invoices/INV-2026-0007.pdf and save a copy.
pdf_stamp {
path: "~/invoices/INV-2026-0007.pdf",
text: "PAID",
position: "center",
out_path: "~/invoices/INV-2026-0007-paid.pdf"
}
-> Stamped "PAID" on 1 page
-> ~/invoices/INV-2026-0007-paid.pdf, 0.9 MBThe stamp is drawn text, not a flattened image: it can be selected and searched, it is drawn on the 45-degree diagonal in the preset green, and the original file is byte-for-byte unchanged.
Free vs Pro
Free | Pro | |
| Unlimited | Unlimited |
| Up to 5 files per call | Any number of files |
| Files up to 30 pages | Any length |
| The | Any text, any colour, any size |
| - | Your business name and VAT id in the footer |
| - | Yes |
A tier limit is an answer, not an error, and nothing is written when one refuses a call.
Pro is a one-time $19, or $39 for every server in the collection, lifetime.
pdf_text is best effort, and here is exactly what that means
A PDF does not store text. It stores drawing operators, and the text you see is bytes handed to a font. This server
decompresses each page's FlateDecode content stream with node:zlib and reads the four text-showing operators --
Tj, TJ, ' and ", plus the positioning operators that end a line. That is a parser written here, in about
two hundred lines, with no pdfjs and no native module, and it has three real limits the tool states in its own
answer every time:
A scan has no text. An image-only page carries no text operators, so nothing comes back. There is no OCR here and there will not be one; the answer says the page is probably a scan rather than returning an empty string with no explanation.
A custom or CID encoding returns glyph indices, not letters. Subset-embedded and CJK fonts map bytes to glyph numbers through a table this parser does not read. When the output has no readable characters, the answer says the font is the reason.
Reading order is drawing order. There is no column detection and no layout reconstruction. Word spaces are recovered from the large negative kerns a
TJarray uses for them, so a PDF that positions every word separately can come back with words run together.
PDFs written by word processors, invoicing tools and report generators, everything with a standard or fully embedded font, read back cleanly. Anything else tells you why it did not.
Encrypted PDFs are refused, not guessed
pdf-lib cannot decrypt, and loading an encrypted file while ignoring the encryption produces pages of garbage that
would be written straight into the output. So a file whose trailer names an /Encrypt dictionary is refused by every
tool that writes, with the reason and the fix in the message: open it in a reader with the password, export or print
to a new PDF, and use that file. pdf_info still answers, with encrypted: true, because reporting is its whole job,
and pdf_count reports it as one unreadable file while still counting the rest.
Existing files are never overwritten, and inputs are never modified
Every tool writes a new file and leaves its inputs byte-for-byte alone, there is no in-place mode, on purpose.
An out_path that already exists is refused:
Error: /path/merged.pdf already exists and nothing was written.
Pass overwrite: true to replace it, or give a different out_path.The path is reserved with an exclusive create, not an existence check, so two processes writing the same out_path
at the same time cannot clobber each other: one wins, the other is refused and writes nothing. pdf_split reserves
every one of its output paths before it writes any of them, so a collision on part 3 does not leave parts 1 and 2
behind as a half-done split, and the reservations are released, so nothing empty is left on disk either.
Pass overwrite: true when replacing the file is what you want.
overwrite: true still does not let an output be an input. Writing the result of an operation back over one of its
own sources destroys that source, the pages are already in memory and get written over the file they came from,
which takes a three-page file to the one page you extracted, and every later read of that path is then quietly
wrong. So an out_path that resolves to (or shares an inode with) any input of the same call is refused before any
work happens:
Error: out_path /path/scan.pdf is also an input of this operation, so writing it would destroy the source.
Nothing was written. Write beside it instead - /path/scan-out.pdf - and, if the result really is meant to
take the original's place, rename it yourself once you have checked it.Limits
Inputs over 100 MB are refused: rewriting a PDF needs several times its size in memory.
A file that does not start with
%PDF-is refused before anything is read.Rotation is recorded as page metadata, in multiples of 90 degrees, which is all the format has. Nothing is redrawn.
Stamp text goes through a built-in PDF font, which carries WinAnsi and its 256 code points. A character outside it is transliterated where it has an obvious Latin body, Polish
OPŁACONEstamps asOPLACONE, and the answer says so and prints what was actually drawn, and removed and counted where it does not, so there is no CJK stamp. A newline is a word separator, never a deletion.font_sizemust be between 1 and 1600 points. A stamp too long to fit even at the smallest size this server will use is still drawn, and the answer says how far past the edge it runs, so you can shorten it.pdf_textcaps one answer at 200,000 characters and names thepagesargument that continues from where it stopped. Nothing is missing from the file; the cut is in the answer, not the read.No page numbering, no signatures, no redaction, no compression. This server does the page-level jobs; it is not a PDF editor. It does not write PDF/A:
pdf_inforeports a file's ownpdfa_claim, and every tool that writes says plainly that its output no longer holds that claim.Forms are read, not filled:
pdf_textprints the AcroForm field values, which live in the fields rather than in the page content stream and are therefore not part of the page text.No OCR. See the
pdf_textsection.
How it stores data
Only a register of what it did: ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/pdf/operations.json, the last 500
operations, as plain JSON. Your PDFs stay where you put them. Every write to the register runs inside an advisory
lock on .../pdf/.lock, so two clients on one data directory cannot lose a record, and saves go to a temporary file
and are renamed into place.
If the register is unreadable or not valid JSON it is never treated as "empty": it is moved aside byte-for-byte as
operations.json.corrupt-<timestamp> with a marker beside it. The PDF you asked for is still written, the file is
on disk before the register is touched, and the answer tells you the history could not be updated.
The business footer reads the one shared profile the whole suite uses,
${XDG_DATA_HOME:-~/.local/share}/mcp-servers/profile/business.json, written by business_set in mcp-invoice or
mcp-docx. Nothing is invented: with no name stored, pdf_watermark_business refuses and says which tool to run.
Privacy
All data stays local. The server reads and writes files on your machine and makes no network request of any kind -- not for licensing (keys are verified offline), not for fonts, not for telemetry. A PDF you stamp is never uploaded anywhere, which is the entire reason this exists.
Pairs with
mcp-invoice, the invoice you sent, stamped PAID: the
mark_invoice_paidprompt chainsinvoice_getintopdf_stamp.mcp-docx, write the proposal as
.docx, print it to PDF, then stamp, merge or split it here.mcp-resume, join a CV, a cover letter and a portfolio into the one file an application form accepts.
office-suite, several servers behind one install, one config entry.
Troubleshooting
npxhangs or fails to find the package: npm publish for this package is pending. Use the.mcpbbundle or the clone-and-build path above until it lands."is encrypted and was refused": the file is password or permissions protected. Open it in a PDF reader, export or print to a new PDF, and run the tool on that copy. This server never guesses or strips a password.
pdf_textreturned nothing: the page is a scan, or its font uses a custom encoding. The answer says which. There is no OCR here.The stamp is too small or too big: by default it is sized to fit the page width. Pass
font_sizefor an exact point size, andopacitybetween 0 and 1."already exists and nothing was written": pass
overwrite: true, or a differentout_path.Node version: requires Node >= 18. Check with
node -v.
MIT licensed. Support: support@zovo.one
Built by theluckystrike.
Frequently asked questions
Is there an MCP server to merge and split PDFs?
Yes. The pdf server at mcp.zovo.one merges, splits, rotates and fills PDF forms while preserving form fields. Free tier of 30 pages per file on split/pages/rotate operations, hosted remote endpoint, no install.
Can Claude fill PDF forms with an MCP server?
Yes — connect https://mcp.zovo.one/mcp/pdf and ask Claude to fill a form's fields or merge several PDFs. Output stays form-preserving, so filled fields remain editable.
Use these docs as an MCP server
Any MCP client (Claude, Cursor, Windsurf, VS Code) can read this repository's documentation directly via GitMCP — no install:
Docs MCP URL: https://gitmcp.io/theluckystrike/mcp-pdf
Available Tools
12 toolslicense_activateActivate licenseA
Activate a Pro key (MCPL1.xxx.yyy) from checkout: verified offline against a built-in public key, saved to your config file. A wrong, malformed or expired key is refused, unsaved. license_status reads it back.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | License key from the checkout confirmation page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that verification happens offline against a built-in public key, that the key is persisted to the config file, and that invalid keys are refused and left unsaved. This is substantial transparency for an activation tool, though it could mention overwriting an existing key or the exact return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence front-loads the main action, source, verification method, and persistence. The second sentence efficiently covers error handling and points to the related read-back tool. Every clause adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single-parameter tool with no output schema and no annotations, the description covers activation behavior, verification mechanism, persistence, error outcomes, and how to read the result later. The only minor gap is an explicit statement of what the function returns upon success or failure, but the phrase 'refused, unsaved' implies a feedback mechanism. Overall, it is sufficiently complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the 'key' parameter at 100% coverage, so the baseline is 3. The description adds meaningful semantics by giving the concrete key format ('MCPL1.xxx.yyy'), confirming the key comes from the checkout page, and explaining that malformed or expired keys will be rejected. This goes beyond the schema's one-line description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Activate a Pro key'), the exact key format ('MCPL1.xxx.yyy'), the source ('from checkout'), and the core mechanism ('verified offline against a built-in public key'). It also differentiates itself from the sibling license_status by noting that license_status reads the activation back, so there is no ambiguity about which tool does what.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this when you have a Pro key from checkout that needs to be activated. It also points to license_status as the read-back tool, which implies when to use a related sibling. It does not explicitly spell out 'do not use for checking status' or list other alternatives, but the context is strong enough to avoid misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
license_statusLicense statusA
Report this server's licence state: product, tier free or pro, licence id, expiry, the key source and the upgrade URL. No arguments, no network. Explains a free-tier refusal; license_activate installs a key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden of behavioral disclosure. It discloses that the call is local ('no network') and argument-free, and it mentions a specific explanatory behavior. The word 'Report' implies read-only, though it does not explicitly state non-destructive or permission requirements; this is adequate for a status command.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence lists the output fields; the second adds constraints and the sibling pointer. Every clause contributes meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool with no output schema, the description lists the expected output fields, behavioral constraints, and the relevant alternative tool. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters and the description reinforces this with 'No arguments'. It adds value by listing the reported fields, helping an agent understand what the empty input will yield. The baseline for zero-parameter tools is high, and the description meets it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Report'), a clear resource ('this server's licence state'), and enumerates the exact fields returned. It also names the sibling 'license_activate' as the tool that does something different, so an agent can distinguish them immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage constraints: no arguments, no network, and explains a free-tier refusal. It also directs the agent to license_activate when the task is to install a key, serving as an explicit pointer to the relevant alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_countCount pages in several PDFsB
Page count per file plus the total, for any number of PDFs, with how many were readable. A file that cannot be read is reported on its own row and the others still count. Read-only. Free and unlimited.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Paths to the PDF files |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description asserts 'Read-only', but the annotations declare readOnlyHint=false (and idempotentHint=false). A page count is inherently a safe, idempotent read, so the annotation flag contradicts the stated behavior and could mislead an agent about safety/idempotency. The otherwise useful failure semantics ('a file that cannot be read is reported on its own row') cannot rescue a direct contradiction with structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the primary output ('page count per file plus the total'), then error semantics, then cost. Every clause carries information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates well by describing return values (per-file counts, total, readable count) and partial-failure behavior. The main gap is the contradiction with readOnlyHint rather than missing content, plus no note on path resolution or how unreadable files are surfaced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (paths) with 100% schema description coverage, so the schema fully documents it (array of file paths, minItems 1). The description corroborates multiplicity ('any number of PDFs') and implies an array, but adds no path syntax, glob, or ordering detail beyond the schema. Baseline 3 for full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (count pages) and resource (PDFs), and even specifies the output shape: per-file count plus total plus readable count. It differentiates itself from single-file siblings like pdf_info and pdf_pages by emphasizing batch scope ('for any number of PDFs'), though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'For any number of PDFs' implies the batch use case, and the description hints this is free/unlimited so there's no reason to batch conservatively. But there is no explicit when-to-use vs. alternatives (pdf_info, pdf_pages) and no exclusions or prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_infoInspect a PDFB
Call this tool to inspect a PDF: page count, page sizes in points/mm, paper name, metadata (title, author, producer, dates) and whether it is encrypted. Read-only, never modifies the file. Free tier: unlimited.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the PDF file. ~ is expanded; a relative path is resolved against the working directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description asserts 'Read-only, never modifies the file', while the annotations declare readOnlyHint=false, which explicitly marks the tool as not a read-only operation. This is a direct conflict between the prose and the structured safety metadata, so per the rubric the score is 1 and the contradiction is flagged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with an enumerated return list; nothing is padded. The leading 'Call this tool to' is mild filler, but the payload arrives immediately and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly carries the return-value burden and enumerates the fields an agent will receive, which is the key requirement here. It does not state behavior for malformed or password-protected files, leaving a small gap for a single-parameter inspection tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter and schema description coverage is 100%, so the schema already documents the 'path' argument including tilde expansion and relative-path resolution. The description adds nothing further about the parameter, which is the expected baseline when the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (inspect a PDF) and enumerates exactly what the inspection yields: page count, page sizes in points/mm, paper name, metadata fields, and encryption state. That enumeration implicitly separates it from pdf_count, pdf_pages, and pdf_text, but no sibling is named explicitly, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The opening imperative 'Call this tool to inspect a PDF' implies the usage context but offers no when-not guidance and no routing against near-siblings such as pdf_count, pdf_pages or pdf_text. The 'Free tier: unlimited' note is useful operational context but is not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_mergeMerge PDFs into one fileA
Call this tool to join several PDFs into one, in the order given. Page sizes are kept as-is, so a merged file may have mixed sizes, and the answer says so. Inputs are never modified. Free tier: up to 5 files per merge.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | The PDFs to join, in the order they should appear | |
| out_path | Yes | Where to write the merged PDF | |
| overwrite | No | Replace out_path if a file is already there. Default false: an existing file is never overwritten |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond annotations: inputs are never modified, page sizes are kept as-is (mixed sizes possible), and the result reports that. Free-tier cap of 5 files is disclosed. Annotations already state destructiveHint=false and readOnlyHint=false; description reinforces the non-destructive behavior of inputs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: action and ordering first, then output behavior (mixed sizes), then input safety and limit. Zero waste and well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers action, ordering, output quirk (mixed page sizes), input immutability, and a service limit. No output schema exists, but the description says the answer reports page-size mixing. Missing explicit overwrite guidance, though the schema covers it fully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so paths, out_path, and overwrite are already documented with semantics including default false for overwrite. The description only mentions ordering of inputs, which duplicates the paths description. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (join/merge) and resource (PDFs) with the ordering scope ('in the order given'). An agent can distinguish it from pdf_split, pdf_reorder, and other pdf_* siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage ('join several PDFs into one') but offers no explicit when-to-use vs alternatives like pdf_reorder or pdf_split. The free-tier limit is a useful constraint but not a usage routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_pagesExtract pages into a new PDFA
Call this tool to pull selected pages into one new PDF, in the order written: "2,4-6" gives four pages. Asking for a page twice copies it twice. The input is never modified. Free tier: files up to 30 pages.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The source PDF | |
| pages | Yes | 1-based pages and ranges to keep, in output order, e.g. "2,4-6" or "5,1,1" | |
| out_path | Yes | Where to write the extracted PDF | |
| overwrite | No | Replace out_path if it exists. Default false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context beyond the annotations: the input PDF is never modified, duplicate page requests produce duplicate pages, and free-tier files are limited to 30 pages. It does not contradict the annotations, though it leaves overwrite/failure behavior to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action and immediately followed by the most important edge cases. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations and 100% schema coverage, the description covers purpose, page-order semantics, duplicate behavior, input immutability, and tier limits. It omits return/output details, but no output schema exists and the write behavior is already well documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by clarifying that asking for the same page twice copies it twice, which is not explicit in the schema's example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: pull selected pages into one new PDF. The phrase 'in the order written' and the duplicate-page example distinguish it from merge, split, and reorder siblings without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case by saying 'Call this tool to pull selected pages into one new PDF' and gives a free-tier size limit, but it does not explicitly say when to use this tool versus siblings such as pdf_split, pdf_merge, or pdf_reorder.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_reorderReorder the pages of a PDFA
Call this tool to write a new PDF with pages in the order you give. The order must name every page exactly once, so nothing drops by accident; use pdf_pages for a subset. Pro.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The source PDF | |
| order | Yes | The 1-based page numbers in their new order, e.g. [3,1,2] for a three-page file. Every page must appear exactly once | |
| out_path | Yes | Where to write the reordered PDF | |
| overwrite | No | Replace out_path if it exists. Default false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, so the safety profile is covered. The description adds the validation rule ('name every page exactly once, so nothing drops by accident') and a cryptic 'Pro.' marker suggesting a plan requirement, but says nothing about overwrite semantics or that the source file is untouched.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the action front-loaded and the key constraint immediately after. The trailing 'Pro.' is terse to the point of being unclear, and 'Call this tool to' is minor filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter write tool with no output schema, the description covers purpose, the critical validation constraint, and the sibling to use instead. Only the overwrite/file-clobbering behavior and any permission requirements are left implicit, and those are partly handled by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter (path, order, out_path, overwrite) is documented in the schema itself. The description's mention of the order constraint duplicates the schema text and adds no new syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('write a new PDF with pages in the order you give'), which is clearly distinct from pdf_pages/pdf_split. It does not differentiate itself from the other PDF writers (pdf_merge, pdf_rotate), but the core action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative explicitly: 'use pdf_pages for a subset', giving a clear when-not condition. No exclusion guidance relative to pdf_merge or pdf_rotate, so it stops short of a full routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_rotateRotate pagesA
Call this tool to turn pages by a multiple of 90 degrees, clockwise for positive. Rotation is added to whatever the page already had, for a sideways scan. Writes a new file. Free tier: files up to 30 pages.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The source PDF | |
| pages | No | Which pages to turn, e.g. "1" or "2,4-6". Omit for every page | |
| degrees | Yes | 90, 180, 270 or -90. Positive turns clockwise. Added to the page's existing rotation | |
| out_path | Yes | Where to write the rotated PDF | |
| overwrite | No | Replace out_path if it exists. Default false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly=false, destructive=false), and the description adds genuinely useful behavior: rotation is additive to existing page rotation and a new file is written rather than in-place editing. It also discloses a 'Free tier: files up to 30 pages' operational limit, which structured fields do not capture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences with the core action front-loaded and the tier limit placed last. The opening 'Call this tool to' is mild filler, but there is no real waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param mutation tool with no output schema, the description covers the essentials an agent needs: additive rotation behavior, new-file output, and a free-tier size cap. Page-range and overwrite semantics live in the schema, which is acceptable at full coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters are already documented, including the additive-rotation note and the 90/180/270/-90 values. The description largely restates those semantics (multiple-of-90, clockwise-for-positive) rather than adding new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('turn pages by a multiple of 90 degrees') and even clarifies the direction convention. However, it never distinguishes itself from the many pdf_* siblings (pdf_reorder, pdf_stamp, pdf_pages), so an agent must infer the difference on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied via the phrase 'for a sideways scan.' There is no explicit when-to-use, no when-not-to-use, and no named alternative among the large pdf_* family, leaving selection guidance thin.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_splitSplit a PDF into several filesA
Call this tool to write one new PDF per range. Ranges are 1-based and may be open-ended: "1-3,5,7-" gives pages 1-3, page 5, and 7 to the end. The input is never modified. Free tier: files up to 30 pages.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The PDF to split | |
| ranges | Yes | Comma-separated 1-based page ranges, e.g. "1-3,5,7-". An open-ended range runs to the last page | |
| overwrite | No | Replace existing outputs. Default false: nothing is overwritten and nothing is written at all if any target exists | |
| out_path_pattern | Yes | Output path with a placeholder: {n} is the part number (1, 2, 3...), {range} is the range itself (e.g. 1-3), {name} is the input file name without .pdf. Example: ~/out/{name}-{range}.pdf |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint=false and destructiveHint=false, the description usefully adds that 'the input is never modified' and discloses a free-tier limit of 30 pages, which are real operational constraints not present in the structured fields. It stops short of describing the return value or how partial failures across multiple output files are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and immediately followed by the range semantics and the safety guarantee. No filler, though the range example duplicates the schema verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the operation, range syntax, non-destructiveness of the input, and a tier limit, but with no output schema and four parameters it never says what the tool returns (e.g., the list of written file paths) or how the {n}/{range}/{name} pattern interacts with multiple ranges. Adequate but with a visible gap for a multi-file write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the ranges format already fully documented in the schema and says nothing about out_path_pattern or overwrite, so it adds no meaning beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and outcome: 'write one new PDF per range', which clearly identifies a split operation on a PDF resource. An agent can distinguish it from read-oriented siblings like pdf_text or pdf_info, though it never explicitly contrasts itself with pdf_merge (the other multi-file write tool).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb ('Call this tool to write one new PDF per range') and the description supplies a concrete range syntax example, but there is no when-to-use vs when-not guidance and no alternative named among the many pdf_* siblings. The free-tier note hints at a scope boundary but not a routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_stampStamp text on a PDFA
Call this tool to draw a word such as PAID or DRAFT across the pages, in a colour and position you choose. Writes a new file; input untouched. Free tier: the PAID and DRAFT presets in their preset colours.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The source PDF | |
| text | Yes | What to stamp. PAID and DRAFT are presets with their own colour; any other text is Pro | |
| color | No | Hex code such as #1b7f3b, or a name: red, green, blue, black, gray, orange, purple. Pro | |
| pages | No | Which pages to stamp, e.g. "1" or "2,4-6". Omit for every page | |
| opacity | No | 0 to 1. Default 0.35 in the centre, 0.85 in a corner | |
| out_path | Yes | Where to write the stamped PDF | |
| position | No | Where on the page. Default center, which is drawn on the 45-degree diagonal like a real stamp | |
| font_size | No | Point size. By default the stamp is sized to fit the page width | |
| overwrite | No | Replace out_path if it exists. Default false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the agent knows it writes without destroying. The description adds valuable context beyond annotations: it writes a new file, leaves the input untouched, and restricts free-tier use to the PAID and DRAFT presets in preset colours. This is strong transparency, though it omits overwrite and output details covered in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and followed by write behavior and tier limits. Every sentence earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core action, the write-to-new-file behavior, input preservation, and free-tier limits, which is sufficient given 100% schema coverage for parameters. It does not explain the output/return or overwrite edge case, but with no output schema and overwrite documented in the schema, these are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines all nine parameters, including text presets, colour, pages, opacity, position, font size, and overwrite. The description adds only a general reference to 'colour and position you choose' and repeats the free-tier preset constraint for text/colour, which is already in the schema. Baseline 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('draw a word such as PAID or DRAFT across the pages') and resource (PDF pages), with concrete examples of the stamped text. It is clear what the tool does, though it does not explicitly distinguish itself from the sibling pdf_watermark_business, so sibling differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description only says 'Call this tool to draw a word...' but gives no when-to-use conditions, no when-not-to-use, and no alternatives (e.g., pdf_watermark_business). Usage is implied by the purpose, but explicit guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_textRead the text of a PDFARead-onlyIdempotent
Call this tool for best-effort text extraction from standard-font PDFs. Returns nothing for a scan (no OCR), or glyph indices for a custom-encoded font, and says which case applies. Read-only. Free tier: unlimited.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The PDF to read | |
| pages | No | Which pages, e.g. "1" or "2,4-6". Omit for every page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive and closed-world, but the description adds genuinely new behavioral context: scans yield nothing, custom-encoded fonts yield glyph indices, and the tool reports which case occurred. It also discloses a 'Free tier: unlimited' cost/quota trait the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core purpose and the failure modes immediately after; nothing is padded. The 'Read-only' clause is mildly redundant with readOnlyHint=true, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does explain the two degraded outcomes and that the tool signals which applies. It does not describe the shape of a normal successful return (e.g., plain concatenated text vs. per-page), leaving a modest gap for a read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two simple parameters (path, pages) fully documented in the schema, including the page-range syntax. The description adds no additional parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('best-effort text extraction from standard-font PDFs'), and the scoping to standard-font PDFs separates it from generic PDF siblings such as pdf_info, pdf_pages, and pdf_merge. An agent can select it over those without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage condition ('for best-effort text extraction from standard-font PDFs') and effectively rules out scanned documents ('Returns nothing for a scan (no OCR)'), which functions as a when-not-to-use signal. It stops short of naming an alternative tool (e.g., for OCR or metadata), so it is not a full routing directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_watermark_businessStamp your business details in the footerB
Call this tool to put your business name and VAT id in the footer of every page, from the shared profile mcp-invoice and mcp-docx write. Use it before sending a document out. Pro.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The source PDF | |
| pages | No | Which pages, e.g. "1". Omit for every page | |
| out_path | Yes | Where to write the footed PDF | |
| overwrite | No | Replace out_path if it exists. Default false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the agent knows this is a non-destructive write. The description adds that the footer content is drawn from a shared profile, which is genuinely useful context, but it says nothing about the non-idempotent overwrite behavior or what happens to an existing out_path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short, but the middle clause "from the shared profile mcp-invoice and mcp-docx write" is garbled and hard to parse, and the trailing "Pro." is a dangling fragment that does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter write tool with annotations covering safety and no output schema, the description is barely adequate. The garbled profile clause leaves ambiguity about where the business details originate, which an agent would need clarified before invoking it reliably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters including pages and overwrite are already documented in the schema. The description adds no syntax or format detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: putting business name and VAT id into the footer of every page. An agent can identify the operation clearly, though it never differentiates itself from the sibling pdf_stamp, which plausibly does overlapping work.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use it before sending a document out" gives a timing cue, which is useful implied usage. However, it names no alternative and no when-not condition, and the fragmented clause about the shared profile does not clarify routing against siblings like pdf_stamp.
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.
12 tool updates
v0.1.0- First observed
license_activate - First observed
license_status - First observed
pdf_count - First observed
pdf_info - First observed
pdf_merge - First observed
pdf_pages - First observed
pdf_reorder - First observed
pdf_rotate - First observed
pdf_split - First observed
pdf_stamp - First observed
pdf_text - First observed
pdf_watermark_business
TDQS
Scored across 12 tools
Each tool has a clearly distinct role: inspection/counting, extraction, and specific output-producing PDF operations. The potentially overlapping trio pdf_split, pdf_pages, and pdf_reorder is explicitly differentiated by descriptions (ranges vs subset vs full-page permutation). License tools are also cleanly separated from PDF content tools.
Names are consistently snake_case and use recognizable prefixes: pdf_ for document tools and license_ for licensing. The only minor inconsistency is that some suffixes are nouns (pdf_info, pdf_pages) while others are verbs (pdf_merge, pdf_rotate), but the pattern remains readable and predictable.
Twelve tools are well-scoped for a PDF utility server, with each tool covering a meaningful operation. The two license-related tools support the product tiering without bloating the surface.
The set covers core PDF workflows: inspection, counting, text extraction, merge, split, page selection, rotation, stamping, watermarking, and reordering. Minor gaps remain, such as OCR/scan text recovery, metadata editing, or compression, but agents can work around most of these for common tasks.
Maintenance
Related MCP Connectors
Merge, split, extract, rotate, reorder and stamp PDF pages from your AI chat, all offline.
Merge, split, extract, rotate, reorder and stamp PDF pages from your AI chat, all offline.
Merge, split, extract, rotate, reorder and stamp PDF pages from your AI chat, all offline.
Privacy-first PDF tools over MCP: merge, split, rotate, delete, compress, protect, inspect.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceThe local PDF workflow for Claude Desktop and MCP hosts: fill, sign, merge, split, extract, and analyze PDFs without sending files to a web app.0158MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to perform 13 PDF operations (merge, split, compress, watermark, encrypt, and more) on local files via MCP.3-
- AlicenseNot gradedqualityAmaintenanceA local MCP server that lets Claude, Cursor, Codex, or any MCP client work with Office documents on your Mac: evaluate spreadsheet formulas, read/write XLSX and PPTX, extract structured DOCX content, and merge/split/protect PDFs. 100% local, no network calls, no account. 14 tools.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to edit text inside real PDF files in place while preserving fonts and layout, with a before/after preview. Also supports compressing, merging, splitting, converting, translating, generating and querying PDFs through a hosted remote MCP endpoint.MIT