cern-inspire-mcp-server
Provides tools for searching and retrieving INSPIRE-HEP high-energy-physics literature, authors, experiments, and indexed HEPData measurement records. Supports fetching paper records by recid, arXiv ID, DOI, or URL; computing citation summaries and h-indices; exporting BibTeX or LaTeX citations; and decoding INSPIRE query syntax, identifiers, filters, and citation buckets.
Click on "Deploy 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., "@cern-inspire-mcp-serverfind recent papers on dark matter and export BibTeX for the top 5"
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.
Overview
High-energy-physics literature from INSPIRE-HEP, including its index of HEPData measurement records. Search papers, authors, and experiments, read a paper's full record, compute citation summaries and h-indices, export BibTeX or LaTeX entries, and find the HEPData record that holds a paper's numerical tables. Runs as a stdio process or a local Streamable HTTP server.
Tools
Tool | Description |
| Search papers with INSPIRE query syntax or free text, filtered by document type, subject, and year |
| Fetch one paper's full record by recid, arXiv ID, or DOI, with its HEPData availability |
| Export INSPIRE's BibTeX or LaTeX |
| Find physicist profiles by name, BAI, ORCID, INSPIRE ID, or author recid |
| h-index, citation totals, and citation buckets for one author or any literature query |
| Find experiments, collaborations, and facilities, with a query that selects their papers |
| Find HEPData measurement records by process, observable, energy, or collaboration |
| Decode query syntax, identifier forms, filter values, citation buckets, and HEPData DOIs |
Resources
Resource | Description |
| One literature record as the |
The same record is reachable through cern_inspire_get_paper for clients that don't surface resources.
Related MCP server: fisicai
Capability reference
cern_inspire_search_literature tool
INSPIRE query syntax or free text, with
sort(relevance,mostrecent,mostcited),document_typesandsubjects(up to 4 values each, all of which must hold), andyear_from/year_to;size1–100 (default 10), paged bypageOnly the first 10,000 results of a query are reachable:
page × sizebeyond that fails asbeyond_result_window, and a reversed year range asinvalid_year_rangeHits carry
recid, title, first author, date, citation counts, arXiv ID, DOI, publication, and a 300-character abstract snippet;totalCount,nextPage, andappliedFilterscome back with the page, and anoticeflags any query matching over 100,000 records
cern_inspire_get_paper tool
papertakes a recid, arXiv ID, DOI, inspirehep.net literature URL, or HEPDatains<recid>/ hepdata.net record URL;resolvedAsnames the form that matched, and a miss fails aspaper_not_foundmax_authors0–500 (default 25) caps the author list;authorCountalways gives the full numberhepdata.statusisavailable,none, orlookup_failed, withrecordDoi,latestVersion,tableCount, andhepdataUrlwhen available;citingQueryandreferencesQueryfeedcern_inspire_search_literature
cern_inspire_export_citations tool
Any literature query (
recid:451647 or arxiv:1207.7214for named papers);formatisbibtex(default),latex-eu, orlatex-us;size1–50 (default 10)Entries arrive verbatim from INSPIRE, each with its
texkey;truncatedis set when more papers matched thansize
cern_inspire_search_authors tool
A name or one identifier (BAI, ORCID, INSPIRE ID, author recid);
limit1–25 (default 5)matchedAsreports the route:orcid,inspire_id,bai, andrecidmatch exactly, whilenameruns a free-text search whose ranked candidates are returned for the caller to choose fromProfiles carry
recid,bai, ORCID, positions, advisors, arXiv categories, awards, and aliteratureQueryselecting the person's papers
cern_inspire_get_citation_summary tool
Exactly one of
author(BAI, ORCID, INSPIRE ID, or author recid) orquery(any literature query); otherwisemissing_target, and a name passed asauthorfails asauthor_not_identifierdocument_types,subjects, andyear_from/year_tonarrow every figure;exclude_self_citationsrecounts without self-citationsh-index, citation totals and averages, and paper counts in the buckets
0,1–9,10–49,50–99,100–249,250–499,500+, each for all citeable and for published papers
cern_inspire_search_experiments tool
An experiment, collaboration, accelerator, or facility name, an INSPIRE legacy name (
CERN-LHC-CMS), or an experiment recid (digits only);limit1–25 (default 5)Records carry the accelerator, host institutions, collaboration, lifecycle dates,
ongoing(omitted when INSPIRE records neither state), INSPIRE's paper count, and aliteratureQueryforcern_inspire_search_literatureorcern_inspire_get_citation_summary
cern_inspire_search_hepdata tool
Free text or INSPIRE syntax over HEPData submissions (
collaborations.value:LHCb,literature.control_number:<recid>);sortisrelevanceormostrecent;size1–50 (default 10), within the same 10,000-result windowRecords carry
paperRecids, collaborations, keywords (reactions, observables, centre-of-mass energies),recordDoi,latestVersion,tableCount, andhepdataUrl; table values are not returned
cern_inspire_list_reference tool
topic:search_syntax,identifiers,document_types,subjects,citation_buckets, orhepdataStatic
term/meaning/exampleentries with no upstream call
inspire://literature/{recid} resource
The
cern_inspire_get_paperdossier for one recid asapplication/json, listing the first 25 authorsTakes a recid only; use the tool for arXiv IDs, DOIs, or a higher author cap
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
INSPIRE-specific:
One process-wide pacer under INSPIRE's published 15 requests per 5 s: 12 request starts per 5 s, at most 4 in flight, and a shared cooldown after a 429 that starts at 5 s and doubles on each consecutive 429, up to 30 s
One 55 s budget per tool call covers queue wait, up to 2 retries, and every request the call makes; a request that can't start in time fails at once as
pacer_shedwith aretryAfterJSON requests select only the fields a tool returns, under an 8 MiB response ceiling and a strict query-parameter allowlist, since INSPIRE silently ignores parameters it doesn't know; author email addresses are never requested
Forgiving inputs: paper identifiers accept an
arXiv:ordoi:prefix, a version suffix, an arxiv.org, doi.org, or inspirehep.net URL, and HEPData'sins<recid>; author identifiers accept an orcid.org URL;document_typesandsubjectstake an array or a comma-joined string in any case
Agent-friendly output:
Chainable identifiers: hits carry
recid, author profiles and experiments carry a readyliteratureQuery, andcern_inspire_get_paperreturnscitingQueryandreferencesQuery, so the next call needs no query buildingQuery echo and paging state:
totalCount,truncated/shown/cap,nextPage,appliedFilters, andeffectiveQuery, plus anoticewith next-step text on empty, capped, or suspiciously broad resultsDiscriminated fields:
hepdata.status,resolvedAs,matchedAs, andtarget.kindlet callers branch on data, and typed failure reasons (paper_not_found,author_not_found,beyond_result_window,inspire_rate_limited) each carry a recovery hintNo fabrication: a field INSPIRE leaves out stays absent and prints as "Not available" or "not recorded"; upstream strings are escaped in the text output and kept verbatim in
structuredContent
Data and licensing
INSPIRE-HEP metadata is mostly CC0 under INSPIRE's terms of use; credit INSPIRE when you reuse it.
HEPData records are CC0; cite the HEPData record DOI (
recordDoi) when you reuse the data.INSPIRE allows 15 requests per 5 seconds per address, and the server paces its own requests under that limit.
This is an independent project, not affiliated with or endorsed by INSPIRE-HEP, HEPData, or CERN.
Known limitations
No HEPData table values. hepdata.net's bot challenge refuses the server's User-Agent, so tools that read hepdata.net directly are deferred.
cern_inspire_get_paperandcern_inspire_search_hepdatareturn the record DOI and the hepdata.net page where the values are read.Malformed INSPIRE syntax doesn't fail. An unparsed operator widens or empties the match instead; zero hits or a very large
totalCountusually means a syntax slip (cern_inspire_list_referencetopicsearch_syntax).10,000-result window. Only the first 10,000 results of a query are reachable; narrow the query to reach the rest.
One request queue per process, one rate limit per address. Every caller of a server process shares one queue under INSPIRE's 15 requests per 5 s, so on a shared deployment one client's burst can delay or shed everyone else's calls with a retryable rate-limit error. A hosted deployment needs a per-client rate limit in front of
/mcp, and should run one replica per egress IP, since INSPIRE counts requests per address; a per-caller share inside the server waits on the framework (cyanheads/mcp-ts-core#618).
Getting started
Add the following to your MCP client configuration file. No API key is needed.
{
"mcpServers": {
"cern-inspire-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/cern-inspire-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"cern-inspire-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/cern-inspire-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"cern-inspire-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/cern-inspire-mcp-server:latest"]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.4.0 or higher (or Node.js v24+).
Nothing else: INSPIRE-HEP's API is public and keyless.
Installation
Clone the repository:
git clone https://github.com/cyanheads/cern-inspire-mcp-server.gitNavigate into the directory:
cd cern-inspire-mcp-serverInstall dependencies:
bun installConfigure environment (optional):
cp .env.example .env
# edit .env to change the transport, logging, or session settingsConfiguration
The server has no settings of its own: INSPIRE needs no key, and the request pacing is fixed in code. These framework variables cover most deployments.
Variable | Description | Default |
| Transport: |
|
| HTTP server port. |
|
| HTTP session mode: |
|
| Authentication: |
|
| Log level ( |
|
| Directory for log files (Node.js only). |
|
| Storage backend: |
|
| Enable OpenTelemetry. |
|
See .env.example for the full list of framework overrides.
Running the server
Local development
Build and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdioRun checks and tests:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Project structure
Directory | Purpose |
|
|
| Tool definitions ( |
| Resource definitions. The literature record resource. |
| INSPIRE service: request pacer, per-call budget, retries, identifier routing, normalization, and the controlled vocabularies. |
| Bounded fetch: per-attempt timeout and response byte ceiling. |
| Escaping for upstream text in tool output and error messages ( |
| Vitest suites for the tools, resource, services, and shared helpers, with INSPIRE response fixtures. |
| Tool surface, verified INSPIRE behavior, design decisions, and the deferred HEPData-direct tools. |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicEvery INSPIRE request goes through
InspireService, with the call opened bybeginCall(ctx); handlers neverfetchdirectlyRegister new tools and resources in the barrels at
src/mcp-server/tools/definitions/index.tsandsrc/mcp-server/resources/definitions/index.tsWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Multi-engine scholarly research server for search, traversal, full text, and reading lists.
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Federated search of books and papers, BibTeX/RIS citations, open-access retrieval and reading.
ArXiv preprint search, daily category digest, and author-collaborator graph.
Related MCP Servers
- AlicenseAqualityBmaintenanceAn MCP server that integrates InspireHEP high-energy physics literature with LLMs. Search papers, explore citations, retrieve author metrics, and generate formatted references.927 PyPI7AGPL 3.0
- AlicenseAqualityBmaintenanceMCP server providing tools for high-energy physics: literature search (INSPIRE-HEP, arXiv), data access (HEPData), and statistical analysis (pyhf likelihoods) for reinterpreting LHC searches.10Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables searching and retrieving high-energy physics literature, authors, institutions, and conferences from INSPIRE-HEP.165 npmMIT
- AlicenseAqualityCmaintenanceAn MCP server for the INSPIRE-HEP API, enabling literature search, author lookups, DOI/arXiv/ORCID resolution, citation export, and bibliography generation with configurable detail levels.9MIT