scholar-mcp
The server is an MCP tool server for scholarly research — searching and analyzing papers, patents, books, and standards, with citation-graph exploration, metadata enrichment, citation generation, and PDF/full-text conversion.
Search and retrieve papers by keyword, venue, year, field, or citation count; look up individual papers by DOI, S2/arXiv/ACM/PubMed IDs.
Explore citation graphs: get forward citations, backward references, BFS graph traversal, and shortest citation paths between papers.
Get recommendations from positive/negative paper examples.
Generate citations in BibTeX, CSL-JSON, or RIS with optional OpenAlex venue enrichment.
Enrich paper metadata with OpenAlex data: affiliations, funders, open-access status, and concepts.
Search and retrieve patents via EPO OPS, including bibliographic data, claims, descriptions, family, legal status, citations, citing patents, and patent PDFs (when configured).
Search and retrieve books via Open Library by title, author, ISBN, or subject; fetch excerpts/previews from Google Books; download cover images; get recommendations.
Resolve standards for NIST, IETF, W3C, and ETSI (plus synced ISO/IEC/IEEE/CC/CEN metadata): normalize identifiers, search, fetch metadata, and optionally fetch full text.
Batch-resolve mixed identifiers — paper DOIs, patent numbers, and ISBNs — in one call.
Convert PDFs to Markdown via docling-serve, with fallback download sources and optional VLM enrichment.
Manage background jobs for long-running operations and poll their results.
Provides fallback PDF conversion for papers from arXiv, and supports paper lookup by arXiv ID.
Enables metadata retrieval for IEEE standards and papers, including status and full-text links.
Allows paper lookup by PubMed ID and access to PubMed Central for full-text PDF conversion.
Core integration for searching papers, retrieving citations, references, author profiles, and citation graph traversal via Semantic Scholar API.
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., "@scholar-mcpSearch for papers on large language models from 2024"
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.
Scholar MCP
A FastMCP server for the scholarly citation landscape (papers, patents, books, and standards), giving LLMs a unified way to search, cross-reference, and retrieve prior art across all four source types via Semantic Scholar, EPO Open Patent Services, Open Library, and standards bodies (NIST, IETF, W3C, ETSI), with OpenAlex enrichment and optional docling-serve PDF/full-text conversion.
Documentation | Config wizard | PyPI | Docker
Features
Source domains
Papers: full-text search with year/venue/field/citation filters; single-paper lookup by DOI, S2 ID, arXiv ID, ACM ID, or PubMed ID; author profile and name search; forward citations, backward references, BFS graph traversal, shortest-path bridge discovery; recommendations from positive/negative examples; BibTeX/CSL-JSON/RIS citation generation with OpenAlex venue enrichment.
Patents: search across 100+ patent offices via EPO OPS with CPC/applicant/inventor/jurisdiction filters; bibliographic, claims, description, family, legal, and citations sections; NPL-to-paper resolution via Semantic Scholar and paper-to-patent citation discovery. EPO credentials are optional; other domains work without them.
Books: Open Library search by title/author/keywords, no API key required; lookup by ISBN-10/13 or by Open Library work/edition ID; subject-based recommendations sorted by popularity; Google Books excerpts and preview links; WorldCat permalinks for library discovery; cover image caching. Papers with an ISBN in
externalIdsare automatically enriched with publisher, edition, cover URL, and subject data from Open Library.Standards: identifier resolution, search, and metadata retrieval for NIST, IETF, W3C, and ETSI standards, with optional full-text fetch and Markdown conversion via docling. Tier 2 ISO, IEC, IEEE, Common Criteria (CC), and CEN/CENELEC metadata (including ISO/IEC/IEEE joint standards and the CC ↔ ISO/IEC 15408 cross-link) is synced locally via
sync-standards. ISO, IEC, IEEE have a live-fetch fallback for unsynced identifiers; CC and CEN have no live API and require a sync first. Citations matching standards patterns (RFC, ISO, NIST SP, IEEE, EN, CC) are automatically enriched with structuredstandard_metadataincluding identifier, title, body, status, and full-text URL when available (see docs/guides/standards.md).
Cross-cutting
Enrichment pipeline: phased enrichment from multiple sources: OpenAlex (OA status, affiliations, funders, concepts), CrossRef (publisher, page ranges, container titles), Google Books (preview links, excerpts), and Open Library (book metadata). Runs automatically on paper and book results.
PDF conversion: download open-access PDFs and convert to Markdown via docling-serve, with optional VLM enrichment for formulas and figures; automatic fallback to ArXiv, PubMed Central, and Unpaywall when Semantic Scholar has no OA link; direct URL download for PDFs found elsewhere.
Intelligent caching: SQLite-backed cache with per-table TTLs (30 days for papers/authors, 7 days for citations/references) and identifier aliasing.
Authentication: bearer token, OIDC (OAuth 2.1), or both simultaneously (multi-auth).
Multi-transport: stdio (Claude Desktop), HTTP (streamable-http), and SSE transports.
Linux packages:
.deband.rpmpackages with systemd service and security hardening.
Coverage by domain
Per-domain depth is uneven. Papers currently have the richest tool surface (citation graph, recommendations, cross-referencing to all three other domains); standards are the leanest. That reflects public data availability, not a value hierarchy: writing a paper typically needs all four source types for citations and prior art. Parity work is tracked in GitHub issues and milestones; the roadmap shows intent, not a completeness commitment.
Related MCP server: Academic Paper MCP HTTP/SSE Server
What you can do with it
With this server mounted in an MCP client (Claude, etc.), you can:
Survey a field: "Find the 20 most-cited papers on graph neural networks from 2020 to 2024 and draft a literature review outline." Composes
search_papers+get_citations+enrich_paper.Trace a citation path: "What's the shortest citation path from 'Attention is All You Need' to 'RLHF for dialogue agents'?" Uses
find_bridge_papers+get_citation_graph.Cross-reference prior art: "For this patent family, list academic papers it cites and any books or standards that show up in the description." Composes
get_patent+batch_resolve+ standards/book enrichment.Generate a bibliography: "Emit BibTeX for these 30 DOIs with OpenAlex venue data." Uses
generate_citations.Look up a standard: "What's the latest status of RFC 9000, and fetch the Markdown full text." Uses
resolve_standard_identifier+get_standard.
Installation
From PyPI
pip install pvliesdonk-scholar-mcpIf you add optional extras via the PROJECT-EXTRAS-START / PROJECT-EXTRAS-END sentinels in pyproject.toml, document them below:
Scholar-mcp ships two optional-dependency groups:
[mcp]: installs FastMCP; required to runscholar-mcp serveand expose tools over stdio/HTTP.[all]: currently identical to[mcp]; reserved for future optional backends.
For MCP-server usage:
pip install 'pvliesdonk-scholar-mcp[mcp]'
# or, without installing into the environment:
uvx --from pvliesdonk-scholar-mcp scholar-mcp serveInstalling the bare pvliesdonk-scholar-mcp package is enough for library use (from scholar_mcp import ...) but the scholar-mcp serve CLI requires [mcp].
From source
git clone https://github.com/pvliesdonk/scholar-mcp.git
cd scholar-mcp
uv sync --all-extras --all-groupsDocker
docker pull ghcr.io/pvliesdonk/scholar-mcp:latestTo run the newest merged code instead of the newest release, use the rolling edge tag. It is rebuilt on every merge to main and carries no version identity. See Image tags for the full tag list.
docker pull ghcr.io/pvliesdonk/scholar-mcp:edgeA compose.yml ships at the repo root and runs as-is: copy .env.example to .env, then docker compose up -d. It publishes port 8000 on the host and assumes no reverse proxy; Docker Compose covers the configuration split, the domain sentinel blocks, and a Traefik overlay.
To attach a remote Python debugger (development only; the protocol is unauthenticated), see Remote debugging.
Linux packages (.deb / .rpm)
Download .deb or .rpm packages from the GitHub Releases page. Both install a hardened systemd unit; env configuration is sourced from /etc/scholar-mcp/env (copy from the shipped /etc/scholar-mcp/env.example).
Claude Desktop (.mcpb bundle)
Download the .mcpb bundle from the GitHub Releases page and double-click to install, or run:
mcpb install scholar-mcp-<version>.mcpbClaude Desktop prompts for required env vars via a GUI wizard, with no manual JSON editing needed.
For manual Claude Desktop configuration and setup options, see Claude Desktop deployment.
Release channels
Artifacts ship on three channels. Each row lists exactly what that channel publishes.
Channel | Version identity | Artifacts |
| None; the commit is the identity | Docker image |
Pre-release |
| PyPI (as the pre-release |
Stable |
| Everything: PyPI, Docker (version tag plus ordering-aware |
Pre-releases reach PyPI so that a candidate's .mcpb bundle installs: the bundle points at PyPI rather than carrying the code. Ordinary installers never see them, because a PEP 440 resolver skips pre-releases unless the requirement pins one or you pass --pre. Ask for a candidate by name with pip install pvliesdonk-scholar-mcp==X.Y.ZrcN. PyPI spells it in the PEP 440 canonical form, while tags use SemVer. Rolling pointers are ordering-aware, so a patch release cut from an old release/X.Y branch never moves latest-style tags back to older content, and a candidate for an already-released version never moves rc. See Release process for the full model.
Quick start
scholar-mcp serve # stdio transport
scholar-mcp serve --transport http --port 8000 # streamable HTTPFor library usage (embedding the domain logic without the MCP transport), import from the scholar_mcp package directly. Backend clients live under src/scholar_mcp/_s2_client.py, _epo_client.py, _openlibrary_client.py, and _standards_client.py.
Server info
The server registers a built-in get_server_info tool (via fastmcp_pvl_core.register_server_info_tool) so operators can confirm the deployed version with a single MCP call. The default response carries server_name, server_version, and core_version. Servers that talk to a remote upstream wire upstream reporting inside the DOMAIN-UPSTREAM-START / DOMAIN-UPSTREAM-END sentinel in src/scholar_mcp/server.py; see tool-registration for the wiring pattern.
Scholar uses that slot for Semantic Scholar key health, under a semantic_scholar key:
{
"server_name": "pvliesdonk-scholar-mcp",
"server_version": "2.0.0",
"core_version": "7.1.0",
"semantic_scholar": {
"key_configured": true,
"key_status": "degraded",
"consecutive_failures": 26,
"last_success": "2026-09-03T12:00:00+00:00",
"last_failure": "2026-09-10T18:00:00+00:00",
"last_failure_kind": "rate_limited"
}
}key_status is one of not_configured (no key set, so the anonymous tier serves), unknown (configured, not yet pinged), ok, failing (refused, but not for long enough to mean more than throttling), or degraded. The degraded threshold is the same one the keepalive escalates at, so this field and the s2_keepalive_degraded log line never disagree.
This is reported here rather than as a /health/ready check on purpose. A revoked key breaks the Semantic Scholar tools, while OpenAlex, Crossref, EPO, Open Library and the standards sources keep serving. Failing readiness answers 503 for the whole server, which drops it from rotation wherever something polls that route, such as a load balancer or a Kubernetes readinessProbe, over a condition that removal from rotation does not repair. The shipped compose.yml probes /health rather than /health/ready and reports the verdict without restarting anything, so it is unaffected either way.
Health
The server serves /health (liveness, a static 200) and /health/ready (readiness, 503 when a backing store or a domain check fails) outside the MCP mount and outside auth, via fastmcp_pvl_core.register_health_routes. compose.yml probes the first. Domain readiness checks go in the health_checks dict in src/scholar_mcp/server.py, deliberately empty here, because scholar's one candidate signal is a partial degradation better reported through get_server_info (above) than gated on; see Docker deployment for the routes, the mount-path rule, and SCHOLAR_MCP_HEALTH_DETAIL.
Configuration
The most common environment variables, shared across all
fastmcp-pvl-core-based services:
Variable | Default | Description |
|
| Persistent-state backend URL shared by every pvl-core subsystem that needs state. |
|
| Log level for FastMCP internals and app loggers (DEBUG / INFO / WARNING / ERROR / CRITICAL). The -v CLI flag overrides to DEBUG. |
|
| Rich color output for a terminal; false gives one plain or JSON line per record. Off in the container image and the systemd unit, since neither is a terminal and Rich wraps a structured record at its 80-column fallback. |
This table and the one under Domain configuration
are curated subsets. The complete generated reference, with every variable
the server reads, is the configuration reference;
.env.example lists the same surface in copy-paste form.
Authorization (opt-in)
This server inherits opt-in per-subject authorization from fastmcp-pvl-core. The default posture is off: every authenticated caller can use every tool, resource, and prompt. Turn it on by pointing SCHOLAR_MCP_ACL_PATH at a TOML ACL file; the middleware is installed only when the path is set, and individual tools opt in by declaring meta={"required_scope": "<scope>"} at registration. A tool without required_scope is unrestricted regardless of caller.
Wire it in by uncommenting the acl_path field in src/scholar_mcp/config.py and the AuthorizationMiddleware stanza in src/scholar_mcp/server.py; both ship as commented stubs in the scaffold.
ACL TOML schema
[subjects]
"user:alice@example.com" = ["read", "write"]
"user:admin@example.com" = ["*"] # wildcard — any required scope passes
"service:ci-bot" = ["read"]
"local" = ["*"] # auth-disabled subject (no bearer / OIDC vars set)Subject strings are opaque. The
<kind>:<id>convention is documentation only; the library treats each subject as a literal string.*is the only library-treated special scope: it grants every required scope. Subject-side wildcards (*as an ACL key) are rejected at load time.Scope vocabulary is domain-defined. Per-project or per-folder gating is encoded into the scope string itself, such as
read:project-fooorwrite:vault/personal;fastmcp-pvl-coretreats every scope except*as opaque.
Subject ↔ bearer-token alignment
The subject string used as a value in the bearer-tokens TOML (SCHOLAR_MCP_BEARER_TOKENS_FILE) is the same string used as a key in the ACL TOML. Same string, opposite roles, so keep the two files consistent when adding or removing a principal. See Mapped bearer tokens in the authentication guide for the bearer-tokens TOML schema.
In single-token mode (SCHOLAR_MCP_BEARER_TOKEN) every authenticated caller shares one subject, the library's default (currently "bearer-anon"); override it with SCHOLAR_MCP_BEARER_DEFAULT_SUBJECT; reference that string as the ACL key. When no auth is configured (no SCHOLAR_MCP_BEARER_TOKEN, SCHOLAR_MCP_BEARER_TOKENS_FILE, or OIDC env vars set, which is common in stdio dev rigs but also possible on HTTP), every request resolves to the literal subject "local". Reference that string as the ACL key for un-authenticated local sessions.
Authentication
Callers authenticate via a bearer token or OIDC (mutually exclusive). See the Authentication guide for setup, mapped multi-subject tokens, OIDC, and troubleshooting.
Post-scaffold checklist
After copier copy and gh repo create --push:
Fill in the DOMAIN blocks (every section marked with a
DOMAINsentinel comment) in this README and inAGENTS.md. TheGENERATED-ENV-TABLE-*regions are not DOMAIN blocks; the config generator owns them and rewrites them on every run.Configure GitHub secrets (see below).
Install dev + docs tooling:
uv sync --all-extras --all-groups.Install pre-commit hooks:
uv run pre-commit install.Run the gate locally:
uv run pytest -x -q && uv run ruff check --fix . && uv run ruff format . && uv run mypy src/ tests/.Push the first commit. CI should be green.
GitHub secrets
CI workflows reference two required repository secrets and one optional Claude token. Configure them via Settings → Secrets and variables → Actions or with gh secret set:
Secret | Used by | How to generate |
|
| Fine-grained PAT at https://github.com/settings/personal-access-tokens/new with |
|
| https://codecov.io: sign in with GitHub and add the repo. The upload token is on its settings page. |
|
| Optional. Run |
gh secret set RELEASE_TOKEN
gh secret set CODECOV_TOKEN
# Optional: enables @claude and opted-in automatic review.
gh secret set CLAUDE_CODE_OAUTH_TOKENDependency updates are handled by Renovate (
renovate.yml), which reusesRELEASE_TOKEN. It maintainsuv.lockand auto-merges patch/minor bumps once theCI Successcheck is green;bootstrap.ymlenables auto-merge and applies the repository rulesets (.github/rulesets/) on first push. See Repository Protection for the per-branch posture and bypass model. GitHub Actions are updated in the copier template and arrive viacopier update, not per-repo.
GITHUB_TOKEN is auto-provided; no action needed.
Local development
The PR gate (matches CI):
uv run pytest -x -q # tests
uv run ruff check --fix . && uv run ruff format . # lint + format
uv run mypy src/ tests/ # type-checkPre-commit runs a subset of the gate on each commit; see .pre-commit-config.yaml for details, or AGENTS.md for the full Hard PR Acceptance Gates.
Troubleshooting
Moving a scaffolded project
uv sync creates .venv/bin/* scripts with absolute shebangs pointing at the venv Python. If you move the repo after scaffolding (mv /old/path /new/path), uv run pytest fails with ModuleNotFoundError: No module named 'fastmcp' because the stale shebang resolves to a different interpreter than the venv's site-packages.
Fix:
rm -rf .venv
uv sync --all-extras --all-groupsuv run python -m pytest also works as a one-shot workaround (bypasses the stale entry-script shim).
uv.lock refresh after copier update
When copier update introduces new dependencies (such as a new extra added to pyproject.toml.jinja), the CI install step runs uv sync --locked, which fails against a stale lockfile. Run uv lock locally and commit the refreshed uv.lock alongside accepting the copier-update PR.
CI installs with --locked (and the review workflow with --frozen) so no job ever rewrites uv.lock in its own workspace: a job that re-locks hides the drift it just repaired, and a dirty workspace breaks any later git checkout in the same job. Lockfile drift then shows up as a red install step with a clear message, not as a silent mutation.
Contributing
CONTRIBUTING.md holds the rules for issues and pull requests, and where a
fix belongs: fastmcp-pvl-core for library code, the template for
template-owned files, this repository for anything inside its DOMAIN-* /
CONFIG-* / PROJECT-* blocks. AGENTS.md carries the conventions and
gates; the skills under .agents/skills/ carry the task procedures, among
them code-review (local self-review before a pull request),
writing-release-notes (release notes),
applying-template-updates (the weekly template update pull request) and
authoring-issues-prs (filing). The release procedure is in
docs/deployment/release-process.md;
the template update procedure in
docs/deployment/template-updates.md.
Links
Domain configuration
The variables this project features as its entry points (domain variables use the SCHOLAR_MCP_ prefix):
Variable | Default | Required | Description |
|
| No | When true, write-tagged tools (PDF download and conversion cache writes) are hidden. Set false to enable them. |
| (none) | No | Semantic Scholar API key. Optional but strongly recommended: unauthenticated requests are limited to ~1 req/s. Request one at https://www.semanticscholar.org/product/api#api-key-form. |
| (none) | No | Base URL of a running docling-serve instance for PDF conversion (such as http://localhost:5001). When unset, PDF conversion tools return an error. |
|
| No | Directory for the SQLite cache database (cache.db) and downloaded PDFs (pdfs/, md/). |
| (none) | No | Contact email for the OpenAlex polite pool (improves rate limits). Also enables Unpaywall lookups as a PDF fallback source. |
This is a curated subset: a field appears here when its tags metadata includes readme. Every domain variable is documented in the configuration reference, grouped the same way the config wizard presents them.
Domain-config fields are composed inside src/scholar_mcp/config.py between the CONFIG-FIELDS-START / CONFIG-FIELDS-END sentinels; env reads go through fastmcp_pvl_core.env(_ENV_PREFIX, "SUFFIX", default) so naming stays consistent, and field invariants go in __post_init__ between the CONFIG-VALIDATE-START / CONFIG-VALIDATE-END sentinels. Each field's metadata help, tags, and wizard group generate the reference tables directly, so keep them accurate and complete.
Scholar-mcp pings Semantic Scholar once on startup and every 7 days thereafter to keep the configured key from being removed for inactivity (Semantic Scholar may remove keys unused for 60+ days). A ping S2 refuses is retried in an hour rather than waiting out the full cycle, so one bad moment does not cost a week of key activity.
To tell a dead key from a transient upstream issue, grep the server logs
for s2_keepalive_degraded. The keepalive logs it at ERROR, once, after
a day of consecutive refusals, and follows it with
s2_keepalive_recovered if a later ping lands. It keys on persistence
rather than on a status code, because a key that has stopped conferring
quota was observed returning 429 indefinitely and never 403.
A 403 Forbidden remains the cheaper signal when S2 does send one:
s2_key_forbidden on real tool calls, s2_keepalive_key_forbidden from
the keepalive. Do not rely on it alone.
Key design decisions
Library-first, MCP-optional. The core domain logic (S2/EPO/Open Library/standards clients, enrichment pipeline, cache) is importable without FastMCP; the MCP server is a thin async wrapper. Enables reuse in scripts, notebooks, and other servers.
Sync domain code, async MCP layer. Backend clients are synchronous; MCP tools call them via
asyncio.to_thread(). Simpler client code, explicit offloading at the transport boundary.SQLite cache with per-table TTLs and identifier aliases. Papers / authors last 30 days, citations / references 7 days. DOI ↔ S2 ID ↔ arXiv ID aliasing survives across cache clears so repeated enrichment hits the same row.
Read-only by default. Write-tagged tools (PDF download/convert, patent PDF) are hidden unless
SCHOLAR_MCP_READ_ONLY=false. Safer default for first-run.Slow work becomes a background job. Every tool whose work can run long runs through the
fastmcp-pvl-corejobs layer, whether the slow part is a docling conversion, an EPO throttle being waited out, or a graph walk making one request per node. A call that beatsSCHOLAR_MCP_JOBS_SOFT_DEADLINE_Sreturns its result directly; a slower one returns a handle to poll withget_job_result. No tool decides in advance whether to go background, so a cache hit needs no special case.EPO throttling is waited out, not queued. The traffic light is consulted before every request and cached for a minute, so a retry sooner than that would re-read the cache rather than ask again. Each backoff outlasts the cache; an exhausted daily quota is reported immediately instead, since it will not clear today.
Tier 2 standards sync out-of-band. ISO/IEC/IEEE/CC/CEN catalogues come from community Relaton dumps via
scholar-mcp sync-standards, not live at runtime, which avoids paywalled-HTML scraping and keeps tool calls fast.
Quick Start details
stdio transport (Claude Desktop / MCP clients)
uvx --from pvliesdonk-scholar-mcp scholar-mcp serveAPI key optional but recommended: The server works without a Semantic Scholar API key, but unauthenticated requests are limited to ~1 req/s and will hit 429 throttles quickly during multi-step operations like citation graph traversal. Request a free key to get ~10 req/s.
Claude Desktop configuration (claude_desktop_config.json):
{
"mcpServers": {
"scholar": {
"command": "uvx",
"args": ["--from", "pvliesdonk-scholar-mcp", "scholar-mcp", "serve"],
"env": {
"SCHOLAR_MCP_S2_API_KEY": "your-key"
}
}
}
}HTTP transport
uvx --from pvliesdonk-scholar-mcp scholar-mcp serve --transport http --port 8000Claude Code plugin
/plugin marketplace add pvliesdonk/claude-plugins
/plugin install scholar-mcp@pvliesdonkSyncing Tier 2 standards catalogues
Tier 2 bodies (ISO, IEC, IEEE, CC, CEN) are populated from community-curated bulk dumps rather than live-scraped at MCP-server runtime. Run the sync on first install and periodically thereafter:
scholar-mcp sync-standards # all registered bodies
scholar-mcp sync-standards --body ISO # only ISO
scholar-mcp sync-standards --body IEEE # only IEEE
scholar-mcp sync-standards --body CC # only Common Criteria
scholar-mcp sync-standards --body CEN # only CEN/CENELEC
scholar-mcp sync-standards --force # re-sync even if upstream SHA is unchangedSchedule via cron, launchd, or a systemd timer. Weekly is sufficient; standards change slowly. First sync can take several minutes; subsequent runs that find no upstream changes exit within seconds.
MCP Tools
29 tools, organised by scholarly source type.
Papers
Search & retrieval
Tool | Description |
| Full-text search with year, venue, field-of-study, and citation-count filters. Returns up to 100 results with pagination. |
| Fetch full metadata for a single paper by DOI, S2 ID, arXiv ID, ACM ID, or PubMed ID. |
| Fetch author profile with publications, or search by name. |
Citation graph
Tool | Description |
| Forward citations (papers that cite a given paper) with optional filters. |
| Backward references (papers cited by a given paper). |
| BFS traversal from seed papers, returning nodes + edges up to configurable depth. |
| Shortest citation path between two papers. |
Both traversal tools carry on when an upstream request fails rather than aborting the walk. Every response states its completeness as
partialandfailed_requests(instatsforget_citation_graph, at the top level forfind_bridge_papers); when something did fail, awarningnames the statuses involved. A partial result says what was found, not what exists. See the Citation Graphs guide.
Recommendations & citation generation
Tool | Description |
| Paper recommendations from 1 to 5 positive examples and optional negative examples. |
| Generate BibTeX, CSL-JSON, or RIS citations for up to 100 papers, with automatic entry type inference and optional OpenAlex venue enrichment. |
| Augment Semantic Scholar metadata with OpenAlex fields (affiliations, funders, OA status, concepts). |
Patents
Tool | Description |
| Search patents across 100+ patent offices via EPO OPS with CPC / applicant / inventor / jurisdiction / date filters. |
| Fetch bibliographic / claims / description / family / legal / citations sections for a single patent by publication number. Citations include NPL-to-paper resolution via Semantic Scholar. |
| Find patents that cite a given academic paper (best-effort; EPO OPS citation search coverage is incomplete). |
| Download a patent PDF via authenticated EPO OPS and optionally convert to Markdown. |
Patent tools are hidden when
SCHOLAR_MCP_EPO_CONSUMER_KEYandSCHOLAR_MCP_EPO_CONSUMER_SECRETare not set.fetch_patent_pdfis also write-tagged and hidden whenSCHOLAR_MCP_READ_ONLY=true.
Books
Tool | Description |
| Search for books by title, author, ISBN, or keywords via Open Library. Returns up to 50 results. |
| Fetch book metadata by ISBN-10, ISBN-13, Open Library work ID, or edition ID. Optionally download and cache the cover image locally. |
| Fetch a book excerpt and description from Google Books by ISBN. Shows preview availability and link. Reports a refused lookup as |
| Recommend books for a subject via Open Library, sorted by popularity. |
Papers with an ISBN in their
externalIdsare automatically enriched withbook_metadata(publisher, edition, cover URL, subjects, and more) from Open Library when fetched viaget_paper,get_citations,get_references, orget_citation_graph. Book records also includeworldcat_url(when ISBN-13 is present),google_books_url, andsnippetfrom Google Books enrichment. Cover images can be downloaded and cached locally viaget_book.
Standards
Tool | Description |
| Normalise a messy citation string such as |
| Search standards by identifier, title, or free text, optionally filtered to one body ( |
| Retrieve a standard by canonical or fuzzy identifier, optionally fetching and converting the full text via docling. |
Tier-1 bodies (NIST, IETF, W3C, ETSI) are supported with full metadata and optional full-text conversion. Tier-2 bodies (ISO, IEC, IEEE, CC, CEN/CENELEC) are populated locally via
scholar-mcp sync-standards.
Cross-source Utility
Tool | Description |
| Resolve up to 100 mixed identifiers (paper DOIs, patent numbers, ISBNs) to full metadata in one call, routing each to the right backend with OpenAlex fallback. |
PDF Conversion (requires docling-serve)
Tool | Description |
| Download PDF for a paper (S2 open-access, then ArXiv/PMC/Unpaywall fallback). |
| Convert a local PDF to Markdown via docling-serve. |
| Full pipeline: fetches the PDF with fallback sources, then converts it to Markdown and returns both. |
| Download a PDF from any URL and optionally convert to Markdown. |
PDF tools are write-tagged and hidden when
SCHOLAR_MCP_READ_ONLY=true(the default).fetch_patent_pdf(above) and theget_standardfull-text mode cover the patent and standards equivalents.
Job Polling
Tool | Description |
| Retrieve the outcome of a background job by ID. |
Tools answer directly when the work is quick, including on a cache hit. A slower call returns
{"status": "working", "job_id": "...", "poll_with": "get_job_result"}; poll with the tool the handle names until the status is terminal.
Docker Compose
services:
scholar-mcp:
image: ghcr.io/pvliesdonk/scholar-mcp:latest
restart: unless-stopped
environment:
SCHOLAR_MCP_S2_API_KEY: "${SCHOLAR_MCP_S2_API_KEY}"
SCHOLAR_MCP_DOCLING_URL: "http://docling-serve:5001"
SCHOLAR_MCP_VLM_API_URL: "${VLM_API_URL:-}"
SCHOLAR_MCP_VLM_API_KEY: "${VLM_API_KEY:-}"
SCHOLAR_MCP_CACHE_DIR: "/data/scholar-mcp"
SCHOLAR_MCP_READ_ONLY: "false"
volumes:
- scholar-mcp-data:/data/scholar-mcp
labels:
- "traefik.enable=true"
- "traefik.http.routers.scholar-mcp.rule=Host(`scholar-mcp.yourdomain.com`)"
docling-serve:
image: ghcr.io/ds4sd/docling-serve:latest
restart: unless-stopped
volumes:
scholar-mcp-data:Cache Management
# Show cache statistics (row counts, database size)
scholar-mcp cache stats
# Clear all cached data (preserves identifier aliases)
scholar-mcp cache clear
# Remove entries older than 30 days
scholar-mcp cache clear --older-than 30
# Override cache directory
scholar-mcp cache stats --cache-dir /path/to/cacheAvailable Tools
21 toolsbatch_resolveBatch Resolve IdentifiersARead-only
Resolve a list of paper, patent, or book identifiers to full records.
Uses the S2 batch endpoint for paper IDs/DOIs, with OpenAlex fallback.
Patent numbers (e.g. EP1234567A1) are auto-detected and resolved via
the EPO OPS API when configured. ISBNs (prefixed ISBN:) are
resolved via Open Library.
Identifiers fan out across three upstreams, so a large batch runs long
and is then handed back as a job handle to poll with get_job_result
rather than the records themselves.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Field set preset (applies to paper results only). | standard |
| identifiers | Yes | List of S2 IDs, DOIs (prefixed ``DOI:``), plain DOIs, patent numbers (e.g. ``EP1234567A1``, ``US11234567B2``), or ISBNs (prefixed ``ISBN:``, e.g. ``ISBN:9780201633610``). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/non-destructive annotations, it discloses fan-out across S2/OpenAlex/EPO OPS/Open Library, auto-detection of patent numbers, and the async job-handle behavior. These are substantive behaviors not inferable from annotations.
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?
Four dense sentences with no fluff: purpose first, then upstream routing, then asynchronous behavior. Each sentence earns its place, and the structure front-loads the action.
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?
For a batch tool with a rich schema and annotations, it covers the essential operational facts: supported ID types, upstream fallback/configuration, and the expected job-handle flow. With an output schema present, nothing critical 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?
Schema description coverage is 100%, and the input schema already fully documents identifiers and fields, including examples and the enum. The description adds no new parameter-level semantic guidance; it merely restates identifier categories already present.
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 opens with a precise verb-object statement: 'Resolve a list of paper, patent, or book identifiers to full records.' It distinguishes itself from single-item siblings by emphasizing batch/list behavior and the S2 batch endpoint; the explicit identifier scoping makes selection unambiguous.
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?
It provides clear usage context: expected identifier types, upstream routing, and the fact that large batches return a job handle to poll with get_job_result. It does not explicitly name single-identifier alternatives or state when not to use this tool, preventing a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enrich_paperEnrich PaperARead-only
Fetch OpenAlex metadata to supplement Semantic Scholar data.
Resolves the paper's DOI from S2, then queries OpenAlex for the requested enrichment fields. Results are cached for 30 days.
A cached record answers immediately. Should the lookup run long it
continues in the background and returns a job handle to poll with
get_job_result.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | One or more of: affiliations, funders, oa_status, concepts. | |
| identifier | Yes | S2 paper ID or DOI (prefix ``DOI:``). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive behavior; the description adds useful details about caching and background job handling. It does not disclose potential rate limits or failure modes, but the core behavior is transparent.
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?
Three concise sentences cover purpose, resolution, caching, and async behavior without redundancy. The structure is focused and easy to parse.
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?
Given the output schema exists, the description adequately covers what the agent needs: input semantics, behavior, and async result retrieval. No critical context appears 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?
Both parameters are fully described in the schema, with identifier format and valid field options explicitly listed. The description reinforces identifier semantics by mentioning DOI resolution.
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?
Clearly states the tool fetches OpenAlex metadata to supplement Semantic Scholar data, using a specific verb and resource. The distinction from siblings like get_paper and search_papers is evident through the OpenAlex enrichment focus.
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?
Describes the enrichment purpose and the asynchronous behavior with get_job_result, giving practical usage context. It could more explicitly contrast with nearby tools like get_paper, but the enrichment scope is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_bridge_papersFind Bridge PapersARead-only
Find the shortest citation path between two papers.
Uses BFS over the citation/reference graph. Leverages cached citation and reference lists to minimise API calls.
The search walks outward one rate-limited request per node, so it
commonly runs long and returns a job handle to poll with
get_job_result rather than the path itself.
A failed upstream request does not abort the search. When one happens,
partial is true, failed_requests counts them, and a warning
key explains what went unfetched. A partial {"found": false} is not
evidence that no path exists, and a partial {"found": true} path is
not guaranteed to be the shortest one.
| Name | Required | Description | Default |
|---|---|---|---|
| direction | No | Expand via citations, references, or both. | both |
| max_depth | No | Maximum hops to search (default 4). | |
| source_id | Yes | Starting paper S2 ID. | |
| target_id | Yes | Target paper S2 ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the read-only/open-world annotations by disclosing async execution (rate-limited, one request per node, commonly long-running), the job-handle return contract, and detailed partial-failure semantics including that a partial found:false is not proof of no path and a partial found:true is not guaranteed shortest. This is exactly the kind of behavioral context an agent cannot infer from the schema or annotations.
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, then layers algorithm, execution model, and failure semantics in short paragraphs that each carry distinct information. Slightly long, but no sentence is redundant.
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?
Covers everything needed to invoke and interpret the tool: what it computes, that it is asynchronous, how to retrieve the result, and how to read imperfect outcomes. With an output schema present, return-value detail is not required, yet the key job-handle behavior is still explained.
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 100%, so the schema already documents direction, max_depth, source_id, and target_id. The description adds only indirect meaning (one request per node relates to max_depth), leaving the baseline of 3 appropriate.
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 precise verb and resource ('Find the shortest citation path between two papers') and pins down the algorithm as BFS over the citation/reference graph. This is clearly distinct from single-hop siblings like get_citations/get_references, but it never explicitly contrasts itself with get_citation_graph, which an agent might otherwise confuse as the closer analogue.
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 strong operational guidance: the call returns a job handle to poll via get_job_result rather than the path, and it explains how to read partial results (partial flag, failed_requests, warning). It stops short of stating when to prefer this over get_citation_graph or other path/graph tools, so there are no explicit alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_citationsGenerate CitationsARead-only
Generate formatted citations for one or more papers.
Resolves papers via Semantic Scholar, optionally enriches with OpenAlex metadata, and formats as BibTeX, CSL-JSON, or RIS.
Enrichment fans out per paper, so a large batch can take a while; such a
call answers with a job handle to poll using get_job_result instead
of the citations themselves.
| Name | Required | Description | Default |
|---|---|---|---|
| enrich | No | If True, attempt OpenAlex enrichment for missing venue data when a DOI is available. | |
| paper_ids | Yes | List of paper identifiers (S2 IDs, DOIs, arXiv IDs, etc.). Maximum 100. | |
| citation_format | No | Output format — bibtex, csl-json, or ris. | bibtex |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description is consistent with these (generating formatted output is non-destructive). Beyond that, the description adds genuinely useful behavioral context: enrichment fans out per paper, large batches can be slow, and such calls respond with a job handle rather than the citations themselves. This discloses the async/polling behavior that annotations do not capture. No contradiction with annotations.
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 purpose, then the resolution/format pipeline, then the edge-case behavioral note. Every sentence earns its place; there is no filler. The async handling is placed last, which is correct since it only applies to large batches. Compact and well-structured for a tool with this many options.
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 definition covers the purpose, the multi-source resolution pipeline, the three output formats, and the job-handle behavior tied to get_job_result. The output schema exists, so return values need not be explained. The only minor gap is that the description does not explicitly differentiate itself from close siblings like batch_resolve or get_citations, leaving some selection reasoning to the agent.
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 100%, so each parameter (paper_ids, enrichment, citation_format) is already documented in the schema, including the enum values and defaults. The description adds marginal reinforcement by naming the resolution sources (Semantic Scholar/OpenAlex) and listing the output formats, which maps to the enrichment and citation_format parameters, but it does not add meaning beyond what the schema already conveys. Baseline 3 is appropriate.
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 opens with a specific verb+resource: 'Generate formatted citations for one or more papers,' and clarifies the pipeline (Semantic Scholar resolution, optional OpenAlex enrichment, output in BibTeX/CSL-JSON/RIS). It is clearly distinct from the sibling get_citations (which retrieves inbound citations, not formatted output), though that distinction is implied by the format emphasis rather than named explicitly.
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 description gives concrete operational guidance: for large batches, enrichment fans out, so the call returns a job handle to poll via get_job_result instead of the citations. This tells the agent when to expect async behavior and points to the correct sibling. However, it never states when to prefer this tool over batch_resolve or enrich_paper, nor when not to use it — the routing to alternatives is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_authorGet AuthorARead-only
Fetch author profile and publications, or search by name.
If identifier looks like a numeric S2 author ID, fetches the author directly. Otherwise performs a name search and returns up to 5 candidates for disambiguation.
Answers directly in normal use. Should the call run long it continues in
the background and returns a job handle to poll with get_job_result.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Publications per page (only used for direct ID lookup). | |
| offset | No | Publication page offset (only used for direct ID lookup). | |
| identifier | Yes | S2 author ID (numeric string) or free-text author name. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the asynchronous behavior: normal calls answer directly while long-running calls return a job handle to poll with get_job_result. It also mentions the up-to-5 candidate fallback for name searches, going beyond the readOnly/destructive annotations.
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 concise and well-structured: purpose first, then identifier behavior, then execution/async behavior. No unnecessary wording.
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?
With an output schema present, the description does not need to detail return fields. It covers the main call behavior, name-search disambiguation, pagination-relevant parameters, and the background job fallback, making it complete for the tool's complexity.
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 100%, and the top-level description adds the conditional meaning of identifier: numeric S2 author ID triggers direct fetch, otherwise name search. The limit/offset descriptions already clarify they only apply to direct ID lookups.
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 clearly states the tool fetches an author profile and publications or searches by name, and it explains the identifier-based branching behavior. This distinguishes it from paper/book/standard 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?
It provides clear context on when direct fetch versus name-search disambiguation is used, but it does not explicitly compare with alternative tools for author-related queries. Still, the guidance is unambiguous and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bookGet BookARead-only
Fetch book metadata by ISBN or Open Library ID.
Open Library is politeness-rate-limited, so a busy moment may answer
with a job handle to poll using get_job_result instead of the
record itself.
| Name | Required | Description | Default |
|---|---|---|---|
| cover_size | No | Cover size variant: ``"S"`` (small), ``"M"`` (medium), ``"L"`` (large). Defaults to ``"M"``. | M |
| identifier | Yes | ISBN-10, ISBN-13, Open Library work ID (e.g. OL1168083W), or edition ID (e.g. OL1429049M). | |
| download_cover | No | If True, download and cache the cover image locally. Returns ``cover_path`` in the response. In read-only mode, returns ``cover_error`` instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
ReadOnlyHint annotation is consistent; description transparently explains rate-limit behavior and download_cover side effects (cache, cover_error in read-only mode).
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?
Description is concise and front-loaded with the core purpose, followed by a brief, relevant note on rate-limiting and job polling.
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?
Covers key aspects an agent needs: input formats, side effects of download_cover, read-only mode behavior, and rate-limit resolution; output schema exists so not all return details need explanation.
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?
All three parameters are described with formats/examples; schema coverage is 100% and description adds meaningful detail like cover_path/cover_error behavior.
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?
Description clearly states the tool fetches book metadata by ISBN or Open Library ID, distinguishing it from siblings like get_book_excerpt and search_books.
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?
Mentions the polling fallback via get_job_result when rate-limited, giving practical usage context though not explicitly contrasting with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_book_excerptGet Book ExcerptARead-only
Get a book excerpt and preview info from Google Books.
Returns the publisher description, text snippet, and a link to the Google Books preview page. Google Books does not expose full chapter text via API -- the excerpt is a publisher-provided summary and/or search snippet.
An error of not_found means Google Books answered and has no
such volume: stop asking about that ISBN. A lookup that never got an
answer says so instead, as rate_limited (with retryable) or
upstream_error, and is worth retrying -- the book may well exist.
| Name | Required | Description | Default |
|---|---|---|---|
| isbn | Yes | ISBN-10 or ISBN-13. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive, open-world), and the description adds substantial behavior beyond them: the API cannot return full chapter text, excerpts are publisher summaries or search snippets, and it enumerates distinct error classes with retry semantics. That is exactly the contextual layer structured fields cannot carry.
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?
It is front-loaded with the purpose and then the output limitation, with the error taxonomy last where it belongs. Slightly long for a one-parameter lookup, but each clause (no full text, error meanings) carries real decision value.
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?
For a single-ISBN read tool with annotations and an output schema present, the description covers the remaining unknowns: what the excerpt actually is and how to interpret each error state. Nothing an agent needs to call or interpret this tool 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?
Schema coverage is 100% with a single 'isbn' parameter already described as 'ISBN-10 or ISBN-13,' so the schema does the heavy lifting. The description adds no further parameter detail, making the 3 baseline appropriate.
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 names a specific verb and resource ('Get a book excerpt and preview info from Google Books') and clarifies what the payload contains (publisher description, snippet, preview link). It implicitly separates the tool from get_book/search_books by framing it as excerpt-only, but never names those siblings explicitly.
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?
It gives useful conditional guidance on outcomes ('not_found' means stop asking about that ISBN; 'rate_limited'/'upstream_error' are worth retrying), which effectively tells the agent how to react. However, there is no guidance on when to choose this over get_book or search_books, so context selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_citation_graphGet Citation GraphARead-only
Traverse the citation graph from one or more seed papers.
Performs BFS up to depth hops. Returns nodes (paper records) and directed edges. Hard-caps at max_nodes to prevent runaway expansion.
Traversal makes one rate-limited request per node, so anything past a
shallow, narrow graph runs long: expect a job handle to poll with
get_job_result rather than the graph itself.
A failed upstream request does not abort the walk. When one happens,
stats.partial is true, stats.failed_requests counts them, and a
warning key explains what went unfetched. Treat such a graph as
incomplete: a missing node or edge is unknown, not absent. This is
distinct from stats.truncated, which means max_nodes stopped an
otherwise successful walk.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Number of hops (1-3). | |
| seed_ids | Yes | 1-10 paper identifiers to start from. | |
| year_end | No | Filter expanded papers to this year and earlier. | |
| direction | No | Expand via citations, references, or both. | citations |
| max_nodes | No | Hard cap on total nodes returned. | |
| year_start | No | Filter expanded papers to this year and later. | |
| min_citations | No | Minimum citation count of expanded papers. | |
| fields_of_study | No | Filter by field. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: one rate-limited request per node, async job-handle return semantics, and a precise failure model where a failed upstream request yields stats.partial, stats.failed_requests, and a warning rather than aborting. It also disambiguates stats.partial from stats.truncated, which is exactly the kind of edge-case behavior an agent needs.
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 purpose and scope, then layers on cost, async behavior, and the partial-vs-truncated distinction in distinct, purposeful paragraphs. Every sentence carries operational meaning with no filler.
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?
For an 8-parameter, open-world traversal tool with an output schema, the description covers cost, async return, and the full failure-mode semantics. Combined with the output schema covering return shape, an agent has everything needed to call and interpret it.
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 100%, so every parameter is already documented in the schema. The description reinforces depth ('up to *depth* hops') and max_nodes ('hard cap') behaviorally, but adds no syntax or format detail beyond what the schema already supplies, so the baseline of 3 applies.
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: 'Traverse the citation graph from one or more seed papers', and immediately scopes it as BFS with depth hops returning nodes and directed edges. This distinguishes it from single-hop siblings like get_citations and get_references by making the multi-hop traversal explicit.
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?
Clearly frames when the tool is heavy ('anything past a shallow, narrow graph runs long') and routes the agent to get_job_result for polling. However, it never explicitly contrasts with the closest siblings (get_citations, get_references, find_bridge_papers), leaving the choice between single-hop and graph traversal to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_citationsGet CitationsARead-only
Fetch papers that cite the given paper (forward citations).
Paging deeply to satisfy min_citations can run long; such a call
continues in the background and returns a job handle to poll with
get_job_result.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (pagination). | |
| fields | No | Field set preset for returned paper records. | compact |
| offset | No | Pagination offset. | |
| year_end | No | Filter citing papers published up to this year. | |
| identifier | Yes | Paper identifier (DOI, S2 ID, ARXIV:, etc.). | |
| year_start | No | Filter citing papers published from this year. | |
| min_citations | No | Minimum citation count of citing papers. Applied client-side (S2 does not support this filter on the citations endpoint). Papers with unknown citation counts are excluded. Pagination (``offset``/``limit``) is applied to the filtered results. The tool paginates through up to 10 000 upstream results to find qualifying papers. | |
| fields_of_study | No | Filter by field of study. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not need to repeat safety. It adds valuable behavioral context about deep pagination for min_citations, explaining that it can run long and returns a job handle to poll with get_job_result. This goes beyond the annotations and is useful for agents.
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 extremely concise: two sentences. The first sentence delivers the core purpose immediately, and the second adds a critical operational caveat. No filler or redundancy. Every word earns its place.
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?
Given the output schema exists and annotations cover safety, the description is quite complete. It covers the primary operation and the non-obvious async behavior for min_citations. It does not describe error handling or rate limits, but these are not essential for an agent to invoke the tool correctly, especially with a rich input schema.
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 100%, so the baseline is 3. The tool description itself does not elaborate on any parameters; all meaning is derived from the input schema. While the schema is thorough (e.g., explaining min_citations client-side behavior), the description adds no additional parameter insight beyond what the schema provides.
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 clearly states the action ('Fetch papers') and the resource ('that cite the given paper'), and explicitly labels it as 'forward citations', which distinguishes it from backward-citation tools like get_references. The purpose is unambiguous and the wording is specific.
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 description does not provide explicit guidance on when to use this tool versus alternatives such as get_references or get_citation_graph. It implies a distinction through 'forward citations' but does not state conditions or exclusions. The background-job note for min_citations gives some operational context but not usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_resultGet Job ResultARead-only
Retrieve the outcome of a background job started by a long-running tool on this server. When such a tool answers with status "working" and a job_id, call this tool with that job_id every few seconds until the status is terminal. Job records expire after a while — fetch results soon after completion. Scholar MCP promotes slow work to a background job. PDF download and docling conversion usually take 1-5 minutes, a busy EPO traffic light is waited out, citation formatting enriches each paper in turn, and graph traversal makes one rate-limited request per node. Those calls commonly answer with a job_id rather than a result; a cache hit answers inline, with no job.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context beyond annotations by explaining the polling nature, job expiration, and that cache hits return inline. The readOnlyHint and destructiveHint annotations are not contradicted; the tool is correctly presented as a read operation.
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 somewhat verbose but each sentence contributes useful information (purpose, usage, expiration, examples). It is well-structured, front-loading the primary purpose and then clarifying usage, without redundancy.
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?
Given the simple one-parameter tool, the description fully covers when and how to use it, the parameter source, and behavioral expectations. The presence of an output schema completes the context, so nothing essential 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?
The schema has no description for job_id, but the tool description explains it comes from the 'working' status response. This provides meaningful context for the parameter's origin, though it doesn't detail format or validation rules. It compensates well for missing schema coverage.
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 clearly states the tool retrieves the outcome of a background job, using a specific verb and resource. It also explains when it is applicable (when a tool returns status 'working' with a job_id), distinguishing it from direct result tools like get_paper.
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?
Explicit guidance is provided: call this tool when a tool responds with status 'working' and a job_id, poll every few seconds until terminal, and fetch soon after completion due to expiration. This is direct and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_paperGet PaperARead-only
Fetch full metadata for a single paper.
A cached paper answers immediately. Otherwise the record is fetched and
enriched; should that run long it continues in the background and returns
a job handle to poll with get_job_result.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Paper identifier — DOI, S2 paper ID, arXiv ID (prefix with ``ARXIV:``), ACM ID (``ACM:``), or PubMed ID (``PMID:``). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds valuable context about caching, background processing, and the potential for returning a job handle instead of the paper, which is not covered by annotations.
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 sentences with no filler. The core purpose is front-loaded, and the behavioral nuance (caching/background) is stated succinctly. Every word earns its place.
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 description covers the two possible outcomes (immediate answer or job handle) and references the polling tool. Since an output schema exists, return format details are not needed. It does not mention error handling, but that is not critical given the other coverage.
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?
The input schema fully documents the 'identifier' parameter with allowed formats (DOI, S2, arXiv, ACM, PMID). The description does not add extra semantic detail about the parameter itself; it only refers to 'full metadata' and the caching behavior, which is indirectly related. Since schema coverage is 100%, a baseline of 3 is appropriate.
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 clearly states 'Fetch full metadata for a single paper', using a specific verb and resource. It differentiates from search_papers by specifying 'single paper' but does not explicitly name sibling tools like get_author or get_book, though the resource type makes it distinct.
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?
It explains the behavior when cached vs. not cached, and instructs to poll with get_job_result if a job handle is returned. This gives clear usage context, though it does not explicitly state when not to use this tool (e.g., for searching multiple papers) or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_referencesGet ReferencesARead-only
Fetch papers referenced by the given paper (backward references).
Should the call run long it continues in the background and returns a
job handle to poll with get_job_result.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results. | |
| fields | No | Field set preset for returned paper records. | compact |
| offset | No | Pagination offset. | |
| identifier | Yes | Paper identifier (DOI, S2 ID, ARXIV:, etc.). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive behavior. The description adds important extra transparency about long-running calls continuing in the background and returning a job handle to poll with get_job_result.
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 concise sentences with no filler; the core purpose is front-loaded and the background-job note is relevant and compact.
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?
Given the output schema exists and the input schema fully covers parameters, the description is complete enough. It includes the important asynchronous behavior; minor gap is not explaining the field preset options, but the schema already does so.
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 100%, so the baseline is 3. The description does not add meaning beyond the schema's own descriptions for identifier, limit, offset, and fields, though the schema describes each parameter adequately.
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 ('Fetch'), the resource ('papers referenced by the given paper'), and clarifies directionality with 'backward references', which differentiates it from siblings like get_citations.
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 'backward references' phrasing gives clear context for when to use this tool versus the forward-looking get_citations/get_citation_graph siblings, though it does not explicitly name the alternatives or give when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_infoServer InfoARead-only
Report wrapper and upstream version info for scholar-mcp. Returns server_name, server_version, core_version (fastmcp-pvl-core), and (when configured) an upstream version block. Useful for verifying a deployment matches the expected build.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safety profile is known. The description adds value by detailing the exact return fields and the conditional 'when configured' upstream version block, which is useful behavioral context beyond the annotation.
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 sentences, front-loaded with the primary purpose, followed by a practical usage note. Every word earns its place with no redundancy.
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?
For a simple zero-parameter read-only info tool, the description fully covers what the tool does, what it returns, and when to use it. The existence of an output schema further reduces the need to describe return format in detail.
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?
The tool has zero parameters, so the description doesn't need to explain parameter behavior. Baseline 4 is appropriate because there is no parameter ambiguity to resolve.
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 the specific verb 'Report' and identifies the resource ('wrapper and upstream version info'). It clearly lists the returned fields and distinguishes itself from sibling tools (which handle papers, books, etc.).
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?
Provides a clear use case: 'Useful for verifying a deployment matches the expected build.' This gives context for when to use it, though it doesn't explicitly mention alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_standardGet StandardARead-only
Retrieve a standard by identifier (canonical or fuzzy).
Resolves fuzzy inputs (e.g. "rfc9000", "nist 800-53") to their
canonical form before fetching. With fetch_full_text=True and
docling configured, downloads and converts the full text.
With fetch_full_text=True the docling conversion takes minutes, so
such a call returns a job handle to poll with get_job_result rather
than the record itself. Without it, and on a cache hit, the record comes
back directly.
A conversion that fails still returns the record, with the reason in
full_text_error; full_text_url is there to fetch by hand. No
full_text and no full_text_error means none was on offer, or
docling is not configured — neither is worth retrying.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Canonical or fuzzy standard identifier. | |
| fetch_full_text | No | If True and docling is configured, download and convert the full text PDF/HTML via docling. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation by explaining the async behavior (job handle), the failure mode (full_text_error), and the meaning of absent full_text/full_text_error. This covers side effects and edge cases clearly.
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 well-structured in short paragraphs and each sentence adds value. It is slightly verbose but not redundant, earning a high score for its efficient use of words.
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 description fully covers the conditional return behavior (job handle vs. record), error states, and configuration prerequisites. Given the output schema exists and no nested objects are mentioned, this is sufficiently complete for an agent to call correctly.
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 100% for both parameters, but the description adds operational meaning (e.g., 'if True and docling is configured' and the distinction between canonical and fuzzy identifiers), enriching the schema beyond the baseline.
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 the verb 'Retrieve' and the resource 'standard' clearly, and distinguishes from siblings like search_standards and resolve_standard_identifier by emphasizing retrieval by identifier (canonical or fuzzy).
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?
Provides clear conditional guidance for fetch_full_text (returns a job handle when true, with docling configured) and mentions polling via get_job_result. Does not explicitly name alternative tools for when not to use this tool, but the conditions are reasonably explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sync_statusGet Sync StatusARead-only
Report the last sync run for each standards body.
One row per body. started_at / finished_at are Unix
timestamps (seconds). errors is a list of non-fatal error
strings from the most recent run (empty on success).
Returns:
{"runs": [{body, upstream_ref, added, updated, unchanged, withdrawn, errors, started_at, finished_at}, ...]}.
Empty runs list when no sync has been run yet.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint and destructiveHint, but the description adds valuable behavioral context by specifying the output structure, the meaning of the 'errors' field (non-fatal), and the behavior when no sync has run (empty list). This goes beyond the annotations.
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 concise and well-structured. It states the purpose, defines key fields ('started_at', 'finished_at', 'errors'), and describes the return format and edge case (empty list) in a compact manner. Every sentence adds value.
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?
Given the tool's simplicity (no parameters, no nested objects), the description fully covers what the agent needs: the output schema is described inline, including field meanings and the empty-list scenario. There is no missing context for invoking this tool.
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?
The tool has zero parameters, so the description does not need to explain any. The baseline of 4 is appropriate, and no additional parameter-related information is missing.
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 clearly states the tool's purpose: 'Report the last sync run for each standards body.' It uses a specific verb ('report') and identifies the resource (sync runs per standards body). It also provides details on the return format, making it distinct from any sibling tool.
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?
While no explicit alternative is mentioned, the description makes the tool's use obvious: it is for checking the last sync status. Given that no sibling tool performs this function, clear context is provided without needing exclusions or contrasts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_booksRecommend BooksARead-only
Recommend books for a subject via Open Library.
Uses the Open Library subject API to find popular books on a topic, sorted by edition count (a proxy for popularity).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return (max 50). | |
| subject | Yes | Subject or topic (e.g. "machine learning", "algorithms", "computer vision"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds meaningful context about the behavior: it uses the Open Library subject API and sorts results by edition count as a popularity proxy, which helps the agent understand the result ordering. This goes beyond the annotations, earning a 4.
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 two concise sentences with the purpose front-loaded and no filler. It efficiently conveys the tool's function and the underlying logic, earning a perfect score.
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 are covered. The description explains the API and sorting, and the schema handles parameter details. It is complete for a read-only recommendation tool, though it does not mention potential edge cases or rate limits, which are minor given the annotations.
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 100%, with both 'subject' and 'limit' fully documented in the schema. The description does not add additional parameter semantics, so the baseline of 3 is appropriate.
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 clearly states the tool's purpose: recommending books for a subject via Open Library, and explains the underlying API and sorting criterion. It distinguishes itself as a recommendation tool, though it does not explicitly contrast with sibling tools like search_books or get_book, so it falls short of a 5.
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 description implies when to use the tool (when you need popular books on a subject) by explaining the mechanism, but it does not explicitly state when not to use it or mention alternatives. It provides context but lacks explicit routing guidance relative to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_papersRecommend PapersARead-only
Recommend papers based on positive (and optionally negative) examples.
Answers directly in normal use. Should the call run long it continues in
the background and returns a job handle to poll with get_job_result.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of recommendations to return. | |
| fields | No | Field set preset for returned records. | standard |
| negative_ids | No | Optional S2 paper IDs to steer away from. | |
| positive_ids | Yes | 1-5 S2 paper IDs to use as positive examples. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and non-destructive; the description adds a non-obvious execution trait: normal calls answer directly, but long runs switch to a background job with a handle to poll via get_job_result. This is valuable behavioral context beyond the annotations and helps an agent handle timeouts correctly. There is no contradiction with the annotations.
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 sentences with no filler: the first states the core purpose, the second states the execution behavior. Every sentence earns its place, and the async fallback is placed after the main purpose without bloating the description.
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?
With a complete input schema, an output schema, and annotations covering safety, the main additional context needed—the synchronous-vs-asynchronous behavior and the polling route—is present. The only minor gap is explicit guidance on sibling alternatives, but that does not prevent an agent from invoking the tool correctly.
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?
The input schema covers 100% of parameters with descriptions, including the 1-5 positive_ids constraint and the negative_ids default. The description only echoes 'positive/negative examples' and adds no extra parameter semantics beyond what the schema already provides, so the baseline score of 3 is appropriate.
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 names the specific operation ('Recommend papers') and the input basis ('positive and optionally negative examples'), which clearly distinguishes it from sibling retrieval tools like search_papers, get_paper, and recommend_books. It states both the resource and the mode of operation, so an agent can tell exactly what the tool does.
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 description implies the right use case—having example paper IDs and wanting similar recommendations—but it does not explicitly state when to prefer this over search_papers or recommend_books, nor does it give exclusions. An agent must infer selection from the words 'papers' and 'examples' rather than receiving direct alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_standard_identifierResolve Standard IdentifierARead-only
Normalise a messy standard citation string to its canonical form.
Tries local regex first (fast, no network). Falls back to querying source APIs when local patterns don't match. Returns all candidates when the input is ambiguous.
A cold catalogue makes this slow: the first call after a fresh install or
a cleared cache downloads and parses each body's index, which runs well
past the soft deadline. Such a call returns a job handle to poll with
get_job_result rather than the result itself.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | Yes | Raw citation string as it appears in a paper reference. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, destructiveHint), the description discloses important behavioral nuances: network fallback, cache-related performance degradation, and the possibility of returning a job handle (get_job_result) instead of the result. This adds significant context not captured by annotations.
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 well-structured and concise, with each sentence adding distinct value: purpose, algorithm, ambiguity handling, and performance caveat. No redundant or filler content.
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?
Given the tool's complexity (fallback logic, cache behavior, job polling), the description provides sufficient context for an agent to understand when to expect a direct result versus a job handle. It does not specify error conditions, but the output schema likely covers return structure. Overall, well-rounded for the complexity level.
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?
The tool description does not add additional parameter information beyond the schema, which already provides a description for 'raw' (coverage 100%). The phrase 'messy standard citation string' loosely echoes the schema but does not expand on format, constraints, or examples. Baseline for full coverage is 3.
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 clearly states the tool's purpose: 'Normalise a messy standard citation string to its canonical form.' It uses a specific verb (Normalise) and resource (standard citation string), and further clarifies behavior with 'Returns all candidates when the input is ambiguous.' This distinguishes it from siblings like search_standards or get_standard.
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 description gives some behavioral guidance (local regex first, fallback to APIs) but does not explicitly state when to use this tool over alternatives like batch_resolve or search_standards. It mentions the cold cache scenario and job handle, but lacks direct 'use this when...' or 'instead of...' instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_booksSearch BooksARead-only
Search for books by title, author, or free text.
Uses Open Library. Prefer title and author over query
— they use dedicated indexes and return far better results.
Open Library is politeness-rate-limited, so a busy moment may answer
with a job handle to poll using get_job_result instead of the
results themselves.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return (max 50). | |
| query | No | Free-text fallback. Use ``title``/``author`` when known. | |
| title | No | Book title or partial title (recommended). | |
| author | No | Author name (recommended). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the rate-limit behavior and the possibility of returning a job handle instead of direct results. This is valuable behavioral context not present in annotations.
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?
Three sentences, each carrying distinct information: the search modes, the preferred parameters, and the rate-limit fallback. No redundant or filler content.
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?
With a fully described input schema and an output schema present, the description covers the core usage, the recommended parameter choices, and the edge case of rate limiting. Everything an agent needs to decide when and how to call this tool is addressed.
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?
The schema already fully describes each parameter with recommended usage. The description adds the cross-parameter guidance to prefer title/author over query, which slightly exceeds the schema's individual descriptions. No contradictions or missing clarifications.
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?
Clearly states the action (search) and resource (books), and lists the three supported search modes: title, author, or free text. Leaves no ambiguity about the tool's purpose.
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?
Explicitly advises preferring title and author over query for better results, and warns about rate limiting with a fallback to polling via get_job_result. This gives concrete, actionable guidance for when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_papersSearch PapersARead-only
Search Semantic Scholar for papers matching a query.
Usually completes in a few seconds.
Answers directly in normal use. Should the call run long it continues in
the background and returns a job handle to poll with get_job_result.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order — relevance, citations, or year. | relevance |
| limit | No | Maximum results to return (max 100). | |
| query | Yes | Keyword or semantic search query. | |
| venue | No | Filter by venue name. | |
| fields | No | Field set preset — compact, standard, or full. | compact |
| offset | No | Pagination offset. | |
| year_end | No | Latest publication year (inclusive). | |
| year_start | No | Earliest publication year (inclusive). | |
| min_citations | No | Minimum citation count. | |
| fields_of_study | No | Filter by fields, e.g. ["Computer Science"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already convey read-only and non-destructive behavior, and the description adds useful behavioral detail about latency and asynchronous fallback. It does not mention error cases, but the async and timing disclosure is meaningful beyond the annotations.
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 brief and to the point, with no redundant or filler content. Each sentence serves a purpose: identifying the action, setting latency expectations, and explaining the async path.
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?
Given that an output schema exists and the annotations cover safety flags, the description provides enough context for correct invocation. The async behavior is the only non-obvious operational aspect, and it is explicitly covered.
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?
All parameters are described in the schema, so the baseline applies; the description itself adds little parameter-level detail beyond saying the search matches 'a query.' The schema already covers sort, filters, pagination, and field presets adequately.
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 clearly states the tool searches Semantic Scholar for papers matching a query. It also distinguishes the normal direct response from the long-running fallback, making the tool's core purpose obvious relative to siblings like get_paper or search_books.
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?
It explicitly tells callers that the call usually completes in a few seconds and that long-running requests return a job handle to poll via get_job_result. This gives clear, actionable guidance on expected behavior and how to handle async results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_standardsSearch StandardsARead-only
Search technical standards by identifier, title, or free text.
Searches NIST, IETF, W3C, and ETSI. Use body to restrict to one
source body.
A cold catalogue makes this slow: the first call after a fresh install or
a cleared cache downloads and parses each body's index, which runs well
past the soft deadline. Such a call returns a job handle to poll with
get_job_result rather than the result itself.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Optional filter — "NIST", "IETF", "W3C", or "ETSI". | |
| limit | No | Maximum results (max 50). | |
| query | Yes | Identifier, title, or free text. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly discloses that a cold cache can cause the first call to exceed the soft deadline and that such calls return a job handle instead of the result, directing the agent to poll with `get_job_result`. This goes beyond the annotations (readOnly, openWorld) and provides critical runtime behavior.
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 a single paragraph that leads with the core purpose, then lists sources, explains the body parameter, and concludes with the performance caveat. It is concise, well-organized, and free of redundant text.
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 description includes the essential information needed to invoke the tool correctly: what it searches, the set of sources, the optional filter, and the potential asynchronous behavior on first use. Given the tool's simplicity and the presence of an output schema, this is sufficient for an agent to use it effectively.
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?
The schema already provides descriptions for all three parameters (query, body, limit) with 100% coverage. The description reiterates the body parameter's purpose and the query types, but adds no new semantic information beyond the schema. Baseline for full schema coverage is 3.
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 clearly states that the tool searches technical standards by identifier, title, or free text across NIST, IETF, W3C, and ETSI. It distinguishes from sibling search tools (search_books, search_papers) by specifying the subject domain and source bodies.
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 description indicates when to use the tool (to search standards) and provides guidance on using the `body` parameter to restrict to a single source body. It also warns about the first call being slow and possibly returning a job handle, guiding the agent on handling asynchronous responses. However, it does not explicitly contrast with alternative search tools, so it is clear but not exhaustive.
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.
20 tool updates
v1.10.0- Changed
batch_resolve4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
enrich_paper4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
find_bridge_papers4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
generate_citations4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
get_author4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
get_book5 fields changed- removed
Input schema / properties / include_editionsRemoved value: -{ - "default": false, - "description": "If true, fetch the work and list editions.", - "type": "boolean" -} - added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
get_citation_graph4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
get_citations4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Added
get_job_result - Changed
get_paper4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
get_references4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
get_standard4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
get_sync_status4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Removed
get_task_result - Removed
list_tasks - Changed
recommend_papers4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
resolve_standard_identifier4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
search_books4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
search_papers4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
search_standards4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
22 tool updates
v1.9.0- First observed
batch_resolve - First observed
enrich_paper - First observed
find_bridge_papers - First observed
generate_citations - First observed
get_author - First observed
get_book - First observed
get_book_excerpt - First observed
get_citation_graph - First observed
get_citations - First observed
get_paper - First observed
get_references - First observed
get_server_info - First observed
get_standard - First observed
get_sync_status - First observed
get_task_result - First observed
list_tasks - First observed
recommend_books - First observed
recommend_papers - First observed
resolve_standard_identifier - First observed
search_books - First observed
search_papers - First observed
search_standards
TDQS
Scored across 21 tools
Most tools have distinct purposes, but get_paper, get_citations, get_references, get_citation_graph, and find_bridge_papers all relate to paper retrieval and could be confused. Descriptions clarify the differences, but an agent might misselect.
All tool names follow a consistent snake_case verb_noun pattern (e.g., get_paper, search_books, generate_citations), with no deviations.
21 tools is on the high side for a scholarly server, though many are necessary for diverse upstreams and background job handling. It's borderline heavy but not unreasonable.
Covers paper, author, citation, book, and standards domains with CRUD-like operations and background job management. Minor gaps like no update or delete operations for records, but those aren't typical for read-focused scholarly APIs.
Maintenance
Related MCP Connectors
Read-only MCP over an agentic SLR workspace with per-claim citation verification
Read-only MCP over an agentic SLR workspace with per-claim citation verification
Academic research MCP server for paper search, citation checks, graphs, and deep research.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server enabling AI agents to search and retrieve scientific papers, citations, and author profiles from Crossref, OpenAlex, and Semantic Scholar with no API keys required.514 PyPI3MIT
- AlicenseNot gradedqualityDmaintenanceA MCP server for academic literature retrieval, aggregating multiple data sources like arXiv, Crossref, OpenAlex, PubMed, and Semantic Scholar to provide search, details, citations, trends, and recommendations.4MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for AI-assisted research: paper ingestion, semantic search, citation graph traversal, cross-domain knowledge synthesis, and workflow automation.MIT
- AlicenseAqualityBmaintenanceA unified MCP server for academic paper discovery, citation exploration, and research intelligence workflows over multiple scientific knowledge sources.71MIT