Production-ready MCP server for PDF processing with intelligent caching. Extract text, search, and analyze PDFs with AI agents.
Project description
pdf-mcp
A Model Context Protocol (MCP) server that enables AI agents to read, search, and extract content from PDF files. Built with Python and PyMuPDF, with SQLite-based caching for persistence across server restarts.
mcp-name: io.github.jztan/pdf-mcp
Features
- 8 specialized tools for different PDF operations
- SQLite caching — persistent cache survives server restarts (essential for STDIO transport)
- Paginated reading — read large PDFs in manageable chunks
- Full-text search — find content without loading the entire document
- Image extraction — extract images as base64 PNG
- URL support — read PDFs from HTTP/HTTPS URLs
Installation
pip install pdf-mcp
Quick Start
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.102+ with GitHub Copilot.
CLI:
code --add-mcp '{"name":"pdf-mcp","command":"pdf-mcp"}'
Command Palette:
- Open Command Palette (
Cmd/Ctrl+Shift+P) - Run
MCP: Open User Configuration(global) orMCP: Open Workspace Folder Configuration(project-specific) - Add the configuration:
{ "servers": { "pdf-mcp": { "command": "pdf-mcp" } } }
- 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
pdf_info — Get Document Information
Returns page count, metadata, table of contents, file size, and estimated token count. Call this first to understand a document before reading it.
"Read the PDF at /path/to/document.pdf"
pdf_read_pages — Read Specific Pages
Read selected pages to manage context size.
"Read pages 1-10 of the PDF"
"Read pages 15, 20, and 25-30"
pdf_read_all — Read Entire Document
Read a complete document in one call. Subject to a safety limit on page count.
"Read the entire PDF (it's only 10 pages)"
pdf_search — Search Within PDF
Find relevant pages before loading content.
"Search for 'quarterly revenue' in the PDF"
pdf_get_toc — Get Table of Contents
"Show me the table of contents"
pdf_extract_images — Extract Images
"Extract images from pages 1-5"
pdf_cache_stats — View Cache Statistics
"Show PDF cache statistics"
pdf_cache_clear — Clear Cache
"Clear expired PDF cache entries"
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")
→ Relevant pages: 89-110
3. pdf_read_pages("report.pdf", "89-100")
→ First batch
4. pdf_read_pages("report.pdf", "101-110")
→ Second batch
5. Synthesize answer from chunks
Caching
The server uses SQLite for persistent caching. This is necessary because MCP servers using STDIO transport are spawned as a new process for each conversation.
Cache location: ~/.cache/pdf-mcp/cache.db
What's cached:
| Data | Benefit |
|---|---|
| Metadata | Avoid re-parsing document info |
| Page text | Skip re-extraction |
| Images | Skip re-encoding |
| TOC | Skip re-parsing |
Cache invalidation:
- Automatic when file modification time changes
- Manual via the
pdf_cache_cleartool - TTL: 24 hours (configurable)
Configuration
Environment variables:
# Cache directory (default: ~/.cache/pdf-mcp)
PDF_MCP_CACHE_DIR=/path/to/cache
# Cache TTL in hours (default: 24)
PDF_MCP_CACHE_TTL=48
Development
git clone https://github.com/jztan/pdf-mcp.git
cd pdf-mcp
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest tests/ -v
# Type checking
mypy src/
# Linting
flake8 src/
# Formatting
black src/
Why pdf-mcp?
| Without pdf-mcp | With pdf-mcp | |
|---|---|---|
| Large PDFs | Context overflow | Chunked reading |
| Repeated access | Re-parse every time | SQLite cache |
| Finding content | Load everything | Search first |
| Tool design | Single monolithic tool | 8 specialized tools |
Contributing
Contributions are welcome. Please submit a pull request.
License
MIT — see LICENSE.
Links
- PyPI
- GitHub
- MCP Documentation
- How I Built pdf-mcp — The story behind this project
- MCP Server Security: 8 Vulnerabilities — Security lessons from building MCP servers
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pdf_mcp-1.4.0.tar.gz.
File metadata
- Download URL: pdf_mcp-1.4.0.tar.gz
- Upload date:
- Size: 45.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0afb51a74a0627260b04c12c6918cb767fd432348b98ce4fcaf2bdc230157b90
|
|
| MD5 |
475951d5422b445c7417db8309d78499
|
|
| BLAKE2b-256 |
6f52d63b9dc7dd03545e7e64f4ee0a8172545324cf6219bedb17cbbf317234ff
|
File details
Details for the file pdf_mcp-1.4.0-py3-none-any.whl.
File metadata
- Download URL: pdf_mcp-1.4.0-py3-none-any.whl
- Upload date:
- Size: 21.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0de9423483b224bda8d2d566bddce44b942d5cc08d0af1588eb4a1752c7bf150
|
|
| MD5 |
66c5dea1c8ffa560a6a5c14bc1728fb0
|
|
| BLAKE2b-256 |
d7d10f31a995a07af0b67114d0bb1b630a724eac9be84b8ae3a2f822de5ba721
|