Skip to main content
Glama
pvliesdonk

scholar-mcp

by pvliesdonk

Scholar MCP

CI codecov repowise Code health PyPI Python License Docker Docs llms.txt Template

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 externalIds are 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 structured standard_metadata including 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: .deb and .rpm packages 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-mcp

If 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 run scholar-mcp serve and 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 serve

Installing 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-groups

Docker

docker pull ghcr.io/pvliesdonk/scholar-mcp:latest

To 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:edge

A 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>.mcpb

Claude 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

edge (rolling)

None; the commit is the identity

Docker image :edge rebuilt on every merge to main; .mcpb bundle as the mcpb-bundle-edge workflow artifact; Claude Code plugin .zip as the plugin-zip-edge artifact; rolling unstable docs version. It leaves no git tag, GitHub release, or PyPI entry behind.

Pre-release

vX.Y.Z-rc.N, computed and reviewed in its release pull request

PyPI (as the pre-release X.Y.ZrcN); GitHub release with wheels, sdist, .deb/.rpm packages, .mcpb bundle, plugin .zip, and SBOM attached; Docker image under its immutable vX.Y.Z-rc.N tag plus the ordering-aware rolling rc tag. Skips the plugin marketplace, the MCP registry, and the docs deploy.

Stable

vX.Y.Z

Everything: PyPI, Docker (version tag plus ordering-aware latest / vX / vX.Y), .deb/.rpm, GitHub release assets (wheels, sdist, .mcpb bundle, plugin .zip, SBOM), plugin marketplace and MCP registry entries (when the release is the newest stable), versioned docs with an ordering-aware latest alias.

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 HTTP

For 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

SCHOLAR_MCP_KV_STORE_URL

file:///data/state

Persistent-state backend URL shared by every pvl-core subsystem that needs state. memory:// is in-process and lost on restart; file:///path persists on one server; redis://, dynamodb:// and mongodb:// each need their matching extra. When unset, defaults to file:///data/state (the volume family Docker images mount), or to memory:// (with a warning) on a host where that directory is not usable.

FASTMCP_LOG_LEVEL

INFO

Log level for FastMCP internals and app loggers (DEBUG / INFO / WARNING / ERROR / CRITICAL). The -v CLI flag overrides to DEBUG.

FASTMCP_ENABLE_RICH_LOGGING

true

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-foo or write:vault/personal; fastmcp-pvl-core treats 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:

  1. Fill in the DOMAIN blocks (every section marked with a DOMAIN sentinel comment) in this README and in AGENTS.md. The GENERATED-ENV-TABLE-* regions are not DOMAIN blocks; the config generator owns them and rewrites them on every run.

  2. Configure GitHub secrets (see below).

  3. Install dev + docs tooling: uv sync --all-extras --all-groups.

  4. Install pre-commit hooks: uv run pre-commit install.

  5. Run the gate locally: uv run pytest -x -q && uv run ruff check --fix . && uv run ruff format . && uv run mypy src/ tests/.

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

RELEASE_TOKEN

release-prepare.yml, release.yml, copier-update.yml, renovate.yml, bootstrap.yml

Fine-grained PAT at https://github.com/settings/personal-access-tokens/new with contents: write, pull_requests: write, and administration: write (bootstrap applies the repository rulesets + auto-merge). Must belong to a repository admin: the shipped rulesets grant bypass to the admin role, and the release tag + GitHub release that knope creates after a release pull request merges rely on it (pull requests the token opens also need it so their CI runs). Scoped to this repo.

CODECOV_TOKEN

ci.yml

https://codecov.io: sign in with GitHub and add the repo. The upload token is on its settings page.

CLAUDE_CODE_OAUTH_TOKEN

claude.yml

Optional. Run claude setup-token locally and configure this only for @claude or opted-in automatic review.

gh secret set RELEASE_TOKEN
gh secret set CODECOV_TOKEN
# Optional: enables @claude and opted-in automatic review.
gh secret set CLAUDE_CODE_OAUTH_TOKEN

Dependency updates are handled by Renovate (renovate.yml), which reuses RELEASE_TOKEN. It maintains uv.lock and auto-merges patch/minor bumps once the CI Success check is green; bootstrap.yml enables 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 via copier 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-check

Pre-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-groups

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

Domain configuration

The variables this project features as its entry points (domain variables use the SCHOLAR_MCP_ prefix):

Variable

Default

Required

Description

SCHOLAR_MCP_READ_ONLY

true

No

When true, write-tagged tools (PDF download and conversion cache writes) are hidden. Set false to enable them.

SCHOLAR_MCP_S2_API_KEY

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

SCHOLAR_MCP_DOCLING_URL

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

SCHOLAR_MCP_CACHE_DIR

/data/scholar-mcp

No

Directory for the SQLite cache database (cache.db) and downloaded PDFs (pdfs/, md/).

SCHOLAR_MCP_CONTACT_EMAIL

(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-core jobs 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 beats SCHOLAR_MCP_JOBS_SOFT_DEADLINE_S returns its result directly; a slower one returns a handle to poll with get_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 serve

API 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 8000

Claude Code plugin

/plugin marketplace add pvliesdonk/claude-plugins
/plugin install scholar-mcp@pvliesdonk

Syncing 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 unchanged

Schedule 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

search_papers

Full-text search with year, venue, field-of-study, and citation-count filters. Returns up to 100 results with pagination.

get_paper

Fetch full metadata for a single paper by DOI, S2 ID, arXiv ID, ACM ID, or PubMed ID.

get_author

Fetch author profile with publications, or search by name.

Citation graph

Tool

Description

get_citations

Forward citations (papers that cite a given paper) with optional filters.

get_references

Backward references (papers cited by a given paper).

get_citation_graph

BFS traversal from seed papers, returning nodes + edges up to configurable depth.

find_bridge_papers

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 partial and failed_requests (in stats for get_citation_graph, at the top level for find_bridge_papers); when something did fail, a warning names the statuses involved. A partial result says what was found, not what exists. See the Citation Graphs guide.

Recommendations & citation generation

Tool

Description

recommend_papers

Paper recommendations from 1 to 5 positive examples and optional negative examples.

generate_citations

Generate BibTeX, CSL-JSON, or RIS citations for up to 100 papers, with automatic entry type inference and optional OpenAlex venue enrichment.

enrich_paper

Augment Semantic Scholar metadata with OpenAlex fields (affiliations, funders, OA status, concepts).

Patents

Tool

Description

search_patents

Search patents across 100+ patent offices via EPO OPS with CPC / applicant / inventor / jurisdiction / date filters.

get_patent

Fetch bibliographic / claims / description / family / legal / citations sections for a single patent by publication number. Citations include NPL-to-paper resolution via Semantic Scholar.

get_citing_patents

Find patents that cite a given academic paper (best-effort; EPO OPS citation search coverage is incomplete).

fetch_patent_pdf

Download a patent PDF via authenticated EPO OPS and optionally convert to Markdown.

Patent tools are hidden when SCHOLAR_MCP_EPO_CONSUMER_KEY and SCHOLAR_MCP_EPO_CONSUMER_SECRET are not set. fetch_patent_pdf is also write-tagged and hidden when SCHOLAR_MCP_READ_ONLY=true.

Books

Tool

Description

search_books

Search for books by title, author, ISBN, or keywords via Open Library. Returns up to 50 results.

get_book

Fetch book metadata by ISBN-10, ISBN-13, Open Library work ID, or edition ID. Optionally download and cache the cover image locally.

get_book_excerpt

Fetch a book excerpt and description from Google Books by ISBN. Shows preview availability and link. Reports a refused lookup as rate_limited or upstream_error, distinct from not_found.

recommend_books

Recommend books for a subject via Open Library, sorted by popularity.

Papers with an ISBN in their externalIds are automatically enriched with book_metadata (publisher, edition, cover URL, subjects, and more) from Open Library when fetched via get_paper, get_citations, get_references, or get_citation_graph. Book records also include worldcat_url (when ISBN-13 is present), google_books_url, and snippet from Google Books enrichment. Cover images can be downloaded and cached locally via get_book.

Standards

Tool

Description

resolve_standard_identifier

Normalise a messy citation string such as "rfc9000" or "nist 800-53" to canonical form and body.

search_standards

Search standards by identifier, title, or free text, optionally filtered to one body (NIST, IETF, W3C, ETSI).

get_standard

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

batch_resolve

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

fetch_paper_pdf

Download PDF for a paper (S2 open-access, then ArXiv/PMC/Unpaywall fallback).

convert_pdf_to_markdown

Convert a local PDF to Markdown via docling-serve.

fetch_and_convert

Full pipeline: fetches the PDF with fallback sources, then converts it to Markdown and returns both.

fetch_pdf_by_url

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 the get_standard full-text mode cover the patent and standards equivalents.

Job Polling

Tool

Description

get_job_result

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/cache

Available Tools

21 tools
batch_resolveBatch Resolve IdentifiersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoField set preset (applies to paper results only).standard
identifiersYesList of S2 IDs, DOIs (prefixed ``DOI:``), plain DOIs, patent numbers (e.g. ``EP1234567A1``, ``US11234567B2``), or ISBNs (prefixed ``ISBN:``, e.g. ``ISBN:9780201633610``).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 PaperA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYesOne or more of: affiliations, funders, oa_status, concepts.
identifierYesS2 paper ID or DOI (prefix ``DOI:``).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 PapersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
directionNoExpand via citations, references, or both.both
max_depthNoMaximum hops to search (default 4).
source_idYesStarting paper S2 ID.
target_idYesTarget paper S2 ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 CitationsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
enrichNoIf True, attempt OpenAlex enrichment for missing venue data when a DOI is available.
paper_idsYesList of paper identifiers (S2 IDs, DOIs, arXiv IDs, etc.). Maximum 100.
citation_formatNoOutput format — bibtex, csl-json, or ris.bibtex

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 AuthorA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPublications per page (only used for direct ID lookup).
offsetNoPublication page offset (only used for direct ID lookup).
identifierYesS2 author ID (numeric string) or free-text author name.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 BookA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cover_sizeNoCover size variant: ``"S"`` (small), ``"M"`` (medium), ``"L"`` (large). Defaults to ``"M"``.M
identifierYesISBN-10, ISBN-13, Open Library work ID (e.g. OL1168083W), or edition ID (e.g. OL1429049M).
download_coverNoIf True, download and cache the cover image locally. Returns ``cover_path`` in the response. In read-only mode, returns ``cover_error`` instead.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ExcerptA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
isbnYesISBN-10 or ISBN-13.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 GraphA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoNumber of hops (1-3).
seed_idsYes1-10 paper identifiers to start from.
year_endNoFilter expanded papers to this year and earlier.
directionNoExpand via citations, references, or both.citations
max_nodesNoHard cap on total nodes returned.
year_startNoFilter expanded papers to this year and later.
min_citationsNoMinimum citation count of expanded papers.
fields_of_studyNoFilter by field.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CitationsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (pagination).
fieldsNoField set preset for returned paper records.compact
offsetNoPagination offset.
year_endNoFilter citing papers published up to this year.
identifierYesPaper identifier (DOI, S2 ID, ARXIV:, etc.).
year_startNoFilter citing papers published from this year.
min_citationsNoMinimum 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_studyNoFilter by field of study.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 ResultA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PaperA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYesPaper identifier — DOI, S2 paper ID, arXiv ID (prefix with ``ARXIV:``), ACM ID (``ACM:``), or PubMed ID (``PMID:``).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 ReferencesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results.
fieldsNoField set preset for returned paper records.compact
offsetNoPagination offset.
identifierYesPaper identifier (DOI, S2 ID, ARXIV:, etc.).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 InfoA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 StandardA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYesCanonical or fuzzy standard identifier.
fetch_full_textNoIf True and docling is configured, download and convert the full text PDF/HTML via docling.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 StatusA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results to return (max 50).
subjectYesSubject or topic (e.g. "machine learning", "algorithms", "computer vision").

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 PapersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of recommendations to return.
fieldsNoField set preset for returned records.standard
negative_idsNoOptional S2 paper IDs to steer away from.
positive_idsYes1-5 S2 paper IDs to use as positive examples.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 IdentifierA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawYesRaw citation string as it appears in a paper reference.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 BooksA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results to return (max 50).
queryNoFree-text fallback. Use ``title``/``author`` when known.
titleNoBook title or partial title (recommended).
authorNoAuthor name (recommended).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PapersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort order — relevance, citations, or year.relevance
limitNoMaximum results to return (max 100).
queryYesKeyword or semantic search query.
venueNoFilter by venue name.
fieldsNoField set preset — compact, standard, or full.compact
offsetNoPagination offset.
year_endNoLatest publication year (inclusive).
year_startNoEarliest publication year (inclusive).
min_citationsNoMinimum citation count.
fields_of_studyNoFilter by fields, e.g. ["Computer Science"].

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 StandardsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoOptional filter — "NIST", "IETF", "W3C", or "ETSI".
limitNoMaximum results (max 50).
queryYesIdentifier, title, or free text.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 20 tool updatesv1.10.0
    • Changedbatch_resolve4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedenrich_paper4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedfind_bridge_papers4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedgenerate_citations4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedget_author4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedget_book5 fields changed
      • removedInput schema / properties / include_editions
        Removed value: -{
        -  "default": false,
        -  "description": "If true, fetch the work and list editions.",
        -  "type": "boolean"
        -}
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedget_citation_graph4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedget_citations4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Addedget_job_result
    • Changedget_paper4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedget_references4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedget_standard4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedget_sync_status4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Removedget_task_result
    • Removedlist_tasks
    • Changedrecommend_papers4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedresolve_standard_identifier4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedsearch_books4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedsearch_papers4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedsearch_standards4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
  2. 22 tool updatesv1.9.0
    • First observedbatch_resolve
    • First observedenrich_paper
    • First observedfind_bridge_papers
    • First observedgenerate_citations
    • First observedget_author
    • First observedget_book
    • First observedget_book_excerpt
    • First observedget_citation_graph
    • First observedget_citations
    • First observedget_paper
    • First observedget_references
    • First observedget_server_info
    • First observedget_standard
    • First observedget_sync_status
    • First observedget_task_result
    • First observedlist_tasks
    • First observedrecommend_books
    • First observedrecommend_papers
    • First observedresolve_standard_identifier
    • First observedsearch_books
    • First observedsearch_papers
    • First observedsearch_standards

TDQS

A4.1/5.0

Scored across 21 tools

Disambiguation4/5

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.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern (e.g., get_paper, search_books, generate_citations), with no deviations.

Tool Count3/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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.
    4
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for AI-assisted research: paper ingestion, semantic search, citation graph traversal, cross-domain knowledge synthesis, and workflow automation.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    A unified MCP server for academic paper discovery, citation exploration, and research intelligence workflows over multiple scientific knowledge sources.
    7
    1
    MIT