← All articles

arXiv MCP Server: Complete Setup Guide & Research Workflows

July 6, 2026·22 min read·MCPForge

arXiv MCP Server: Complete Setup Guide & Research Workflows

The arXiv MCP Server connects AI assistants directly to the world's largest open-access research repository — giving tools like Claude, Cursor, and other MCP-compatible clients the ability to search papers, retrieve metadata, read abstracts, and pull PDF content in real time, without leaving your development environment.

This guide covers everything from zero to production: installation, client configuration, real research workflows, RAG pipeline integration, and the operational details that most tutorials skip entirely.


What the arXiv MCP Server Actually Does

arXiv hosts over 2.3 million research papers across physics, mathematics, computer science, quantitative biology, quantitative finance, statistics, electrical engineering, and economics. Traditionally, accessing this via an AI assistant meant copy-pasting paper titles, abstracts, or URLs into a chat window. This workflow breaks down immediately when you need to survey 50 papers or track citations across a field.

The arXiv MCP Server solves this by exposing arXiv's public API as structured MCP tools. Your AI client can call these tools directly during a conversation or an agentic workflow:

  • Search papers by keyword, author, category, or date range
  • Retrieve full paper metadata including title, authors, abstract, submission date, categories, and DOI
  • Get PDF download URLs for direct paper access
  • Fetch abstracts in bulk for literature review synthesis
  • Track papers by arXiv ID (e.g., 2312.00752)

The result is that an AI agent can conduct a structured literature review, identify key papers in a field, summarize findings, and synthesize research gaps - all autonomously, within a single session.

What makes this particularly powerful is the combination of search and retrieval in a single tool chain. An agent can search for papers on a topic, pull abstracts for the top results, identify the most-cited authors, then search again using those names - iterating through the literature the way a researcher would, but in seconds rather than hours. This kind of chained reasoning across multiple tool calls is where MCP's architecture genuinely earns its place over simple API wrappers. The server also handles arXiv's rate limiting and response parsing transparently, so the AI receives clean, structured data rather than raw XML. For teams building research assistants, automated literature monitors, or domain-specific knowledge bases, this removes the most tedious part of the pipeline entirely.


How It Works: Architecture

The arXiv MCP Server is a lightweight process that sits between your MCP client (Claude Desktop, Cursor, Claude Code) and the arXiv public API.

┌─────────────────────────────────────────────────────────────────┐
│                        MCP Client Layer                         │
│   ┌──────────────┐   ┌──────────────┐   ┌──────────────────┐   │
│   │ Claude Desktop│   │  Claude Code │   │     Cursor       │   │
│   └──────┬───────┘   └──────┬───────┘   └────────┬─────────┘   │
└──────────┼──────────────────┼────────────────────┼─────────────┘
           │  JSON-RPC (stdio)│                    │
           ▼                  ▼                    ▼
┌─────────────────────────────────────────────────────────────────┐
│                   arXiv MCP Server Process                      │
│  ┌────────────────┐  ┌─────────────────┐  ┌─────────────────┐  │
│  │  Tool: search  │  │ Tool: get_paper │  │ Tool: get_pdf   │  │
│  │  _papers       │  │ _details        │  │ _url            │  │
│  └────────┬───────┘  └────────┬────────┘  └────────┬────────┘  │
└───────────┼───────────────────┼────────────────────┼───────────┘
            │  HTTP requests    │                    │
            ▼                  ▼                    ▼
┌─────────────────────────────────────────────────────────────────┐
│                   arXiv Public API                              │
│         https://export.arxiv.org/api/query                      │
│         https://arxiv.org/abs/{id}                              │
│         https://arxiv.org/pdf/{id}                              │
└─────────────────────────────────────────────────────────────────┘

The server communicates with MCP clients via stdio transport (the standard for local MCP servers). Each tool call triggers an HTTP request to the arXiv API, parses the Atom XML response, and returns structured JSON back to the client.

This is important to understand: the arXiv MCP Server is stateless by design. Each tool call is independent. There is no session, no caching layer (unless you add one), and no persistent state between requests.


Choosing an Implementation

There is no single official arXiv MCP Server. Several community implementations exist. Here's an honest comparison:

ImplementationLanguageStars (approx.)PDF SupportCategory FilterMaintained
blazickjp/arxiv-mcp-serverPython★★★Yes (URL + text)YesActive
custom npm implementationsTypeScriptVariesPartialVariesMixed
Self-built via MCP SDKPython/TSN/AFull controlFull controlYou own it

For most developers, blazickjp/arxiv-mcp-server is the practical starting point. It's Python-based, actively maintained, and covers the core use cases. This guide uses it as the primary reference.

If you need full PDF text extraction, custom category hierarchies, or citation graph traversal, you'll likely need to extend or replace it with a custom implementation.


Want to analyze your API security?

Import your OpenAPI spec and generate a Security Report automatically.

Prerequisites

Before installing:

  • Python 3.10+ (the server uses modern type annotations and async features)
  • uv (recommended) or pip for package management
  • Node.js 18+ only if you're using a TypeScript implementation
  • An MCP-compatible client: Claude Desktop, Claude Code (CLI), or Cursor
  • No API keys required — the arXiv API is publicly accessible

Verify your Python version:

bash
python --version
# Python 3.11.x or higher recommended

Installation

uv is the fastest way to run Python MCP servers without polluting your global environment:

bash
# Install uv if you don't have it
curl -LsSf https://astral.sh/uv/install.sh | sh

# Run the arXiv MCP server directly with uvx (no install needed)
uvx arxiv-mcp-server

Using uvx means you don't manage a virtual environment manually. The package is fetched and run in an isolated environment automatically.

Option 2: Install via pip

bash
# Create and activate a virtual environment
python -m venv arxiv-mcp-env
source arxiv-mcp-env/bin/activate  # On Windows: arxiv-mcp-env\Scripts\activate

# Install the server
pip install arxiv-mcp-server

# Verify installation
arxiv-mcp-server --version

Option 3: Install from Source (For Customization)

bash
git clone https://github.com/blazickjp/arxiv-mcp-server.git
cd arxiv-mcp-server

# Using uv
uv sync
uv run arxiv-mcp-server

# Using pip
pip install -e .
arxiv-mcp-server

Installing from source is the right choice if you need to modify the tool schemas, add caching, or integrate additional paper sources.


Client Configuration

Claude Desktop Integration

Claude Desktop reads its MCP server configuration from a JSON file. Locate it:

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

Add the arXiv MCP Server:

json
{
  "mcpServers": {
    "arxiv": {
      "command": "uvx",
      "args": ["arxiv-mcp-server"],
      "env": {
        "ARXIV_MAX_RESULTS": "20",
        "ARXIV_STORAGE_PATH": "/Users/yourname/.arxiv-mcp/papers"
      }
    }
  }
}

If you installed via pip into a virtual environment, use the full path instead:

json
{
  "mcpServers": {
    "arxiv": {
      "command": "/Users/yourname/arxiv-mcp-env/bin/arxiv-mcp-server",
      "args": [],
      "env": {
        "ARXIV_MAX_RESULTS": "25",
        "ARXIV_STORAGE_PATH": "/Users/yourname/.arxiv-mcp/papers"
      }
    }
  }
}

After saving, restart Claude Desktop completely (Quit from the menu bar, not just close the window). The arXiv tools should appear in Claude's tool panel.

Verify it's working by asking Claude: "Search arXiv for recent papers on mixture of experts language models" — if the tool is connected, Claude will invoke the search tool and return structured results.

Claude Code Integration

Claude Code (the CLI agent) supports MCP servers via a project-level config file or the global config. For project-level configuration:

bash
# From your project root
mkdir -p .claude

Create .claude/mcp.json:

json
{
  "mcpServers": {
    "arxiv": {
      "command": "uvx",
      "args": ["arxiv-mcp-server"],
      "env": {
        "ARXIV_MAX_RESULTS": "30",
        "ARXIV_STORAGE_PATH": "./.arxiv-cache"
      }
    }
  }
}

For global configuration:

bash
# Claude Code reads from ~/.claude/mcp.json by default
mkdir -p ~/.claude
# Add the same JSON structure above

Verify the connection:

bash
claude mcp list
# Should output: arxiv - connected

claude mcp get arxiv
# Shows available tools

In a Claude Code session, you can then run:

> Search arXiv for papers about retrieval augmented generation published in 2024

Claude Code will use the arXiv tools autonomously and synthesize results.

Cursor Integration

Cursor supports MCP servers through its settings. Open Cursor Settings (Cmd+, or Ctrl+,), navigate to Features → MCP Servers, and add the configuration:

json
{
  "mcpServers": {
    "arxiv": {
      "command": "uvx",
      "args": ["arxiv-mcp-server"],
      "env": {
        "ARXIV_MAX_RESULTS": "15"
      }
    }
  }
}

Alternatively, you can add a .cursor/mcp.json file at the project root with the same structure — useful for research projects where you want arXiv access scoped to a specific workspace.

Once configured, open Cursor's AI chat panel and try: "Find the most cited papers on diffusion models from 2022" — Cursor's AI will invoke the arXiv search tool and return results inline.


Available Tools and What They Return

The arXiv MCP Server exposes several tools. Understanding their input/output schemas matters for designing agentic workflows.

search_papers

Searches the arXiv API using keyword queries, category filters, and date ranges.

Input schema:

json
{
  "query": "attention mechanism transformer",
  "max_results": 10,
  "categories": ["cs.LG", "cs.AI"],
  "date_from": "2024-01-01",
  "date_to": "2024-12-31",
  "sort_by": "relevance"
}

Returns:

json
{
  "papers": [
    {
      "id": "2401.12345",
      "title": "Example Paper Title",
      "authors": ["Smith, J.", "Jones, A."],
      "abstract": "Abstract text...",
      "published": "2024-01-15",
      "updated": "2024-01-20",
      "categories": ["cs.LG", "cs.AI"],
      "pdf_url": "https://arxiv.org/pdf/2401.12345",
      "abs_url": "https://arxiv.org/abs/2401.12345"
    }
  ],
  "total_results": 1,
  "query_time": 0.42
}

get_paper_details

Retrieves full metadata for a specific paper by arXiv ID.

Input:

json
{
  "paper_id": "1706.03762"
}

This is the tool to use when you know the paper ID (e.g., "Attention Is All You Need" is 1706.03762) and need complete metadata.

download_paper

Fetches paper content — either the PDF URL for download, or extracted text depending on the implementation.

Input:

json
{
  "paper_id": "2312.00752",
  "format": "text"
}

list_downloaded_papers

Returns papers previously downloaded and stored in the local storage path. Useful in long research sessions where you've built up a local paper cache.


Environment Configuration Reference

Environment VariableDefaultDescription
ARXIV_MAX_RESULTS10Maximum papers per search query
ARXIV_STORAGE_PATH./papersDirectory for downloaded papers/cache
ARXIV_REQUEST_DELAY3Seconds between API requests (rate limiting)
ARXIV_DEFAULT_CATEGORIESNoneDefault category filter if not specified
ARXIV_SORT_BYrelevanceDefault sort: relevance, lastUpdatedDate, submittedDate
ARXIV_SORT_ORDERdescendingSort direction

Setting ARXIV_STORAGE_PATH to a persistent directory is important if you're running repeated research sessions and want to avoid re-downloading papers.


Real Research Workflows

This is where the arXiv MCP Server pays off. Here are concrete workflows developers and researchers actually use.

Workflow 1: Automated Literature Review

The classic use case. Instead of spending 3 hours on Google Scholar, you can instruct Claude:

You are a research assistant. Use the arXiv search tool to:
1. Search for papers on "speculative decoding large language models" from 2023-2024
2. Retrieve the abstract for each of the top 10 results
3. Identify the 5 most technically significant papers based on their abstracts
4. Write a structured literature review covering: problem statement, key techniques, 
   experimental results, and open research questions
5. Format citations in APA style

Claude will execute multiple tool calls, synthesize the results, and produce a structured review — a task that would take a researcher 2-4 hours manually.

Workflow 2: Research Gap Analysis

Search arXiv for papers on "federated learning privacy" in categories cs.LG and cs.CR.
For the top 20 results, extract:
- The primary problem each paper addresses
- The proposed solution approach
- Stated limitations in the paper's own conclusion

Then identify: What problems are frequently mentioned as future work but have few dedicated papers?
This will help identify promising research directions.

This kind of meta-analysis over a literature corpus is extremely tedious manually but straightforward for an AI agent with arXiv access.

Workflow 3: Track a Specific Author's Output

Search arXiv for all papers authored by "Ilya Sutskever" published after 2022.
For each paper, extract the title, co-authors, categories, and one-sentence summary.
Present as a chronological timeline showing the evolution of research focus.

Workflow 4: Daily Research Digest

For teams that want a daily digest of new papers in their area:

python
# This would run inside a Claude Code or agent session
# Search for papers submitted in the last 24 hours in specific categories
search_params = {
    "query": "large language models",
    "categories": ["cs.LG", "cs.AI", "cs.CL"],
    "date_from": "2025-01-29",  # yesterday
    "date_to": "2025-01-30",   # today
    "sort_by": "submittedDate",
    "max_results": 50
}

The agent fetches new papers, ranks them by relevance to your stated interests, and produces a digest. You can automate this via a cron job that invokes a Claude Code session.

Workflow 5: Code Implementation from Paper

This is a particularly powerful pattern for ML engineers:

1. Search arXiv for the paper "FlashAttention-2" (2307.08691)
2. Download and read the paper's method section
3. Identify the core algorithm described
4. Implement a Python prototype of the algorithm based on the paper description
5. Add comments referencing the specific equations from the paper

The AI reads the paper and generates an initial implementation — not perfect, but a strong starting point that previously required manually reading and transcribing algorithms.


Building a RAG Pipeline with arXiv MCP

For production research tools, you'll want to combine arXiv MCP with a vector database for retrieval-augmented generation.

Here's the architecture:

┌─────────────────────────────────────────────────────────────┐
│                    Research RAG Pipeline                    │
│                                                             │
│  User Query                                                 │
│       │                                                     │
│       ▼                                                     │
│  ┌─────────┐    arXiv MCP      ┌──────────────────────┐    │
│  │  Agent  │──────────────────▶│  arXiv API           │    │
│  │ (Claude)│◀──────────────────│  (search + metadata) │    │
│  └────┬────┘                   └──────────────────────┘    │
│       │ Papers + Abstracts                                  │
│       ▼                                                     │
│  ┌─────────────────────┐                                   │
│  │  PDF Text Extractor │  (PyMuPDF, pdfplumber, etc.)      │
│  └──────────┬──────────┘                                   │
│             │ Chunked Text                                  │
│             ▼                                               │
│  ┌─────────────────────┐    ┌──────────────────────────┐   │
│  │  Embedding Model    │───▶│  Vector Store            │   │
│  │  (text-embedding-3) │    │  (Chroma, Pinecone, etc.)│   │
│  └─────────────────────┘    └──────────────────────────┘   │
│                                      │                      │
│                             Semantic Search                 │
│                                      │                      │
│  ┌─────────────────────┐             │                      │
│  │  Synthesis Agent    │◀────────────┘                      │
│  │  (Claude + context) │                                    │
│  └─────────────────────┘                                    │
└─────────────────────────────────────────────────────────────┘

Example implementation using LangChain + Chroma:

python
import asyncio
import os
from typing import List
import anthropic
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
import fitz  # PyMuPDF
import httpx

# Step 1: Use Claude with arXiv MCP to gather papers
async def gather_papers_via_mcp(topic: str, max_papers: int = 20) -> List[dict]:
    """
    In practice, this runs inside a Claude session with arXiv MCP enabled.
    The agent calls search_papers and get_paper_details automatically.
    This function simulates the structured output.
    """
    # Claude with arXiv MCP will populate this via tool calls
    # For programmatic use, you'd invoke the MCP server directly
    pass

# Step 2: Extract text from arXiv PDFs
def extract_text_from_arxiv_pdf(paper_id: str) -> str:
    """Download and extract text from an arXiv PDF."""
    pdf_url = f"https://arxiv.org/pdf/{paper_id}"
    
    response = httpx.get(pdf_url, follow_redirects=True, timeout=30)
    response.raise_for_status()
    
    # Extract text using PyMuPDF
    doc = fitz.open(stream=response.content, filetype="pdf")
    text_chunks = []
    
    for page_num in range(len(doc)):
        page = doc.load_page(page_num)
        text = page.get_text()
        if text.strip():
            text_chunks.append(text)
    
    return "\n".join(text_chunks)

# Step 3: Build vector store from papers
def build_research_vector_store(
    paper_ids: List[str],
    persist_directory: str = "./research_db"
) -> Chroma:
    """Build a searchable vector store from arXiv papers."""
    
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=1000,
        chunk_overlap=200,
        separators=["\n\n", "\n", ". ", " "]
    )
    
    documents = []
    metadatas = []
    
    for paper_id in paper_ids:
        print(f"Processing {paper_id}...")
        try:
            text = extract_text_from_arxiv_pdf(paper_id)
            chunks = text_splitter.split_text(text)
            
            for i, chunk in enumerate(chunks):
                documents.append(chunk)
                metadatas.append({
                    "paper_id": paper_id,
                    "chunk_index": i,
                    "source": f"https://arxiv.org/abs/{paper_id}"
                })
            
            # Respect arXiv rate limits
            import time
            time.sleep(3)
            
        except Exception as e:
            print(f"Failed to process {paper_id}: {e}")
            continue
    
    embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
    
    vector_store = Chroma.from_texts(
        texts=documents,
        embedding=embeddings,
        metadatas=metadatas,
        persist_directory=persist_directory
    )
    
    vector_store.persist()
    return vector_store

# Step 4: Query the research corpus
def query_research_corpus(vector_store: Chroma, question: str, k: int = 5) -> str:
    """Retrieve relevant paper sections for a research question."""
    results = vector_store.similarity_search_with_score(question, k=k)
    
    context_parts = []
    for doc, score in results:
        paper_id = doc.metadata.get("paper_id", "unknown")
        context_parts.append(
            f"[Source: arxiv.org/abs/{paper_id} | Relevance: {score:.3f}]\n{doc.page_content}"
        )
    
    return "\n\n---\n\n".join(context_parts)

This pattern lets you build a persistent research knowledge base that grows over time as the agent discovers new papers.


AspectManual SearcharXiv MCP Server
Time to survey 50 papers4–8 hours5–15 minutes
Category filteringManual, error-proneStructured, programmatic
Metadata extractionCopy/pasteStructured JSON
Bulk abstract analysisImpracticalNative
Integration with codeManualDirect in IDE
Research gap identificationExpert judgment onlyAI-assisted at scale
Citation trackingSeparate tool neededCombinable via ID
ReproducibilityNoneFully logged tool calls
PDF accessBrowser-basedProgrammatic
Date range filteringLimitedPrecise

The comparison isn't about replacing researcher judgment — it's about removing the mechanical overhead so researchers can spend time on actual synthesis and decision-making.


Security Considerations

The arXiv MCP Server's security profile is simpler than most MCP servers because it has no authentication surface — but there are still things to get right.

Network Access Scope

The server makes outbound HTTP requests to arxiv.org. In restricted enterprise environments or CI environments, you may need to whitelist export.arxiv.org and arxiv.org explicitly.

PDF Content Trust

PDFs from arXiv are generally safe — they're academic papers. However, if you're automatically parsing and executing code found in papers (e.g., for implementation workflows), treat that content the same as any untrusted input. Never exec() code extracted from PDFs without review.

Storage Path Security

The ARXIV_STORAGE_PATH directory stores downloaded papers. Ensure this path:

  • Is outside your web server's document root
  • Has appropriate file permissions
  • Is excluded from version control (add to .gitignore)
bash
echo ".arxiv-cache/" >> .gitignore
echo "papers/" >> .gitignore

Rate Limiting and Responsible Use

arXiv's Terms of Service prohibit aggressive scraping. The arXiv API guidelines specify:

  • No more than 3 requests per second
  • Automated bulk downloads must use the official API, not web scraping
  • Use the API's max_results parameter rather than paging through thousands of results unnecessarily

If you're building a production research tool that queries arXiv frequently, consider implementing a local caching layer so you don't re-fetch papers you already have.

Production MCP Server Validation

Before deploying any MCP server in a production research pipeline, validate it. MCPForge Verify checks your MCP server's tool schemas, transport compatibility, and configuration against the MCP specification. This is particularly useful when you've customized or extended the arXiv server, since schema drift can cause silent failures in agentic workflows.


Common Mistakes and How to Fix Them

Mistake 1: Forgetting to Restart Claude Desktop

Symptom: arXiv tools don't appear in Claude Desktop after adding config.
Why it happens: Claude Desktop loads MCP configuration at startup only.
Fix: Fully quit Claude Desktop (not just close the window) and relaunch. On macOS, use Cmd+Q or right-click the Dock icon → Quit.

Mistake 2: Wrong Python Path in Config

Symptom: Error: spawn ENOENT or command not found: arxiv-mcp-server
Why it happens: The command in the config points to a Python binary that doesn't exist at that path, or arxiv-mcp-server isn't in the PATH that Claude Desktop inherits.
Fix: Use uvx which handles path resolution automatically, or specify the absolute path:

bash
# Find the actual path
which arxiv-mcp-server
# Use this full path in your config

Mistake 3: Hitting arXiv Rate Limits

Symptom: Tool calls fail with HTTP 429 or connection errors during bulk operations.
Why it happens: Agentic workflows that loop over many papers can trigger rapid-fire API calls.
Fix: Set ARXIV_REQUEST_DELAY to at least 3 seconds. In agent prompts, explicitly instruct the AI to process papers sequentially rather than attempting parallel searches.

Mistake 4: Searching Without Category Filters

Symptom: Search results are noisy and off-topic.
Why it happens: arXiv spans many disciplines. "Transformer" returns papers from physics and biology, not just ML.
Fix: Always specify categories for technical searches:

json
{
  "query": "transformer architecture",
  "categories": ["cs.LG", "cs.AI", "cs.CL"]
}

Mistake 5: Treating Abstracts as Full Papers

Symptom: AI-generated literature reviews contain factual errors or miss key methodological details.
Why it happens: Abstracts are summaries, not complete technical descriptions. An AI working only from abstracts will miss experimental details, limitations sections, and nuanced findings.
Fix: For deep technical analysis, use the download_paper tool to get full paper text. Use abstracts for initial screening and triage only.

Mistake 6: Not Validating the Paper ID Format

Symptom: get_paper_details returns an error for valid-looking paper IDs.
Why it happens: arXiv paper IDs changed format in 2007. Old-format IDs use subject area prefixes (e.g., hep-th/9901001), while new-format IDs are purely numeric (e.g., 2401.12345).
Fix: Both formats are valid but must be passed correctly. Strip version suffixes (v1, v2) if you want the latest version:

2401.12345      ✓ (new format, latest version)
2401.12345v2    ✓ (new format, specific version)
hep-th/9901001  ✓ (old format)
2401.12345v     ✗ (malformed)

Performance Optimization

Implement a Local Cache

The biggest performance gain comes from caching paper metadata locally. If your workflow repeatedly references the same papers across sessions, fetching them from arXiv each time is wasteful.

python
import json
import hashlib
from pathlib import Path
from datetime import datetime, timedelta

class ArxivCache:
    def __init__(self, cache_dir: str = ".arxiv-cache", ttl_days: int = 7):
        self.cache_dir = Path(cache_dir)
        self.cache_dir.mkdir(exist_ok=True)
        self.ttl = timedelta(days=ttl_days)
    
    def _cache_key(self, query: str) -> str:
        return hashlib.md5(query.encode()).hexdigest()
    
    def get(self, query: str) -> dict | None:
        key = self._cache_key(query)
        cache_file = self.cache_dir / f"{key}.json"
        
        if not cache_file.exists():
            return None
        
        data = json.loads(cache_file.read_text())
        cached_at = datetime.fromisoformat(data["cached_at"])
        
        if datetime.now() - cached_at > self.ttl:
            cache_file.unlink()  # Expired
            return None
        
        return data["result"]
    
    def set(self, query: str, result: dict) -> None:
        key = self._cache_key(query)
        cache_file = self.cache_dir / f"{key}.json"
        cache_file.write_text(json.dumps({
            "cached_at": datetime.now().isoformat(),
            "result": result
        }))

Batch Abstract Retrieval

For literature reviews, fetch multiple papers in a single search call rather than making individual get_paper_details calls per paper. The search API returns abstracts in its response — use them for initial analysis before downloading full PDFs.

Limit PDF Downloads to Key Papers

PDFs are large (often 5–20MB) and slow to process. Structure your agent workflow to:

  1. Search and retrieve abstracts for 20-50 papers
  2. Have the AI rank the top 5-10 by relevance
  3. Only download full PDFs for those top papers

This is the research equivalent of reading titles and abstracts before pulling papers off the shelf.


Production Deployment Notes

For teams running shared research infrastructure, you can deploy the arXiv MCP Server as a remote HTTP/SSE endpoint rather than a local process.

python
# server.py - Deploy as HTTP MCP server using FastMCP
from mcp.server.fastmcp import FastMCP
import arxiv

mcp = FastMCP("arXiv Research Server")

@mcp.tool()
def search_papers(query: str, max_results: int = 10, categories: list[str] = None) -> dict:
    """Search arXiv for research papers."""
    search_query = query
    if categories:
        cat_filter = " OR ".join([f"cat:{c}" for c in categories])
        search_query = f"({query}) AND ({cat_filter})"
    
    client = arxiv.Client()
    search = arxiv.Search(
        query=search_query,
        max_results=max_results,
        sort_by=arxiv.SortCriterion.Relevance
    )
    
    papers = []
    for result in client.results(search):
        papers.append({
            "id": result.entry_id.split("/")[-1],
            "title": result.title,
            "authors": [a.name for a in result.authors],
            "abstract": result.summary,
            "published": result.published.isoformat(),
            "categories": result.categories,
            "pdf_url": result.pdf_url
        })
    
    return {"papers": papers, "count": len(papers)}

if __name__ == "__main__":
    # Run as HTTP server for remote MCP clients
    mcp.run(transport="sse", host="0.0.0.0", port=8080)

For remote deployment, clients connect via HTTP instead of stdio:

json
{
  "mcpServers": {
    "arxiv-remote": {
      "url": "http://your-server:8080/sse",
      "transport": "sse"
    }
  }
}

This enables your entire team to share a single arXiv MCP deployment with centralized caching and rate limit management.

For production deployment considerations — including health checks, authentication, monitoring, and containerization — see the Running MCP Servers in Production guide, which covers these operational concerns in depth.

Before going to production with any MCP server, validating its compatibility and tool schema correctness will save you debugging time. The MCPForge Verify tool runs your server through a suite of specification checks and catches common configuration issues before they surface in production workflows.

You can also browse verified MCP servers in the MCPForge directory to find other servers that pair well with arXiv — including database connectors, vector store integrations, and document processing servers that round out a complete research pipeline.


Troubleshooting Reference

SymptomLikely CauseFix
Tools don't appear in Claude DesktopConfig file JSON syntax error, or Claude not restartedValidate JSON, restart Claude fully
spawn ENOENT errorcommand path is wrongUse absolute path or uvx
Empty search resultsQuery too specific, wrong categoriesBroaden query, check category codes
HTTP 429 from arXivRate limit exceededIncrease ARXIV_REQUEST_DELAY, add retry logic
PDF download failsPaper may not have a public PDF (rare)Check the abs page manually
Old papers not foundDate filter excluding themCheck date_from parameter
Abstract truncatedarXiv API response limitUse get_paper_details for full abstract
MCP Inspector can't connectServer not running or wrong transportCheck server starts successfully with uvx arxiv-mcp-server directly
Duplicate papers in resultsMultiple versions of same paperDeduplicate by base paper ID (strip version suffix)

Key Takeaways

  • The arXiv MCP Server requires no API key and works out of the box with uvx arxiv-mcp-server as the command in any MCP client config.
  • Always specify category filters for technical searches — without them, results will include papers from unrelated disciplines.
  • Use abstracts for triage, full PDF text for deep technical analysis.
  • Implement local caching in any workflow that touches the same papers repeatedly.
  • The arXiv API has a 3-request-per-second rate limit — configure your server accordingly and add retry logic in production.
  • For team deployments, consider running the server as an HTTP/SSE endpoint with centralized caching rather than per-developer local processes.
  • Validate any MCP server before production use, especially if you've customized the tool schemas.
  • The most powerful research workflows combine arXiv MCP with a vector store for RAG — arXiv provides discovery and retrieval, while the vector store enables semantic search across your curated paper corpus.

The arXiv MCP Server is one of those tools that immediately changes how you approach research. Once your AI assistant can search, read, and synthesize research papers autonomously, manually hunting through Google Scholar starts to feel like writing assembly code when you could use a high-level language.

Frequently Asked Questions

Does the arXiv MCP Server require an API key?

No. The arXiv API is publicly accessible without authentication for read operations. The arXiv MCP Server uses the public arXiv API endpoints directly, so no API key or OAuth token is required to search papers, retrieve metadata, or download PDFs.

Can the arXiv MCP Server download full PDF content for an AI to read?

Yes, with caveats. The server can retrieve PDF download URLs and, depending on implementation, extract text from PDFs. However, full PDF parsing depends on which arXiv MCP implementation you use. Some implementations return raw PDF bytes, while others extract plain text. For large-scale ingestion, text extraction via a dedicated PDF parser is more reliable.

What is the rate limit for the arXiv API?

arXiv requests a maximum of 3 requests per second with a minimum 3-second delay between requests. The MCP server implementations typically handle this automatically. In bulk workflows, you should still add explicit delays and retry logic to avoid temporary blocks.

Can I use the arXiv MCP Server with Claude Code and Cursor simultaneously?

Yes. The MCP server process runs independently. You can configure multiple clients — Claude Desktop, Claude Code, and Cursor — to each spawn their own instance of the arXiv MCP server process, or point them to a shared remote MCP endpoint if you deploy it as an HTTP/SSE server.

Is there an official Anthropic arXiv MCP Server?

No. As of early 2025, there is no officially maintained Anthropic arXiv MCP Server. The most widely used implementation is the community-built arxiv-mcp-server by blazickjp on GitHub. Always verify any MCP server implementation before using it in production workflows.

How do I search only within a specific arXiv category like cs.AI?

Most arXiv MCP implementations expose category filtering as a search parameter. You pass the category (e.g., cs.AI, stat.ML, quant-ph) as part of the search tool call. Under the hood, this maps to the arXiv API's category query parameter (cat:cs.AI). Check your specific implementation's tool schema for the exact parameter name.

Can I use the arXiv MCP Server in a RAG pipeline?

Absolutely. The arXiv MCP Server is well-suited for retrieval-augmented generation. An AI agent can search arXiv, retrieve paper abstracts and metadata, then pass that content into a vector database or directly into context for synthesis. For large-scale RAG, you'll want to combine arXiv MCP with a PDF text extractor and embedding pipeline.

What happens if the arXiv API is down?

If the arXiv API is unavailable, MCP tool calls will fail with network errors. Production deployments should implement retry logic with exponential backoff, and your MCP client configuration should handle tool call errors gracefully. The arXiv API is generally very reliable but does have occasional maintenance windows.

How do I validate that my arXiv MCP Server is working correctly before using it in production?

Run a simple search query using the MCP Inspector or your client's built-in tool testing. You can also use MCPForge Verify (mcpforge.dev/verify) to validate your server's tool schema, compatibility, and production readiness against known MCP standards before deploying.

Check your MCP security posture

Generate a Security Score, detect risky tools, and review permissions before exposing APIs to AI agents.