Skip to main content
Glama
pvliesdonk

scholar-mcp

by pvliesdonk

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
FASTMCP_LOG_LEVELNoLog level for FastMCP internals and app loggers (DEBUG / INFO / WARNING / ERROR). The -v CLI flag overrides to DEBUG.INFO
SCHOLAR_GITHUB_TOKENNoGitHub personal access token for Relaton sync; lifts unauthenticated GitHub rate limit from 60/hr to 5,000/hr.
SCHOLAR_MCP_ACL_PATHNoPath to a TOML ACL file for per-subject authorization.
SCHOLAR_MCP_BASE_URLNoPublic base URL, required for OIDC (e.g. https://mcp.example.com).
SCHOLAR_MCP_CACHE_DIRNoDirectory for the SQLite cache database and downloaded PDFs./data/scholar-mcp
SCHOLAR_MCP_READ_ONLYNoIf true, write-tagged tools (fetch_paper_pdf, convert_pdf_to_markdown, etc.) are hidden.true
SCHOLAR_MCP_VLM_MODELNoModel name for VLM-enriched conversion.gpt-4o
SCHOLAR_MCP_S2_API_KEYNoSemantic Scholar API key; optional but recommended for higher rate limits.
SCHOLAR_MCP_DOCLING_URLNoBase URL of a running docling-serve instance (e.g. http://localhost:5001).
SCHOLAR_MCP_VLM_API_KEYNoAPI key for the VLM endpoint.
SCHOLAR_MCP_VLM_API_URLNoOpenAI-compatible VLM endpoint for formula/figure-enriched PDF conversion.
SCHOLAR_MCP_BEARER_TOKENNoStatic bearer token for HTTP transport authentication.
SCHOLAR_MCP_CONTACT_EMAILNoIncluded in the OpenAlex User-Agent for polite pool access (faster rate limits); also enables Unpaywall PDF lookups.
SCHOLAR_MCP_OIDC_CLIENT_IDNoOIDC client ID.
FASTMCP_ENABLE_RICH_LOGGINGNoSet to false for plain / structured JSON log output.true
SCHOLAR_MCP_EVENT_STORE_URLNoEvent store backend for HTTP session persistence — memory:// (dev), file:///path (survives restarts).memory://
SCHOLAR_MCP_OIDC_CONFIG_URLNoOIDC discovery endpoint URL.
SCHOLAR_MCP_EPO_CONSUMER_KEYNoEPO OPS consumer key; both key and secret must be set for patent tools to appear.
SCHOLAR_MCP_BEARER_TOKENS_FILENoPath to a TOML file with mapped bearer tokens for multi-subject authentication.
SCHOLAR_MCP_OIDC_CLIENT_SECRETNoOIDC client secret.
SCHOLAR_MCP_EPO_CONSUMER_SECRETNoEPO OPS consumer secret.
SCHOLAR_MCP_GOOGLE_BOOKS_API_KEYNoGoogle Books API key for higher rate limits (1000 req/day without key).
SCHOLAR_MCP_OIDC_JWT_SIGNING_KEYNoJWT signing key; required on Linux/Docker to survive restarts (openssl rand -hex 32).
SCHOLAR_MCP_BEARER_DEFAULT_SUBJECTNoDefault subject string for single-token bearer auth (default: bearer-anon).

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
search_papersA

Search Semantic Scholar for papers matching a query.

Usually completes in a few seconds.

Answers directly in normal use. Should the call run long it continues in the background and returns a job handle to poll with get_job_result.

get_paperA

Fetch full metadata for a single paper.

A cached paper answers immediately. Otherwise the record is fetched and enriched; should that run long it continues in the background and returns a job handle to poll with get_job_result.

get_authorA

Fetch author profile and publications, or search by name.

If identifier looks like a numeric S2 author ID, fetches the author directly. Otherwise performs a name search and returns up to 5 candidates for disambiguation.

Answers directly in normal use. Should the call run long it continues in the background and returns a job handle to poll with get_job_result.

get_citationsA

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

Paging deeply to satisfy min_citations can run long; such a call continues in the background and returns a job handle to poll with get_job_result.

get_referencesA

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

Should the call run long it continues in the background and returns a job handle to poll with get_job_result.

get_citation_graphA

Traverse the citation graph from one or more seed papers.

Performs BFS up to depth hops. Returns nodes (paper records) and directed edges. Hard-caps at max_nodes to prevent runaway expansion.

Traversal makes one rate-limited request per node, so anything past a shallow, narrow graph runs long: expect a job handle to poll with get_job_result rather than the graph itself.

A failed upstream request does not abort the walk. When one happens, stats.partial is true, stats.failed_requests counts them, and a warning key explains what went unfetched. Treat such a graph as incomplete: a missing node or edge is unknown, not absent. This is distinct from stats.truncated, which means max_nodes stopped an otherwise successful walk.

find_bridge_papersA

Find the shortest citation path between two papers.

Uses BFS over the citation/reference graph. Leverages cached citation and reference lists to minimise API calls.

The search walks outward one rate-limited request per node, so it commonly runs long and returns a job handle to poll with get_job_result rather than the path itself.

A failed upstream request does not abort the search. When one happens, partial is true, failed_requests counts them, and a warning key explains what went unfetched. A partial {"found": false} is not evidence that no path exists, and a partial {"found": true} path is not guaranteed to be the shortest one.

recommend_papersA

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

Answers directly in normal use. Should the call run long it continues in the background and returns a job handle to poll with get_job_result.

batch_resolveA

Resolve a list of paper, patent, or book identifiers to full records.

Uses the S2 batch endpoint for paper IDs/DOIs, with OpenAlex fallback. Patent numbers (e.g. EP1234567A1) are auto-detected and resolved via the EPO OPS API when configured. ISBNs (prefixed ISBN:) are resolved via Open Library.

Identifiers fan out across three upstreams, so a large batch runs long and is then handed back as a job handle to poll with get_job_result rather than the records themselves.

enrich_paperA

Fetch OpenAlex metadata to supplement Semantic Scholar data.

Resolves the paper's DOI from S2, then queries OpenAlex for the requested enrichment fields. Results are cached for 30 days.

A cached record answers immediately. Should the lookup run long it continues in the background and returns a job handle to poll with get_job_result.

generate_citationsA

Generate formatted citations for one or more papers.

Resolves papers via Semantic Scholar, optionally enriches with OpenAlex metadata, and formats as BibTeX, CSL-JSON, or RIS.

Enrichment fans out per paper, so a large batch can take a while; such a call answers with a job handle to poll using get_job_result instead of the citations themselves.

search_booksA

Search for books by title, author, or free text.

Uses Open Library. Prefer title and author over query — they use dedicated indexes and return far better results.

Open Library is politeness-rate-limited, so a busy moment may answer with a job handle to poll using get_job_result instead of the results themselves.

get_bookA

Fetch book metadata by ISBN or Open Library ID.

Open Library is politeness-rate-limited, so a busy moment may answer with a job handle to poll using get_job_result instead of the record itself.

get_book_excerptA

Get a book excerpt and preview info from Google Books.

Returns the publisher description, text snippet, and a link to the Google Books preview page. Google Books does not expose full chapter text via API -- the excerpt is a publisher-provided summary and/or search snippet.

An error of not_found means Google Books answered and has no such volume: stop asking about that ISBN. A lookup that never got an answer says so instead, as rate_limited (with retryable) or upstream_error, and is worth retrying -- the book may well exist.

recommend_booksA

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

resolve_standard_identifierA

Normalise a messy standard citation string to its canonical form.

Tries local regex first (fast, no network). Falls back to querying source APIs when local patterns don't match. Returns all candidates when the input is ambiguous.

A cold catalogue makes this slow: the first call after a fresh install or a cleared cache downloads and parses each body's index, which runs well past the soft deadline. Such a call returns a job handle to poll with get_job_result rather than the result itself.

search_standardsA

Search technical standards by identifier, title, or free text.

Searches NIST, IETF, W3C, and ETSI. Use body to restrict to one source body.

A cold catalogue makes this slow: the first call after a fresh install or a cleared cache downloads and parses each body's index, which runs well past the soft deadline. Such a call returns a job handle to poll with get_job_result rather than the result itself.

get_standardA

Retrieve a standard by identifier (canonical or fuzzy).

Resolves fuzzy inputs (e.g. "rfc9000", "nist 800-53") to their canonical form before fetching. With fetch_full_text=True and docling configured, downloads and converts the full text.

With fetch_full_text=True the docling conversion takes minutes, so such a call returns a job handle to poll with get_job_result rather than the record itself. Without it, and on a cache hit, the record comes back directly.

A conversion that fails still returns the record, with the reason in full_text_error; full_text_url is there to fetch by hand. No full_text and no full_text_error means none was on offer, or docling is not configured — neither is worth retrying.

get_sync_statusA

Report the last sync run for each standards body.

One row per body. started_at / finished_at are Unix timestamps (seconds). errors is a list of non-fatal error strings from the most recent run (empty on success).

Returns: {"runs": [{body, upstream_ref, added, updated, unchanged, withdrawn, errors, started_at, finished_at}, ...]}. Empty runs list when no sync has been run yet.

get_job_resultA

Retrieve the outcome of a background job started by a long-running tool on this server. When such a tool answers with status "working" and a job_id, call this tool with that job_id every few seconds until the status is terminal. Job records expire after a while — fetch results soon after completion. Scholar MCP promotes slow work to a background job. PDF download and docling conversion usually take 1-5 minutes, a busy EPO traffic light is waited out, citation formatting enriches each paper in turn, and graph traversal makes one rate-limited request per node. Those calls commonly answer with a job_id rather than a result; a cache hit answers inline, with no job.

get_server_infoA

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.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.1/5.0

Scored across 21 tools

Disambiguation4/5

Most tools have distinct purposes, but get_paper, get_citations, get_references, get_citation_graph, and find_bridge_papers all relate to paper retrieval and could be confused. Descriptions clarify the differences, but an agent might misselect.

Naming Consistency5/5

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

Tool Count3/5

21 tools is on the high side for a scholarly server, though many are necessary for diverse upstreams and background job handling. It's borderline heavy but not unreasonable.

Completeness4/5

Covers paper, author, citation, book, and standards domains with CRUD-like operations and background job management. Minor gaps like no update or delete operations for records, but those aren't typical for read-focused scholarly APIs.

Maintenance

ActivityActive
ResponsivenessResponsive