Migration
anymd was called pdf-reader-mcp, then Citra. Existing setups keep working; this page lists what changed and how to move to the new names.
Packages
| Before | Now |
|---|---|
npx -y @sylphx/pdf-reader-mcp (bin pdf-reader-mcp) | npx -y @sylphx/anymd (bin anymd) |
npx -y @sylphx/citra (bin citra) | npx -y @sylphx/anymd |
MCP registry io.github.SylphxAI/pdf-reader-mcp, io.github.SylphxAI/citra | io.github.SylphxAI/anymd |
@sylphx/citra-<platform> native packages | @sylphx/anymd-<platform> |
CITRA_RUST_BIN | ANYMD_RUST_BIN (the old name is still read by the SDK) |
SDK class Citra | Anymd (Citra stays as a deprecated alias) |
@sylphx/pdf-reader-mcp and @sylphx/citra are published at the same version as thin aliases that run anymd, so old configs need no change. For new installs, and to get a shorter server name in your client, switch the command to npx -y @sylphx/anymd.
--allow-dir and MCP_PDF_ALLOWED_DIRS are unchanged.
Tools
| Before | Now |
|---|---|
read_pdf | read |
search_pdf | search |
pdf_evidence | inspect (same operations) |
pdf_compare | inspect with operation: "compare" |
The old names still work for this major version but no longer appear in tools/list, so agents discover the new ones.
The new tools take simpler arguments:
// before
{ "sources": [{ "path": "report.pdf", "pages": "1-5" }] }
// now
{ "source": "report.pdf", "pages": "1-5" }search takes plain strings in sources (files, folders, or URLs) and searches every supported format, not just PDFs.
Markdown by default
read and search answer in compact Markdown: <!-- page N --> anchors, a small front-matter header, pipe tables, and a max_tokens budget (default 20000) with a cursor. On Attention Is All You Need, that is 42 KB instead of a 2 MB JSON envelope.
Structured JSON
If you relied on the JSON result (document map, elements with bounding boxes, tables with geometry, trust and accessibility reports), it is still there:
Now:
inspectwithoperation: "structure"and aprofileoffast(default),quality, orresearch:json{ "operation": "structure", "sources": [{ "path": "report.pdf" }], "profile": "research" }Legacy
read_pdf: passingprofile(fast,quality,research) or anyinclude_*flag still returns the JSON result. A plainread_pdfcall with onlysourcesnow returns Markdown.Legacy
search_pdf: passdetail: truefor the JSON result with match geometry and provenance instead of the one-line-per-hit list.