MCP server: One MCP server.

Citra

@sylphxaiMCP server · External

Local-first PDF evidence for agents: structure, tables, OCR, and citations. SDK · CLI · MCP.

agent document twinv5.0.2MITTypeScript
Freeno charge per call

Runs on your machine from its package; the steps are below.

What it does

  1. Reads
  2. Writes
  3. High impact

Not assessed yet.

What it costs

Free

Odel charges nothing per call. The publisher may charge for its own service.

Runs locally over stdio

This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).

npm@sylphx/citrav5.0.2

Run

npx -y @sylphx/citra

MCP client config

{
  "mcpServers": {
    "citra": {
      "command": "npx",
      "args": [
        "-y",
        "@sylphx/citra"
      ]
    }
  }
}
README5 min read

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

npm version License: MIT stars

Zero-config in one line

bash
npx -y @sylphx/citra

No Docker. No API key. No global install. Spawns a stdio MCP server agents can use immediately.

ClientSetup
Any agent / CLInpx -y @sylphx/citra
Claude Codeclaude mcp add citra -- npx -y @sylphx/citra
Claude Desktop / Cursor / VS Code / Codex"command": "npx", "args": ["-y", "@sylphx/citra"]
Global CLInpm 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 todayWith Citra
Page numbers invented or missingPage + geometry + provenance
Tables flattened into soupRows · columns · cells · bounding boxes
Scanned PDFs become noiseOCR path linked to evidence
Install / config / “hope it works”npx -y — done
Silent engine fallbacksFail closed if the native binary is missing

Five reasons teams pick Citra

  1. Zero-config — real npx MCP, not a 20-step bootstrap.
  2. Evidence, not vibes — citations agents can show a human.
  3. Local-first — PDFs stay on the machine; no required cloud vision API.
  4. Brand-sole — one package, one bin, one story (@sylphx/citra / citra).
  5. Instrument family — compose with Iris (image), Cue (video), Spine, Lookout, Locus.

See the difference

Plain text vs evidence

Without evidenceWith Citra
“Revenue was about $12M”“Page 14, Table 3, cell (row 4, col 2) = $12.4M”
Lost table structureRows, columns, cells, bounding boxes
Scanned PDF = garbage textOCR with page-linked evidence
Hidden / adversarial text ignoredTrust signals when requested

What you get

Three tools. One product surface.

ToolWhat agents use it for
read_pdfSmart default: markdown, tables, structure, OCR, citations
search_pdfFind page + snippet matches before deep reading
pdf_evidenceCrops, renders, inspect, focused evidence ops

Minimal call:

json
{
  "sources": [{ "path": "/absolute/path/to/report.pdf" }]
}

Flagship use cases

  1. Financial reports — extract table cells agents can cite by page and geometry
  2. Research papers — headings, reading order, page-level quotes
  3. Scanned documents — OCR path with evidence, not a text soup

Platforms

One optional native package is selected for your host only:

PlatformNative 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

DocPurpose
docs/POSITIONING.mdStrategic positioning
docs/COMPETITIVE.mdPeer anchors and wedge
docs/EVIDENCE_CONTRACT.mdEvidence = result contract
docs/TOOL_SURFACE.mdFew clear tools policy
docs/PRODUCT_INDEPENDENCE.mdThis repo is SSOT
docs/IPPB.mdIndependent public product bar
docs/PUBLISH.mdnpm / git publish status
docs/guide/installation.mdInstall & host config
skills/citra/SKILL.mdAgent skill surface

Surfaces (MCP · CLI · SDK)

MCP (default agent path)

bash
npx -y @sylphx/citra

Claude Desktop / Cursor / VS Code / Codex

json
{
  "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

bash
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.14Sole-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 files4,10120 (~205× fewer)
Production npm depsPDF.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):

ModeWhat it measuresResult
persistent_warmlong-lived server, repeated identical local read_pdf after warm-up≥ ~10× median latency improvement on all 8 required fixture classes
startup_inclusivespawn + initialize + one tasklarge 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.


Stop PDF hallucinations. Give agents proof.

bash
npx -y @sylphx/citra

Similar modules

Browse agent document twin