Awesome Paper MCP
Searches ACM Digital Library publications as one of the aggregated academic sources.
Provides search and retrieval of arXiv preprints: keyword search, PDF download, full-text reading with outlines, LaTeX source access, citation graph lookups, and topic alerts.
Searches the DBLP computer-science bibliography for publication records.
Resolves DOI identifiers (e.g. 10.1145/xxx): get_paper auto-detects DOI-shaped ids and dispatches them to the backends able to resolve the work's metadata.
Runs Google Scholar keyword and advanced searches and retrieves author profile information.
Searches the HAL French open academic archive for papers and metadata.
Searches IEEE Xplore for paper metadata; requires an IEEE API key to be configured.
Searches PubMed and retrieves article full text for biomedical literature queries.
Searches Scopus for indexed publication records and metadata.
Looks up Semantic Scholar paper details, citations, references, author information and paper recommendations; an optional API key lifts the service's 429 rate limits.
Searches SSRN for social-science working papers and preprints.
Searches the Zenodo open research repository for papers, datasets and other deposits.
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., "@Awesome Paper MCPsearch arXiv and Semantic Scholar for papers on RLHF, then summarize the top 3"
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.
Awesome Paper MCP — Unified Academic Paper Search
One MCP server that unifies 9 upstream paper-search MCP servers into a single endpoint. Point any MCP-capable agent at it and get search, full-text reading, citation graphs, peer-review data and a research pipeline from 40+ academic sources — arXiv, Semantic Scholar, Google Scholar, OpenReview, OpenAlex, DBLP, PubMed, bioRxiv, medRxiv, Crossref, CORE, HAL, Europe PMC, SSRN, Zenodo, CiteSeerX, DOAJ, BASE, OpenAIRE, PMC, ACM, IACR, WoS, Scopus, IEEE, plus conference listings for NeurIPS / ICML / ICLR / IJCAI / CVPR / ECCV / AAAI / PMLR.
14 backends · 148 upstream tools · 1 config entry.
Why a gateway instead of installing 9 servers
Each upstream project pins its own dependency versions (arxiv 2.x vs 4.x,
bibtexparser 1.x vs 2.x, mcp 0.9 vs 1.30, fastmcp 3.x vs 4.x). Installing
them into one interpreter breaks them. This gateway therefore runs each upstream
server as a separate child process on a private stdio pipe and speaks MCP to
it, so no two projects ever share an interpreter.
agent ──stdio/http──▶ paper-mcp gateway ──┬─▶ arxiv (19 tools)
├─▶ multisearch (71 tools)
├─▶ resp (20 tools)
├─▶ openreview (11 tools)
├─▶ openreview_classic (5 tools)
├─▶ scholar (9 tools)
├─▶ google_scholar (3 tools)
├─▶ papers_helper (4 tools)
└─▶ 6 × sercantas research pipeline (6 tools)Related MCP server: Research MCP
Install
One command from a fresh clone (needs uv, git, node ≥ 18, npm):
git clone https://github.com/<you>/awesome-paper-mcp.git
cd awesome-paper-mcp
bash scripts/setup.shThe script creates the Python 3.12 venv, installs the pinned dependency set
(requirements-lock.txt), clones the 9 upstream repos at the exact commits this
gateway was tested against, links them into the same venv with --no-deps
(that is what lets their incompatible pins coexist), installs the Node modules
for the sercantas pipeline, installs the gateway itself, and finishes with an
MCP handshake smoke test. It is safe to re-run.
cd awesome-paper-mcp
uv venv --python 3.12 .venv
export VIRTUAL_ENV=$PWD/.venv PATH=$PWD/.venv/bin:$PATH
uv pip install -r requirements-lock.txt # pinned shared dependency set
git clone <upstream-url> sources/<dir> && git -C sources/<dir> checkout <sha> # ×9, see scripts/setup.sh
for d in blazickjp-arxiv-mcp-server openags-paper-search-mcp monk1337-resp_mcp \
OpenCodice-Research-openreview-mcp anyakors-openreview-mcp-server-equivalent \
silung-scholar-search-mcp elpaca-ai_papers_helper; do
uv pip install -e "sources/$d" --no-deps # pins cannot fight each other
done
( cd sources/sercantas-Academic-Research-MCP-Suite && npm install --no-audit --no-fund )
uv pip install -e . --no-deps # gateway -> .venv/bin/paper-mcpJackKuo666-Google-Scholar-MCP-Server is deliberately not installed: it imports
a sibling module by bare name, so the gateway launches it as a script instead.
Connect your agent
Replace /path/to/awesome-paper-mcp with your checkout everywhere below. If
your client supports a cwd field, the python -m unified_mcp form works; if
it does not (e.g. MiniMax Code), point command at the console script
/path/to/awesome-paper-mcp/.venv/bin/paper-mcp with no args — the gateway
resolves its own paths from the script location.
Claude Code / Claude Desktop
{
"mcpServers": {
"paper-mcp": {
"command": "/path/to/awesome-paper-mcp/.venv/bin/python",
"args": ["-m", "unified_mcp"],
"cwd": "/path/to/awesome-paper-mcp"
}
}
}Cursor (~/.cursor/mcp.json)
{
"mcpServers": {
"paper-mcp": {
"command": "/path/to/awesome-paper-mcp/.venv/bin/python",
"args": ["-m", "unified_mcp"],
"cwd": "/path/to/awesome-paper-mcp"
}
}
}MiniMax Code (~/.minimax/mcp.json or project .mcp.json)
MiniMax Code's MCP settings have no cwd field, so use the console script:
{
"mcpServers": {
"paper-mcp": {
"command": "/path/to/awesome-paper-mcp/.venv/bin/paper-mcp",
"args": []
}
}
}HTTP transport (shared / remote)
.venv/bin/python -m unified_mcp --http --host 127.0.0.1 --port 8765{
"mcpServers": {
"paper-mcp": { "type": "http", "url": "http://127.0.0.1:8765/mcp" }
}
}Generic stdio (Gemini CLI, Cline, Windsurf, Zed, OpenCode, …)
{
"mcpServers": {
"paper-mcp": {
"command": "python",
"args": ["-m", "unified_mcp"],
"cwd": "/path/to/awesome-paper-mcp"
}
}
}The 14 backends
Backend | Source repo | Tools | What it is for |
| 19 | arXiv search, PDF download, full-text reading, outlines, LaTeX source, citation graph, topic alerts | |
| 71 | 40+ sources in one server: PubMed, bioRxiv, medRxiv, Semantic Scholar, Crossref, OpenAlex, DBLP, HAL, CORE, DOAJ, Zenodo, SSRN, WoS, Scopus, IEEE, … | |
| 20 | SERP-free multi-source search + conference listings (NeurIPS/IJCAI/CVPR/ECCV/AAAI/PMLR) | |
| 11 | Reviews, meta-reviews, rebuttals, decisions for NeurIPS/ICLR/ACL ARR/COLM/TMLR | |
| anyakors/openreview-mcp-server | 5 | Bulk conference listing + JSON/PDF full-text export |
| 9 | Semantic Scholar details, citations, references, authors, recommendations | |
| 3 | Google Scholar keyword/advanced search + author profiles | |
| 4 | Local FTS5/BM25 paper library, TOC extraction, in-PDF grep | |
| 1 | Refine a question into a testable hypothesis | |
| sercantas | 1 | Clean and prepare datasets |
| sercantas | 1 | Generate Python/R/JS analysis scripts |
| sercantas | 1 | Execute analysis scripts, capture output |
| sercantas | 1 | Compose APA / ASA / generic reports |
| sercantas | 1 | Coordinate the whole pipeline |
Note on
anyakors/openreview-mcp-server— that URL returns 401 togit cloneand 404 to the GitHub tarball API, so it could not be fetched. Its published content is byte-identical to stepp1/openreview-mcp-server (same tools, same README), which is whatopenreview_classicruns. If the original becomes reachable, replacesources/anyakors-openreview-mcp-server-equivalent.
How to use it
1. Discover what is available
list_sources()Returns every backend, its status (ready / needs_config / unavailable),
the env vars it is missing, and its full tool list.
2. Search across many sources at once
search_papers(query="mixture of experts routing", max_results=10)Fans out to arxiv, multisearch, resp and google_scholar in parallel and
merges the results. Pass sources=["scholar","openreview"] to narrow it.
3. Get one paper by id
get_paper(paper_id="2401.04088") # arXiv id
get_paper(paper_id="10.1145/xxx") # DOIAuto-detects the id shape and tries the backends that can resolve it.
4. Read full text
get_paper_text(paper_id="2401.04088", source="arxiv", max_chars=20000)arxiv handles arXiv ids, multisearch handles arXiv/PubMed/bioRxiv/medRxiv/
Crossref/OpenAlex, openreview_classic exports OpenReview PDFs.
5. Call any specific upstream tool
call_source_tool(backend="arxiv", tool="get_paper_latex", arguments={"paper_id":"2401.04088"})Or, after list_sources() has mounted them, call the namespaced form directly:
arxiv__get_paper_latex(arguments={"paper_id": "2401.04088"})
multisearch__search_pubmed(arguments={"query": "CRISPR off-target", "max_results": 10})
openreview__openreview_get_reviews(arguments={"submission_id": "abc123"})
resp__search_neurips(arguments={"keyword": "diffusion", "year": 2024})Namespaced tools take their arguments as a single arguments object and forward
it verbatim, so every upstream parameter is available. Their descriptions list
each parameter, its type and whether it is required.
6. Run the research pipeline
run_research_pipeline(question="does test-time compute scaling help reasoning?", output_style="APA")Credentials
Everything works with no credentials at all. These only unlock more:
Env var | Backend | Effect |
|
| Removes Semantic Scholar 429 rate limits |
|
| Enables Unpaywall open-access PDF fallback |
|
| CORE full-text search |
|
| IEEE Xplore metadata |
|
| Non-anonymous OpenReview queries |
|
| PDF → markdown parsing |
Set them in the env block of your MCP config, e.g.:
{
"mcpServers": {
"paper-mcp": {
"command": "/path/to/awesome-paper-mcp/.venv/bin/python",
"args": ["-m", "unified_mcp"],
"cwd": "/path/to/awesome-paper-mcp",
"env": {
"SEMANTIC_SCHOLAR_API_KEY": "...",
"PAPER_SEARCH_MCP_UNPAYWALL_EMAIL": "you@example.com"
}
}
}
}Layout
awesome-paper-mcp/
├── unified_mcp/ # the gateway (the only code in this repo)
│ ├── server.py # FastMCP gateway + smart tools + namespace mount
│ └── backends/
│ ├── registry.py # the 14 backend definitions
│ └── proxy.py # raw JSON-RPC stdio bridge to each child
├── scripts/setup.sh # one-command bootstrap (clones + installs everything)
├── requirements-lock.txt # pinned shared dependency set (144 packages)
├── mcp-configs.json # ready-to-paste configs for 10 MCP clients
├── pyproject.toml # console script: paper-mcp
├── sources/ # 9 upstream repos — fetched by setup.sh, not committed
├── .venv/ # Python 3.12 environment — created by setup.sh
└── README.mdThe upstream projects are not vendored: sources/ is git-ignored and
populated by scripts/setup.sh at the commits recorded in that script, so they
keep their own history, licenses and update cadence.
Design notes
Why raw JSON-RPC instead of mcp.client.stdio? The installed mcp 1.30.0
client deadlocks inside stdio_client + ClientSession.initialize() on this
platform (an anyio 4.15 task-group / cancel-scope interaction). All upstream
servers answer correctly to raw newline-delimited JSON-RPC over stdio, which was
verified against every backend first, so backends/proxy.py speaks the protocol
directly. If a future mcp release fixes the client, swapping in the official
client is a drop-in change confined to proxy.py.
Why lazy startup? A backend is only spawned when first used, so one slow or
broken source never delays the handshake or blocks the others. --no-lazy
warms everything at boot instead.
Proxy handling. If the host exports an http_proxy pointing at a loopback
port that is not listening, the child processes detect it and fall back to a
direct connection instead of failing every request with ProxyError.
License
MIT for the gateway code in unified_mcp/ and everything else in
this repository. The upstream projects under sources/ are downloaded at
install time and keep their own licenses — nothing here redistributes them.
Available Tools
6 toolscall_source_toolA
Call any tool from any backend by name.
This is the escape hatch for backend-specific features that have no
cross-source wrapper (e.g. openreview reviews, arxiv LaTeX source,
resp conference listings). Use list_sources() to discover tool names.
Args: backend: Backend name from list_sources(). tool: Tool name as listed by list_sources(). arguments: Tool arguments as a JSON object.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | ||
| backend | Yes | ||
| arguments | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that this is an arbitrary dispatcher, but says nothing about error behavior for unknown backend/tool names, whether mutating backend tools can be invoked through this path, or any auth/rate-limit considerations — meaningful gaps for a generic pass-through.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in one line and follows with the Args block; nothing is padded. The reStructuredText double-backticks are cosmetic noise but negligible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. However, for a generic dispatcher the description should mention failure modes (invalid names) and whether destructive backend tools are reachable — neither is covered, which leaves an agent unequipped for edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: each of the three parameters is explained, including the crucial provenance hint that backend and tool names come from list_sources(). It stops short of describing the shape or conventions of the arguments object beyond 'JSON object'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — call any backend tool by name — and frames itself as the 'escape hatch' for features with no cross-source wrapper, which implicitly separates it from the sibling wrappers (search_papers, get_paper). It does not explicitly name which siblings to prefer, but the examples (openreview reviews, arxiv LaTeX source) make the niche concrete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear condition for use (backend-specific features lacking a cross-source wrapper) and directs the agent to list_sources() to discover valid backend/tool names. It never states an explicit 'do not use when a wrapper exists', but that exclusion is strongly implied by 'no cross-source wrapper'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_paperA
Fetch metadata / abstract for one paper by its id.
Args: paper_id: arXiv id (2401.04088), DOI (10.1234/xyz), OpenReview forum id, or a Semantic Scholar paper id. source: Force a specific backend. Omit to auto-detect.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | ||
| paper_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. 'Fetch' implies a read-only operation and the source parameter explains auto-detection, but the description does not disclose authentication needs, rate limits, fallback behavior across backends, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then provides compact, useful parameter details. The Args block is efficient and every line adds information needed to call the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and has an output schema, so return values need not be explained. Parameter semantics are well covered, but the description lacks explicit routing guidance relative to sibling tools, leaving a small contextual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for both parameters. It does this well: paper_id is documented with accepted ID formats (arXiv, DOI, OpenReview, Semantic Scholar), and source is explained as an optional backend override with auto-detection when omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Fetch metadata / abstract for one paper by its id.' This clearly scopes the tool to a single-paper metadata lookup, which implicitly separates it from search_papers and get_paper_text, but it does not explicitly name or distinguish those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose: call this when you have a paper identifier and need metadata or an abstract. However, the description gives no explicit when-to-use guidance against siblings like search_papers or get_paper_text, nor any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_paper_textA
Download a paper and return its readable text.
Args:
paper_id: arXiv id, DOI, or backend-specific id.
source: Backend to use. arxiv (default) supports arXiv ids;
multisearch supports arXiv/PubMed/bioRxiv/medRxiv/Crossref/OpenAlex/...;
openreview_classic exports OpenReview PDFs.
max_chars: Truncate the returned text to this many characters.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | arxiv | |
| paper_id | Yes | ||
| max_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full burden. It does disclose that a network download happens, that text is truncated at max_chars, and that backend choice changes which identifiers resolve — genuinely useful behavior. It says nothing about permissions, rate limits, failure modes, or whether truncated output is signaled, which is a real gap for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded purpose sentence followed by a compact Args block; every line carries information and nothing is padded. The docstring formatting is slightly awkward as agent-facing prose but costs no comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return value needs no explanation, and all three parameters are documented. What's missing is behavioral context an agent would want before calling: how errors surface for an invalid id, whether truncation is indicated in the response, and any cost or latency implications of downloading full papers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it largely does: paper_id is described as accepting arXiv ids, DOIs, or backend-specific ids, and source enumerates three concrete backend values that the schema itself does not declare as an enum. max_chars is explained as a truncation limit. It falls short of 5 because it doesn't clarify which id forms each backend accepts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb (download) plus resource (paper) and the returned artifact (readable text), which distinguishes it from the metadata-oriented get_paper. It never explicitly names the sibling it replaces, so an agent must infer the split from the return type alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The source argument description implicitly guides selection by naming which backends handle which id types, which is useful context for choosing a call. However, there is no explicit statement of when to use this versus get_paper or search_papers, and no prerequisites or failure conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sourcesA
List every paper source available through this server, with its capabilities, tool names and any missing credentials.
Call this first to decide which backend to use.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does disclose the returned content categories, including 'missing credentials' — valuable context telling the agent it can detect unconfigured backends before attempting work. It doesn't state side effects, but a listing operation needs little more.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the payload description first and the call-ordering instruction second. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and no parameters or annotations are needed, so the description only has to establish purpose and onboarding role — both are present. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. There is nothing for the description to disambiguate and it does not waste words on nonexistent inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List every paper source available through this server') and enumerates what the listing contains: capabilities, tool names, missing credentials. This is clearly distinct from siblings like search_papers or get_paper, which operate on papers rather than backends.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call this first to decide which backend to use' gives explicit ordering and a decision purpose, which is strong guidance. It stops short of naming call_source_tool as the follow-on, but the routing intent is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_research_pipelineB
Run the full academic research pipeline on a research question.
Stages: refine the question into a hypothesis, generate analysis code, execute it, then compose a structured report. Uses the sercantas Academic-Research-MCP-Suite backends.
Args: question: A vague or broad research question. output_style: APA, ASA or generic.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | ||
| output_style | No | APA |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, yet it does not disclose that the pipeline generates and executes code (a significant side-effect/safety consideration), nor anything about runtime, cost, or whether artifacts are persisted. The stage list describes the internal flow, which is useful, but the risky behaviors of an execute-code pipeline are left unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and stage summary, followed by a compact Args block. The backend vendor mention ('sercantas Academic-Research-MCP-Suite') is of limited value to an agent selecting the tool, but it occupies little space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and both parameters are covered. However, for a tool that refines questions, generates code, and executes it, the absence of any note on duration, failure modes, or side effects leaves the behavioral picture incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: 'question' is characterized as vague or broad (implying the refinement stage will handle it), and 'output_style' is given its allowed values (APA, ASA, generic) which the schema does not enumerate. Minor gap: 'generic' is unexplained and no format example is given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run the full academic research pipeline') and enumerates the four stages, so the agent knows this is an end-to-end multi-step operation rather than a single lookup. It does not explicitly contrast itself with the read-only siblings (search_papers, get_paper), but the 'full pipeline' framing makes the distinction inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the argument hint 'A vague or broad research question' suggests this tool is for exploratory questions rather than targeted lookups, but there is no explicit 'use this instead of search_papers when...' statement or statement of prerequisites. No exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_papersA
Search for papers across one or many sources at once.
Default sources are the ones that need no credentials: arxiv, multisearch (Semantic Scholar / Crossref / OpenAlex / DBLP / PubMed ...), resp and google_scholar.
Args: query: Keywords or a paper title. sources: Backend names from list_sources(). Omit for the default set. max_results: Results per source. year_from: Only papers from this year onwards (where supported).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| sources | No | ||
| year_from | No | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose real behavioral traits: defaults require no credentials, max_results is per-source (not a total), and year_from is only honored 'where supported' — a meaningful warning about uneven backend capability. It stops short of saying what happens when an individual source fails or whether results are merged/deduplicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The scope statement is front-loaded and the credential note follows immediately; the Args block is compact. Mild redundancy in restating parameter names, but each line adds at least one fact not in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values, and the description covers defaults, credentials, and per-source limits. For a multi-backend aggregator, however, it is silent on partial-failure behavior and result merging across sources, which an agent would reasonably want before calling it with several backends at once.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and largely does: it names all four parameters and adds semantics the schema lacks — sources must come from list_sources() and can be omitted, max_results is per source, and year_from is best-effort. The 'where supported' caveat is genuinely useful; only the format of sources entries is left implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource plus scope ('across one or many sources at once'), which is unambiguous. It does not, however, distinguish itself from siblings such as get_paper or run_research_pipeline, so the agent must infer the boundary on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'Default sources are the ones that need no credentials' and 'Backend names from list_sources()' tell the agent how to activate non-default sources, but there is no explicit when-to-use versus get_paper/run_research_pipeline guidance and no when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.0.0- First observed
call_source_tool - First observed
get_paper - First observed
get_paper_text - First observed
list_sources - First observed
run_research_pipeline - First observed
search_papers
TDQS
Scored across 6 tools
The core wrappers (list_sources, search_papers, get_paper, get_paper_text) target clearly distinct steps, and the metadata-vs-full-text split is explicitly documented. However, call_source_tool is a generic escape hatch that can perform the same operations as every wrapper, so an agent could plausibly misselect it instead of search_papers or get_paper without reading carefully.
All six tools use snake_case with a leading verb (list_, search_, get_, call_, run_), giving a predictable verb_noun pattern throughout. The paired get_paper / get_paper_text naming even signals their relationship clearly.
Six tools is lean for a multi-backend aggregation server and each has a distinct role: discovery, search, metadata, full text, escape hatch, and pipeline. Nothing feels redundant or padded.
The surface covers the full lifecycle: discover backends, search across them, fetch metadata, retrieve full text, and reach any backend-specific feature (reviews, LaTeX, conference listings) via call_source_tool. Citation-graph traversal is not a dedicated wrapper but is reachable through the escape hatch, so there are no real dead ends.
Maintenance
Related MCP Connectors
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Scholarly search: OpenAlex, Crossref, arXiv, OpenCitations and PubMed in one endpoint.
Research paper search with real citations and reference formatting for AI assistants
Find research papers and arXiv preprints, and get an abstract and free full text from a DOI or id.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to search across multiple academic databases (PubMed, arXiv, bioRxiv, medRxiv, Semantic Scholar) through a unified interface. Supports advanced filtering, metadata retrieval, PDF downloads, and comprehensive research workflows with citation analysis.5-
- AlicenseNot gradedqualityDmaintenanceEnables LLMs to search, analyze, and summarize academic research papers in real-time from arXiv, Semantic Scholar, and PubMed. Provides automatic deduplication, citation analysis, and BibTeX generation across multiple research databases.82 npmMIT
- FlicenseNot gradedqualityAmaintenanceEnables searching for academic papers and preprints across multiple platforms including Semantic Scholar, arXiv, PubMed, and CrossRef. It provides access to research records, DOI lookups, and journal metadata through a unified interface deployed on Cloudflare Workers.2-
- AlicenseAqualityBmaintenanceUnifies academic literature retrieval from multiple sources like Scopus, ArXiv, PubMed, and Google Scholar into a single standardized API for LLM agents.2956 PyPI11AGPL 3.0