Nutrient PDF MCP Server
Enables low-level PDF object-tree inspection and debugging through natural language, with lazy loading for token efficiency.
README
Nutrient PDF MCP Server
A powerful Model Context Protocol server for LLM-driven PDF document analysis and exploration
Which MCP Server Should I Use?
| Server | Best for | Deployment | Core capabilities |
|---|---|---|---|
| Nutrient DWS MCP Server | Cloud document workflows | Nutrient-hosted API (API key) | Convert, OCR, redact, sign, extract, watermark, automation |
| Nutrient Document Engine MCP Server | Self-hosted document workflows | On-prem/private cloud | Document processing with deployment control and data residency |
| Nutrient PDF MCP Server | Low-level PDF inspection/debugging | Local Python runtime | Object-tree exploration, indirect-object resolution, structural analysis |
You are in the PDF MCP Server repo. Choose this when you need low-level PDF object-tree inspection/debugging rather than end-to-end workflow automation.
- Ecosystem overview: Nutrient AI Infrastructure
- Product landing page: Nutrient MCP Server
A Model Context Protocol (MCP) server for investigating PDF object trees with lazy loading support. This tool allows LLMs to efficiently explore PDF document structure without overwhelming token limits.
Features
- Lazy Loading: Explore PDF structure without loading entire object trees
- Path Navigation: Navigate through PDF objects using dot notation (e.g.,
Pages.Kids.0) - Selective Resolution: Resolve specific indirect objects on demand
- Token Efficient: Massive reduction in response sizes compared to full tree dumps
- Type Safe: Comprehensive type hints and error handling
Installation
Optional asdf setup
You'll need python and nodejs installed on your machine. You can optionally use asdf.
Finally install required tools with:
git clone https://github.com/PSPDFKit/nutrient-pdf-mcp-server.git
cd nutrient-pdf-mcp-server
asdf install
# Install pipx for Python
python -m pip install --user pipx
Proceed with the rest of the installation after that.
Quick Start
git clone https://github.com/PSPDFKit/nutrient-pdf-mcp-server.git
cd nutrient-pdf-mcp-server
make install-dev # Sets up development environment
For Claude Code CLI
Recommended: Build and Install
pip install build
make build
pipx install dist/nutrient_pdf_mcp-1.0.0-py3-none-any.whl
claude mcp add nutrient-pdf-mcp nutrient-pdf-mcp
If using asdf, you might need to configure pipx with the following before running:
export PIPX_DEFAULT_PYTHON=$(asdf which python)
pipx install dist/nutrient_pdf_mcp-1.0.0-py3-none-any.whl
Development Mode
make install-dev
claude mcp add nutrient-pdf-mcp "$(pwd)/venv/bin/python" -m pdf_mcp.server
Manual Configuration
{
"mcpServers": {
"nutrient-pdf-mcp": {
"command": "python",
"args": ["-m", "pdf_mcp.server"]
}
}
}
Available Tools
get_pdf_object_tree
Nutrient PDF MCP Server - Get JSON representation of PDF object tree with lazy loading.
Parameters:
pdf_path(required): Path to the PDF fileobject_id(optional): Specific object ID to retrieve (e.g., '1 0')path(optional): Object path to navigate (e.g., 'Pages.Kids.0')mode(optional): Parsing mode - 'lazy' (default) or 'full'
Examples:
{
"pdf_path": "document.pdf",
"mode": "lazy"
}
{
"pdf_path": "document.pdf",
"path": "Pages.Kids.0",
"mode": "lazy"
}
resolve_indirect_object
Nutrient PDF MCP Server - Resolve a specific indirect object by its object and generation numbers.
Parameters:
pdf_path(required): Path to the PDF fileobjnum(required): PDF object number (e.g., 3)gennum(optional): PDF generation number (defaults to 0)depth(optional): Resolution depth - 'shallow' (default) or 'deep'
Examples:
{
"pdf_path": "document.pdf",
"objnum": 3,
"gennum": 0,
"depth": "shallow"
}
Command Line Usage
# Run the server
make serve
# Or run with debug logging
make serve-debug
Architecture
Core Components
parser.py: Main PDF parsing logic with lazy loading supportserver.py: MCP server implementationtypes.py: Type definitions for PDF objects and responsesexceptions.py: Custom exception classes
Response Types
All PDF objects are serialized into a consistent JSON format:
{
"type": "dict",
"value": {
"/Type": { "type": "name", "value": "/Pages" },
"/Kids": {
"type": "array",
"value": [{ "type": "indirect_ref", "objnum": 2, "gennum": 0 }]
}
}
}
Token Efficiency
The lazy loading system provides massive token savings:
- Lazy mode: ~5-50 lines (minimal tokens)
- Shallow resolution: ~50-100 lines (reasonable tokens)
- Deep resolution: 500+ lines (use sparingly)
Examples
Exploring PDF Structure
- Get overview:
get_pdf_object_tree(path="document.pdf", mode="lazy") - Navigate to pages:
get_pdf_object_tree(path="document.pdf", path="Pages", mode="lazy") - Resolve specific page:
resolve_indirect_object(objnum=3, gennum=0, depth="shallow") - Deep dive when needed:
resolve_indirect_object(objnum=3, gennum=0, depth="deep")
Path Navigation Examples
"Pages"- Navigate to Pages object"Pages.Kids"- Get Kids array from Pages"Pages.Kids.0"- Get first page"Pages.Kids.0.MediaBox.2"- Get width from MediaBox array
Development
Quick Start
# Set up development environment
make install-dev
# Run all quality checks (format, lint, typecheck, test)
make quality
# Or run individual commands
make test # Run tests
make format # Format code
make lint # Run linter
make typecheck # Type checking
Project Structure
nutrient-pdf-mcp-server/
├── pdf_mcp/
│ ├── __init__.py
│ ├── server.py # MCP server
│ ├── parser.py # PDF parsing logic
│ ├── types.py # Type definitions
│ └── exceptions.py # Custom exceptions
├── tests/ # Test suite
├── res/ # Sample PDFs
├── pyproject.toml # Project configuration
└── README.md
Publishing to PyPI
# Build the package
make build
# Upload to test PyPI first
twine upload --repository testpypi dist/*
# Upload to production PyPI
twine upload dist/*
After publishing, users can install with:
pipx install nutrient-pdf-mcp
# or
pip install --user nutrient-pdf-mcp
Contributing
- Fork the repository
- Create a feature branch
- Make your changes with tests
- Ensure code quality checks pass
- Submit a pull request
License
MIT License - see LICENSE file for details.
Related Projects
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.