Skip to main content
Glama
pvliesdonk

scholar-mcp

by pvliesdonk

scholar-mcp

CI codecov 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 as a starting point. Copy .env.example to .env, edit, and docker compose up -d.

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 version reporting inside the DOMAIN-UPSTREAM-START / DOMAIN-UPSTREAM-END sentinel in src/scholar_mcp/server.py; see CLAUDE.md for the wiring pattern.

Configuration

Core 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

Set false for plain or structured JSON log output.

Domain-specific variables go below under Domain configuration.

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 CLAUDE.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 three repository secrets. 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, release-notes.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, claude-code-review.yml, release-notes.yml

Run claude setup-token locally and paste the result.

gh secret set RELEASE_TOKEN
gh secret set CODECOV_TOKEN
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 CLAUDE.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.

Domain configuration

Domain environment variables use the SCHOLAR_MCP_ prefix:

Variable

Default

Required

Description

SCHOLAR_GITHUB_TOKEN

(none)

No

GitHub token used to raise rate limits when fetching standards documents from GitHub. Optional; unauthenticated requests work at reduced limits.

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_VLM_API_URL

(none)

No

OpenAI-compatible VLM endpoint for formula and figure enrichment during PDF conversion.

SCHOLAR_MCP_VLM_API_KEY

(none)

No

API key for the VLM endpoint.

SCHOLAR_MCP_VLM_MODEL

gpt-4o

No

Model name to use with the VLM endpoint.

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.

SCHOLAR_MCP_EPO_CONSUMER_KEY

(none)

No

EPO Open Patent Services consumer key. Optional; patent tools are hidden when unset. Register at https://developers.epo.org/user/register.

SCHOLAR_MCP_EPO_CONSUMER_SECRET

(none)

No

EPO Open Patent Services consumer secret. Optional; patent tools are hidden when unset.

SCHOLAR_MCP_GOOGLE_BOOKS_API_KEY

(none)

No

Google Books API key. Optional; book tools work unauthenticated at reduced rate limits.

SCHOLAR_MCP_JOBS_SOFT_DEADLINE_S

25.0

No

Seconds a long-running tool call may run in the foreground before it is promoted to a background job and a job handle is returned instead.

SCHOLAR_MCP_JOBS_RESULT_TTL_S

3600.0

No

Seconds a background-job record (working or finished) is retained for polling before it expires from the store.

SCHOLAR_MCP_JOBS_MAX_PER_SUBJECT

256

No

Maximum live background jobs per calling subject; further promotions are rejected until older records expire.

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 and tags generate the table above 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). If S2 starts rejecting the key with 403 Forbidden, this shows up in the server logs as s2_key_forbidden (on real tool calls) or s2_keepalive_key_forbidden (from the background keepalive); grep for either to confirm a dead key versus a transient upstream issue.

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.

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.

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

22 tools
batch_resolveA
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.

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
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the operation as read-only and non-destructive, but the description adds valuable behavioral details: the use of OpenAlex fallback, auto-detection of patent numbers, the configuration dependency for EPO OPS API, and that the fields parameter only applies to paper results. This goes beyond the annotations and gives the agent useful context on how the tool behaves.

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: a clear one-sentence purpose followed by a few sentences with key technical details. Every sentence adds value without unnecessary fluff, and the length is appropriate for the tool's complexity.

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 presence of an output schema and comprehensive annotations, the description covers the essential aspects: what identifiers are accepted, how they are routed, and key fallback behavior. It does not explain error handling or partial failures, but those are likely covered in the output schema. The description is sufficiently complete for an agent to use the tool 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 input schema provides thorough descriptions of both parameters, achieving 100% coverage. The description adds some nuance (e.g., patent numbers are auto-detected, ISBNs require the 'ISBN:' prefix), but much of this is already implied in the schema. Since the schema carries the load, a 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 clearly states the tool's function: 'Resolve a list of paper, patent, or book identifiers to full records.' This is specific with a verb, resource, and scope. It distinguishes itself from siblings like get_paper (single) and search_papers by focusing on batch resolution of multiple identifier types.

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 provides clear context for when to use this tool: when you have a list of paper, patent, or book identifiers to resolve. It also explains the underlying sources (S2 batch, OpenAlex, EPO, Open Library), which helps set expectations. However, it does not explicitly mention alternatives or situations where a different tool (e.g., get_paper for single IDs) would be more appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals the two-step process (resolve DOI from S2, then query OpenAlex) and states that results are cached for 30 days. These details go beyond the annotations, which already mark the tool as read-only, open-world, and non-destructive. It does not mention potential failure modes or rate limits, but the provided behavioral context is valuable.

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 at three sentences, with the purpose in the first sentence, workflow in the second, and caching behavior in the third. No extraneous words or repetition of schema/annotations. It is well-structured and immediately informative.

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 moderate complexity, the presence of an output schema, and comprehensive annotations, the description covers the essential aspects: purpose, workflow, and caching. It does not explain what happens if the DOI cannot be resolved, but that is a minor gap. Overall, the description is complete enough for effective selection and invocation.

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 already covers both parameters with usage details, including the identifier format and the allowed enrichment fields. The description adds no new parameter-specific semantics beyond the phrase 'requested enrichment fields,' which merely restates the schema. 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.

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 function: 'Fetch OpenAlex metadata to supplement Semantic Scholar data.' It uses a specific verb (fetch) and resource (OpenAlex metadata), and distinguishes it from sibling tools focused on searching, retrieving papers, or citations. The workflow of resolving the DOI and querying OpenAlex adds further specificity.

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 implies the tool is used when Semantic Scholar data needs supplementing from OpenAlex, providing clear context. However, it does not explicitly mention when not to use it or name alternative tools for comparison, such as get_paper or search_papers, so it stops short of a full usage guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

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
resultYes

TDQS

A4.2/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, covering the safety profile. The description adds meaningful behavioral context: it uses BFS over the citation/reference graph and leverages cached lists to minimize API calls. This informs the agent about computational cost and efficiency, which is beyond what annotations provide.

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 sentences: one stating the core purpose and one adding algorithmic context. Every sentence earns its place, with no filler or redundancy. The primary functionality is front-loaded, making it easy for an agent to quickly parse.

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 annotations, full schema coverage, and presence of an output schema, the description provides sufficient context for an agent to select and invoke the tool. It explains the approach (BFS) and the efficiency optimization (caching), which are valuable for understanding behavior. It lacks edge-case details like 'what if no path exists', but the output schema likely covers return semantics, so this is a minor gap.

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 all four parameters documented including enums and defaults. The description adds no additional parameter-level explanation, so it stays at the baseline of 3. It does not contradict the schema and correctly leaves parameter details to the structured definition.

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 'Find the shortest citation path between two papers', which is a specific verb+resource pair that clearly distinguishes this tool from sibling tools like get_citations or get_references. It explicitly names the two-paper pathfinding scope, leaving no ambiguity about its primary function.

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 context is clear: use this when you need the shortest path between two papers. The mention of BFS and cached lists implies efficiency, suggesting it is preferable to manual graph traversal via sibling tools. However, it does not explicitly name alternatives or state when not to use it, so it misses a point for explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

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
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the multi-step behavior: resolving via Semantic Scholar, optionally enriching with OpenAlex, and outputting to three formats. This adds meaningful context beyond the readOnly/destructive annotations, though it does not discuss failure behavior or edge cases.

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 compact sentences, front-loaded with the primary action, and each clause contributes meaningful detail (resolution, enrichment, output formats). No redundancy or 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?

Given the three parameters, annotations, and presence of an output schema, the description covers the main workflow and outputs. It omits edge-case handling, but that is not required for a tool of this complexity.

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 three parameters are fully described in the input schema (100% coverage), so the description's brief mention of resolution, enrichment, and formatting adds little new parameter-level detail. Baseline 3 is appropriate when schema carries the parameter documentation burden.

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 a specific verb 'Generate' and a clear object 'formatted citations for one or more papers,' and elaborates with supported formats and enrichment workflow. This clearly distinguishes it from sibling tools like get_citations, which would retrieve citation lists rather than format references.

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 implies the use case of converting paper identifiers into formatted reference strings, with the output formats making the context clear. It does not explicitly exclude alternatives or say 'use when you need BibTeX/CSL-JSON/RIS,' but the purpose is unambiguous enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

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
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and destructiveHint, so the description adds value by explaining the dual fetch/search behavior, the 5-candidate limit for name searches, and the conditional use of limit/offset.

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-loaded with the main purpose, then a concise conditional explanation. Every sentence 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?

Given the output schema and annotations, the description sufficiently covers tool behavior, parameter nuances, and disambiguation logic. No major gaps for selecting and invoking the 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?

Schema covers all parameters fully, but the description adds meaning by clarifying the identifier polymorphism and the 5-candidate result for name searches, which goes beyond the schema.

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 author profiles and publications or searches by name, with a specific disambiguation behavior. This distinguishes it from sibling tools like get_paper or search_papers.

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 guidance on when to use direct ID lookup vs name search based on identifier format, but does not explicitly mention alternatives or exclusions. The conditional logic is a strong usage hint.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bookA
Read-only

Fetch book metadata by ISBN or Open Library ID.

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.
include_editionsNoIf true, fetch the work and list editions.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description need not repeat those. However, it adds little beyond stating the lookup action; no behavior around cover_sizing, download caching, or edition inclusion is mentioned. It does not contradict 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 a single focused sentence that front-loads the main purpose and identifier scope. Every word earns its place; no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

The tool has an output schema and annotations cover the safety profile. The description is brief but sufficient for a metadata fetch operation; the main gap is lack of explicit usage context relative to sibling tools, which is a minor omission.

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 detailed parameter definitions for identifier, cover_size, download_cover, and include_editions. The description adds no new parameter semantics beyond aligning with the identifier field, which is the minimum viable level.

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 action ('Fetch') and resource ('book metadata'), and explicitly specifies the input types (ISBN or Open Library ID). This distinguishes it from sibling tools like search_books and get_book_excerpt.

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 usage when a book identifier is already known, but it does not explicitly contrast with alternatives such as search_books or get_book_excerpt. No exclusions or when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
isbnYesISBN-10 or ISBN-13.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only and non-destructive. The description adds behavioral context by specifying exactly what is returned—publisher description, snippet, preview link—and the limitation that it is not full text. This goes beyond the annotations and helps set expectations for the API's constraints.

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 very concise—two sentences—and the first sentence immediately states the tool's purpose. The second sentence adds valuable behavioral limitation without redundancy. Every word earns its place.

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 (one parameter) and the presence of an output schema, this description fully covers what the tool does, what it returns, and its key limitation. It also aligns with the read-only annotation. No important contextual element appears 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?

The single parameter 'isbn' is fully described in the schema as 'ISBN-10 or ISBN-13,' so the description doesn't need to repeat that. The description provides no additional parameter semantics beyond what the schema already states, so a 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 begins with 'Get a book excerpt and preview info from Google Books,' which clearly identifies the action and resource. It further specifies the contents of the return: publisher description, text snippet, and link. This distinguishes it from sibling tools like get_book 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?

The description explains that Google Books does not expose full chapter text via API, clarifying that this tool only provides excerpts and not full content. It does not explicitly name alternative tools or when to use them, but the context of what this tool returns versus what it cannot provide is clear. Thus it offers clear context without explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

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
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only and non-destructive behavior, and the description adds valuable algorithm details: BFS traversal, depth-limited expansion, and a hard node cap. This goes beyond the safe-read annotation by explaining execution behavior and limits, though it does not cover every edge case like open-world incompleteness.

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, no filler. The first sentence states the core purpose, and the follow-ups add necessary algorithm and boundary details without fluff.

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 rich input schema (100% coverage), output schema, and safety annotations, the description sufficiently covers the tool's behavior. It explains the traversal algorithm, depth limit, and node cap—enough for an agent to invoke it correctly without needing further clarification.

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%, so the baseline is 3; the description adds extra semantic value by explaining how depth, max_nodes, and seed_ids work together in the BFS traversal. It does not repeat every parameter but clarifies the core mechanism that gives those parameters meaning.

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 a specific verb ('Traverse') and names a distinct resource ('the citation graph') with a clear scope: one or more seed papers. It differentiates itself from siblings like get_citations/get_references by emphasizing graph traversal and BFS, not simple list retrieval.

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 clearly conveys the intended use case: multi-hop citation graph traversal with controllable depth and node caps. It does not explicitly mention alternatives or when not to use it, but the BFS and graph-edge language strongly implies this tool is for relational exploration rather than basic lookup.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_citationsA
Read-only

Fetch papers that cite the given paper (forward citations).

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
resultYes

TDQS

A4.3/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, covering the safety profile. The description adds the key behavioral detail that this is forward citations, which is not captured by annotations or the tool name alone. It does not, however, discuss edge cases like pagination behavior beyond what the schema's parameter descriptions already provide.

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, front-loaded sentence that states the core purpose without any filler. Every word earns its place, and there is zero redundancy or tangential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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

Given the presence of a complete input schema with all parameter descriptions, an output schema (not shown but indicated), and annotations that cover safety, the one-sentence description is sufficient. It clearly identifies the tool's scope (forward citations) and relies on structured fields for the rest, which is complete for a tool of this simplicity.

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 provides 100% coverage with detailed descriptions for all 8 parameters, including the client-side filtering effect of min_citations and pagination semantics. The description itself adds no parameter information, so it does not go beyond the baseline of 3 for high 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 uses a specific verb ('Fetch') and resource ('papers that cite the given paper'), and explicitly clarifies 'forward citations', which distinguishes it from backward citation tools like get_references. This leaves no ambiguity about the tool's function.

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 phrase 'forward citations' provides clear context that this tool is for finding papers that cite the given paper, implicitly differentiating it from get_references (backward citations). However, it does not explicitly mention alternatives or when not to use it, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_paperA
Read-only

Fetch full metadata for a single paper.

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
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, indicating a safe read operation. The description adds 'full metadata' but does not disclose additional behavioral context like response size, pagination, or handling of missing papers. With annotations covering safety, this is adequate but not enriched.

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 concise sentence, 'Fetch full metadata for a single paper,' that is front-loaded and contains no fluff. Every word contributes to clarity.

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 simplicity (one parameter, full schema coverage, output schema present, and annotations provided), the description is nearly complete. It does not explain return values, but the output schema covers that. The only minor gap is lack of mention of error cases, but openWorldHint in annotations partially covers that. Overall, it is sufficient for a straightforward fetch tool.

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% for the single identifier parameter, with a detailed explanation of supported formats (DOI, S2 paper ID, arXiv ID with prefix, etc.). The tool description adds no additional parameter context beyond the schema, so the schema carries the semantic weight; baseline 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 'Fetch full metadata for a single paper' uses a specific verb 'Fetch' and resource 'paper', with clear scope ('single'). It distinguishes from sibling tools like search_papers (search) and get_author (author), making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit when-to-use or when-not-to-use guidance. It does not mention alternatives or exclusions. The usage is only implied by the name and description, which is insufficient for an agent to decide between this and similar fetch tools like get_author or get_book.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_referencesA
Read-only

Fetch papers referenced by the given paper (backward references).

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
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and destructiveHint=false, so safety is covered. Description adds the directional context (backward references) and clarifies it's a listing of references for a paper, but doesn't add other behavioral details like pagination behavior or error handling.

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?

A single clear sentence that conveys the core function 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 output schema exists and annotations cover safety, the description is sufficient for a simple fetch tool. It correctly specifies the input identifier and the direction of the relationship.

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 four parameters are fully described in the schema (100% coverage), so the description adds no extra parameter semantics. Baseline 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?

Uses specific verb 'Fetch' and resource 'papers referenced by the given paper', explicitly noting backward references, distinguishing it from get_citations (likely forward references).

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?

Implies backward-reference usage via 'backward references' but does not explicitly name alternative tools or when not to use. The sibling context suggests get_citations for forward references, but this is not stated.

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

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
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only and open-world hints, so the safety profile is covered. The description adds value by disclosing the fuzzy-input resolution behavior and the conditional full-text download via docling, which are non-obvious behavioral traits. 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 concise, front-loaded with the primary action, and every sentence earns its place. It avoids fluff and provides necessary details in two short paragraphs.

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 and only two simple parameters, the description is complete for its complexity. It covers the core retrieval, fuzzy resolution, and optional full-text behavior, leaving no major gaps in understanding the tool's functionality.

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 description largely restates the schema's parameter explanations (canonical/fuzzy identifier, fetch_full_text with docling condition). It adds no new parameter semantics beyond what the schema already provides, 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?

The description uses a specific verb ('Retrieve') and resource ('standard by identifier'), and clearly distinguishes from siblings like search_standards and resolve_standard_identifier by focusing on fetching a standard. The fuzzy-to-canonical resolution detail further clarifies its unique role.

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 usage: fetch a standard by identifier, with optional full-text retrieval. However, it does not explicitly mention when to avoid this tool or name alternatives like resolve_standard_identifier for pure identifier resolution. This is a clear context but lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_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: JSON {"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
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, destructiveHint, openWorldHint), the description adds meaningful behavioral details: the output JSON structure, that 'errors' contains non-fatal error strings, and that the runs list is empty when no sync has been run. This provides context about edge cases and return semantics that annotations do not cover.

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, well-structured, and front-loaded with the main purpose. It uses a clear hierarchy: summary sentence, then details about timestamps and errors, then an explicit return format. Every sentence adds information 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?

This tool has no parameters, a read-only annotation, and an output schema, yet the description still covers key edge cases (empty runs list, non-fatal errors, timestamp units). It is complete and self-contained, enabling the agent to understand exactly what to expect without needing additional context.

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 no parameters, and the schema coverage is trivially 100%. The description still adds value by explaining the output fields and their meanings, though parameter-level semantics are not applicable. Given the zero-parameter baseline of 4, this score 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 starts with a clear, specific verb and resource: 'Report the last sync run for each standards body.' This distinguishes it from sibling tools that handle papers, books, standards, or tasks, and leaves no ambiguity about 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the tool's function and output scope ('One row per body'), making the intended use context obvious. It does not explicitly mention alternatives or exclusions, but given the unique subject matter among siblings, the usage context is clear enough to earn a 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_task_resultA
Read-only

Poll for the result of a background task.

When a tool returns {"queued": true, "task_id": "..."} it means the operation was submitted for background processing. Call this tool with the task_id to check whether it has completed.

PDF conversion tasks typically take 1-5 minutes. Keep polling — the response includes elapsed_seconds and a hint with expected duration while the task is in progress.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesThe task ID returned by a queued operation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and destructiveHint annotations, the description adds useful behavioral context: the task is processed in the background, polling is expected, and the response includes elapsed_seconds and a hint with expected duration. This helps the agent understand the polling cycle and set expectations.

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, starting with the core purpose, then trigger conditions, expected duration, and response hints. Every sentence adds value 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?

For a single-parameter polling tool with annotations and an output schema, the description covers all necessary context: when to use it, how to use it, what to expect in terms of timing and response fields. No gaps are apparent.

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%, and the parameter description already explains that task_id is returned by a queued operation. The tool description reinforces this but does not add new semantic detail beyond what the schema provides, so baseline 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 clearly states the tool polls for background task results using a specific verb ('Poll') and resource ('result of a background task'). It distinguishes itself from sibling tools by focusing on task polling, which is unique among the listed 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?

Provides explicit trigger conditions: when a tool returns {"queued": true, "task_id": "..."}, call this tool. It also gives timing expectations (1-5 minutes) and polling guidance, but does not 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.

list_tasksA
Read-only

List all active background tasks.

Returns: JSON list of {"task_id": ..., "status": ...} dicts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/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 read-only nature is covered. The description adds value by disclosing the return format (JSON list of task_id and status) and the scope (active tasks), which goes beyond annotations. It does not contradict 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 extremely concise, with only two sentences: the first stating the action and the second outlining the return format. Every word is purposeful, with no redundancy or 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 a simple, zero-parameter tool with annotations and an output schema, the description is complete. It clearly states what is listed and the shape of the return value, leaving no significant gaps in understanding.

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 parameter-specific descriptions are unnecessary. The baseline for 0 params is 4, and the description appropriately focuses on behavior rather than parameters.

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 "List" and identifies the resource as "active background tasks," which clearly states what the tool does. It distinguishes itself from siblings like get_task_result by focusing on the list of tasks rather than individual task results.

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 this tool is used to view active background tasks but provides no explicit guidance on when to use it versus alternatives such as get_task_result. No exclusions or alternative references are given, so usage context is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recommend_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

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context about the sorting logic (by edition count as a popularity proxy) and the data source (Open Library subject API), which is beyond what annotations provide.

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 sentences, front-loaded with the core purpose, and every word earns its place. It avoids redundancy with the schema and annotations while providing the essential behavioral detail about sorting.

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 tool is simple with only two parameters, annotations cover safety, an output schema exists, and the description explains the underlying mechanism (Open Library API and sorting by edition count). This is fully sufficient for an agent to understand and invoke 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?

Schema description coverage is 100%, so the schema fully documents both parameters (subject and limit). The description does not add any parameter-specific information beyond what the schema already provides, 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool recommends books for a subject using the Open Library subject API, and specifies that results are sorted by edition count as a proxy for popularity. This provides a specific verb, resource, and key behavior, distinguishing it from sibling tools like 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?

The description implies the use case of getting popular book recommendations for a subject, which is clear context. However, it does not explicitly mention when not to use this tool or suggest alternatives like search_books for exact matches, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recommend_papersA
Read-only

Recommend papers based on positive (and optionally negative) examples.

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
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is known. The description adds the concept of positive/negative examples, but this is also reflected in the schema. No additional behavioral traits (e.g., how recommendations are computed) are disclosed.

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, front-loaded sentence with no filler words. Every word earns its place, and it clearly conveys the core functionality without unnecessary detail.

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 rich schema, annotations, and output schema, the description is adequate for an agent to select and invoke the tool. It could add a bit more context about typical use cases, but the absence of such detail is not a significant gap given the structured data available.

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 describes all four parameters with 100% coverage, so the baseline is 3. The description's mention of 'positive (and optionally negative) examples' adds no meaning beyond what the schema already 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 uses a specific verb ('recommend') and resource ('papers') and clearly states the mechanism ('based on positive (and optionally negative) examples'). This distinguishes it from sibling tools like search_papers, get_paper, and recommend_books.

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 use case is implied: an agent should use this tool when it has example paper IDs and wants similar papers. However, the description offers no explicit guidance on when to prefer this over alternatives, nor does it mention exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it as read-only and non-destructive. The description adds significant behavioral detail: tries local regex first (fast, no network), falls back to source APIs, and returns all candidates when ambiguous. This goes well beyond annotation coverage.

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, all substantive. The primary purpose is front-loaded, followed by concise behavioral details. 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 single parameter fully described in the schema, an output schema present, and annotations covering safety, the description provides enough context: normalization, fallback behavior, ambiguity handling. Return values are unnecessary because output schema exists.

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 description for the sole parameter 'raw' covers 100% of the parameter semantics. The tool description does not add extra meaning about the parameter beyond calling it a 'messy standard citation string', which mirrors the schema. Baseline 3 is appropriate since schema does the heavy lifting.

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 normalizes a messy standard citation string to its canonical form, with a specific verb and resource. This distinguishes it from siblings like search_standards and get_standard, which focus on discovery or retrieval rather than normalization.

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 implies usage context: you use this when you have a messy citation string. It explains the local-first then API-fallback behavior, but does not explicitly mention when not to use it or alternatives like batch_resolve. Clear context is present, but exclusions are missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

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
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, covering the safety profile. The description adds valuable behavioral context by noting that it 'Uses Open Library,' implying an external dependency with potential variability, and explains the index-based performance difference between parameter types.

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: the first states the core purpose, the second delivers the key usage tip. No redundant or filler content; 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?

For a search tool with an output schema and 100% parameter documentation, the description covers the essential aspects: what it does, the external data source, and parameter preferences. It doesn't mention full-text vs. metadata matching or potential API limitations, but these are minor given the existing structured context.

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 100% coverage with descriptions for all parameters, but the description adds semantic nuance by explaining why title/author are preferred ('dedicated indexes') and frames query as a fallback. This goes beyond the schema's 'recommended' labels by explaining the underlying reason.

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 'Search for books by title, author, or free text,' which clearly specifies the action (search) and the resource (books). It distinguishes from sibling tools like search_papers (which searches papers) and get_book (which retrieves a specific book).

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 provides clear internal guidance: 'Prefer title and author over query — they use dedicated indexes and return far better results.' This tells the agent which parameters to favor for better outcomes, though it doesn't explicitly contrast with sibling tools beyond the tool name and purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_papersB
Read-only

Search Semantic Scholar for papers matching a query.

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
resultYes

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description merely restates the tool's purpose and adds no behavioral context beyond what annotations already provide. It does not mention pagination, sorting, or the nature of results, leaving the agent without insight into the tool's operational behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no wasted words, achieving high conciseness. However, it is overly sparse and lacks the detail needed to be truly useful, making it merely adequate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

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

Despite having 10 parameters and an output schema, the description provides no context about the tool's capabilities such as filtering, sorting, or typical usage scenarios. It does not even mention that it returns a list of papers, leaving a significant gap in contextual information.

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 has 100% parameter description coverage, so the baseline is 3. The description does not add any additional parameter semantics, but the schema already thoroughly documents all parameters.

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, using a specific verb and resource. It distinguishes itself from sibling tools like search_books and get_paper by explicitly naming 'Semantic Scholar' and 'papers'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as get_paper, search_books, or recommend_papers. The description lacks any mention of use cases, exclusions, or alternative tool recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, non-destructive, and open-world. The description adds source scope (NIST, IETF, W3C, ETSI) and mentions the 'body' filter, which is useful but not deeply behavioral. It does not disclose internal behavior like rate limits, pagination, or default ordering, but with output schema and annotations present, the extra burden is lower.

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. The first sentence delivers the core purpose, and the second provides scope and a usage hint. Every sentence earns its place with no redundancy or fluff.

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?

For a simple search tool, the description is adequate: it names the resource, search modes, source bodies, and the body filter. Combined with the exhaustive schema and output schema, it gives the agent enough to call the tool. A small gap is that it doesn't mention how results are ordered or that 'limit' caps the result count, though the schema covers the latter.

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 baseline is 3. The description reinforces query semantics ('identifier, title, or free text') and explains the purpose of 'body', but these details are also present in the schema. No additional parameter meaning is added beyond what the schema already 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 tool's function: 'Search technical standards by identifier, title, or free text.' It also specifies the resource (technical standards) and the scope (NIST, IETF, W3C, ETSI), distinguishing it from sibling search tools like search_papers 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful context: it searches four named source bodies and explicitly instructs how to restrict to one via the 'body' parameter. This provides clear guidance on parameter usage, though it doesn't explicitly mention alternatives or when *not* to use this tool.

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. Dates show when Glama detected each change.

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

A3.7/5.0
Disambiguation4/5

Most tools are clearly distinguished by resource type (papers, books, standards) and action (search, get, recommend). A few potential overlaps exist, such as get_author handling both search and fetch, and batch_resolve overlapping with get_paper for single IDs, but descriptions clarify usage.

Naming Consistency4/5

The majority follow a verb_noun pattern (search_papers, get_book, recommend_books). Minor inconsistencies include 'find_bridge_papers' instead of 'search_bridge_papers', 'batch_resolve' lacking a noun, and longer names like 'resolve_standard_identifier', but the overall convention is readable and predictable.

Tool Count3/5

At 22 tools, the server is on the heavier side, covering three distinct domains (papers, books, standards) plus utilities. While each tool has a purpose, the count exceeds the typical well-scoped range and feels slightly bloated for a single server.

Completeness4/5

The paper domain is well-covered with search, get, citation traversal, recommendations, and enrichment. Books and standards have basic CRUD-like coverage (search, get, recommend). Minor gaps exist (e.g., no separate author search, no book full-text retrieval), but core workflows are supported.

Maintenance

ActivityActive
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pvliesdonk/scholar-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server