paper-mcp
Provides tools for searching arXiv papers with fielded queries, retrieving full metadata and abstracts, downloading and converting papers to markdown for reading, listing category codes, and managing a local cache of downloaded papers.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@paper-mcpsearch for recent papers on graph neural networks"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
paper-mcp
A local, Claude-native MCP server for searching and reading
arXiv papers. Successor to the Streamlit app in paper-distill/, rebuilt as a
plain stdio MCP server with first-class Claude Code support.
No API keys, no secrets, no server-side LLM. The server only searches arXiv and converts papers to markdown — Claude (the MCP client) does all summarization and Q&A. Cheap-model summarization is handled client-side by a bundled Claude Code subagent running on Haiku.
Requirements
Python 3.12+
Related MCP server: arXiv Research Assistant MCP Server
Setup
uv syncThat's it. Claude Code picks up the server automatically from the checked-in .mcp.json
when you start claude in this directory (approve the project-scoped server on first launch).
To register it elsewhere:
claude mcp add paper-mcp -- uv run --directory C:\path\to\paper-mcp python -m paper_mcpThe server is started as
python -m paper_mcprather than via thepaper-mcpconsole script: on locked-down Windows machines (AppLocker/WDAC), the generated.venv\Scripts\*.exeshims may be blocked from executing, whilepython.exeis allowed.
Tools
Tool | Description |
| Search arXiv (fielded queries |
| Full metadata + abstract for one paper (accepts IDs, |
| Download + convert the paper to markdown, paginated; also returns |
| Known arXiv category codes |
| Cache location and size |
| Delete one paper's cached files, or everything |
Prompts (slash commands in Claude Code)
/mcp__paper-mcp__summarize-paper <id> [paragraphs] [audience]— audience: High School, Undergraduate, Graduate, PhD/mcp__paper-mcp__ask-paper <id> "<question>"
Haiku summarization (Claude Code)
/summarize-paper <arxiv-id> [paragraphs] [audience]runs the bundledpaper-summarizersubagent on Haiku, so the full paper text never enters your main conversation context — only the summary comes back.
Configuration (optional)
Env var | Default | Purpose |
|
| Where PDFs and markdown are cached |
| 2 GiB | Cache size budget (oldest files evicted first) |
|
| Log level (logs go to stderr) |
Downloads are capped at 50 MB with a 60 s timeout. Cached paper versions are immutable, so there is no TTL — the cache is size-bounded instead.
Development
uv run python -m pytest -q # tests (no network needed)
uv run ruff check . # lint
uv run ruff format . # formatManual smoke test against the live server:
npx @modelcontextprotocol/inspector uv run python -m paper_mcpAvailable Tools
6 toolscache_infoCache infoARead-onlyIdempotent
Show the location and size of the local PDF/markdown cache.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| cache_dir | Yes | |
| pdf_count | Yes | |
| total_bytes | Yes | |
| deleted_files | No | Files removed by this call, if any |
| markdown_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint true, so the safety profile is covered. The description adds the specific output content (location and size) but does not introduce any additional behavioral caveats. Since there are no side effects or complex behaviors to disclose, the transparency level is adequate but not enhanced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that immediately states the action and target. Every word is informative, and there is no redundancy or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, read-only, idempotent) and the presence of an output schema, the description fully covers what an agent needs to know. There are no missing aspects like return format, side effects, or complex logic to explain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description has nothing to add about parameter semantics because none exist. The lack of parameter info is appropriate and does not hinder usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Show' and clearly identifies the resource as 'the location and size of the local PDF/markdown cache.' It distinguishes itself from sibling tools like 'clear_cache' and 'search_papers' by focusing solely on cache metadata, so an agent can easily tell what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: an agent would call this to inspect cache details, likely before clearing it. However, there is no explicit mention of when to use this tool versus alternatives, nor any exclusions or prerequisites. The purpose is simple enough that the implied context suffices, but the guidance is not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_cacheClear paper cacheADestructiveIdempotent
Delete cached files for one paper, or the entire cache.
| Name | Required | Description | Default |
|---|---|---|---|
| arxiv_id | No | Clear one paper's cached PDF+markdown, or everything when omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cache_dir | Yes | |
| pdf_count | Yes | |
| total_bytes | Yes | |
| deleted_files | No | Files removed by this call, if any |
| markdown_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true. The description adds the key behavioral nuance that omitting arxiv_id clears the entire cache, which is not directly stated in annotations. It also mentions 'cached files' without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that communicates the action, scope, and conditional behavior without any wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple deletion tool with an output schema, annotations for destructiveness and idempotency, and a single optional parameter, the description covers the essential behavior. It could mention that clearing the entire cache is irreversible, but the destructiveHint annotation already signals this, so it's sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains that arxiv_id clears one paper's cached PDF+markdown or everything when omitted. The description adds no additional parameter meaning beyond this, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Delete') and resource ('cached files') with clear scope: either one paper or the entire cache. This clearly distinguishes it from sibling tools like search_papers, get_paper, and cache_info, which are read/search operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on what the tool does and its two modes (single paper vs. entire cache). It does not explicitly name alternatives or state when not to use it, but given the sibling list, it is the only cache-clearing tool, making the usage context reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_paperGet paper metadataARead-onlyIdempotent
Fetch full metadata and the abstract of a single arXiv paper.
| Name | Required | Description | Default |
|---|---|---|---|
| arxiv_id | Yes | arXiv ID (e.g. 2403.05530, 2403.05530v2, math.GT/0309136) or an arxiv.org abs/pdf URL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| doi | Yes | |
| title | Yes | |
| abs_url | Yes | |
| authors | Yes | |
| comment | Yes | |
| pdf_url | Yes | |
| updated | Yes | |
| abstract | Yes | |
| arxiv_id | Yes | |
| published | Yes | |
| categories | Yes | |
| journal_ref | Yes | |
| primary_category | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, idempotent, and open-world behavior. The description adds the specific return content ('full metadata and the abstract'), which is useful but not extensive. No additional behavioral traits such as error handling, rate limits, or network dependencies are disclosed, but the bar is lower given the strong annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that clearly states the action and resource without any unnecessary words. It is front-loaded with the verb and immediately conveys the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with rich annotations and an output schema, the description is largely complete. It covers what the tool does and what it returns. The only gap is explicit usage guidance versus sibling tools, but that is a minor omission given the other structured fields provide sufficient context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description for arxiv_id is comprehensive, covering examples and URL support (100% coverage). The tool description adds no extra meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Fetch' and clearly identifies the resource: 'full metadata and the abstract of a single arXiv paper.' The phrase 'single arXiv paper' distinguishes this from search_papers (which likely returns multiple results) and read_paper (which likely provides full text). Even without naming siblings explicitly, the scope and resource are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving metadata for a known arXiv paper, but it provides no explicit guidance on when to use this tool versus alternatives like search_papers or read_paper. No exclusions or alternative tools are mentioned, so usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesList arXiv categoriesARead-onlyIdempotent
List known arXiv category codes and their display names.
| Name | Required | Description | Default |
|---|---|---|---|
| prefix | No | Optional group filter, e.g. 'cs', 'math', 'q-bio', 'stat'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, covering safety. The description adds behavioral context by specifying that the tool returns category codes and display names, which tells the agent what to expect. It does not disclose other traits like pagination, but it is consistent and adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states exactly what the tool does without any waste. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool, the schema fully documents the optional parameter, annotations declare the safe and idempotent nature, and the description conveys the core purpose. An output schema exists, so return values need not be described. Nothing important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, describing the optional prefix parameter with examples ('cs', 'math', etc.). The tool description itself does not add parameter details, so the schema carries the load. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and clearly identifies the resource ('arXiv category codes') and the output content ('display names'). This distinguishes it from sibling tools like search_papers and get_paper, which are search/retrieval operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving category metadata but does not explicitly state when to use it versus alternatives or mention any exclusions. There is no guidance on when to use the optional prefix filter, though the schema provides examples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_paperRead paper as markdownARead-onlyIdempotent
Download an arXiv paper, convert it to markdown, and return its text (paginated).
Also returns markdown_path: the cached file holding the FULL text, which can be Read/Grep'd directly instead of paging.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Character offset to start reading from | |
| arxiv_id | Yes | arXiv ID or arxiv.org URL. A versionless ID resolves to the latest. | |
| max_chars | No | Maximum characters returned in this call |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | Yes | |
| content | Yes | |
| arxiv_id | Yes | |
| has_more | Yes | |
| next_offset | Yes | Pass as `offset` to fetch the next chunk; null when the document is done |
| total_chars | Yes | |
| markdown_path | Yes | Absolute path to the cached markdown file holding the FULL paper text. For long papers, prefer Read/Grep on this file over paging through tool output. |
| returned_chars | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses pagination behavior and the markdown_path cache file, which can be Read/Grep'd directly—information not captured by annotations. It also explains the download/convert process, adding meaningful behavioral context beyond the readOnly/idempotent hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and a practical tip about the cached file. Zero redundant words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's full flow—download, convert, return text, and cache file—and the existing output schema handles return details. It lacks explicit fallback/error context (e.g., if conversion fails), but that's not essential given the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter already described in detail (e.g., arxiv_id resolves versionless IDs to latest, offset is character offset). The description's 'paginated' mention aligns with offset/max_chars but doesn't add meaning beyond the schema; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Download an arXiv paper, convert it to markdown, and return its text (paginated).' This distinguishes it from siblings like search_papers (search) and get_paper (likely metadata), making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context: the tool returns paginated text and also a markdown_path for full-text access, suggesting when to use the cached file instead of paging. However, it doesn't explicitly contrast with sibling tools like get_paper or define exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_papersSearch arXivARead-onlyIdempotent
Search arXiv for papers matching a query, optionally filtered by category.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | relevance | |
| query | Yes | Free-text or fielded arXiv query. Field prefixes (ti:, au:, abs:) and boolean operators (AND, OR, ANDNOT) are supported. | |
| categories | No | Optional arXiv category codes to filter by, e.g. ['cs.LG', 'stat.ML']. Use list_categories to discover valid codes. | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| query | Yes | The effective arXiv query that was executed |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, open-world, and idempotent, covering the safety profile. The description adds minimal behavioral context, simply confirming it searches for papers and optionally filters by category, without addressing rate limits, response format, or other behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that immediately states the tool's action and scope. It is concise with no filler, earning a high score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema and good annotations, but the description is very brief and omits guidance on when to use this tool vs siblings. It doesn't mention sorting or max_results behavior, though these are discoverable from schema. Overall, it's adequate for a simple search tool but lacks some contextual completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes query and categories, but sort and max_results lack descriptions, leaving 50% coverage. The description only repeats optional category filtering and doesn't explain sorting or result limits, so it fails to compensate for the undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches arXiv for papers matching a query, with an optional category filter. This distinguishes it from sibling tools like get_paper and read_paper, which likely retrieve specific papers rather than search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for using this tool to search for papers, but it does not explicitly mention when to use alternatives such as get_paper for known papers. However, the verb 'search' and the sibling names imply the appropriate scenario, though no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
cache_info - First observed
clear_cache - First observed
get_paper - First observed
list_categories - First observed
read_paper - First observed
search_papers
TDQS
Scored across 6 tools
Each tool has a clear, distinct purpose: searching, fetching metadata, reading full text, listing categories, and managing cache. There is no overlap or ambiguity between tools.
Tool names follow a mostly consistent verb_noun pattern with underscores (search_papers, get_paper, read_paper, clear_cache). 'cache_info' is slightly inconsistent (could be 'get_cache_info'), but the pattern is still predictable and readable.
With 6 tools, the server is well-scoped for an arXiv paper management client. It covers search, retrieval, reading, and cache management without unnecessary bloat.
The tool surface covers the core workflow: search, fetch metadata, read full text, and manage cache. A direct PDF download tool is missing, but read_paper converts to markdown, so it is not a critical gap.
Maintenance
Related MCP Connectors
Academic research MCP server for paper search, citation checks, graphs, and deep research.
Zotero MCP server for Claude and ChatGPT: search, citations, safe writes, PDF passages and pages.
Augments MCP Server - A comprehensive framework documentation provider for Claude Code
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server for searching and downloading academic papers from multiple sources including arXiv, PubMed, bioRxiv, and Sci-Hub, designed for seamless integration with large language models like Claude Desktop.572,611MIT
- AlicenseBqualityDmaintenanceAn MCP server that allows Claude AI to search, explore, and compare arXiv papers efficiently through a custom-built local server.417MIT
- FlicenseNot gradedqualityCmaintenanceAn MCP server that enables AI assistants to search arXiv papers, retrieve metadata, and access PDFs.-
- AlicenseNot gradedqualityDmaintenanceA MCP server for searching and downloading academic papers from arXiv, PubMed, bioRxiv, and more. It integrates with LLMs like Claude Desktop for paper discovery.MIT