find-research-papers-mcp
Give your AI agent scientific grounding: search 250M+ scholarly works across five indexes with one query, and pull references and citations even from paywalled journals.
LLMs hallucinate citations. This server replaces guesswork with verified metadata — every hit is a real record from a real scholarly index, with a DOI, a URL, an abstract, and a retraction flag when the source knows one.
What it does
- One search, five indexes — arXiv, OpenAlex, Crossref, PubMed, and Semantic Scholar, aggregated into a single hit schema. The same query goes out everywhere; results come back unified.
- Paywalled papers, public bibliography — a Nature or IEEE paper you
cannot read still has public metadata:
get_paperreturns its references (Crossref) and citing works (OpenAlex). DOI, abstract, and reference data are public even when full text is not. - Verification built in —
verify=trueHEAD-checks the landing page and cross-checks OpenAlex's retraction flag. A paper that won't answer is reported asresolves: null(unknown), never as "dead". - Graceful degradation — a rate-limited or failing source is skipped and
reported in the response's
skippedlist. No key required anywhere; one source's outage never breaks a search. - Zero required API keys — works out of the box. An optional Semantic Scholar key lifts its shared-pool rate limit.
Sources
| Source | Coverage | Key needed |
|---|---|---|
arxiv |
Open-access preprints (CS, physics, math, q-bio, q-fin, stats) | no |
openalex |
~250M scholarly works — Nature and all peer-reviewed journals | no |
crossref |
DOI registry — Springer Nature, Elsevier, IEEE, ACM… | no |
pubmed |
30M+ biomedical citations, free full-text via PMC | no |
semanticscholar |
~220M papers, citation graph + TLDRs | optional¹ |
¹ Semantic Scholar's shared pool rate-limits without a key. Set
FIND_RESEARCH_PAPERS_MCP_S2_API_KEY to lift it. When a source is skipped,
the server says so in the response — it never crashes.
Tools
| Tool | What it does |
|---|---|
search_papers(query, sources, limit, year_from, year_to, sort, open_access_only) |
Aggregate search across all or selected sources. Returns unified hits: id, title, authors, year, venue, abstract, doi, url, pdf_url, citations_count, open_access, retracted, type, source. |
get_paper(identifier, id_type, include_references, include_citations, verify) |
Resolve one paper by DOI, arXiv ID, PMID, OpenAlex ID, or S2 ID (auto-detected), plus its reference and citation graph — works for paywalled papers. With verify=true (default), adds verification: {resolves, retracted, checked_at}. |
get_research_method() |
The house method: when to use each tool, rules for interpreting results, per-source quirks, verification steps. Agents should call this before interpreting results. |
list_sources() |
What is searchable and from where. |
Install
Any MCP client (Claude Code, Cursor, opencode, …):
uvx find-research-papers-mcp # or
npx -y find-research-papers-mcp
One-command installer (served from a Cloudflare worker — auto-detects uvx vs npx, finds your harness, merges into the right config, and reports anonymous install telemetry back to the worker — Claude Code, Cursor, opencode, Windsurf, VS Code):
curl -fsSL https://papers-mcp-install-telemetry.reachsuren.workers.dev/install?src=readme | bash
# or explicitly: bash install.sh --claude bash install.sh --opencode
Claude Code plugin (one-time registration, then install from anywhere):
/plugin marketplace add surendranb/find-research-papers-mcp
/plugin install find-research-papers@find-research-papers-mcp
Official MCP Registry — the server is listed as
io.github.surendranb/find-research-papers-mcp, installable through clients
that support the registry.
From source:
uv venv .venv --python 3.11
uv pip install --python .venv/bin/python -e .
.venv/bin/python -m papers_mcp # stdio server
Optional config: export FIND_RESEARCH_PAPERS_MCP_S2_API_KEY=... for
full-rate Semantic Scholar.
Quick start
# search everything at once
hits = search_papers("retrieval augmented generation", limit=3)
# -> unified hits: id, title, authors, year, doi, url, pdf_url,
# citations_count, abstract, retracted, source
# deep-dive one paper, even paywalled
paper = get_paper("10.1038/s41586-023-06466-1",
include_references=True, include_citations=True)
# verify before you cite
v = get_paper(identifier, verify=True)["verification"]
# v["resolves"]: landing page answered?
# v["retracted"]: OpenAlex flags this paper as retracted?
A retracted: true hit must never be presented as evidence.
Telemetry & privacy
The server collects anonymous usage telemetry, on by default, to learn which sources and features matter.
- Sent: event names, an anonymous installation UUID, coarse environment signals (OS, Python version, agent name), and tool outcome counts (hits found, sources used, skipped reasons, retracted hits, latency).
- Never sent: search queries, paper results, file paths, emails, or URLs.
- Opt out with any of:
FIND_RESEARCH_PAPERS_MCP_TELEMETRY=false,DISABLE_TELEMETRY=1,DO_NOT_TRACK=1,NO_TELEMETRY=1. The install ID lives in~/.find_research_papers_mcp/installation_id; delete the folder to reset it. - The first run prints a disclosure to stderr before anything is sent.
- Telemetry never blocks or slows the server: a dead endpoint just drops events.
Development
.venv/bin/python -m pytest tests/test_sources.py # offline unit tests
.venv/bin/python -m pytest tests/e2e/test_e2e.py # native MCP protocol
.venv/bin/python -m pytest -m live tests/e2e/ # live third-party APIs
License
Apache-2.0
Release files for find-research-papers-mcp 0.4.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| find_research_papers_mcp-0.4.2.tar.gz | 40.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| find_research_papers_mcp-0.4.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 84.3 kB
Release files / find_research_papers_mcp-0.4.2.tar.gz
| Download URL | find_research_papers_mcp-0.4.2.tar.gz |
|---|---|
| Size | 40.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bdb6578f4d603bcfc967c353cadd97ff6c425f6ce09426058478fcf9788de93e
|
|
BLAKE2b-256 checksum How to use checksums |
1f90114f64ab24f4c4ca7167344ec6b78b2d4a82cf8bbb3f2cdaa329a055da73
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|
Release files / find_research_papers_mcp-0.4.2-py3-none-any.whl
| Download URL | find_research_papers_mcp-0.4.2-py3-none-any.whl |
|---|---|
| Size | 43.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
064460f1a8e9966f0f7e84ea480b7ac2d96454f5346d9eb71750225e7cbf896a
|
|
BLAKE2b-256 checksum How to use checksums |
865367d4cb082442b4fbb9bae5a4b9d5b24046a1759bc88703e16c2ba2dd2a01
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|