pdfops-mcp
MCP server that gives AI agents deterministic PDF tools, backed by the PDFops API: inspect AcroForm fields, fill forms, merge PDFs, generate invoices, and edit PDFs (extract, delete, rotate and split pages, watermark, page numbers, unlock, protect, metadata) — no Chromium, no native deps, nothing to host.
Beside a local agent, tools operate on file paths, so PDF bytes never transit the model context: your agent says "fill /tmp/form.pdf and save to /tmp/out.pdf" and gets a one-line confirmation back. Every PDF input also accepts an https:// URL or a data:application/pdf;base64,… URI, and every output can be returned inline instead of written — which is what makes the server work on hosted runtimes (see below).
Install
Claude Code
claude mcp add pdfops -- npx -y pdfops-mcp
# with a key:
claude mcp add pdfops -e PDFOPS_API_KEY=pdfops_live_… -- npx -y pdfops-mcp
Claude Desktop (claude_desktop_config.json) / Cursor (.cursor/mcp.json)
{
"mcpServers": {
"pdfops": {
"command": "npx",
"args": ["-y", "pdfops-mcp"],
"env": { "PDFOPS_API_KEY": "pdfops_live_…" }
}
}
}
VS Code (.vscode/mcp.json, note the servers key and type)
{
"servers": {
"pdfops": {
"type": "stdio",
"command": "npx",
"args": ["-y", "pdfops-mcp"],
"env": { "PDFOPS_API_KEY": "pdfops_live_…" }
}
}
}
Any other stdio client (Windsurf, Cline, Zed, your own agent): command npx, args -y pdfops-mcp. Per-client walkthrough and a real tool-call transcript: pdfops.dev/mcp.
PDFOPS_API_KEY is optional — without it you get the keyless trial (100 requests/IP/month). A free key (250/month, no card) takes one field at pdfops.dev/pricing.
File access is confined. The server reads and writes only .pdf files inside PDFOPS_ROOT, which defaults to the directory the client starts it in (your home directory if that is /). Set it to the folder(s) holding your PDFs, separated by : (; on Windows), e.g. -e PDFOPS_ROOT=$HOME/Documents/forms. Inputs must start with a %PDF header, symlinks are resolved before the check, and URLs must be public https:// addresses (private, loopback and cloud-metadata hosts are refused on every redirect hop). Since 0.4.2.
Tools
| Tool | What it does |
|---|---|
pdf_inspect | List a PDF's form fields (names, types, options, values) + a paste-ready fill template. Call first on unfamiliar PDFs. |
pdf_fill | Fill AcroForm fields → write the filled PDF. Optional flatten bakes values in and drops the form; optional password opens a user-password PDF. |
pdf_merge | Merge ≥2 PDFs in order → write the result. |
pdf_invoice | Structured data → complete invoice PDF. Deterministic: same input, byte-identical output. |
pdf_extract_pages | Keep only the listed pages, in the order given (also reorders and duplicates) → write the result. |
pdf_delete_pages | Remove the listed pages, keep the rest in order → write the result. |
pdf_rotate | Rotate pages clockwise by 90, 180, 270 or -90 degrees; all pages unless pages is given. |
pdf_split | Split into several PDFs by ranges or fixed-size every chunks → part-1.pdf, part-2.pdf, … in output_dir, or inline. |
pdf_watermark | Stamp a diagonal text watermark (opacity, size, colour, position, page selection). |
pdf_page_numbers | Print page numbers from a {n} / {total} template, with position, start number and margin. |
pdf_unlock | Save without encryption so print/copy restrictions are gone. Does not crack unknown passwords. |
pdf_protect | Encrypt with a user and/or owner password and a list of allowed permissions. |
pdf_metadata | Read page count, per-page sizes and rotation, title/author/dates, encryption flag and form field count. |
pdf_set_metadata | Write title, author, subject, creator and keywords. |
pdfops_usage | Quota check for the configured key. |
Hosted endpoint (no install)
PDFops also runs this server for you at https://pdfops.dev/api/mcp (Streamable HTTP). It works without a key (keyless trial cap of 100 calls/IP/month); a free key from https://pdfops.dev/pricing#free-key raises the cap:
claude mcp add --transport http pdfops https://pdfops.dev/api/mcp
# with a key:
claude mcp add --transport http pdfops https://pdfops.dev/api/mcp --header "Authorization: Bearer $PDFOPS_API_KEY"
Sources must be https:// URLs or data: URIs, and results come back inline. Setup for Cursor and VS Code: https://pdfops.dev/mcp#remote.
Running remotely (Smithery, Glama hosted, cloud IDE gateways)
A hosted MCP runtime executes this server on a machine where your agent's file paths do not exist. Nothing changes in the config — pass sources the server can reach and skip output_path:
- Inputs (
pdf_path,pdf_paths): anhttps://URL the server can fetch (≤4 MB per PDF, ≤4.5 MB per request — the API's limits), or adata:application/pdf;base64,…URI for small files. - Outputs: omit
output_pathand the PDF-producing tools (pdf_fill,pdf_merge,pdf_invoice,pdf_rotate, …) return the PDF inline as an embeddedapplication/pdfresource (pdfops://filled.pdf, …) that the client saves. Withoutput_pathset, the file is written where the server runs.
Locally, absolute paths keep working exactly as before and remain the recommended form — bytes stay off the model context.
Example prompts
- "What fields does ~/forms/fw9.pdf have?" →
pdf_inspect - "Fill ~/forms/fw9.pdf for Ada Lovelace, 12 Analytical Way, London; save it flattened as ~/out/w9-ada.pdf" →
pdf_inspect, thenpdf_fillwithflatten: true - "Fill the onboarding form once per row of contractors.csv into ~/out/" → one
pdf_inspect, thenpdf_fillper row - "Merge ~/out/w9-ada.pdf, ~/docs/nda.pdf and ~/docs/cover.pdf into one packet, cover first" →
pdf_merge - "Invoice Globex for 3 days of consulting at $650, 8.5% tax, due in 30 days" →
pdf_invoice - "Drop pages 1-2 of ~/docs/scan.pdf and rotate the rest 90 degrees" →
pdf_delete_pages, thenpdf_rotate - "Split ~/docs/report.pdf into 10-page chunks in ~/out/" →
pdf_splitwithevery: 10,output_dir - "How many PDFops requests do I have left this month?" →
pdfops_usage
Example agent flow
"Fill the W-9 template at ~/docs/w9.pdf for Ada Lovelace and merge it with ~/docs/cover.pdf"
pdf_inspect→ discovers field names + fill templatepdf_fill→ writes the filled W-9pdf_merge→ writes the combined packet
Links
API docs: pdfops.dev/docs · OpenAPI: pdfops.dev/openapi.json · Typed client: pdfops-sdk · Questions: hello@pdfops.dev
Privacy Policy
This server runs on your machine and sends only what a tool call needs to the PDFops API (https://pdfops.dev): the PDF bytes you point it at, the field values you supply, and your API key if you set one. PDFops processes the request in memory and returns the result; it does not store your documents. API requests are logged with usage metadata to run quotas and the service. The full policy is at https://pdfops.dev/privacy. Questions: hello@pdfops.dev.
MIT © PDFops