Skip to main content
Glama
scalingx666-ai

Awesome Paper MCP

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.sh

The 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-mcp

JackKuo666-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

arxiv

blazickjp/arxiv-mcp-server

19

arXiv search, PDF download, full-text reading, outlines, LaTeX source, citation graph, topic alerts

multisearch

openags/paper-search-mcp

71

40+ sources in one server: PubMed, bioRxiv, medRxiv, Semantic Scholar, Crossref, OpenAlex, DBLP, HAL, CORE, DOAJ, Zenodo, SSRN, WoS, Scopus, IEEE, …

resp

monk1337/resp_mcp

20

SERP-free multi-source search + conference listings (NeurIPS/IJCAI/CVPR/ECCV/AAAI/PMLR)

openreview

OpenCodice-Research/openreview-mcp

11

Reviews, meta-reviews, rebuttals, decisions for NeurIPS/ICLR/ACL ARR/COLM/TMLR

openreview_classic

anyakors/openreview-mcp-server

5

Bulk conference listing + JSON/PDF full-text export

scholar

silung/scholar-search-mcp

9

Semantic Scholar details, citations, references, authors, recommendations

google_scholar

JackKuo666/Google-Scholar-MCP-Server

3

Google Scholar keyword/advanced search + author profiles

papers_helper

elpaca/ai_papers_helper

4

Local FTS5/BM25 paper library, TOC extraction, in-PDF grep

research_initiator

sercantas/Academic-Research-MCP-Suite

1

Refine a question into a testable hypothesis

data_wrangler

sercantas

1

Clean and prepare datasets

code_generator

sercantas

1

Generate Python/R/JS analysis scripts

code_executor

sercantas

1

Execute analysis scripts, capture output

research_writer

sercantas

1

Compose APA / ASA / generic reports

research_orchestrator

sercantas

1

Coordinate the whole pipeline

Note on anyakors/openreview-mcp-server — that URL returns 401 to git clone and 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 what openreview_classic runs. If the original becomes reachable, replace sources/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")    # DOI

Auto-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

SEMANTIC_SCHOLAR_API_KEY

scholar, multisearch, resp

Removes Semantic Scholar 429 rate limits

PAPER_SEARCH_MCP_UNPAYWALL_EMAIL

multisearch

Enables Unpaywall open-access PDF fallback

PAPER_SEARCH_MCP_CORE_API_KEY

multisearch

CORE full-text search

PAPER_SEARCH_MCP_IEEE_API_KEY

multisearch

IEEE Xplore metadata

OPENREVIEW_USERNAME / OPENREVIEW_PASSWORD

openreview, openreview_classic

Non-anonymous OpenReview queries

MINERU_API_KEY

papers_helper

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.md

The 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 tools
call_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.

NameRequiredDescriptionDefault
toolYes
backendYes
argumentsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
sourceNo
paper_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
sourceNoarxiv
paper_idYes
max_charsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
questionYes
output_styleNoAPA

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

NameRequiredDescriptionDefault
queryYes
sourcesNo
year_fromNo
max_resultsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 6 tool updatesv1.0.0
    • First observedcall_source_tool
    • First observedget_paper
    • First observedget_paper_text
    • First observedlist_sources
    • First observedrun_research_pipeline
    • First observedsearch_papers

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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 npm
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables 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
    -