
Security News
vlt 1.5.0 Adds Agent Skills Management
vlt 1.5.0 links skills from JavaScript dependencies to coding agents, with lockfile versioning and Socket data to filter out known malicious packages.
@niubai/pdfedit-mcp
Advanced tools
MCP server for the PDF Edit API: replace, redact, insert and read text in existing PDFs.
@niubai/pdfedit-mcp — edit existing PDFs from your agentFive MCP tools over the PDF Edit API: replace, delete, redact, insert and form-fill text inside a PDF that already exists, keeping the original font, the original layout and everything you did not point at. Not "generate a new PDF that looks similar" — the same file, with the words you named changed, and a before/after picture of every change.
With
PDFEDIT_BASE_URLunset the server talks to the hosted API athttps://api.niubai.vip; set it to point at another deployment.
Without PDFEDIT_API_KEY the server runs on the keyless free tier: 20 pages a day
per IP, outputs watermarked TEST, local files included.
Claude Code
claude mcp add pdfedit -- npx -y @niubai/pdfedit-mcp
Cursor / VS Code / Claude Desktop — this server entry (or the buttons on the repository page):
{ "pdfedit": { "command": "npx", "args": ["-y", "@niubai/pdfedit-mcp"] } }
Then ask your agent: "In ./contract.pdf replace 'Acme Ltd' with 'Acme GmbH' and redact the IBAN." The edited PDF is written next to the original and a before/after picture of every change comes back. A free API key (200 pages a month, no watermark on ordinary documents) takes one email at https://api.niubai.vip.
Claude Code — one line:
claude mcp add pdfedit -e PDFEDIT_API_KEY=sk_live_your_key -- npx -y @niubai/pdfedit-mcp
Cursor — the deeplink (Settings → MCP also takes the same JSON):
cursor://anysphere.cursor-deeplink/mcp/install?name=pdfedit&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBuaXViYWkvcGRmZWRpdC1tY3AiXSwiZW52Ijp7IlBERkVESVRfQVBJX0tFWSI6InNrX2xpdmVfeW91cl9rZXkifX0=
Claude Desktop — claude_desktop_config.json:
{
"mcpServers": {
"pdfedit": {
"command": "npx",
"args": ["-y", "@niubai/pdfedit-mcp"],
"env": {
"PDFEDIT_API_KEY": "sk_live_your_key"
}
}
}
}
No key? Leave env out: the keyless free tier is 20 pages/day per IP, outputs
watermarked TEST. Web clients that cannot run a local server (claude.ai) can add the
hosted endpoint instead; it takes PDF URLs only.
This package runs on your machine, so every tool's file argument takes an absolute
(or ~) local path — it uploads the file for you and writes the edited PDF back next
to the input as <name>.edited.pdf — or an https:// URL, or an f_… file id from an
earlier call. The hosted Streamable-HTTP endpoint cannot read your disk and says so
(remote server cannot read local paths; pass a URL). PDFs never travel as MCP content
blobs either way; only up to three preview PNGs of the changed pages come back inline.
| Tool | What it does |
|---|---|
pdf_edit | Replace / delete / redact / insert / fill, one call, with previews. |
pdf_batch | The same edits once per record over one template. Returns a job id. |
pdf_find | Every span with page, bbox, font and span id; filter with the four match modes. |
pdf_preview | Render a page (or a region) as a PNG, with optional highlight boxes. |
pdf_job | The result of an async edit or a batch. |
Every schema is generated from the gateway's OpenAPI document, so an edits[] entry here
is exactly the one POST /v1/edit and the SDKs take — see
src/tools.ts.
The engine would rather hand back "no" with a reason than a file that looks edited and is not. Two kinds of refusal.
Every change is written, then checked, then kept or undone. A group that fails any gate
is rolled back and reported in failed[]:
| Reason | What happened |
|---|---|
collateral_damage | Pixels changed outside the rewrite's own area — something else on the page moved. The page is restored byte-for-byte. |
readback_failed | Re-reading the edited rectangle did not return the text that was supposed to be there. |
does_not_fit | The replacement does not fit the space, and fit was not allowed to make it worse (fit: "strict"), or an insert would have landed on text that is already there. |
font_unavailable | options.font.policy: "exact_only" (or "metric_only") and neither the system nor the document has an acceptable face. |
redact_residual | After a redaction the string was still readable in the rect — the removal is refused rather than reported as done. |
no_target, field_not_editable, field_value_invalid, field_value_mismatch | The form field does not exist, is read-only, rejects the value, or did not read back as written. |
With options.atomic (the default) any single failure fails the whole request and no
file is produced; options.strict does the same for an edit that simply did not match.
An unmatched edit comes back with fuzzy suggestions ("did you mean Acme, Inc.?")
rather than a silent no-op.
invalid_requestWhat the API refuses before touching the document:
find. Everything after the matcher is
left-to-right: lines are assembled left edge first and replacements are laid out
rightwards, so RTL would be matched against a visually reversed line and written in the
wrong direction with nothing downstream able to notice.redact on text that only exists as scanned pixels. The word is the image;
covering it leaves it in the file, so the op's promise cannot be kept.style together with fit: "reflow". A reflow re-sets the whole paragraph in the
document's own face, so the matched phrase no longer has a run of its own to style.fit: "reflow" on redact or form.options.preview: "pages" (whole-page previews); "changes" and "none" work.font_source, font_used), the summary spells out approx_font_used when the last
resort was taken, and options.font.policy: "metric_only" refuses it outright, so "it
looks slightly different" is a value you can read rather than a surprise.flatten on radio groups and comboboxes depends on the appearance the file carries; where it
declines, the field is left live and flatten_skipped is warned instead of failing.password); edits are not attempted
without it.edits[], options and the response.MIT. The engine behind the API is AGPL-3.0; the API serves its complete source to its
users at GET /source (any key, a free test key included; the hosted MCP endpoint relays
it at https://pdfedit-mcp-remote.niubai-pdfedit-remote-worker.workers.dev/source).
FAQs
MCP server for the PDF Edit API: replace, redact, insert and read text in existing PDFs.
The npm package @niubai/pdfedit-mcp receives a total of 0 weekly downloads. As such, @niubai/pdfedit-mcp popularity was classified as not popular.
We found that @niubai/pdfedit-mcp demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
vlt 1.5.0 links skills from JavaScript dependencies to coding agents, with lockfile versioning and Socket data to filter out known malicious packages.

Security News
Rust 1.100 will add opt-in dependency cooldowns to Cargo, giving security scanners and maintainers time to catch malicious crate releases.

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.