Turn dense PDFs into a clean, readable web page.
PDF Card MCP is a local-first MCP server and CLI that turns any local PDF into a portable HTML reader — broken into small, readable cards you can search, navigate, annotate, and export, with the original text preserved exactly.
pip install pdf-card-mcpOn PyPI · Python 3.11–3.13.
No setup needed — download the Claude Desktop extension, double-click, and click Install. No terminal, no config files.
Building this in the open — if it's useful, star it on GitHub.
Python 3.11–3.13 · MIT licensed · Runs entirely on your machine.
The same paper, two very different reading experiences.
PDF Card MCP rebuilds a document into small, source-linked cards with large type, search, and navigation — without changing a word of the original text.


Same document. One is a wall of text. The other is something you'll actually finish.
How it works
A four-step local pipeline, from PDF to portable reader.
- 01
Extract, faithfully.
Source text is pulled with char-geometry repair, so missing spaces are reconstructed from PDF character positions — not guessed.
- 02
Crop what text can't hold.
Tables, figures, and display formulas are rasterized from the source region into images, so numeric alignment, subscripts, and math spacing survive.
- 03
Style from the source.
Reader colors and typography hints are derived locally from the PDF's own palette (--style-engine pdf), or kept to a soft default.
- 04
Write one portable file.
A standalone .html with embedded CSS, JS, page images, and crops — plus a manifest.json of cards, pages, warnings, and source anchors.
Features
Everything you need to actually read what you collect.
Source text, preserved.
Exact text, no LLM rewrites. Every card links back to its source page for verification.
Faithful tables, figures & formulas.
Rendered as image crops so layout and math stay intact; captions kept as searchable text and alt text.
A reader built for reading.
Large type, small cards, full-text search, section nav, keyboard controls, a font-size slider, and source-page previews.
Notes & highlights → Markdown.
Select text, highlight or annotate, and export a clean .annotations.md file.
Publish read-only bundles.
Share a static reader with only the public annotations you choose; local paths are redacted by default.
Local-first by default.
No uploads and no external API calls in the deterministic conversion path.
MCP
Built as an MCP server.
Point Claude Code, Claude Desktop, or any MCP host at a local PDF path and get back a reader, manifest, and warnings — no hosted service in the loop.
Claude Desktop can also install the .mcpb bundle from the latest GitHub release.
{ "mcpServers": { "pdf-card": { "command": "uvx", "args": ["--from", "pdf-card-mcp", "pdf-card-mcp-server"] } }}| Tool | What it does |
|---|---|
convert_pdf_to_card_html | Convert a local PDF path into a standalone card reader plus a manifest of cards, pages, and warnings. |
validate_reader_annotations | Check a notes/highlights sidecar against a generated reader before publishing. |
publish_reader_bundle | Write a publish-ready, read-only static reader or bundle from an existing reader and annotations. |
Your documents never leave your machine.
Deterministic conversion uploads nothing and calls no external APIs. Optional MCP sampling is bounded — the host model can only choose validated style tokens or suggest card-boundary polish; it can never rewrite, delete, or invent source text.
Use --style-engine fixed/pdf and postprocess_engine=none to keep all document text in the local process.
Get started
Install it your way.
Install from PyPI — works out of the box.
pip install pdf-card-mcpQuestions, answered.
What is an MCP server?
MCP (Model Context Protocol) is an open standard that lets an AI host like Claude Code or Claude Desktop call external tools. PDF Card MCP is one such tool: a host asks it to convert a local PDF, and it returns a reader, manifest, and warnings — running on your own machine.
Does it work offline?
Yes. The default, deterministic conversion runs entirely locally — no uploads and no external API calls. Optional OCR runs locally too when you install its dependencies.
Does it change my PDF's text?
No. Source text is preserved exactly and each card links back to its source page. There are no LLM rewrites in the deterministic path, and optional sampling can never rewrite, delete, or invent source text.
Does it handle scanned PDFs?
PDF Card MCP shines on text-layer PDFs today, with best-effort table detection. Scanned, image-only PDFs need the optional OCR support. It's an early open-source project, and we're upfront about where it's strongest.