Local-first PDF evidence for agents: structure, tables, OCR, and citations. SDK · CLI · MCP.
io.github.SylphxAI/citra — MCP Server
The MCP server “io.github.SylphxAI/citra” provides local-first PDF evidence support for agents. Its scope is described as enabling PDF structure extraction, table handling, OCR, and citations. The server offering is presented as an SDK and CLI, with MCP included as an additional interface.
🛠️ Key Features
Local-first PDF evidence processing for agents
PDF structure support
Table support
OCR support
Citation support
Provides SDK · CLI · MCP
🚀 Use Cases
Supplying agents with structured PDF evidence
Extracting and citing information from PDFs, including OCR-derived content
Handling PDFs with tables for downstream agent workflows
⚡ Developer Benefits
Access via MCP alongside SDK and CLI
Supports agent-oriented outputs that include structure, tables, OCR, and citations
⚠️ Limitations
No additional technical constraints (e.g., file limits, supported languages) are stated in the provided data.
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.
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.
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.