Skip to main content

Production-ready MCP server for PDF processing with intelligent caching. Extract text, search, and analyze PDFs with AI agents.

Project description

pdf-mcp

PyPI version Python 3.10+ License: MIT GitHub Issues CI codecov Downloads

Surgical PDF access for AI agents — search, read, and extract without flooding context.

An MCP server that lets Claude Code and other AI agents search a PDF by meaning or keyword, read only the pages that matter, and cleanly pull out tables, images, and scanned text — even from multi-column and Japanese layouts.

mcp-name: io.github.jztan/pdf-mcp

Try it in your browser

See what your AI agent sees →

Drop in any PDF and watch an agent skim it, search it, and read only the pages that matter — using a fraction of the tokens. 100% client-side, no install required.

pdf-mcp browser demo: an AI agent maps a 216-page PDF, searches it, and reads only the matching pages — using a fraction of the tokens

Why pdf-mcp?

Without pdf-mcp With pdf-mcp
Large PDFs Context overflow Chunked reading
Token budgeting Guess and overflow Estimated tokens before reading
Finding content Load everything Hybrid search (BM25 keyword + semantic)
Tables Lost in raw text Extracted and inlined per page
Multi-column PDFs Columns interleaved in extracted text Column-aware reading order (pdf-mcp[multicolumn])
Vertical scripts (Japanese) Columns scrambled / glyph soup Geometric reorder of vertical text (tategaki / 縦書き) — search CJK with mode='semantic' (pip install 'pdf-mcp[cjk]')
Images Ignored Extracted as PNG files
Repeated access Re-parse every time SQLite cache
Scanned PDFs No text extracted OCR via Tesseract, parallelized across pages (pdf_read_pages(ocr=True))
Visual content Must describe in words Render page as image (pdf_render_pages)
Tool design Single monolithic tool 9 specialized tools

Features

  • Hybrid search — find relevant pages with a question, not a page range. Combines BM25 keyword and semantic search via Reciprocal Rank Fusion
  • Paginated reading — fetch only the pages your agent needs; large documents don't blow your context window
  • OCR — scanned and image-based PDFs are fully readable and searchable via Tesseract, parallelized across pages for ~2–3x faster extraction on typical scans
  • Structured extraction — tables, embedded images, and table of contents returned as structured data, not text soup
  • Vertical-script reading order — Japanese tategaki (縦書き) reconstructed from glyph geometry into correct top-to-bottom, right-to-left order; article segmentation for dense magazine layouts; mojibake filtered
  • Persistent cache — SQLite-backed; re-reads are instant and survive server restarts
  • Secure URL fetching — HTTPS-only with SSRF protection; local network ranges are blocked

Contents

Installation

pip install pdf-mcp

For semantic search (adds fastembed and numpy, ~67 MB model download on first use):

pip install 'pdf-mcp[semantic]'

For correct reading order on multi-column PDFs (adds pymupdf4llm, which pulls pymupdf_layout/onnxruntime):

pip install 'pdf-mcp[multicolumn]'

Without it, multi-column pages fall back to positional-sort extraction, which can interleave columns.

For Japanese/Chinese/Korean PDFs (recommended — CJK search needs semantic; extraction works without it):

pip install 'pdf-mcp[cjk]'

For OCR on scanned PDFs (requires system Tesseract):

# macOS
brew install tesseract

# Ubuntu/Debian
apt install tesseract-ocr

# Windows — download the installer from:
# https://github.com/UB-Mannheim/tesseract/wiki
# Then add the install directory to your PATH.

Quick Start

Choose your MCP client below to get started:

Claude Code
claude mcp add pdf-mcp -- pdf-mcp

Or add to ~/.claude.json:

{
  "mcpServers": {
    "pdf-mcp": {
      "command": "pdf-mcp"
    }
  }
}
Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "pdf-mcp": {
      "command": "pdf-mcp"
    }
  }
}

Config file location:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Restart Claude Desktop after updating the config.

Visual Studio Code

Requires VS Code 1.101+ with GitHub Copilot.

CLI:

code --add-mcp '{"name":"pdf-mcp","command":"pdf-mcp"}'

Command Palette:

  1. Open Command Palette (Cmd/Ctrl+Shift+P)
  2. Run MCP: Open User Configuration (global) or MCP: Open Workspace Folder Configuration (project-specific)
  3. Add the configuration:
    {
      "servers": {
        "pdf-mcp": {
          "command": "pdf-mcp"
        }
      }
    }
    
  4. Save. VS Code will automatically load the server.

Manual: Create .vscode/mcp.json in your workspace:

{
  "servers": {
    "pdf-mcp": {
      "command": "pdf-mcp"
    }
  }
}
Codex CLI
codex mcp add pdf-mcp -- pdf-mcp

Or configure manually in ~/.codex/config.toml:

[mcp_servers.pdf-mcp]
command = "pdf-mcp"
Kiro

Create or edit .kiro/settings/mcp.json in your workspace:

{
  "mcpServers": {
    "pdf-mcp": {
      "command": "pdf-mcp",
      "args": [],
      "disabled": false
    }
  }
}

Save and restart Kiro.

Other MCP Clients

Most MCP clients use a standard configuration format:

{
  "mcpServers": {
    "pdf-mcp": {
      "command": "pdf-mcp"
    }
  }
}

With uvx (for isolated environments):

{
  "mcpServers": {
    "pdf-mcp": {
      "command": "uvx",
      "args": ["pdf-mcp"]
    }
  }
}

Verify Installation

pdf-mcp --help

Tools

The typical pattern: call pdf_info first to plan, then pdf_search to locate — its paragraph excerpts are often enough to answer directly. Use pdf_read_pages or pdf_read_all when you need deeper context.

Tool What it does
pdf_info Page count, metadata, TOC summary, scanned-page detection. Call first.
pdf_get_toc Full table of contents for documents with >50 bookmarks
pdf_read_pages Read specific pages or ranges; OCR-on-demand; embedded images + tables
pdf_read_all Read entire document in one call (byte-capped for safety)
pdf_render_pages Render pages as PNG for vision models — diagrams, handwriting, scans
pdf_search Hybrid RRF search (keyword + semantic), page or section granularity, optional paragraph excerpts
pdf_cache_stats Per-document cache breakdown + total size
pdf_cache_clear Clear expired or all cache entries
server_info Which optional features (column-aware, OCR, semantic) and config are active. Call before feature-dependent calls.

Example prompts:

"Read the PDF at /path/to/document.pdf"
"Which pages discuss supply chain risks?"
"Find sections about the training process"
"Show me what page 5 looks like"
"OCR pages 3-5 of the scanned PDF"

See docs/tool-reference.md for the complete reference — every parameter, response shape, security contract, and example. For semantic-search model selection, see docs/embedding-models.md.

Example Workflow

For a large document (e.g., a 200-page annual report):

User: "Summarize the risk factors in this annual report"

Agent workflow:
1. pdf_info("report.pdf")
   → 200 pages, TOC shows "Risk Factors" on page 89

2. pdf_search("report.pdf", "risk factors")
   → Matches with structural paragraph excerpts — each excerpt
     is the bullet, paragraph, or heading that matched, not a
     fixed-width window. Often enough to answer directly.

3. If excerpts are sufficient → synthesize answer

4. If more context needed:
   pdf_read_pages("report.pdf", "89-95")
   → Full page text for deeper reading

Configuration

pdf-mcp works out of the box with no configuration. To restrict which paths and URL hosts the server can access, tune cache and worker settings, or understand what's cached, see docs/configuration.md.

  • Access control~/.config/pdf-mcp/config.toml allow/deny rules for paths and URLs, plus response byte caps
  • Environment variables — cache directory, TTL, and parallel OCR/render worker count
  • Caching — SQLite-backed persistence, what's cached, and invalidation

Roadmap

See ROADMAP.md for planned features and release history.

Contributing

Contributions are welcome. See docs/contributing.md for setup, checks, the coherence eval harness, and quality-loop guidelines.

Security

Found a vulnerability? See SECURITY.md for the threat model, reporting channel, and expected response timeline. Please do not open a public GitHub issue for unpatched security reports.

License

MIT — see LICENSE.

Links

Blog posts

Background, benchmarks, and design notes from building pdf-mcp:

Getting started

Search & retrieval

Engineering & security

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pdf_mcp-1.17.0.tar.gz (2.9 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pdf_mcp-1.17.0-py3-none-any.whl (74.0 kB view details)

Uploaded Python 3

File details

Details for the file pdf_mcp-1.17.0.tar.gz.

File metadata

  • Download URL: pdf_mcp-1.17.0.tar.gz
  • Upload date:
  • Size: 2.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for pdf_mcp-1.17.0.tar.gz
Algorithm Hash digest
SHA256 4404f70be5e238ff3c93e9987828e73a913290f83ac77a000f91fdffcf9777b2
MD5 911d1df0614f1ae525f081e360eb46e4
BLAKE2b-256 d759051a77e83d8f586442d6543fe9ebefdff5a8331c9d1669799ebc37d7de4a

See more details on using hashes here.

File details

Details for the file pdf_mcp-1.17.0-py3-none-any.whl.

File metadata

  • Download URL: pdf_mcp-1.17.0-py3-none-any.whl
  • Upload date:
  • Size: 74.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for pdf_mcp-1.17.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f4af719238520f61e2ff49f7f6f7fc28e994f9f54f4fc42c198c8fb33a835e08
MD5 98ed7c828502fe99f6bb8961dc4067a6
BLAKE2b-256 ec057e2027a8bfe528acceb428ec5c32b3a2fdaf60c1aaecbc3742001ccb5e23

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page