arXiv Discovery MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DATABASE_URL | Yes | PostgreSQL connection string (default: postgresql+asyncpg://arxiv_mcp:arxiv_mcp_dev@localhost:5432/arxiv_mcp) | postgresql+asyncpg://arxiv_mcp:arxiv_mcp_dev@localhost:5432/arxiv_mcp |
| OPENALEX_EMAIL | No | Email for OpenAlex polite pool (recommended; increases rate limit from 1 to 10 req/s) | |
| DEPLOYMENT_MODE | No | local or hosted -- controls content license enforcement | local |
| OPENALEX_API_KEY | No | OpenAlex API key for enrichment |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_papersA | Search for arXiv papers by text, title, author, or category. Returns paginated results with paper metadata and relevance scores. Use cursor from previous results to get the next page. Optionally provide profile_slug to get profile-ranked results with ranking explanations on each result. Response shape: {"results": {"items": [...], "page_info": {...}}, "ranker_snapshot": ...} Without profile_slug: items include triage_state and collection_slugs; ranking_explanation is null; ranker_snapshot is null. With profile_slug: items additionally include ranking_explanation and the response includes a ranker_snapshot capturing ranker config. |
| browse_recentA | Browse recently announced arXiv papers, optionally filtered by category. Use time_basis to select ordering: announced, submitted, or updated. Note: Many papers may not have announced_date populated. If results are empty with the default time_basis='announced', try time_basis='submitted'. Optionally provide profile_slug to get profile-ranked results with ranking explanations on each result. Response shape: {"results": {"items": [...], "page_info": {...}}, "ranker_snapshot": ...} Without profile_slug: items include triage_state and collection_slugs; ranking_explanation is null; ranker_snapshot is null. With profile_slug: items additionally include ranking_explanation and the response includes a ranker_snapshot capturing ranker config. |
| find_related_papersA | Find papers related to one or more seed papers via lexical similarity. Accepts a single arXiv ID or a list of IDs. When multiple seeds are given, results are merged and deduplicated, keeping the highest score for each paper. |
| get_paperA | Get metadata for a single paper by its arXiv ID. |
| triage_paperB | Set the triage state for a paper. Valid states: seen, shortlisted, dismissed, read, cite-later, archived, unseen. |
| add_to_collectionB | Add a paper to a collection. Creates the collection if it doesn't exist. |
| create_watchA | Create a monitored search that tracks new papers matching your query. Read the watch://{slug}/deltas resource to see papers added since your last check. |
| add_signalC | Add a signal to an interest profile. Signal types: seed_paper (arXiv ID), saved_query (query slug), followed_author (author name), negative_example (arXiv ID). |
| batch_add_signalsA | Add multiple signals to an interest profile in one call. Each signal dict must have: signal_type, signal_value. Optional per-signal: reason. Returns a summary with counts and per-signal results. Continues on individual signal errors (partial success is OK). |
| create_profileB | Create a new interest profile. Returns the profile summary with slug, name, signal_count, and timestamps. |
| suggest_signalsA | Generate signal suggestions for an interest profile. Examines workflow activity (triaged papers, frequent queries, recurring authors) to suggest new signals. With auto_add=True, adds suggestions as pending signals automatically. Returns candidates list and added_count. |
| enrich_paperB | Trigger OpenAlex enrichment for a paper to get topics, citations, and related works. Set refresh=True to re-enrich even if data exists within the cooldown window. |
| get_content_variantA | Get paper content at the requested fidelity level. Retrieves paper content as abstract, HTML, or PDF-derived markdown. Use variant='best' (default) to get the highest-quality available format, which tries HTML first then falls back to PDF markdown. Valid variants: 'abstract', 'html', 'pdf_markdown', 'best' Returns content with provenance metadata (source, backend, license). For non-abstract variants, respects per-paper license restrictions. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| literature_review_session | Guided literature review: search, triage, collect, expand, enrich. Start with a search query and optionally a category filter and interest profile. The prompt guides you through discovering papers, triaging them, building collections, expanding via related papers, and enriching metadata. |
| daily_digest | Automated daily monitoring: check watches, triage new papers, summarize. Reviews all active watches for new papers, performs quick triage on each, and produces a summary organized by watch/collection. |
| triage_shortlist | Batch-evaluate papers in a collection for triage decisions. Reviews each paper against the research interest and recommends triage states with reasoning. Human confirms or overrides. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 13 tools
Most tools target distinct actions: search, browse, related-papers, get-paper, triage, watch, signals, enrichment, and content retrieval are clearly separated. The only mild ambiguity is between search_papers and browse_recent since both return ranked paper lists with optional profile_slug, but their descriptions make the query-vs-recency distinction clear.
The majority follow a verb_noun pattern such as get_paper, create_profile, add_signal, and enrich_paper. Minor deviations like browse_recent (verb + adjective) and batch_add_signals break the pattern slightly, but the naming remains predictable and readable.
13 tools is a well-scoped count for an arXiv discovery server. Each tool contributes a meaningful capability without redundancy, and the set is neither too thin nor overloaded.
The discovery side is well covered with search, browse, get, related papers, content variants, and enrichment. However, the personalization surface has notable lifecycle gaps: you can create profiles, create watches, add signals, and add to collections, but there are no remove, delete, or list operations for these resources.