academic-mcp
Searches and retrieves papers from arXiv, including direct DOI-to-arXiv resolution and title-based preprint lookup as a fallback for paywalled content.
Uses the Elsevier API for Scopus search and ScienceDirect paper downloads, including PDF retrieval for DOI-based lookups.
Searches academic literature via Scopus, merging results with OpenAlex and tracking referenced DOIs for session-scoped download authorization.
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., "@academic-mcpSearch for papers about graph neural networks published after 2020"
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.
academic-mcp
A local MCP service that is the whole backend of an academic research workflow:
literature search, citation chains, per-project research memory, paper download
and PDF→Markdown conversion. Any MCP client can drive it — the first one is the
DSH academic agent preset, which contains no Python at all.
client (any MCP host) ──JSON-RPC /mcp──▶ academic-mcp :8790
├─ Scopus + OpenAlex (search, citation chains)
├─ project memory JSON (notes, findings, progress)
├─ arXiv / Elsevier / browser → PDF
└─ MinerU cloud API (PDF → Markdown)Everything that needs Python lives here. A client only sends tool calls.
Tools
Tool | Purpose |
| Scopus + OpenAlex search, merged, deduplicated and hybrid-reranked. |
| Forward / backward citation expansion from seed DOIs (OpenAlex). Pass |
| Per-project research memory: |
| Read a session's tool-call log. |
| DOI → full text (Markdown), cached under |
| DOI → PDF path only (no conversion). |
| Any document (local path or URL) → Markdown: PDF, Word, PPT, Excel, images, HTML. Returns path + outline + page→line map. |
| May this DOI be downloaded in this session? (no network) |
| Machine-readable tool contract: every tool with its required/optional arguments. Clients validate against it instead of assuming names. |
| Config + resolver stats (secrets masked). Call this first when something fails. |
convert_document is the one MinerU implementation for both the paper pipeline
and general document reading.
Related MCP server: openresearch-mcp
Configuration
Settings come from the process environment, then <MCP_HOME>/.env (this
directory), then ~/.shellrc. Copy .env.example to .env and fill it in.
Nothing else is read — in particular, no client's directory is consulted.
The essentials:
Variable | Meaning | Default |
| library root: project memory JSON, |
|
| MinerU cloud PDF→Markdown (required for conversion) | — |
| Scopus search + ScienceDirect download | — |
| OpenAlex search + citation chains | — |
| publisher/API access, and the rescue route in | — |
|
|
|
| primary route for OpenAlex search / arXiv (failover hop applies here too) | — |
| listen address |
|
| local conversion cache |
|
Full list with defaults and tuning knobs: .env.example.
There are two proxy settings and one Elsevier credential: DOWNLOAD_PROXY
(publisher/API access, and the rescue route in failover mode) and
GFW_PROXY (arXiv/search engines/OpenAlex). ELSEVIER_API_KEY alone is
enough for metadata; an institutional insttoken is not supported.
Restart the service after editing (configuration is read once at startup):
systemctl --user restart academic-mcp # or however you run itInstall
python -m venv .venv && . .venv/bin/activate
pip install -e . # or: pip install academic-mcp
cp .env.example .env # then edit
academic-mcp # or: python -m academic_mcpThe browser fallback needs a one-time download and a display (Xvfb is fine):
camoufox fetchacademic-mcp.service and academic-mcp-xvfb.service in this directory are
examples — they assume Linux with systemd --user. Adjust the paths before
using them.
PDF → Markdown: MinerU only
There is deliberately no fallback converter. The previous backend tried local MinerU (GPU) and then PyMuPDF4LLM; both produced silently degraded text (lost formulas, broken tables, scrambled reading order) that a reading agent then summarised as authoritative. Failing loudly is better than fabricating structure.
Resolver order
Cheap and reliable first, expensive and fragile last:
arxiv-direct— the DOI is an arXiv ID (10.48550/...)elsevier-api—10.1016/+ ScienceDirect API keydirect-pdf— open-access publishers whose PDF needs no session cookies. Only entries verified to returnapplication/pdfbelong here. SciPost is deliberately excluded: it sits behind a proof-of-work gate, and dodging that with a non-browser User-Agent would evade a control someone installed on purpose — it goes through the browser instead.camoufox-browser— headful Firefox, CloudFlare bypass, paywalls. Walks the same routes as the HTTP client (DOWNLOAD_PROXY_MODE), one browser session per exit, because entitlements are per-IP: an exit that is a subscriber for one publisher is a stranger for the next, and the second route is what rescues the first.arxiv-title-search— find the preprint by title (arXiv API + verification, with DDGS as a rescue for titles the API's phrase match cannot reach)
The last one is a fallback for content, not access: when every publisher path is paywalled, an arXiv preprint of the same paper is still worth reading. It runs last so the version-of-record wins when reachable. Candidates are verified (title similarity + author) before use — fetching the wrong paper is worse than failing. It asks arXiv's own API first and keeps web search as the rescue, because a resolver whose job is to work when the publisher refused us cannot depend on search engines that may be refusing us too.
Display for the browser
Headful Firefox is required for CloudFlare Turnstile (headless is detected and
challenged harder). The resolver picks, in order: an existing Xvfb on :99–:96,
the ambient DISPLAY, a self-started Xvfb, otherwise headless.
Layout
academic-mcp/
├── academic-mcp.py # script entrypoint (kept for compatibility)
├── academic_mcp/
│ ├── __main__.py # python -m academic_mcp
│ ├── config.py # env + .env settings
│ ├── server.py # MCP tools (incl. contract / health)
│ ├── pipeline.py # cache → resolve → convert
│ ├── mineru.py # MinerU cloud API (the only converter)
│ ├── storage.py # DOI→key, cache validity
│ ├── httpclient.py # pooled client, retries, proxy policy
│ ├── validate.py # session-scoped DOI authorization
│ ├── markdown.py # outline + page→line map
│ ├── resolvers/ # arxiv, elsevier, publisher, camoufox
│ └── agent/ # search, snowball, memory + MCP wrappers
├── scripts/ # manual publisher / network diagnostics
└── tests/ # offline smoke testsDevelopment
pip install -e ".[dev]"
ruff check .
pytest -q # offline: no network, no browser, no MinerU quotaThe tests pin the parts clients depend on as a contract: the tool surface, the
argument names, the cwd → session_id rule and the memory round-trip.
Security notes
The service binds to
127.0.0.1by default and keeps its keys in.env(never returned over the wire;healthmasks them).validate_doionly authorises a DOI that appeared in this session's search results, so a stray DOI cannot trigger a download.The browser fallback drives a real Firefox for CloudFlare challenges and paywalled publishers. Use it in line with those sites' terms.
License
GPL-3.0-or-later — see LICENSE.
Copyright (C) 2026 cxxiao.
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. It is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose.
This server cannot be deployed
Maintenance
Related MCP Connectors
Academic literature search, retrieval, and private library management on top of OpenAlex.
Zotero MCP server for Claude and ChatGPT: search, citations, safe writes, PDF passages and pages.
Self-hosted AI workspace: semantic RAG document search, long-term memory, and AI chat via MCP.
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Related MCP Servers
- AlicenseAqualityAmaintenanceMulti-source academic paper search, citation graph exploration, and PDF download as an MCP server, designed for LLM agents doing research.6153 PyPI5Apache 2.0
- AlicenseNot gradedqualityCmaintenanceZero-auth multi-source research MCP server that enables web search, reading URLs, PDFs, GitHub repos, and querying Hacker News, Stack Overflow, Semantic Scholar, and YouTube transcripts without API keys.71 PyPI11Apache 2.0
- AlicenseNot gradedqualityBmaintenanceA local-first paper RAG server that enables searching and managing academic PDFs via MCP tools, supporting metadata enrichment and citation graphs.1MIT
- AlicenseAqualityCmaintenanceA local MCP server for searching scientific papers, retrieving metadata and abstracts, and legally downloading Open Access PDFs via OpenAlex, CrossRef, and Unpaywall APIs.53MIT