pdf-reader-mcp is now anymd: a local Rust MCP server that reads PDFs, Office files, images and audio for AI agents
Give your AI agent eyes for PDFs — structured text, tables, OCR, visual evidence, and page-level citations via MCP. Native Rust, local-first.
At a glance
- What is it?
- SylphxAI/pdf-reader-mcp is the repository of what its README now calls anymd, an MIT-licensed Rust MCP server and CLI that turns documents into Markdown with page anchors. It runs on your machine with no API key, and a hosted, metered sibling uses the same crates.
- Who is it for?
- anymd suits developers who want an AI agent to read PDFs and other documents locally, with page citations and a token budget, and who are happy to run an npx-launched Rust binary. It does not suit anyone who expects the old pdf-reader-mcp package name to keep working unchanged, or who needs the speed and accuracy claims verified independently.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 7 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- SylphxAI/pdf-reader-mcp1,070 ★ · +148
| Repository | 2026-09-11 | 2026-11-14 |
|---|---|---|
| SylphxAI/pdf-reader-mcp | 922 | 1.1k |
148 Stars in the last 64 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The repository is called pdf-reader-mcp, but the product and package are anymd
The README is headed anymd and says the project was formerly pdf-reader-mcp, with a migration guide for people moving over. The npm package is @sylphx/anymd, the Rust crate is anymd, the Docker image is ghcr.io/sylphxai/anymd, and the releases are titled anymd 8.5.9, 8.5.7 and 8.5.6. Only the GitHub repository name still says pdf-reader-mcp.
The consequence is that anyone searching for the old name finds this repository but must install a different package. Read the migration guide linked from the README before you replace an existing setup, and use the anymd command in every client configuration.
It reads far more than PDFs, and one tool call covers every format
The lead line lists PDF, Word, PowerPoint, Excel, EPUB, HTML and web pages, images through OCR, and audio and video for metadata, subtitles and transcripts. The README says one tool reads every listed format, also accepts web URLs and whole directories, and offers a search that looks across all of them.
Output is Markdown with citation anchors written as page comments, a small front-matter header and compact tables. A token budget and a cursor keep large documents within an agent's context, so the agent can page through a long file instead of receiving it whole. The repository's example files cover basic reads, page ranges, structure inspection, scanned OCR, evidence crops and a search-then-verify flow.
One setup command edits the configuration of every MCP client on the machine
Installation centres on a single command that adds anymd to every MCP client it finds, including Claude Code, Codex, Cursor, VS Code, Claude Desktop, Windsurf and Gemini CLI:
npx -y @sylphx/anymd setup # --dry-run to preview, --remove to undoThe flags matter. Because the command writes to the configuration of several tools at once, run it with the dry-run option first to see what it will change, and keep the remove option in mind to undo it. The only stated requirement is Node 18 or newer, and npm installs the native binary for your platform. If you prefer to configure one client, Claude Code uses claude mcp add anymd followed by npx -y @sylphx/anymd, and other clients take the same command and arguments in their own JSON or TOML file.
Every client runs the same npx command, and allow-dir keeps the server inside one folder
For manual setup, every MCP client runs the same command. The Cursor entry in .cursor/mcp.json, for example, is:
{ "mcpServers": { "anymd": { "command": "npx", "args": ["-y", "@sylphx/anymd"] } } }VS Code and Claude Desktop use a similar entry, and clients that speak MCP over stdio can take the command npx with the arguments -y and @sylphx/anymd. To keep the server inside one folder, add --allow-dir with the path to your documents.
Because the server accepts whole directories, an install without allow-dir leaves the choice of which directories to read to whoever drives the agent. The allow-dir option is the safeguard to set when documents are sensitive. Launching through npx fetches the package on first use, and the CLI-only route lists a global npm install as the alternative.
Local means nothing is uploaded, but OCR and transcription each need an explicit opt-in
The project says nothing is uploaded. OCR uses installed local doc-VLM models or tesseract. Transcripts use ffmpeg and a bundled Qwen3-ASR model. OCR setup and ASR model downloads require explicit opt-in.
This has a practical cost. Out of the box, a scanned PDF will not be turned into text until you enable OCR, and audio will not be transcribed until you opt into the model download. If you expect an agent to read scans immediately after setup, you will see no text until you do that. The privacy claim is also narrower than it sounds: it describes the conversion path, and your agent's own model still receives whatever text you let it read.
The benchmark is the vendor's own, with large speed multiples and one tool that did not finish
The README cites AgentDocBench, an open benchmark of license-clean documents in 12 categories, scored on verbatim sentences, text F1, reading order and table cells, with time and output tokens. Each tool runs on the same kind of GitHub-hosted runner with 4 CPUs. The headline table gives anymd an overall score of 96.4 against 93.0 for docling, 81.7 for kreuzberg, 81.2 for unstructured, 76.8 for markitdown, 71.0 for marker and 42.2 for pdftotext, and table cells F1 of 92.2 against 89.9 for docling.
On speed, 38 documents take anymd 11.5 seconds in total against 2,432.4 seconds for docling and 75.6 seconds for markitdown. Marker converted only 30 of the documents. The benchmark lives in the same project as the tool being scored, so treat the ranking as a claim to reproduce on your own documents.
The CLI-only routes are npm, Homebrew, Docker and cargo, and Python wheels follow publication
If you want the converter without wiring up an MCP client, the CLI routes are npm install -g @sylphx/anymd, or a one-off run with npx. Homebrew is available on macOS and Linux through the sylphxai tap, and the README says to use npm on Windows, macOS and Linux. The Docker image supports amd64 and arm64:
docker run --rm -v "$PWD:/data" ghcr.io/sylphxai/anymd report.pdf > report.md
docker run -i --rm ghcr.io/sylphxai/anymd # MCP server on stdioThe first line converts a file mounted from the current directory, and the second starts the MCP server on stdio. Python wheels carry the same prebuilt binary and are on PyPI as anymd from the first release after publication, so do not expect a pip package for every version in the list.
A hosted metered service uses the same crates, and the build depends on patched forks
anymd is described as the free local mode of the crates behind Sylphx AI parse, a hosted document-parse service metered per page for callers who want no local runtime. A Pro page is linked from the README. The project also links an anymd Pro page, so check which capabilities belong to the free local mode.
Building from source with cargo install anymd needs Rust 1.95 or newer, CMake and a C++ compiler, and includes doc-VLM OCR and local ASR. npm, pip and Docker ship a prebuilt binary. The Cargo workspace vendors patched forks of pdf-extract and adobe-cmap-parser, because the upstream pdf-extract mishandles figure text placement and some table rules and adobe-cmap-parser can panic on malformed CMap data. The last push was on 2026-11-02, and releases 8.5.6, 8.5.7 and 8.5.9 landed within four days.
Editorial conclusion
anymd suits developers who want an AI agent to read PDFs and other documents locally, with page citations and a token budget, and who are happy to run an npx-launched Rust binary. It does not suit anyone who expects the old pdf-reader-mcp package name to keep working unchanged, or who needs the speed and accuracy claims verified independently. Before adopting it, run setup with the dry-run flag, restrict directories with allow-dir, and decide whether OCR and transcription are worth opting into.
Frequently asked questions
What is the pdf-reader-mcp project today?
It is now called anymd. The README says it was formerly pdf-reader-mcp, and it is a Rust MCP server and CLI that converts PDF, Office files, EPUB, HTML, images and audio to Markdown on your machine.
How do I add anymd to my MCP clients?
Run npx -y @sylphx/anymd setup, with --dry-run to preview and --remove to undo. It adds anymd to MCP clients such as Claude Code, Codex, Cursor, VS Code, Claude Desktop, Windsurf and Gemini CLI. Node 18 or newer is required.
Does anymd upload my documents?
The README says nothing is uploaded. OCR uses installed local models or tesseract, and transcripts use ffmpeg and bundled Qwen3-ASR, with OCR setup and ASR downloads requiring explicit opt-in.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/sylphxai-pdf-reader-mcp)Star history chart for your README
[](https://hysenlabs.com/projects/sylphxai-pdf-reader-mcp)Was this useful?