MCP server enabling AI agents to efficiently search and understand PDF documents
Project description
Paper Intelligence
A local MCP server for intelligent paper/PDF management. Convert PDFs to markdown, then search them with hybrid grep + semantic search. Designed for token efficiency: search first, read only what you need.
🚀 Quick Start
1. Install UV (one-time setup)
curl -LsSf https://astral.sh/uv/install.sh | sh
2. Add to Your MCP Client
Claude Code CLI:
claude mcp add paper-intelligence -- uvx paper-intelligence
VS Code:
code --add-mcp '{"name":"paper-intelligence","command":"uvx","args":["paper-intelligence"]}'
That's it! uvx handles everything automatically.
🔌 MCP Client Integration
Claude Desktop
Add to your Claude Desktop config:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"paper-intelligence": {
"command": "uvx",
"args": ["paper-intelligence"]
}
}
}
Cursor
- Go to Settings → MCP → Add new MCP Server
- Select
commandtype - Enter:
uvx paper-intelligence
Or add to ~/.cursor/mcp.json:
{
"mcpServers": {
"paper-intelligence": {
"command": "uvx",
"args": ["paper-intelligence"]
}
}
}
Windsurf / Other MCP Clients
Any MCP-compatible client can use paper-intelligence:
{
"mcpServers": {
"paper-intelligence": {
"command": "uvx",
"args": ["paper-intelligence"]
}
}
}
✨ Features
- PDF to Markdown — High-accuracy conversion using Marker
- Hybrid Search — Combined grep (exact/regex) + semantic RAG search
- Token Efficient — Search papers instead of reading entire documents
- GPU Acceleration — MPS (Apple Silicon) and CUDA support
- Self-Contained — Each paper gets its own directory with all data
- Header Context — Search results show document structure (e.g., "Methods > Data Collection")
📖 MCP Tools
process_paper
Full pipeline: Convert PDF → Index headers → Create embeddings
Parameters:
pdf_path(string): Path to PDF fileuse_llm(boolean, optional): Enhanced accuracy mode (default: false)chunk_size(integer, optional): Text chunk size for embedding (default: 512)chunk_overlap(integer, optional): Overlap between chunks (default: 50)
Example:
Process the paper at ~/Downloads/attention-is-all-you-need.pdf
Output Structure:
attention-is-all-you-need/
├── attention-is-all-you-need.md # Converted markdown
├── metadata.json # Processing version info
├── index.json # Header hierarchy
├── chroma/ # Embeddings database
└── images/ # Extracted figures
search
Unified search with grep and/or semantic RAG
Parameters:
query(string): Search query (text, regex, or semantic)paper_dirs(array): List of paper directories to searchmode(string, optional):"grep","rag", or"hybrid"(default: hybrid)top_k(integer, optional): Number of results (default: 5)regex(boolean, optional): Treat query as regex (default: false)
Example Queries:
# Semantic search across papers
Search for "attention mechanism implementation" in my processed papers
# Exact text search
Search for "transformer" using grep mode
# Regex search
Search for "BERT|GPT|T5" with regex enabled
Returns: Results with line numbers, surrounding context, and header location.
convert_pdf
Convert PDF to Markdown (without embeddings)
Parameters:
pdf_path(string): Path to PDF fileoutput_dir(string, optional): Custom output directoryuse_llm(boolean, optional): Enhanced accuracy mode
Returns: markdown_path, images_dir, image_count
get_paper_info
Check processing status of a paper
Parameters:
paper_dir(string): Path to paper directory
Example Response:
{
"has_markdown": true,
"has_index": true,
"has_embeddings": true,
"has_images": true,
"image_count": 12,
"version": "0.2.0",
"processed_at": "2025-01-15T10:30:00Z"
}
index_markdown / embed_document
Individual pipeline steps (for advanced use)
index_markdown — Extract header hierarchy into searchable JSON
index_markdown(markdown_path="~/Downloads/paper/paper.md")
embed_document — Create embeddings for semantic search
embed_document(
markdown_path="~/Downloads/paper/paper.md",
chunk_size=512,
chunk_overlap=50
)
📊 Example Output
Search Result
{
"source": "attention-is-all-you-need.md",
"line_number": 142,
"header_path": "Model Architecture > Attention",
"content": "An attention function can be described as mapping a query and a set of key-value pairs to an output...",
"score": 0.89
}
🎯 Typical Workflow
-
Process a paper:
Process the PDF at ~/Downloads/transformer-paper.pdf
-
Search across papers:
Search for "positional encoding" in my papers
-
Read specific sections:
Show me the Methods section from the transformer paper
The agent reads search results (a few hundred tokens) instead of entire papers (tens of thousands of tokens).
🛠️ Installation Options
Install from PyPI
# Install with pip
pip install paper-intelligence
# Or run directly with uvx (no install needed)
uvx paper-intelligence
Install from GitHub
pip install "paper-intelligence @ git+https://github.com/Strand-AI/paper-intelligence.git"
Local Development
git clone https://github.com/Strand-AI/paper-intelligence.git
cd paper-intelligence
# Create virtual environment
python3.11 -m venv .venv
source .venv/bin/activate
# Install in development mode
pip install -e ".[dev]"
# Run the server
python -m paper_intelligence.server
Development MCP config:
{
"mcpServers": {
"paper-intelligence": {
"command": "python",
"args": ["-m", "paper_intelligence.server"],
"cwd": "/path/to/paper-intelligence"
}
}
}
Run tests:
# Unit tests (fast)
pytest tests/test_markdown_parser.py
# Integration tests (slow, requires ML models)
pytest tests/test_integration.py -v
🔧 Debugging
Use the MCP Inspector to debug the server:
npx @modelcontextprotocol/inspector uvx paper-intelligence
🆘 Troubleshooting
Server not starting?
- Ensure Python 3.11+ is installed
- Try
uvx paper-intelligencedirectly to see error messages - Check that all dependencies installed correctly
Windows encoding issues?
Add to your MCP config:
"env": {
"PYTHONIOENCODING": "utf-8"
}
Claude Desktop not detecting changes?
Claude Desktop only reads configuration on startup. Fully restart the app after config changes.
🏗️ Technical Stack
| Component | Technology |
|---|---|
| MCP Server | Official Python SDK with FastMCP |
| PDF Conversion | marker-pdf |
| Embeddings | LlamaIndex + HuggingFace (BAAI/bge-small-en-v1.5) |
| Vector Store | ChromaDB (persistent, local per-paper) |
| GPU Support | PyTorch with MPS (Apple) or CUDA |
🙏 Acknowledgments
- Marker for excellent PDF conversion
- LlamaIndex for the RAG framework
- ChromaDB for the vector database
- FastMCP for the MCP server framework
📄 License
MIT — see LICENSE for details.
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
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 paper_intelligence-0.3.0.tar.gz.
File metadata
- Download URL: paper_intelligence-0.3.0.tar.gz
- Upload date:
- Size: 741.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d13b9b5ee793f4d1c51ad292d6cb5f735fd14ee44bcdf370d817e4df0f1395cd
|
|
| MD5 |
2de96bf3aa61120330e999aa6995eeeb
|
|
| BLAKE2b-256 |
5fc694158093b29e83395be82dd85493e08a102912e5e654712d078aeddf0af1
|
Provenance
The following attestation bundles were made for paper_intelligence-0.3.0.tar.gz:
Publisher:
publish.yml on Strand-AI/paper-intelligence
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
paper_intelligence-0.3.0.tar.gz -
Subject digest:
d13b9b5ee793f4d1c51ad292d6cb5f735fd14ee44bcdf370d817e4df0f1395cd - Sigstore transparency entry: 789074418
- Sigstore integration time:
-
Permalink:
Strand-AI/paper-intelligence@7d2b820591dbc100da5bd1cd4c20edf65d2e6cff -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/Strand-AI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7d2b820591dbc100da5bd1cd4c20edf65d2e6cff -
Trigger Event:
push
-
Statement type:
File details
Details for the file paper_intelligence-0.3.0-py3-none-any.whl.
File metadata
- Download URL: paper_intelligence-0.3.0-py3-none-any.whl
- Upload date:
- Size: 24.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e79a2287f5554ae0fc786b38f05215557c2eb599ed15114ec0de3af8b04c298
|
|
| MD5 |
8dea9d039cb4ef504abbc87e6a6e6060
|
|
| BLAKE2b-256 |
32c9e6dea40113f4123bd0751245d806dcb9864a6be52f3543a27ce7c40ec71b
|
Provenance
The following attestation bundles were made for paper_intelligence-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on Strand-AI/paper-intelligence
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
paper_intelligence-0.3.0-py3-none-any.whl -
Subject digest:
2e79a2287f5554ae0fc786b38f05215557c2eb599ed15114ec0de3af8b04c298 - Sigstore transparency entry: 789074421
- Sigstore integration time:
-
Permalink:
Strand-AI/paper-intelligence@7d2b820591dbc100da5bd1cd4c20edf65d2e6cff -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/Strand-AI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7d2b820591dbc100da5bd1cd4c20edf65d2e6cff -
Trigger Event:
push
-
Statement type: