crossref-mcp-server
Resolve DOIs, search ~155M scholarly works, and fetch references via the Crossref REST API. STDIO or Streamable HTTP.
Install / Use
claude mcp add cyanheads -- npx -y github:cyanheads/crossref-mcp-serverIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
MarketingSupported Platforms
Skill content
View source on GitHubTools
Seven tools for working with Crossref data — DOI resolution, full-text search across all scholarly works, outgoing reference lists, and journal, funder, and publisher lookup:
| Tool | Description |
|:-----|:------------|
| crossref_get_work | Resolve a DOI to its full Crossref metadata record: title, authors, affiliations, abstract (when deposited), journal, publication date, type, license, full-text links, funder acknowledgements, and outgoing reference count. The author list pages by offset/limit. |
| crossref_search_works | Search the Crossref works index by free text and/or structured filters. Supports sort, field selection, a per-work author cap, and cursor-based deep paging. |
| crossref_get_references | Return the outgoing reference list for a DOI — the works cited by this paper, with deposited citation strings and resolved DOIs where available |
| crossref_search_journals | Find Crossref journal records by ISSN or title query; optionally retrieve a page of the journal's most recent works by publication date. Both lists page by offset. |
| crossref_search_funders | Find funders registered in the Crossref Funder Registry by name, bare registry ID, or funder DOI; optionally retrieve a page of funded works. Both lists page by offset. |
| crossref_get_member | Resolve a Crossref member ID to its publisher record — name, owned DOI prefixes, DOI counts, per-work-type breakdown, and per-category metadata deposit coverage |
| crossref_get_prefix | Resolve a DOI prefix (e.g. 10.1038) to its owning publisher — name and member ID, chaining into crossref_get_member |
crossref_get_work
Resolve a DOI to its canonical Crossref record.
- DOI validated against
10.NNNN/suffixregex before the upstream call - Returns title, authors with affiliations, abstract (when deposited), container/journal, publication date, work type, ISSN, license URLs, full-text link URLs, and funder acknowledgements
- The author list is paged with
offsetandlimit(default 25, max 500).authorCountis the full deposited total; when authors remain, the response carries anextOffsetto pass back asoffset. Ordinary records fit in a single page — large-collaboration papers deposit thousands of authors, enough to fill a client's context from one record. Only the author list is paged; every other field comes back in full on every page. - A funder or an affiliation the publisher asserted through the ROR registry rather than by name carries that identifier as
ror, and noname. The entry still names an organization instead of coming back as an award number with nothing attached to it. - A date component Crossref records as unknown — it deposits
nullin place of the number — is omitted rather than reported, so a record with no registered year comes back with no publication date. - The publication date is the first of
published,published-print,published-online, andissuedthat names one. The three search tools read the same order withoutissued, which is this tool's alone. A source deposited holding only unknown components names nothing and is passed over; one naming a coarser date than the source behind it still answers, since the four are different facts rather than one fact at four precisions. - Outgoing references are reported as a count; the entries themselves come from
crossref_get_references - Incoming citation count (
is-referenced-by-count) is included; citing works are not — Crossref does not expose that data. Use OpenAlex for citation graphs.
crossref_search_works
Search across ~155M Crossref-registered works.
- Free-text
queryplus a structuredfilterobject using Crossref's hyphen-separated key syntax:from-pub-date,until-pub-date,type,funder,issn,member,has-abstract,has-references,has-full-text,directory(useDOAJto restrict to open-access content) - Field-specific query parameters scope matching beyond the generic
query:queryTitle,queryAuthor,queryContainerTitle(journal/book name), andqueryBibliographic(whole-citation match to resolve a known reference to its DOI) — all combine with each other and withquery - Sort by
relevance,is-referenced-by-count,published,deposited, orscore fieldsparameter narrows response payload — useful for large result sets. Names are case-sensitive;DOIis always returned whether or not it is listed, so every result stays resolvable bycrossref_get_work.- Each work returns at most
authorLimitauthors (default 25, max 500), withauthorCountreporting that work's full deposited total. A single page of large-collaboration papers can carry tens of thousands of author entries; pass a cut work's DOI tocrossref_get_workto page its whole author list, or raiseauthorLimitto widen the cap here. - Offset paging up to ~10K results; deep paging requires
cursor=*on the first call, then pass the returnednextCursortoken. Cursor and offset cannot be combined. - A cursor walk ends on the page that omits
nextCursor. Crossref keeps minting a token past the end of a list, so the token is withheld on an empty page rather than relayed — the rule theworks_cursorwalks below follow too. Here that page also carries anoticesaying the walk is complete, becauseworksis this tool's whole payload and an empty page nothing is said about renders as blank text.
crossref_get_references
Fetch the outgoing reference list for a DOI.
- Each reference includes its deposited citation string and, where Crossref has resolved it, a DOI for follow-up lookup
- Citation strings come back with markup removed — inline emphasis (
<i>,<em>,<small>,<span>), scripts (<sub>,<sup>,<inf>), block boundaries (<p>,<br>,<refersplit />), MathML and TeX formula wrappers, and a whole JATS<mixed-citation>deposited into a free-text field. A bracket comes out only when it is a well-formed tag whose element name is on a closed list, so an angle-bracket span that is not one — a cited URL, a Miller index, a DOI fragment, a bracketed phrase — is returned exactly as deposited. A link (<a>,<ext-link>,<uri>) is decided against its own text: its tags come out where the text already carries what thehrefholds, and stay where thehrefaddresses something the text does not name. - Paged with
offsetandlimit(default 100, max 500).referenceCountis the full deposited total; when more remain, the response carries anextOffsetto pass back asoffset. Most works fit in a single page — bibliography records can carry tens of thousands of references. - Coverage varies by publisher — pre-2000 literature and non-participating publishers may have no reference list
- Single-hop only; agents that need N-hop traversal chain calls explicitly
crossref_search_journals
Find journal records by ISSN or title.
include_works: truealso returns a page of the journal's most recent works by publication date- Returns journal title, publisher, ISSN-L, subject areas, and total DOI count
- Title-query results page with
offset;journalsTotalreports the full match count andnextOffsetcarries the input for the following page. The journal works list pages separately withworks_offsetandnextWorksOffset. - The two lists have different ceilings: title search allows
offset + rowsup to 100,000, the works list only 10,000. A page that stops at either ceiling carries anoticesaying so — a missing continuation offset would otherwise read as the end of the list. - The journal works list also pages by cursor, which has no ceiling: pass
works_cursor="*"and chain thenextWorksCursortoken from each response to read the whole list. A cursor walk starts at the newest work and cannot resume from an offset, and the two cannot be combined —works_cursorwith a nonzeroworks_offsetreturnsworks_cursor_offset_conflict. Each token runs about 1500 characters on both result surfaces, a cost per page rather than per record, so a long walk is cheaper at a highrows. include_worksneeds an unambiguous journal. A title query matching more than one — measured by the upstream match count, not by how many fit on the requested page — returnsambiguous_journal, naming the page's candidates and their ISSNs in the message and incandidateson the error data, alongside the full match count. Pass one back asissn, or narrow the query when the journal you want is not among them.- The works list is addressable by ISSN alone, so a matched journal with none registered has no works list to request.
include_worksis then skipped and the response carries anoticesaying so — an absentrecentWorkswould otherwise read as a journal with no works, andtotalDoisis the journal's own DOI count rather than an answer about the lookup. There is no alternative identifier to retry with; usecrossref_search_workswithqueryContainerTitleinstead.
crossref_search_funders
Find funders in the Crossref Funder Registry.
- Accepts a name query, a bare registry ID (
100000001), or a full funder DOI (10.13039/100000001, optionally behind adoi:orhttps://doi.org/prefix) include_works: truealso returns a page of works funded by the matched funder- Returns funder name, registry ID, country, and alternate names
- Name-query results page with
offset;fundersTotalreports the full match count andnextOffsetcarries the input for the following page. The funded works list pages separately withworks_offsetandnextWorksOffset. - The two lists have different ceilings: name search allows
offset + rowsup to 100,000, the works list only 10,000. A page that stops at either ceiling carries anoticesaying so — a missing continuation offs
Truncated for display — read the full file on GitHub.
Related Skills
momen-cursurrules-prompt-file
40.6kCursor rules for building custom frontends with Momen.app as headless BaaS with GraphQL API, actionflows, AI agents, and Stripe integration.
pyspark-etl-best-practices-cursorrules-prompt-file
40.6kCursor rules for PySpark ETL development with code style, joins, window functions, map operations, and Iceberg patterns.
semiotic-react-dataviz-cursorrules-prompt-file
40.6kCursor rules for Semiotic data visualization library with 30+ chart types, MCP server, and AI-assisted chart generation.
Agent-Reach
71.9kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
