PDF Reader MCP MCP Server
io.github.SylphxAI/pdf-reader-mcp
Local-first PDF reading for AI agents with citeable page and bounding box evidence.
What is the PDF Reader MCP MCP server?
The PDF Reader MCP (Citra) is an MCP server that gives AI agents structured access to PDF content with verifiable citations. It extracts text, tables, and OCR from PDFs while preserving page numbers, geometry, and bounding boxes so agents can cite specific evidence rather than hallucinate. Designed for zero-config deployment via npx with no API keys or cloud dependencies.
Citra solves the problem of AI agents making up PDF citations or losing table structure. It returns an 'Agent Document Twin' with three core tools: read_pdf for smart extraction with markdown and tables, search_pdf for finding page-specific matches, and pdf_evidence for inspecting crops and geometry. Built on a native Rust engine, it runs locally on macOS, Linux, and Windows with minimal footprint and ~10× faster performance than previous versions.
How to install PDF Reader MCP
Copy-paste configuration for popular MCP clients.
{
"mcpServers": {
"pdf-reader-mcp": {
"command": "npx",
"args": [
"-y",
"@sylphx/pdf-reader-mcp"
]
}
}
}{
"mcpServers": {
"pdf-reader-mcp": {
"command": "npx",
"args": [
"-y",
"@sylphx/pdf-reader-mcp"
]
}
}
}{
"mcpServers": {
"pdf-reader-mcp": {
"command": "npx",
"args": [
"-y",
"@sylphx/pdf-reader-mcp"
]
}
}
}{
"servers": {
"pdf-reader-mcp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@sylphx/pdf-reader-mcp"
]
}
}
}claude mcp add pdf-reader-mcp -- npx -y @sylphx/pdf-reader-mcpTools & capabilities
Tools this server exposes to the agent.
read_pdf— Smart default extraction: markdown, tables, structure, OCR, and page-level citations from PDFssearch_pdf— Find page and snippet matches in PDFs before deep readingpdf_evidence— Inspect crops, renders, and focused evidence operations with bounding boxes and geometry
Use cases
- Extract and cite specific table cells from financial reports by page and cell geometry
- Search research papers for headings and quotes with page-level evidence
- OCR scanned documents while preserving page-linked evidence instead of text soup
- Build agent workflows that defend PDF claims with verifiable citations
- Compose with other Sylphx tools (Iris for images, Cue for video) in document processing pipelines
PDF Reader MCP MCP server FAQ
It gives AI agents structured PDF reading with verifiable citations. Agents can extract text, tables, and OCR while preserving page numbers and bounding boxes, so they cite specific evidence instead of hallucinating.
Yes. Citra is MIT-licensed and open-source. No API keys or cloud services required.
Add to your config: {"mcpServers": {"citra": {"command": "npx", "args": ["-y", "@sylphx/citra"]}}}. Or run `npx -y @sylphx/citra` directly.
No. Citra is local-first and runs entirely on your machine. PDFs never leave your system.
macOS (arm64 and x64), Linux (x64 and arm64), and Windows (x64). Platform-specific native binaries are installed automatically.
The native Rust engine is ~10× faster than the previous TypeScript version on repeated reads, with a much smaller install footprint (~24 MiB vs 82 MiB).
README (reference)
Source of truth, from the repository.
Citra
Give your AI agent eyes for PDFs — with proof.
Local-first PDF evidence for agents. Structured text, tables, OCR, visual crops, and page-level citations your agent can defend — not invent.
Canonical package @sylphx/citra · bin citra · MCP io.github.SylphxAI/citra · live 5.0.0
Zero-config in one line
npx -y @sylphx/citra
No Docker. No API key. No global install. Spawns a stdio MCP server agents can use immediately.
| Client | Setup |
|---|---|
| Any agent / CLI | npx -y @sylphx/citra |
| Claude Code | claude mcp add citra -- npx -y @sylphx/citra |
| Claude Desktop / Cursor / VS Code / Codex | "command": "npx", "args": ["-y", "@sylphx/citra"] |
| Global CLI | npm i -g @sylphx/citra → citra |
Why Citra feels unfairly good
Plain-text PDF tools make agents guess. Citra returns an Agent Document Twin they can cite.
| Pain today | With Citra |
|---|---|
| Page numbers invented or missing | Page + geometry + provenance |
| Tables flattened into soup | Rows · columns · cells · bounding boxes |
| Scanned PDFs become noise | OCR path linked to evidence |
| Install / config / “hope it works” | npx -y — done |
| Silent engine fallbacks | Fail closed if the native binary is missing |
Five reasons teams pick Citra
- Zero-config — real
npxMCP, not a 20-step bootstrap. - Evidence, not vibes — citations agents can show a human.
- Local-first — PDFs stay on the machine; no required cloud vision API.
- Brand-sole — one package, one bin, one story (
@sylphx/citra/citra). - Instrument family — compose with Iris (image), Cue (video), Spine, Lookout, Locus.
See the difference
| Without evidence | With Citra |
|---|---|
| “Revenue was about $12M” | “Page 14, Table 3, cell (row 4, col 2) = $12.4M” |
| Lost table structure | Rows, columns, cells, bounding boxes |
| Scanned PDF = garbage text | OCR with page-linked evidence |
| Hidden / adversarial text ignored | Trust signals when requested |
What you get
Three tools. One product surface.
| Tool | What agents use it for |
|---|---|
read_pdf | Smart default: markdown, tables, structure, OCR, citations |
search_pdf | Find page + snippet matches before deep reading |
pdf_evidence | Crops, renders, inspect, focused evidence ops |
Minimal call:
{
"sources": [{ "path": "/absolute/path/to/report.pdf" }]
}
Flagship use cases
- Financial reports — extract table cells agents can cite by page and geometry
- Research papers — headings, reading order, page-level quotes
- Scanned documents — OCR path with evidence, not a text soup
Platforms
One optional native package is selected for your host only:
| Platform | Native package |
|---|---|
| macOS arm64 | @sylphx/citra-darwin-arm64 |
| macOS x64 | @sylphx/citra-darwin-x64 |
| Linux x64 | @sylphx/citra-linux-x64-gnu |
| Linux arm64 | @sylphx/citra-linux-arm64-gnu |
| Windows x64 | @sylphx/citra-win32-x64-msvc |
Missing native → fail closed (no silent TypeScript PDF engine).
Product docs
| Doc | Purpose |
|---|---|
| docs/POSITIONING.md | Strategic positioning |
| docs/COMPETITIVE.md | Peer anchors and wedge |
| docs/EVIDENCE_CONTRACT.md | Evidence = result contract |
| docs/TOOL_SURFACE.md | Few clear tools policy |
| docs/PRODUCT_INDEPENDENCE.md | This repo is SSOT |
| docs/IPPB.md | Independent public product bar |
| docs/PUBLISH.md | npm / git publish status |
| docs/guide/installation.md | Install & host config |
| skills/citra/SKILL.md | Agent skill surface |
Surfaces (MCP · CLI · SDK)
MCP (default agent path)
npx -y @sylphx/citra
Claude Desktop / Cursor / VS Code / Codex
{
"mcpServers": {
"citra": {
"command": "npx",
"args": ["-y", "@sylphx/citra"]
}
}
}
Dual-era hosts that send server/discover before initialize (e.g. Gemini Antigravity CLI) are supported on stdio.
CLI
npx -y @sylphx/citra --help
SDK
@sylphx/citra/sdk→Citra(read/search/evidence)@sylphx/citra/pure-rust→ low-level client helpers- Same tools as MCP:
read_pdf·search_pdf·pdf_evidence - Requires the platform optional native package (same as MCP)
Install footprint (honest)
Compare full clean installs, not “JS wrapper tarball vs native executable”:
| Metric (measured clean install, linux-x64) | Historical TS 3.0.14 | Sole-Rust 4.1.0 lineage |
|---|---|---|
| Main package on disk | ~403 KB | ~77 KB |
Full node_modules | ~82.3 MiB | ~24.4 MiB (~3.4× smaller) |
| Installed files | 4,101 | 20 (~205× fewer) |
| Production npm deps | PDF.js + MCP TS SDK + more | {} + one platform native |
The native binary is multi-megabyte because it is the PDF engine. That is expected — and still a cleaner install than shipping PDF.js + a large JS tree.
Details: installed footprint comparison
Performance (method-bounded)
Controlled same-host linux-x64 dual-mode A/B vs historical @sylphx/pdf-reader-mcp@3.0.14, using registry-installed sole-Rust natives (measured on the 4.1.x lineage; method applies to current sole-Rust packages):
| Mode | What it measures | Result |
|---|---|---|
persistent_warm | long-lived server, repeated identical local read_pdf after warm-up | ≥ ~10× median latency improvement on all 8 required fixture classes |
startup_inclusive | spawn + initialize + one task | large advantage on the same fixtures |
persistent_warm includes a process-local cache for identical local path+options. First request in a process still pays full parse cost.
Not a multi-host guarantee. Details: 4.1.0 report · claims policy
Engine note
Current production is a native Rust engine on supported platforms via a thin Node launcher.
Local-first. Five platform packages. One clean install. Fail closed without the matching native.
Unusually formed or broken ToUnicode CMaps are handled without crashing; the release binary is panic-unwind so a worker-thread panic fails the request instead of aborting the process (#608).
Engineering history and recovery pins: docs/migration.md — not the product pitch.
Product proof & links
<div align="center">
Stop PDF hallucinations. Give agents proof.
npx -y @sylphx/citra
</div>Related MCP servers
Image Reader MCP
Evidence-first image MCP. Agent Media Twin with metadata and citeable OCR evidence.
Video Reader MCP
Evidence-first video MCP. Timeline document with ffprobe streams and subtitle cues.
Smart Reader MCP
Sniff format and delegate to Sylphx Reader siblings for unified media read.