Citra — PDF answers with page-level proof. Local-first structured text, tables, OCR, visual evidence, and citations via MCP, CLI, and SDK.
概要
One call returns structured text, tables, OCR and citations your agent can defend — not invent. @sylphx/citra · citra · io.github.SylphxAI/citra Most PDF tools hand an agent a wall of text. The agent then guesses — the page number, the table grid, the region behind the claim. And a confidently wrong answer costs more than "I can't tell." Locators in, citations out. A human can check the claim. Excerpt of a read_pdf response against test/fixtures/differential/v3014-selectable-table-v1.pdf (paths shortened). The table is detected linked to its continuation on page 2 — and when Citra cannot prove something, it says so in gaps instead of guessing. Citra keeps the default path cheap and explicit. fast reads the embedded text layer and structure. quality explicitly enables OCR, rendering, and richer crops. research is not hidden inside PDF reading. Expensive work is requested, never silently triggered. No Docker. No API key. No global install.
README
The problem
Most PDF tools hand an agent a wall of text. The agent then guesses — the page number, the table grid, the region behind the claim. And a confidently wrong answer costs more than “I can’t tell.”
The difference
Locators in, citations out. A human can check the claim.
One call. Locators included.
{
"status": "ok",
"route": { "engine": "rust-core", "path": "rust-read-pdf-v1" },
"source": { "hash": "99d313eb…", "path": "…/selectable-table-v1.pdf" },
"results": [{
"data": {
"table_info": [{
"page": 1,
"bounding_box": { "left": 72, "top": 151, "right": 454.8, "bottom": 79 },
"colCount": 3,
"cellCount": 9,
"confidence": 0.92,
"provenance": { "engine": "pdf-reader-core", "source": "selectable_text" },
"continuation": {
"role": "starts",
"groupId": "table-continuation-p1-table-1-p2-table-1",
"signals": ["same_column_count", "repeated_header_candidate"]
},
"quality": {
"completeness": 0.79,
"cellBoundingBoxCoverage": 0.89,
"signals": ["missing_cells", "merged_cell_candidates"]
}
}]
}
}],
"gaps": []
}
Excerpt of a real read_pdf response against test/fixtures/differential/v3014-selectable-table-v1.pdf
(paths shortened). The table is detected and linked to its continuation on page 2 — and when
Citra cannot prove something, it says so in gaps instead of guessing.
Predictable defaults
Citra keeps the default path cheap and explicit. fast reads the embedded text
layer and structure. quality explicitly enables OCR, rendering, and richer
crops. research is not hidden inside PDF reading. Expensive work is requested,
never silently triggered.
Install in 30 seconds
npx -y @sylphx/citra
No Docker. No API key. No global install. That starts a stdio MCP server your agent can use immediately.
| Your 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 teams pick Citra
- Zero-config. A real
npxMCP server — not a 20-step bootstrap. - Evidence, not vibes. Page, geometry, table cells, provenance. Citations a human can check.
- Local-first. PDFs stay on the machine. No required cloud vision API, no document upload.
- Fail closed. No matching native binary? The process refuses to start. Never a silent engine fallback.
- Native and small. A Rust PDF engine behind a thin launcher — not PDF.js plus a large JS tree.
What you get
Four tools. One surface. Few, powerful, obvious.
| Tool | What an agent uses it for |
|---|---|
read_pdf |
The main read: markdown, tables with cells and geometry, structure, optional OCR, citation-ready chunks |
search_pdf |
Cheap literal retrieval first: page and bounding-box locators before a deep read |
pdf_compare |
Compare two local PDFs at page and term level |
pdf_evidence |
Focused verification: inspect, render_page, extract_regions, ocr_pages, analyze_regions |
Full option and result reference: docs/api
Proof, method-bounded
| ≥ 10.4× | median warm read_pdf latency vs the TypeScript engine — same host (linux-x64), 8 required fixture classes, median of class speedups ~15.4× |
| ~3.4× smaller | clean install — 82.3 MiB → 24.4 MiB of node_modules vs TS 3.0.14 |
| 20 files | on disk vs 4,101 — one native binary per platform, zero production JS dependencies |
| 5 platforms | macOS arm64/x64 · Linux x64/arm64 · Windows x64 |
Warm-cache figure is method-bounded: long-lived MCP server, repeated identical local
read_pdf after warm-up, measured on the sole-Rust lineage (4.1.0) against TS 3.0.14. The first
request in a process pays full parse cost. No multi-host extrapolation.
See the performance report and
claims policy.
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 |
Security & trust
- Local-first — no required cloud provider; the PDF is not uploaded.
- Fail closed — a missing native binary stops the process; there is no silent TypeScript fallback.
- Panic-unwind — a malformed document (e.g. a broken ToUnicode CMap) fails the request, never the process (#608).
- Remote URL policy — a
urlsource is a pinned, redirect-revalidated http(s) fetch, not a browser; private addresses are rejected unlessMCP_PDF_ALLOW_PRIVATE_IPS=trueis explicitly set (policy). - HTTP transport is opt-in and hardened — loopback by default,
MCP_API_KEYenforced before binding elsewhere, and--allow-dirrestricts filesystem reach. Details: security docs · report privately per SECURITY.md.
Companion MCP tools
| Product | Job |
|---|---|
| Iris | Image facts and pixel evidence |
| Cue | Video timelines and timestamp evidence |
| Spine | Repository architecture and impact |
| Locus | Exact code-chunk retrieval |
| Lookout | Web research with source excerpts |
Each product is independent. Install only the tools your agent needs.
Documentation
| 🌐 Website | sylphxai.github.io/citra |
| ⚡ Quickstart | Getting started |
| 📐 API reference | docs/api |
| 📐 Evidence contract | What “proof” means |
| 📊 Performance | Method & results |
| ⚖️ Comparison | Why not the alternatives |
インストール
npx -y @sylphx/citra設定
{
"mcpServers": {
"citra": {
"command": "npx",
"args": ["-y", "@sylphx/citra"]
}
}
}