scholar-mcp
The server is an MCP tool server for scholarly research — searching and analyzing papers, patents, books, and standards, with citation-graph exploration, metadata enrichment, citation generation, and PDF/full-text conversion.
Search and retrieve papers by keyword, venue, year, field, or citation count; look up individual papers by DOI, S2/arXiv/ACM/PubMed IDs.
Explore citation graphs: get forward citations, backward references, BFS graph traversal, and shortest citation paths between papers.
Get recommendations from positive/negative paper examples.
Generate citations in BibTeX, CSL-JSON, or RIS with optional OpenAlex venue enrichment.
Enrich paper metadata with OpenAlex data: affiliations, funders, open-access status, and concepts.
Search and retrieve patents via EPO OPS, including bibliographic data, claims, descriptions, family, legal status, citations, citing patents, and patent PDFs (when configured).
Search and retrieve books via Open Library by title, author, ISBN, or subject; fetch excerpts/previews from Google Books; download cover images; get recommendations.
Resolve standards for NIST, IETF, W3C, and ETSI (plus synced ISO/IEC/IEEE/CC/CEN metadata): normalize identifiers, search, fetch metadata, and optionally fetch full text.
Batch-resolve mixed identifiers — paper DOIs, patent numbers, and ISBNs — in one call.
Convert PDFs to Markdown via docling-serve, with fallback download sources and optional VLM enrichment.
Manage background jobs for long-running operations and poll their results.
Provides fallback PDF conversion for papers from arXiv, and supports paper lookup by arXiv ID.
Enables metadata retrieval for IEEE standards and papers, including status and full-text links.
Allows paper lookup by PubMed ID and access to PubMed Central for full-text PDF conversion.
Core integration for searching papers, retrieving citations, references, author profiles, and citation graph traversal via Semantic Scholar API.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@scholar-mcpSearch for papers on large language models from 2024"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
scholar-mcp
A FastMCP server for the scholarly citation landscape (papers, patents, books, and standards), giving LLMs a unified way to search, cross-reference, and retrieve prior art across all four source types via Semantic Scholar, EPO Open Patent Services, Open Library, and standards bodies (NIST, IETF, W3C, ETSI), with OpenAlex enrichment and optional docling-serve PDF/full-text conversion.
Documentation | Config wizard | PyPI | Docker
Features
Source domains
Papers: full-text search with year/venue/field/citation filters; single-paper lookup by DOI, S2 ID, arXiv ID, ACM ID, or PubMed ID; author profile and name search; forward citations, backward references, BFS graph traversal, shortest-path bridge discovery; recommendations from positive/negative examples; BibTeX/CSL-JSON/RIS citation generation with OpenAlex venue enrichment.
Patents: search across 100+ patent offices via EPO OPS with CPC/applicant/inventor/jurisdiction filters; bibliographic, claims, description, family, legal, and citations sections; NPL-to-paper resolution via Semantic Scholar and paper-to-patent citation discovery. EPO credentials are optional; other domains work without them.
Books: Open Library search by title/author/keywords, no API key required; lookup by ISBN-10/13 or by Open Library work/edition ID; subject-based recommendations sorted by popularity; Google Books excerpts and preview links; WorldCat permalinks for library discovery; cover image caching. Papers with an ISBN in
externalIdsare automatically enriched with publisher, edition, cover URL, and subject data from Open Library.Standards: identifier resolution, search, and metadata retrieval for NIST, IETF, W3C, and ETSI standards, with optional full-text fetch and Markdown conversion via docling. Tier 2 ISO, IEC, IEEE, Common Criteria (CC), and CEN/CENELEC metadata (including ISO/IEC/IEEE joint standards and the CC ↔ ISO/IEC 15408 cross-link) is synced locally via
sync-standards. ISO, IEC, IEEE have a live-fetch fallback for unsynced identifiers; CC and CEN have no live API and require a sync first. Citations matching standards patterns (RFC, ISO, NIST SP, IEEE, EN, CC) are automatically enriched with structuredstandard_metadataincluding identifier, title, body, status, and full-text URL when available (see docs/guides/standards.md).
Cross-cutting
Enrichment pipeline: phased enrichment from multiple sources: OpenAlex (OA status, affiliations, funders, concepts), CrossRef (publisher, page ranges, container titles), Google Books (preview links, excerpts), and Open Library (book metadata). Runs automatically on paper and book results.
PDF conversion: download open-access PDFs and convert to Markdown via docling-serve, with optional VLM enrichment for formulas and figures; automatic fallback to ArXiv, PubMed Central, and Unpaywall when Semantic Scholar has no OA link; direct URL download for PDFs found elsewhere.
Intelligent caching: SQLite-backed cache with per-table TTLs (30 days for papers/authors, 7 days for citations/references) and identifier aliasing.
Authentication: bearer token, OIDC (OAuth 2.1), or both simultaneously (multi-auth).
Multi-transport: stdio (Claude Desktop), HTTP (streamable-http), and SSE transports.
Linux packages:
.deband.rpmpackages with systemd service and security hardening.
Coverage by domain
Per-domain depth is uneven. Papers currently have the richest tool surface (citation graph, recommendations, cross-referencing to all three other domains); standards are the leanest. That reflects public data availability, not a value hierarchy: writing a paper typically needs all four source types for citations and prior art. Parity work is tracked in GitHub issues and milestones; the roadmap shows intent, not a completeness commitment.
Related MCP server: Academic Paper MCP HTTP/SSE Server
What you can do with it
With this server mounted in an MCP client (Claude, etc.), you can:
Survey a field: "Find the 20 most-cited papers on graph neural networks from 2020 to 2024 and draft a literature review outline." Composes
search_papers+get_citations+enrich_paper.Trace a citation path: "What's the shortest citation path from 'Attention is All You Need' to 'RLHF for dialogue agents'?" Uses
find_bridge_papers+get_citation_graph.Cross-reference prior art: "For this patent family, list academic papers it cites and any books or standards that show up in the description." Composes
get_patent+batch_resolve+ standards/book enrichment.Generate a bibliography: "Emit BibTeX for these 30 DOIs with OpenAlex venue data." Uses
generate_citations.Look up a standard: "What's the latest status of RFC 9000, and fetch the Markdown full text." Uses
resolve_standard_identifier+get_standard.
Installation
From PyPI
pip install pvliesdonk-scholar-mcpIf you add optional extras via the PROJECT-EXTRAS-START / PROJECT-EXTRAS-END sentinels in pyproject.toml, document them below:
Scholar-mcp ships two optional-dependency groups:
[mcp]: installs FastMCP; required to runscholar-mcp serveand expose tools over stdio/HTTP.[all]: currently identical to[mcp]; reserved for future optional backends.
For MCP-server usage:
pip install 'pvliesdonk-scholar-mcp[mcp]'
# or, without installing into the environment:
uvx --from pvliesdonk-scholar-mcp scholar-mcp serveInstalling the bare pvliesdonk-scholar-mcp package is enough for library use (from scholar_mcp import ...) but the scholar-mcp serve CLI requires [mcp].
From source
git clone https://github.com/pvliesdonk/scholar-mcp.git
cd scholar-mcp
uv sync --all-extras --all-groupsDocker
docker pull ghcr.io/pvliesdonk/scholar-mcp:latestTo run the newest merged code instead of the newest release, use the rolling edge tag. It is rebuilt on every merge to main and carries no version identity. See Image tags for the full tag list.
docker pull ghcr.io/pvliesdonk/scholar-mcp:edgeA compose.yml ships at the repo root 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>.mcpbClaude Desktop prompts for required env vars via a GUI wizard, with no manual JSON editing needed.
For manual Claude Desktop configuration and setup options, see Claude Desktop deployment.
Release channels
Artifacts ship on three channels. Each row lists exactly what that channel publishes.
Channel | Version identity | Artifacts |
| None; the commit is the identity | Docker image |
Pre-release |
| PyPI (as the pre-release |
Stable |
| Everything: PyPI, Docker (version tag plus ordering-aware |
Pre-releases reach PyPI so that a candidate's .mcpb bundle installs: the bundle points at PyPI rather than carrying the code. Ordinary installers never see them, because a PEP 440 resolver skips pre-releases unless the requirement pins one or you pass --pre. Ask for a candidate by name with pip install pvliesdonk-scholar-mcp==X.Y.ZrcN. PyPI spells it in the PEP 440 canonical form, while tags use SemVer. Rolling pointers are ordering-aware, so a patch release cut from an old release/X.Y branch never moves latest-style tags back to older content, and a candidate for an already-released version never moves rc. See Release process for the full model.
Quick start
scholar-mcp serve # stdio transport
scholar-mcp serve --transport http --port 8000 # streamable HTTPFor library usage (embedding the domain logic without the MCP transport), import from the scholar_mcp package directly. Backend clients live under src/scholar_mcp/_s2_client.py, _epo_client.py, _openlibrary_client.py, and _standards_client.py.
Server info
The server registers a built-in get_server_info tool (via fastmcp_pvl_core.register_server_info_tool) so operators can confirm the deployed version with a single MCP call. The default response carries server_name, server_version, and core_version. Servers that talk to a remote upstream wire upstream 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 |
|
| Persistent-state backend URL shared by every pvl-core subsystem that needs state. |
|
| Log level for FastMCP internals and app loggers (DEBUG / INFO / WARNING / ERROR / CRITICAL). The -v CLI flag overrides to DEBUG. |
|
| 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-fooorwrite:vault/personal;fastmcp-pvl-coretreats every scope except*as opaque.
Subject ↔ bearer-token alignment
The subject string used as a value in the bearer-tokens TOML (SCHOLAR_MCP_BEARER_TOKENS_FILE) is the same string used as a key in the ACL TOML. Same string, opposite roles, so keep the two files consistent when adding or removing a principal. See Mapped bearer tokens in the authentication guide for the bearer-tokens TOML schema.
In single-token mode (SCHOLAR_MCP_BEARER_TOKEN) every authenticated caller shares one subject, the library's default (currently "bearer-anon"); override it with SCHOLAR_MCP_BEARER_DEFAULT_SUBJECT; reference that string as the ACL key. When no auth is configured (no SCHOLAR_MCP_BEARER_TOKEN, SCHOLAR_MCP_BEARER_TOKENS_FILE, or OIDC env vars set, which is common in stdio dev rigs but also possible on HTTP), every request resolves to the literal subject "local". Reference that string as the ACL key for un-authenticated local sessions.
Authentication
Callers authenticate via a bearer token or OIDC (mutually exclusive). See the Authentication guide for setup, mapped multi-subject tokens, OIDC, and troubleshooting.
Post-scaffold checklist
After copier copy and gh repo create --push:
Fill in the DOMAIN blocks (every section marked with a
DOMAINsentinel comment) in this README and inCLAUDE.md. TheGENERATED-ENV-TABLE-*regions are not DOMAIN blocks; the config generator owns them and rewrites them on every run.Configure GitHub secrets (see below).
Install dev + docs tooling:
uv sync --all-extras --all-groups.Install pre-commit hooks:
uv run pre-commit install.Run the gate locally:
uv run pytest -x -q && uv run ruff check --fix . && uv run ruff format . && uv run mypy src/ tests/.Push the first commit. CI should be green.
GitHub secrets
CI workflows reference three repository secrets. Configure them via Settings → Secrets and variables → Actions or with gh secret set:
Secret | Used by | How to generate |
|
| Fine-grained PAT at https://github.com/settings/personal-access-tokens/new with |
|
| https://codecov.io: sign in with GitHub and add the repo. The upload token is on its settings page. |
|
| Run |
gh secret set RELEASE_TOKEN
gh secret set CODECOV_TOKEN
gh secret set CLAUDE_CODE_OAUTH_TOKENDependency updates are handled by Renovate (
renovate.yml), which reusesRELEASE_TOKEN. It maintainsuv.lockand auto-merges patch/minor bumps once theCI Successcheck is green;bootstrap.ymlenables auto-merge and applies the repository rulesets (.github/rulesets/) on first push. See Repository Protection for the per-branch posture and bypass model. GitHub Actions are updated in the copier template and arrive viacopier update, not per-repo.
GITHUB_TOKEN is auto-provided; no action needed.
Local development
The PR gate (matches CI):
uv run pytest -x -q # tests
uv run ruff check --fix . && uv run ruff format . # lint + format
uv run mypy src/ tests/ # type-checkPre-commit runs a subset of the gate on each commit; see .pre-commit-config.yaml for details, or 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-groupsuv run python -m pytest also works as a one-shot workaround (bypasses the stale entry-script shim).
uv.lock refresh after copier update
When copier update introduces new dependencies (such as a new extra added to pyproject.toml.jinja), the CI install step runs uv sync --locked, which fails against a stale lockfile. Run uv lock locally and commit the refreshed uv.lock alongside accepting the copier-update PR.
CI installs with --locked (and the review workflow with --frozen) so no job ever rewrites uv.lock in its own workspace: a job that re-locks hides the drift it just repaired, and a dirty workspace breaks any later git checkout in the same job. Lockfile drift then shows up as a red install step with a clear message, not as a silent mutation.
Links
Domain configuration
Domain environment variables use the SCHOLAR_MCP_ prefix:
Variable | Default | Required | Description |
| (none) | No | GitHub token used to raise rate limits when fetching standards documents from GitHub. Optional; unauthenticated requests work at reduced limits. |
|
| No | When true, write-tagged tools (PDF download and conversion cache writes) are hidden. Set false to enable them. |
| (none) | No | Semantic Scholar API key. Optional but strongly recommended: unauthenticated requests are limited to ~1 req/s. Request one at https://www.semanticscholar.org/product/api#api-key-form. |
| (none) | No | Base URL of a running docling-serve instance for PDF conversion (such as http://localhost:5001). When unset, PDF conversion tools return an error. |
| (none) | No | OpenAI-compatible VLM endpoint for formula and figure enrichment during PDF conversion. |
| (none) | No | API key for the VLM endpoint. |
|
| No | Model name to use with the VLM endpoint. |
|
| No | Directory for the SQLite cache database (cache.db) and downloaded PDFs (pdfs/, md/). |
| (none) | No | Contact email for the OpenAlex polite pool (improves rate limits). Also enables Unpaywall lookups as a PDF fallback source. |
| (none) | No | EPO Open Patent Services consumer key. Optional; patent tools are hidden when unset. Register at https://developers.epo.org/user/register. |
| (none) | No | EPO Open Patent Services consumer secret. Optional; patent tools are hidden when unset. |
| (none) | No | Google Books API key. Optional; book tools work unauthenticated at reduced rate limits. |
|
| 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. |
|
| No | Seconds a background-job record (working or finished) is retained for polling before it expires from the store. |
|
| 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-corejobs layer, whether the slow part is a docling conversion, an EPO throttle being waited out, or a graph walk making one request per node. A call that beatsSCHOLAR_MCP_JOBS_SOFT_DEADLINE_Sreturns its result directly; a slower one returns a handle to poll withget_job_result. No tool decides in advance whether to go background, so a cache hit needs no special case.EPO throttling is waited out, not queued. The traffic light is consulted before every request and cached for a minute, so a retry sooner than that would re-read the cache rather than ask again. Each backoff outlasts the cache; an exhausted daily quota is reported immediately instead, since it will not clear today.
Tier 2 standards sync out-of-band. ISO/IEC/IEEE/CC/CEN catalogues come from community Relaton dumps via
scholar-mcp sync-standards, not live at runtime, which avoids paywalled-HTML scraping and keeps tool calls fast.
Quick Start details
stdio transport (Claude Desktop / MCP clients)
uvx --from pvliesdonk-scholar-mcp scholar-mcp serveAPI key optional but recommended: The server works without a Semantic Scholar API key, but unauthenticated requests are limited to ~1 req/s and will hit 429 throttles quickly during multi-step operations like citation graph traversal. Request a free key to get ~10 req/s.
Claude Desktop configuration (claude_desktop_config.json):
{
"mcpServers": {
"scholar": {
"command": "uvx",
"args": ["--from", "pvliesdonk-scholar-mcp", "scholar-mcp", "serve"],
"env": {
"SCHOLAR_MCP_S2_API_KEY": "your-key"
}
}
}
}HTTP transport
uvx --from pvliesdonk-scholar-mcp scholar-mcp serve --transport http --port 8000Claude Code plugin
/plugin marketplace add pvliesdonk/claude-plugins
/plugin install scholar-mcp@pvliesdonkSyncing Tier 2 standards catalogues
Tier 2 bodies (ISO, IEC, IEEE, CC, CEN) are populated from community-curated bulk dumps rather than live-scraped at MCP-server runtime. Run the sync on first install and periodically thereafter:
scholar-mcp sync-standards # all registered bodies
scholar-mcp sync-standards --body ISO # only ISO
scholar-mcp sync-standards --body IEEE # only IEEE
scholar-mcp sync-standards --body CC # only Common Criteria
scholar-mcp sync-standards --body CEN # only CEN/CENELEC
scholar-mcp sync-standards --force # re-sync even if upstream SHA is unchangedSchedule via cron, launchd, or a systemd timer. Weekly is sufficient; standards change slowly. First sync can take several minutes; subsequent runs that find no upstream changes exit within seconds.
MCP Tools
29 tools, organised by scholarly source type.
Papers
Search & retrieval
Tool | Description |
| Full-text search with year, venue, field-of-study, and citation-count filters. Returns up to 100 results with pagination. |
| Fetch full metadata for a single paper by DOI, S2 ID, arXiv ID, ACM ID, or PubMed ID. |
| Fetch author profile with publications, or search by name. |
Citation graph
Tool | Description |
| Forward citations (papers that cite a given paper) with optional filters. |
| Backward references (papers cited by a given paper). |
| BFS traversal from seed papers, returning nodes + edges up to configurable depth. |
| Shortest citation path between two papers. |
Recommendations & citation generation
Tool | Description |
| Paper recommendations from 1 to 5 positive examples and optional negative examples. |
| Generate BibTeX, CSL-JSON, or RIS citations for up to 100 papers, with automatic entry type inference and optional OpenAlex venue enrichment. |
| Augment Semantic Scholar metadata with OpenAlex fields (affiliations, funders, OA status, concepts). |
Patents
Tool | Description |
| Search patents across 100+ patent offices via EPO OPS with CPC / applicant / inventor / jurisdiction / date filters. |
| Fetch bibliographic / claims / description / family / legal / citations sections for a single patent by publication number. Citations include NPL-to-paper resolution via Semantic Scholar. |
| Find patents that cite a given academic paper (best-effort; EPO OPS citation search coverage is incomplete). |
| Download a patent PDF via authenticated EPO OPS and optionally convert to Markdown. |
Patent tools are hidden when
SCHOLAR_MCP_EPO_CONSUMER_KEYandSCHOLAR_MCP_EPO_CONSUMER_SECRETare not set.fetch_patent_pdfis also write-tagged and hidden whenSCHOLAR_MCP_READ_ONLY=true.
Books
Tool | Description |
| Search for books by title, author, ISBN, or keywords via Open Library. Returns up to 50 results. |
| Fetch book metadata by ISBN-10, ISBN-13, Open Library work ID, or edition ID. Optionally download and cache the cover image locally. |
| Fetch a book excerpt and description from Google Books by ISBN. Shows preview availability and link. |
| Recommend books for a subject via Open Library, sorted by popularity. |
Papers with an ISBN in their
externalIdsare automatically enriched withbook_metadata(publisher, edition, cover URL, subjects, and more) from Open Library when fetched viaget_paper,get_citations,get_references, orget_citation_graph. Book records also includeworldcat_url(when ISBN-13 is present),google_books_url, andsnippetfrom Google Books enrichment. Cover images can be downloaded and cached locally viaget_book.
Standards
Tool | Description |
| Normalise a messy citation string such as |
| Search standards by identifier, title, or free text, optionally filtered to one body ( |
| Retrieve a standard by canonical or fuzzy identifier, optionally fetching and converting the full text via docling. |
Tier-1 bodies (NIST, IETF, W3C, ETSI) are supported with full metadata and optional full-text conversion. Tier-2 bodies (ISO, IEC, IEEE, CC, CEN/CENELEC) are populated locally via
scholar-mcp sync-standards.
Cross-source Utility
Tool | Description |
| Resolve up to 100 mixed identifiers (paper DOIs, patent numbers, ISBNs) to full metadata in one call, routing each to the right backend with OpenAlex fallback. |
PDF Conversion (requires docling-serve)
Tool | Description |
| Download PDF for a paper (S2 open-access, then ArXiv/PMC/Unpaywall fallback). |
| Convert a local PDF to Markdown via docling-serve. |
| Full pipeline: fetches the PDF with fallback sources, then converts it to Markdown and returns both. |
| Download a PDF from any URL and optionally convert to Markdown. |
PDF tools are write-tagged and hidden when
SCHOLAR_MCP_READ_ONLY=true(the default).fetch_patent_pdf(above) and theget_standardfull-text mode cover the patent and standards equivalents.
Job Polling
Tool | Description |
| Retrieve the outcome of a background job by ID. |
Tools answer directly when the work is quick, including on a cache hit. A slower call returns
{"status": "working", "job_id": "...", "poll_with": "get_job_result"}; poll with the tool the handle names until the status is terminal.
Docker Compose
services:
scholar-mcp:
image: ghcr.io/pvliesdonk/scholar-mcp:latest
restart: unless-stopped
environment:
SCHOLAR_MCP_S2_API_KEY: "${SCHOLAR_MCP_S2_API_KEY}"
SCHOLAR_MCP_DOCLING_URL: "http://docling-serve:5001"
SCHOLAR_MCP_VLM_API_URL: "${VLM_API_URL:-}"
SCHOLAR_MCP_VLM_API_KEY: "${VLM_API_KEY:-}"
SCHOLAR_MCP_CACHE_DIR: "/data/scholar-mcp"
SCHOLAR_MCP_READ_ONLY: "false"
volumes:
- scholar-mcp-data:/data/scholar-mcp
labels:
- "traefik.enable=true"
- "traefik.http.routers.scholar-mcp.rule=Host(`scholar-mcp.yourdomain.com`)"
docling-serve:
image: ghcr.io/ds4sd/docling-serve:latest
restart: unless-stopped
volumes:
scholar-mcp-data:Cache Management
# Show cache statistics (row counts, database size)
scholar-mcp cache stats
# Clear all cached data (preserves identifier aliases)
scholar-mcp cache clear
# Remove entries older than 30 days
scholar-mcp cache clear --older-than 30
# Override cache directory
scholar-mcp cache stats --cache-dir /path/to/cacheAvailable Tools
22 toolsbatch_resolveARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Field set preset (applies to paper results only). | standard |
| identifiers | Yes | List of S2 IDs, DOIs (prefixed ``DOI:``), plain DOIs, patent numbers (e.g. ``EP1234567A1``, ``US11234567B2``), or ISBNs (prefixed ``ISBN:``, e.g. ``ISBN:9780201633610``). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_paperARead-only
Fetch OpenAlex metadata to supplement Semantic Scholar data.
Resolves the paper's DOI from S2, then queries OpenAlex for the requested enrichment fields. Results are cached for 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | One or more of: affiliations, funders, oa_status, concepts. | |
| identifier | Yes | S2 paper ID or DOI (prefix ``DOI:``). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_papersARead-only
Find the shortest citation path between two papers.
Uses BFS over the citation/reference graph. Leverages cached citation and reference lists to minimise API calls.
| Name | Required | Description | Default |
|---|---|---|---|
| direction | No | Expand via citations, references, or both. | both |
| max_depth | No | Maximum hops to search (default 4). | |
| source_id | Yes | Starting paper S2 ID. | |
| target_id | Yes | Target paper S2 ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_citationsARead-only
Generate formatted citations for one or more papers.
Resolves papers via Semantic Scholar, optionally enriches with OpenAlex metadata, and formats as BibTeX, CSL-JSON, or RIS.
| Name | Required | Description | Default |
|---|---|---|---|
| enrich | No | If True, attempt OpenAlex enrichment for missing venue data when a DOI is available. | |
| paper_ids | Yes | List of paper identifiers (S2 IDs, DOIs, arXiv IDs, etc.). Maximum 100. | |
| citation_format | No | Output format — bibtex, csl-json, or ris. | bibtex |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_authorARead-only
Fetch author profile and publications, or search by name.
If identifier looks like a numeric S2 author ID, fetches the author directly. Otherwise performs a name search and returns up to 5 candidates for disambiguation.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Publications per page (only used for direct ID lookup). | |
| offset | No | Publication page offset (only used for direct ID lookup). | |
| identifier | Yes | S2 author ID (numeric string) or free-text author name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_bookARead-only
Fetch book metadata by ISBN or Open Library ID.
| Name | Required | Description | Default |
|---|---|---|---|
| cover_size | No | Cover size variant: ``"S"`` (small), ``"M"`` (medium), ``"L"`` (large). Defaults to ``"M"``. | M |
| identifier | Yes | ISBN-10, ISBN-13, Open Library work ID (e.g. OL1168083W), or edition ID (e.g. OL1429049M). | |
| download_cover | No | If True, download and cache the cover image locally. Returns ``cover_path`` in the response. In read-only mode, returns ``cover_error`` instead. | |
| include_editions | No | If true, fetch the work and list editions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so 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.
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.
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.
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.
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.
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_excerptARead-only
Get a book excerpt and preview info from Google Books.
Returns the publisher description, text snippet, and a link to the Google Books preview page. Google Books does not expose full chapter text via API -- the excerpt is a publisher-provided summary and/or search snippet.
| Name | Required | Description | Default |
|---|---|---|---|
| isbn | Yes | ISBN-10 or ISBN-13. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations 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.
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.
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.
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.
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.
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_graphARead-only
Traverse the citation graph from one or more seed papers.
Performs BFS up to depth hops. Returns nodes (paper records) and directed edges. Hard-caps at max_nodes to prevent runaway expansion.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Number of hops (1-3). | |
| seed_ids | Yes | 1-10 paper identifiers to start from. | |
| year_end | No | Filter expanded papers to this year and earlier. | |
| direction | No | Expand via citations, references, or both. | citations |
| max_nodes | No | Hard cap on total nodes returned. | |
| year_start | No | Filter expanded papers to this year and later. | |
| min_citations | No | Minimum citation count of expanded papers. | |
| fields_of_study | No | Filter by field. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_citationsARead-only
Fetch papers that cite the given paper (forward citations).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (pagination). | |
| fields | No | Field set preset for returned paper records. | compact |
| offset | No | Pagination offset. | |
| year_end | No | Filter citing papers published up to this year. | |
| identifier | Yes | Paper identifier (DOI, S2 ID, ARXIV:, etc.). | |
| year_start | No | Filter citing papers published from this year. | |
| min_citations | No | Minimum citation count of citing papers. Applied client-side (S2 does not support this filter on the citations endpoint). Papers with unknown citation counts are excluded. Pagination (``offset``/``limit``) is applied to the filtered results. The tool paginates through up to 10 000 upstream results to find qualifying papers. | |
| fields_of_study | No | Filter by field of study. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_paperARead-only
Fetch full metadata for a single paper.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Paper identifier — DOI, S2 paper ID, arXiv ID (prefix with ``ARXIV:``), ACM ID (``ACM:``), or PubMed ID (``PMID:``). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_referencesARead-only
Fetch papers referenced by the given paper (backward references).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results. | |
| fields | No | Field set preset for returned paper records. | compact |
| offset | No | Pagination offset. | |
| identifier | Yes | Paper identifier (DOI, S2 ID, ARXIV:, etc.). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 InfoARead-only
Report wrapper and upstream version info for scholar-mcp. Returns server_name, server_version, core_version (fastmcp-pvl-core), and (when configured) an upstream version block. Useful for verifying a deployment matches the expected build.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safety profile is known. The description adds value by detailing the exact return fields and the conditional 'when configured' upstream version block, which is useful behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary purpose, followed by a practical usage note. Every word earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-parameter read-only info tool, the description fully covers what the tool does, what it returns, and when to use it. The existence of an output schema further reduces the need to describe return format in detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description doesn't need to explain parameter behavior. Baseline 4 is appropriate because there is no parameter ambiguity to resolve.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Report' and identifies the resource ('wrapper and upstream version info'). It clearly lists the returned fields and distinguishes itself from sibling tools (which handle papers, books, etc.).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear use case: 'Useful for verifying a deployment matches the expected build.' This gives context for when to use it, though it doesn't explicitly mention alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_standardARead-only
Retrieve a standard by identifier (canonical or fuzzy).
Resolves fuzzy inputs (e.g. "rfc9000", "nist 800-53") to their
canonical form before fetching. With fetch_full_text=True and
docling configured, downloads and converts the full text.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Canonical or fuzzy standard identifier. | |
| fetch_full_text | No | If True and docling is configured, download and convert the full text PDF/HTML via docling. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_statusARead-only
Report the last sync run for each standards body.
One row per body. started_at / finished_at are Unix
timestamps (seconds). errors is a list of non-fatal error
strings from the most recent run (empty on success).
Returns:
JSON {"runs": [{body, upstream_ref, added, updated, unchanged, withdrawn, errors, started_at, finished_at}, ...]}.
Empty runs list when no sync has been run yet.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_resultARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The task ID returned by a queued operation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_tasksARead-only
List all active background tasks.
Returns:
JSON list of {"task_id": ..., "status": ...} dicts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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_booksARead-only
Recommend books for a subject via Open Library.
Uses the Open Library subject API to find popular books on a topic, sorted by edition count (a proxy for popularity).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return (max 50). | |
| subject | Yes | Subject or topic (e.g. "machine learning", "algorithms", "computer vision"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, 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.
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.
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.
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.
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.
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_papersARead-only
Recommend papers based on positive (and optionally negative) examples.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of recommendations to return. | |
| fields | No | Field set preset for returned records. | standard |
| negative_ids | No | Optional S2 paper IDs to steer away from. | |
| positive_ids | Yes | 1-5 S2 paper IDs to use as positive examples. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_identifierARead-only
Normalise a messy standard citation string to its canonical form.
Tries local regex first (fast, no network). Falls back to querying source APIs when local patterns don't match. Returns all candidates when the input is ambiguous.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | Yes | Raw citation string as it appears in a paper reference. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_booksARead-only
Search for books by title, author, or free text.
Uses Open Library. Prefer title and author over query
— they use dedicated indexes and return far better results.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return (max 50). | |
| query | No | Free-text fallback. Use ``title``/``author`` when known. | |
| title | No | Book title or partial title (recommended). | |
| author | No | Author name (recommended). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_papersBRead-only
Search Semantic Scholar for papers matching a query.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order — relevance, citations, or year. | relevance |
| limit | No | Maximum results to return (max 100). | |
| query | Yes | Keyword or semantic search query. | |
| venue | No | Filter by venue name. | |
| fields | No | Field set preset — compact, standard, or full. | compact |
| offset | No | Pagination offset. | |
| year_end | No | Latest publication year (inclusive). | |
| year_start | No | Earliest publication year (inclusive). | |
| min_citations | No | Minimum citation count. | |
| fields_of_study | No | Filter by fields, e.g. ["Computer Science"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_standardsARead-only
Search technical standards by identifier, title, or free text.
Searches NIST, IETF, W3C, and ETSI. Use body to restrict to one
source body.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Optional filter — "NIST", "IETF", "W3C", or "ETSI". | |
| limit | No | Maximum results (max 50). | |
| query | Yes | Identifier, title, or free text. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
22 tool updates
v1.9.0- First observed
batch_resolve - First observed
enrich_paper - First observed
find_bridge_papers - First observed
generate_citations - First observed
get_author - First observed
get_book - First observed
get_book_excerpt - First observed
get_citation_graph - First observed
get_citations - First observed
get_paper - First observed
get_references - First observed
get_server_info - First observed
get_standard - First observed
get_sync_status - First observed
get_task_result - First observed
list_tasks - First observed
recommend_books - First observed
recommend_papers - First observed
resolve_standard_identifier - First observed
search_books - First observed
search_papers - First observed
search_standards
TDQS
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.
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.
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.
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
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
Read-only MCP over an agentic SLR workspace with per-claim citation verification
Read-only MCP over an agentic SLR workspace with per-claim citation verification
Citable retrieval across papers, books, patents, Wikipedia, and live social sources.
Academic research MCP server for paper search, citation checks, graphs, and deep research.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server enabling AI agents to search and retrieve scientific papers, citations, and author profiles from Crossref, OpenAlex, and Semantic Scholar with no API keys required.53MIT
- AlicenseNot gradedqualityDmaintenanceA MCP server for academic literature retrieval, aggregating multiple data sources like arXiv, Crossref, OpenAlex, PubMed, and Semantic Scholar to provide search, details, citations, trends, and recommendations.4MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for AI-assisted research: paper ingestion, semantic search, citation graph traversal, cross-domain knowledge synthesis, and workflow automation.MIT
- AlicenseAqualityBmaintenanceA unified MCP server for academic paper discovery, citation exploration, and research intelligence workflows over multiple scientific knowledge sources.71MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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