Paper-Research-MCP
Federated academic research retrieval over MCP — 30 connectors, 34 tools, one standardized result schema.
🇮🇩 Versi Bahasa Indonesia · 📦 Source code: github.com/DranxX/Paper-Research-MCP
📜 What is Paper-Research-MCP?
A brand-new MCP server for academic paper search, distilled from the expansion plan
in Collection/Markdown/Refer/Reference.md — absorbed while curating three upstream
collections plus that additional reference, to make agent-side research broader, not
just deeper.
It implements the document's core design rule: don't flatten every source into one
search_papers(). Each source is its own connector with its own tools (discovery,
conference review, paper↔code mapping, metadata resolution, OA resolution), and a
federation layer on top handles cross-source search, deduplication, and provenance.
- 🔓 Free-first — everything runs without an API key; premium connectors are registered but dormant until you set their env vars
- 🧵 Federated — cross-source search with DOI → title dedup and
alsoIn/matchedQueriesprovenance - 📅 Date-bounded —
year_from/year_topassed natively to APIs that support it, universal post-filter for the rest - 📦 uv-packaged — Python ≥ 3.10, deps only
mcp+httpx - 🟢 Honest failures — bot-walls and rate limits return structured envelopes with manual-fallback suggestions, never silent lies
📦 Install
Requires: Python ≥ 3.10 and uv. Deps: mcp + httpx.
Local checkout — point your MCP client at the folder:
// ZCode / Claude Desktop / Cursor / any MCP client
{
"mcpServers": {
"paper-research": {
"command": "uv",
"args": ["--directory", "<path>/Paper-Research-MCP", "run", "paper-research-mcp"],
"env": { "S2_API_KEY": "", "ADS_TOKEN": "", "SCOPUS_API_KEY": "" }
}
}
}
Published on PyPI — after release (see 🚀 Publishing below) it becomes one line:
{ "mcpServers": { "paper-research": { "command": "uvx", "args": ["paper-research-mcp"] } } }
🔑 Optional API keys
All free connectors work without any key. Premium connectors stay dormant until their
env var is set (see .env.example):
| Env var | Connector | Note |
|---|---|---|
S2_API_KEY |
Semantic Scholar | removes the 429 rate limit |
OPENALEX_API_KEY |
OpenAlex | dedicated daily budget |
ADS_TOKEN |
NASA ADS | free for researchers |
ALPHAXIV_API_KEY |
AlphaXiv | or add their official MCP directly |
SCOPUS_API_KEY |
Scopus | needs institutional entitlement |
LENS_TOKEN / DIMENSIONS_TOKEN / WOS_API_KEY |
Lens / Dimensions / WoS | subscription-based |
BAIDU_API_KEY / AMINER_API_KEY / CSTR_CLIENT_ID+CSTR_SECRET |
Baidu / AMiner / CSTR | China platforms |
🌐 Connectors
| Category | Sources |
|---|---|
| FREE (default on) | OpenAlex · Crossref · arXiv · DOAJ · OpenReview · INSPIRE-HEP · ERIC · Unpaywall · ORCID · NSSD (China SSH) · ScienceDB |
| FREE, bot-wall/rate-limited (default on, honest errors) | Semantic Scholar · Papers with Code · Google Scholar · Baidu Scholar · GARUDA · SINTA · OneSearch · RAMA · Moraref · Neliti · BRIN |
| API KEY (dormant until env set) | NASA ADS · AlphaXiv · Scopus · The Lens · Dimensions · Web of Science · AMiner · CSTR |
🇮🇩 The
indonesia_researchblock follows the Reference.md warning: these platforms have no official APIs — they are best-effort scrapers with truthful failure envelopes.
🛠 Tools
34 tools are auto-discovered by any MCP client via tools/list — no configuration
needed. Two entry points worth knowing:
search_papers— federated search; supports singlequeryor parallelqueries: ["k1","k2"], date boundsyear_from/year_to, source selection, dedup by DOI → title, and provenance (alsoIn+matchedQueries)list_sources— every connector with its access category and env status
Full per-source tools (e.g. openalex_search, openreview_notes, garuda_search) are
listed by your client automatically after connecting.
🏗 Architecture
pyproject.toml ← uv package ([project.scripts] paper-research-mcp)
└── src/paper_research_mcp/
├── server.py ← MCP stdio entry (official `mcp` SDK, lowlevel Server)
├── registry.py ← 30 connectors, auth-gating, universal year post-filter
├── federation.py ← search_papers: queries×sources parallel (pool 8), dedup, provenance
├── core.py ← httpx w/ timeout, standardized item schema, envelopes, year filter
└── sources/
├── free.py (11) OpenAlex Crossref arXiv DOAJ S2 OpenReview INSPIRE ERIC Unpaywall ORCID PwC
├── indonesia.py (8) GARUDA SINTA OneSearch RAMA Moraref Neliti BRIN Google Scholar
├── china.py (5) NSSD Baidu Scholar AMiner ScienceDB CSTR
└── premium.py (6) ADS AlphaXiv Scopus Lens Dimensions WoS
🧪 Testing
uv run python tests/e2e_all_tools.py
Live suite with 36 checks: all 34 tools one by one (envelope-shape validation +
per-category status expectations), all three federation modes, year-filter leak checks,
and the MCP stdio handshake in a subprocess. Scraper sources returning blocked count
as PASS — the envelope is the contract, not the network mood. Last run: 36/36 PASS.
🚀 Publishing
# 1. Create a PyPI account → Account Settings → API token
# 2. Dry-run against TestPyPI (optional):
uv publish --publish-url https://test.pypi.org/legacy/ --token pypi-XXXXXXXX
# 3. Release:
uv build
uv publish --token pypi-XXXXXXXX
# 4. Anyone can now run it:
uvx paper-research-mcp
📄 License
MIT. Source of the connector plan: Collection/Markdown/Refer/Reference.md
(paper-search-mcp ecosystem + indonesia_research + China platforms + premium connectors).
Metadata
Release files for paper-research-mcp 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| paper_research_mcp-0.1.1.tar.gz | 97.2 kB | Without provenance | Details for paper_research_mcp-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| paper_research_mcp-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for paper_research_mcp-0.1.1-py3-none-any.whl |
Total release size: 127.9 kB
Release files / paper_research_mcp-0.1.1.tar.gz
| Download URL | paper_research_mcp-0.1.1.tar.gz |
|---|---|
| Size | 97.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e67137efca003a9afad378d3049dc18813054d0a16ffd73dd8db37be6e74e152
|
|
BLAKE2b-256 checksum How to use checksums |
17bd2a41c4db9e8ad6ff29030364703a1bbfcf7bf89d06bd72502ff5369ee4ee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / paper_research_mcp-0.1.1-py3-none-any.whl
| Download URL | paper_research_mcp-0.1.1-py3-none-any.whl |
|---|---|
| Size | 30.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8de2c1bd991dbf113ab3f79a38ff318fcc6b1f009ea90f770ce59852bbe5cc62
|
|
BLAKE2b-256 checksum How to use checksums |
81666b9c80e08b0b2843162d46a33290d375276e20550bf8fbe80ec668139e0f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for paper-research-mcp 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.