paper-search-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_HOST | No | Bind address for streamable-http transport. Default: 127.0.0.1. | 127.0.0.1 |
| MCP_PORT | No | Port for streamable-http transport. Default: 8000. | 8000 |
| MCP_TRANSPORT | No | Transport mode: 'stdio' (default) or 'streamable-http'. | stdio |
| MCP_PUBLIC_URL | No | Externally-visible base URL. When set, enables OAuth 2.1. Leave unset for local stdio use. | |
| MCP_ALLOWED_HOSTS | No | Comma-separated Host headers to accept (DNS-rebinding protection). Required when behind a reverse proxy. | |
| MCP_AUTH_STATE_PATH | No | Where to persist OAuth clients/tokens. Default: oauth-state.json beside server.py. | oauth-state.json |
| SEMANTIC_SCHOLAR_API_KEY | No | A personal Semantic Scholar API key. Without one, S2 calls fall back to the shared unauthenticated rate limit, which is slower and more prone to 429 errors. All other functionality works unaffected. | |
| PAPER_SEARCH_CONTACT_EMAIL | No | Sent as a mailto: contact to get polite pool (faster, more reliable) treatment from CrossRef and OpenAlex. Required by get_open_access_pdf (Unpaywall rejects requests with no email). |
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
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_crossrefA | Search CrossRef for scholarly works (articles, books, proceedings, etc.). Args: query: Free-text search query (e.g. title/author/topic keywords). rows: Max number of results to return (1-100). filter: Optional CrossRef filter string, e.g. "from-pub-date:2020-01-01,type:journal-article". sort: Optional sort field: relevance, published, is-referenced-by-count, etc. |
| get_crossref_workA | Fetch full CrossRef metadata for a single work by its DOI. Args: doi: The DOI of the work, e.g. "10.1037/0003-066x.59.1.29". |
| search_ericA | Search the ERIC database (education research literature) via api.ies.ed.gov. Args: query: Free-text search query, ERIC's Solr-style syntax is supported (e.g. 'title:"reading comprehension" AND author:Smith'). rows: Max number of results to return (1-100). start: Offset for pagination. |
| get_eric_recordA | Fetch full ERIC metadata for a single record by its ERIC ID (e.g. "EJ1234567"). Args: eric_id: The ERIC document identifier, e.g. "EJ1234567" or "ED123456". |
| search_semantic_scholarA | Search Semantic Scholar for papers across all disciplines. Args: query: Free-text search query (title/topic/author keywords). rows: Max number of results to return (1-100). |
| get_semantic_scholar_paperA | Fetch full Semantic Scholar metadata for a single paper. Args: paper_id: A Semantic Scholar paper ID, or a prefixed external ID such as "DOI:10.1037/0003-066x.59.1.29", "ARXIV:2106.15928", "PMID:12345678", or "CorpusID:215416146". |
| search_openalexA | Search OpenAlex for scholarly works across all disciplines. Args: query: Free-text search query (title/topic/author keywords). rows: Max number of results to return (1-100). filter: Optional OpenAlex filter string, e.g. "from_publication_date:2020-01-01,type:article". sort: Optional sort string, e.g. "cited_by_count:desc" or "publication_date:desc". |
| get_openalex_workA | Fetch full OpenAlex metadata for a single work. Args: work_id: An OpenAlex work ID (e.g. "W2741809807"), a bare DOI (e.g. "10.1037/0003-066x.59.1.29"), or a "doi:10.xxxx" string. |
| get_open_access_pdfA | Find a legal open-access PDF for a DOI via Unpaywall. Use this after CrossRef/OpenAlex/ERIC turns up a paper you want to read in full. Returns the best OA copy plus any alternatives, or is_open_access false when no free version is known. Args: doi: The DOI of the work, e.g. "10.1371/journal.pone.0000308". |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 9 tools
Each tool targets a distinct combination of provider and action (search vs. get), with provider names clearly separating them. The only non-pair tool, get_open_access_pdf, has a unique purpose not covered by the others.
Tool names follow a consistent verb_noun pattern: search_<provider> and get_<provider>_<record> for all four services. The single outlier, get_open_access_pdf, still uses the 'get_' verb style, maintaining overall predictability.
Nine tools is well-scoped for a paper-search server, covering four major scholarly databases plus an OA PDF finder. Every tool provides a distinct, necessary capability without redundancy.
The domain is read-only scholarly search/retrieval, and the set covers the full lifecycle: search any provider, fetch detailed records, and obtain accessible full text. No obvious gaps or dead ends for the stated purpose.