io.github.cyanheads/crossref-mcp-server
REMOTE · CROSSREF.CASEYJHAND.COM · 2 COMPONENTS
Resolve DOIs, search ~188M scholarly works, and fetch references via the Crossref REST API.
Available components
Last scanned (3 hours ago)
Scores higher than 96% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Education and Research
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security83
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability73
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 4528 tokens (~566/item across 8 items; 7 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 7 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 0
- Tool “crossref_get_member” rewrote its description, which is the text the model reads security
- Tool “crossref_get_prefix” rewrote its description, which is the text the model reads security
- Tool “crossref_get_work” rewrote its description, which is the text the model reads security
- Tool “crossref_search_funders” rewrote its description, which is the text the model reads security
- Tool “crossref_search_journals” rewrote its description, which is the text the model reads security
- Server version: 0.5.0 → 0.5.1 functional
- “crossref_get_member” reworded the description of “member_id” cosmetic
- “crossref_get_references” reworded the description of “limit” cosmetic
- “crossref_get_work” reworded the description of “limit” cosmetic
- “crossref_search_funders” reworded the description of “offset” cosmetic
- “crossref_search_funders” reworded the description of “rows” cosmetic
- “crossref_search_funders” reworded the description of “works_offset” cosmetic
- “crossref_search_journals” reworded the description of “include_works” cosmetic
- “crossref_search_journals” reworded the description of “offset” cosmetic
- “crossref_search_journals” reworded the description of “rows” cosmetic
- “crossref_search_journals” reworded the description of “works_offset” cosmetic
- “crossref_search_works” reworded the description of “fields” cosmetic
- “crossref_search_works” reworded the description of “offset” cosmetic
- “crossref_search_works” reworded the description of “rows” cosmetic
- 28 Oct 26 +2
- Schema quality: 582 → 521 ▲ functional
- First check of Schema quality: 100 functional
- New resource “crossref-guide” functional
- Server version: 0.4.4 → 0.5.0 functional
- 24 Oct 26 +3
- Stability: fail → pass ▲ security
- Server version: 0.4.3 → 0.4.4 functional
- 23 Oct 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “crossref_search_journals” rewrote its description, which is the text the model reads security
- Tool “crossref_search_works” rewrote its description, which is the text the model reads security
- Schema quality: 516 → 582 ▼ functional
- Server version: 0.4.2 → 0.4.3 functional
- “crossref_search_works” reworded the description of “order” cosmetic
- “crossref_search_works” reworded the description of “sort” cosmetic
- “crossref_get_references” reworded the description of “limit” cosmetic
- “crossref_search_journals” reworded the description of “rows” cosmetic
- “crossref_search_funders” reworded the description of “rows” cosmetic
- “crossref_get_work” reworded the description of “limit” cosmetic
- “crossref_search_works” reworded the description of “authorLimit” cosmetic
- “crossref_search_works” reworded the description of “cursor” cosmetic
- “crossref_search_works” reworded the description of “fields” cosmetic
- “crossref_search_works” reworded the description of “rows” cosmetic
- 18 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 72 to 75.
- 16 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 65 to 69.
- 14 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 59 to 62.
- 12 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 49 to 55.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://crossref.caseyjhand.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=caseyjhand.com | CN=WE1,O=Google Trust Services,C=US | 2 Nov 2026 | 31 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | 995a30681ab772540e934241ca1d576c |
| SANs: caseyjhand.com, *.caseyjhand.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of crossref.caseyjhand.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| caseyjhand.com. | present | 2371 | 13 | Verified |
| crossref.caseyjhand.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://crossref.caseyjhand.com/mcp | Verified | 200 | |
| http (plaintext) | http://crossref.caseyjhand.com/mcp | HTTPS enforced | 301 | https://crossref.caseyjhand.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
crossref_get_member Get Member by ID ~197
Resolves a Crossref member ID to its publisher/organization record: primary name, alternate imprint names, owned DOI prefixes, registered DOI counts, a per-work-type breakdown, and per-category metadata deposit coverage. Members are the organizations that register DOIs with Crossref, so this answers "what does this publisher publish, and how completely do they deposit metadata?" The member that holds a DOI now is the memberId crossref_get_work or crossref_search_works returns for it — pass that ID here. crossref_get_prefix returns the member a DOI prefix record names, the prefix's registrant, which for a transferred title is a former publisher rather than the DOI's current one.
| Name | Type | Req | Description |
|---|---|---|---|
| member_id | integer | yes | Crossref member ID — a positive integer, e.g. 297 (Springer) or 340 (PLOS). A DOI's current member is the memberId crossref_get_work returns for it. |
| Name | Type | Req | Description |
|---|---|---|---|
| counts | object | – | Registered DOI counts |
| coverage | array | – | Per-category metadata deposit coverage — each a 0–1 fraction split into current (recent) and backfile (older) DOIs. Signals how completely this publisher deposits references, abstracts, ORCIDs, funde… |
| deposits | boolean | – | Whether the member deposits any metadata with Crossref |
| depositsArticles | boolean | – | Whether the member deposits journal-article metadata |
| error | object | – | Present when the call failed. Absent on success. |
| id | number | – | Crossref member ID |
| location | string | – | Publisher location (city, region, country) |
| names | array | – | Alternate and imprint names registered under this member |
| prefixes | array | – | DOI prefixes owned by this member, e.g. "10.1038" |
| primaryName | string | – | Primary publisher/organization name |
| worksByType | array | – | DOI counts broken down by work type (all DOIs), sorted by count descending |
No examples provided.
crossref_get_prefix Get Prefix Owner ~172
Resolves a DOI prefix — the registrant portion of a DOI, e.g. "10.1038" — to the Crossref member its prefix record names: the publisher name and numeric member ID. That member is the prefix's registrant, so for a title transferred to another publisher it is not the member holding the DOI now — crossref_get_work's memberId names that one. The Crossref prefix record carries only these three facts (no counts, coverage, or flags); the returned memberId chains directly into crossref_get_member for the full publisher record.
| Name | Type | Req | Description |
|---|---|---|---|
| prefix | string | yes | DOI prefix in the format "10.NNNN" — the registrant portion of a DOI with no "/suffix", e.g. "10.1038" or "10.1371". |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| memberId | number | – | Numeric Crossref member ID the prefix record names — pass to crossref_get_member for the full publisher record. For a transferred title it is a former publisher; a DOI's current member is the memberI… |
| ownerName | string | – | Name of the member (publisher) the prefix record names — its registrant |
| prefix | string | – | The DOI prefix that was resolved, e.g. "10.1038" |
No examples provided.
crossref_get_references Get Reference List ~313
Returns the outgoing reference list for a DOI — the works cited by this paper. Each reference includes the deposited citation string and, where Crossref has resolved it, a DOI you can look up with crossref_get_work. Results are paged: referenceCount is the full deposited total, and when more remain the response carries a nextOffset to pass back as offset. Reference list coverage varies by publisher; many older works and non-participating publishers have no indexed references. Incoming citations — the works that cite this paper — are not available through Crossref; use OpenAlex for that.
| Name | Type | Req | Description |
|---|---|---|---|
| doi | string | yes | DOI in the format "10.NNNN/suffix", e.g. "10.1038/nature12373". A resolver-wrapped form — "https://doi.org/10.1038/nature12373", "https://dx.doi.org/…", "doi:10.1038/nature12373" — is accepted and un… |
| limit | integer | – | Maximum number of references to return in one page (1–2500 per call, default 100). A larger value, up to 100000, returns 2500 and says so in notice; nextOffset continues after the references returned… |
| offset | integer | – | Zero-based index of the first reference to return. Pass the nextOffset value from the previous response to continue through a long reference list. |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The limit that was applied to this page. |
| doi | string | – | DOI of the citing work |
| error | object | – | Present when the call failed. Absent on success. |
| nextOffset | number | – | Offset to pass in the next call to retrieve the following page. Absent when this page reaches the end of the reference list. |
| notice | string | – | Coverage guidance when no references are indexed, a range explanation when the requested offset is past the end of the list, or which references this page covers and the offset that reaches the next… |
| offset | number | – | Zero-based index of the first returned reference within the deposited list |
| referenceCount | number | – | Total number of references in the deposited list |
| references | array | – | Page of the outgoing reference list |
| shown | number | – | Number of references returned in this page. |
| truncated | boolean | – | True when references remain beyond this page. Absent when the page is the last. |
No examples provided.
crossref_get_work Get Work by DOI ~572
Resolves a DOI to its full Crossref metadata record: title, authors, editors, affiliations, abstract (when deposited), journal or container with the volume, issue, pages, and article number that locate the work in it, ISSNs and ISBNs, publication date, type, license, full-text links, and funder acknowledgements. The author list is paged: authorCount is the full deposited total, offset and limit select the page (25 authors by default), and when authors remain the response carries a nextOffset to pass back as offset — large-collaboration papers deposit thousands. Post-publication updates are relayed as Crossref records them: updatedBy names each correction, retraction, expression of concern, or new version issued against this work, with its notice DOI and whether the publisher or Retraction Watch recorded it, and updateTo names the works this record is itself a notice for. An absent updatedBy does not mean the work was never updated — coverage depends on those deposits. relations lists related identifiers, such as a preprint and its published version, grouped by relation type; only the Crossref-registered DOIs among them resolve through crossref_get_work. memberId is the Crossref member that holds the DOI now — pass it to crossref_get_member for the publisher record and its deposit coverage; the prefix of the DOI names the member that registered the prefix, which for a transferred title is a former publisher. Outgoing references are reported as a count in referencesCount; the reference entries themselves come from crossref_get_references. The isReferencedByCount field reports the total incoming citation count from Crossref; the citing works themselves are not available through Crossref — use OpenAlex for citation graphs.
| Name | Type | Req | Description |
|---|---|---|---|
| doi | string | yes | DOI in the format "10.NNNN/suffix", e.g. "10.1038/nature12373". A resolver-wrapped form — "https://doi.org/10.1038/nature12373", "https://dx.doi.org/…", "doi:10.1038/nature12373" — is accepted and un… |
| limit | integer | – | Maximum number of authors to return in one page (1–10000 per call, default 25). A larger value, up to 100000, returns 10000 and says so in notice; nextOffset continues after the authors returned. Ord… |
| offset | integer | – | Zero-based index of the first author to return. Pass the nextOffset value from the previous response to continue through a long author list. Only the author list is paged; every other field of the re… |
| Name | Type | Req | Description |
|---|---|---|---|
| abstract | string | – | Abstract when deposited by the publisher. Many records lack abstracts. Publishers deposit it as JATS XML, so this is the text of that deposit with markup removed and character references decoded; num… |
| articleNumber | string | – | Article number, deposited by journals that number articles instead of paging them |
| authorCount | number | – | Total number of authors in the deposited list, before offset and limit were applied. Omitted alongside authors when the record deposits no author field. |
| authors | array | – | Page of the author and contributor list, bounded by limit. Omitted when the record deposits no author field at all. |
| cap | number | – | The limit that was applied to this page of authors. |
| containerTitle | string | – | Journal, book, or proceedings name containing this work — the first entry of containerTitles |
| containerTitles | array | – | Every container title the record deposits, in deposited order. A book chapter or proceedings paper often deposits two: the series, then the book or volume. Omitted when the record deposits none. |
| doi | string | – | Canonical DOI |
| editors | array | – | Editors of the work, or of the book or proceedings containing it, in the entry shape authors use. Returned whole — never paged by offset and limit, and never counted in authorCount. Omitted when the… |
| error | object | – | Present when the call failed. Absent on success. |
| funders | array | – | Funding acknowledgements |
| isReferencedByCount | number | – | Incoming citation count from Crossref — the count of works citing this DOI |
| isbn | array | – | ISBN(s) as deposited — for a book chapter, those of the containing book. Omitted when the record deposits none. |
| issn | array | – | ISSN(s) of the containing journal |
| issue | string | – | Issue of the container the work appears in |
| language | string | – | Language code (ISO 639) |
| licenses | array | – | License terms |
| links | array | – | Registered full-text links |
| memberId | number | – | Crossref member ID of the publisher that holds this DOI now — pass to crossref_get_member for its record. The DOI's prefix names the member that registered the prefix, which for a transferred title i… |
| nextOffset | number | – | Offset to pass in the next call to retrieve the following page of authors. Absent when this page reaches the end of the author list. |
| notice | string | – | When updatedBy is present, the update types Crossref records for this work with the source of each, and where the notice is read. Then, when limit was above its per-call cap, the value requested and… |
| offset | number | – | Zero-based index of the first returned author within the deposited list. Omitted alongside authors when the record deposits no author field. |
| page | string | – | Page range as deposited, e.g. "357-362" |
| published | object | – | Publication date — the first of published, published-print, published-online, and issued that names one. A component Crossref records as unknown is omitted, and so is every component below it. |
| publisher | string | – | Publisher name |
| referencesCount | number | – | Number of outgoing references (works cited by this paper) |
| relations | array | – | Related identifiers — preprints and published versions, other versions, reviews, supplements, parts — grouped by relation type, identifier type, and asserting party, groups in Crossref's order and id… |
| shown | number | – | Number of authors returned in this page. |
| subject | array | – | Subject classification terms |
| subtitle | string | – | Subtitle when present |
| title | string | – | Work title |
| truncated | boolean | – | True when authors remain beyond this page. Absent when the page is the last. |
| type | string | – | Work type (e.g. journal-article, book-chapter, posted-content) |
| updateTo | array | – | Works this record is an update notice for, in the entry shape updatedBy uses and in deposited order. Omitted when the record is not registered as a notice. |
| updatedBy | array | – | Update notices Crossref records against this work — corrections, errata, retractions, expressions of concern, withdrawals, new versions — in deposited order. Entries are never merged: the same notice… |
| url | string | – | DOI resolution URL |
| volume | string | – | Volume of the container the work appears in |
No examples provided.
crossref_search_funders Search Funders ~889
Finds funders registered in the Crossref Funder Registry by name or funder DOI. Provide funder_doi for an exact single-funder lookup — the full DOI ("10.13039/100000001"), the bare registry ID ("100000001"), or either behind a doi: or https://doi.org/ prefix — or query for name-based search. Name-query results page with offset — the nextOffset enrichment carries the value for the following page, up to offset + rows = 100000. Set include_works to true to also return a page of the most recent works funded by the matched funder; that list pages two ways, in two orders. works_offset is the simple one: newest published first, capped ten times lower at works_offset + rows = 10000. works_cursor has no ceiling and reaches the whole funded-works list, newest registered first — ordered by the date each DOI was registered with Crossref, since Crossref does not walk a publication-date sort by cursor: pass works_cursor="*" on the first call, then chain the nextWorksCursor token from each response. The two cannot be combined, and a cursor walk always starts at the most recently registered work — it cannot resume from an offset. This list also counts works funded by the funder's registry descendants, which a crossref_search_works filter on {"funder": "10.13039/<id>"} does not; a funder_doi lookup returns those descendants' registry IDs as descendants, and the funder's own ID OR'd with each of them in the funder filter ({"funder": "<id>,funder:<descendant>,…"}) counts the same scope with date, type, or other filters. Returns funder name, registry ID, country, and alternate names, plus the work count of the ID alone on a funder_doi lookup. The Funder Registry supersedes entries, and a deprecated one answers to the same names as its successor while carrying only a fraction of its works: such a record carries replacedBy with the superseding registry ID and the response carries a notice naming it. The replacement is never followed automatically — re-run with funder_doi set to that ID…
| Name | Type | Req | Description |
|---|---|---|---|
| funder_doi | – | – | Funder DOI for exact lookup — the full DOI "10.13039/100000001" (NSF) or the bare registry ID "100000001". Supersedes query when provided. |
| include_works | boolean | – | When true, also return a page of works funded by the matched funder. Requires an unambiguous funder — pass funder_doi when a name query matches more than one. |
| offset | integer | – | Zero-based offset into the name-query funder list. Pass the nextOffset value from the previous response to continue. Capped at offset + rows = 100000: a page that would pass it returns the funders th… |
| query | string | – | Funder name search query, e.g. "National Science Foundation" or "Wellcome Trust" |
| rows | integer | – | Maximum funders to return for name queries, or works when include_works is true (1–1000, default 10). |
| works_cursor | string | – | Cursor token for deep paging of the funded-works list when include_works is true. Pass "*" to start the walk at the most recently registered work, then pass the nextWorksCursor value from each respon… |
| works_offset | integer | – | Zero-based offset into the funded-works list when include_works is true. Pass the nextWorksOffset value from the previous response to continue. Capped at works_offset + rows = 10000: a page that woul… |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| fundedWorks | array | – | Page of works funded by the matched funder, newest first — by publication date on an offset page, by Crossref registration date on a works_cursor page. Only present when include_works is true. |
| fundedWorksTotal | number | – | Total count of funded works for the matched funder, including works funded by its registry descendants, when include_works is true |
| funderCount | number | – | Number of funder records returned in this page |
| funders | array | – | Matching funder records |
| fundersTotal | number | – | Total funder records matching the query in Crossref |
| nextOffset | number | – | Value to pass as offset on the next call for the following page of funders. Absent when this page ends the matches or reaches the 100000-record offset ceiling. |
| nextWorksCursor | string | – | Value to pass as works_cursor on the next call for the following page of funded works. Present only on a page requested with works_cursor, and absent once the walk reaches the end of the works list. |
| nextWorksOffset | number | – | Value to pass as works_offset on the next call for the following page of funded works. Absent when this page ends the works list, reaches the 10000-record offset ceiling, or was requested with works_… |
| notice | string | – | Guidance on a page that needs a caveat: a query nothing matched, an offset or works_offset past the end of a list that did match, a page whose offset + rows would pass one of the route offset ceiling… |
No examples provided.
crossref_search_journals Search Journals ~783
Finds Crossref journal records by ISSN or title query. Provide issn for an exact single-journal lookup, or query for title-based search returning up to rows results. Title-query results page with offset — the nextOffset enrichment carries the value for the following page, up to offset + rows = 100000. Set include_works to true to also return a page of the matched journal's most recent works — the works deposited under any of its ISSNs, whichever one you passed; that list pages two ways, in two orders. works_offset is the simple one: newest published first, capped ten times lower at works_offset + rows = 10000. works_cursor has no ceiling and reaches the whole works list, newest registered first — ordered by the date each DOI was registered with Crossref, since Crossref does not walk a publication-date sort by cursor: pass works_cursor="*" on the first call, then chain the nextWorksCursor token from each response. The two cannot be combined, and a cursor walk always starts at the most recently registered work — it cannot resume from an offset. Returns journal metadata: title, publisher, ISSNs with their print or electronic form, subject areas, DOI counts (total, current, backfile), and per-category metadata deposit coverage — how completely the journal deposits abstracts, references, ORCIDs, funders, licenses, and similar metadata. An issn lookup also returns DOI counts by issued year.
| Name | Type | Req | Description |
|---|---|---|---|
| include_works | boolean | – | When true, also return a page of the journal's most recent works — newest published first on an offset page, newest registered first on a works_cursor walk. Requires an unambiguous journal — pass iss… |
| issn | – | – | ISSN for exact single-journal lookup (print or electronic, with or without hyphen). Example: "1234-5678". |
| offset | integer | – | Zero-based offset into the title-query journal list. Pass the nextOffset value from the previous response to continue. Capped at offset + rows = 100000: a page that would pass it returns the journals… |
| query | string | – | Journal title search query, e.g. "Nature" or "Journal of Machine Learning Research" |
| rows | integer | – | Maximum number of journals to return for title queries, or works when include_works is true (1–500 per call, default 10). A larger value, up to 1000, returns 500 and says so in notice; nextOffset and… |
| works_cursor | string | – | Cursor token for deep paging of the journal works list when include_works is true. Pass "*" to start the walk at the most recently registered work, then pass the nextWorksCursor value from each respo… |
| works_offset | integer | – | Zero-based offset into the journal works list when include_works is true. Pass the nextWorksOffset value from the previous response to continue. Capped at works_offset + rows = 10000: a page that wou… |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| journalCount | number | – | Number of journal records returned in this page |
| journals | array | – | Matching journal records |
| journalsTotal | number | – | Total journal records matching the query in Crossref |
| nextOffset | number | – | Value to pass as offset on the next call for the following page of journals. Absent when this page ends the matches or reaches the 100000-record offset ceiling. |
| nextWorksCursor | string | – | Value to pass as works_cursor on the next call for the following page of works. Present only on a page requested with works_cursor, and absent once the walk reaches the end of the works list. |
| nextWorksOffset | number | – | Value to pass as works_offset on the next call for the following page of works. Absent when this page ends the works list, reaches the 10000-record offset ceiling, or was requested with works_cursor. |
| notice | string | – | Guidance on a page that needs a caveat: a query nothing matched, an offset or works_offset past the end of a list that did match, a page whose offset + rows would pass one of the route offset ceiling… |
| recentWorks | array | – | Page of works from the matched journal, newest first — by publication date on an offset page, by Crossref registration date on a works_cursor page. Requires include_works, and absent even then when t… |
| worksTotal | number | – | Total works deposited under any of the journal's ISSNs, when include_works is true |
No examples provided.
crossref_search_works Search Works ~1,204
Searches the Crossref works index (~188M records) by free text and/or structured filters. The generic query matches loosely across all fields; scope precisely with the field-specific parameters queryTitle, queryAuthor, and queryContainerTitle, or resolve a known citation to its DOI with queryBibliographic — all combine with each other and with query. Use the filter parameter for structured filtering (object with hyphen-separated Crossref keys). Sort options: relevance, score, is-referenced-by-count, published, deposited, indexed, created. Each work returns at most authorLimit authors (25 by default) with authorCount reporting the full deposited total, since a single page of large-collaboration papers can carry tens of thousands of author entries; crossref_get_work pages the whole author list for any DOI whose list was cut. Post-publication updates ride each work as Crossref records them: updatedBy names each correction, retraction, expression of concern, or new version issued against it, and updateTo the works it is itself a notice for — an absent updatedBy does not mean the work was never updated. Offset-based paging is capped at ~10K results; use cursor="*" to start cursor-based deep paging, then pass the nextCursor value from each response to continue. A walk with a query term and no sort runs by relevance, one with filters only in Crossref registration order. The walk ends on the page where nextCursor is absent — that page also carries a notice saying the list is exhausted. Cursor and offset cannot be combined.
| Name | Type | Req | Description |
|---|---|---|---|
| authorLimit | integer | – | Maximum number of authors to return per work (1–500 per call, default 25; a larger value, up to 100000, applies 500 and says so in notice). Ordinary records fit under the default; large-collaboration… |
| cursor | string | – | Cursor token for deep paging. Pass "*" to start cursor-based paging (required past ~10K results), then pass the nextCursor value from each response until a response omits it, which means the list is… |
| fields | array | – | Fields to return (reduces payload). Names are case-sensitive, and each fills one output field: DOI → doi, title → title, type → type, author → authors and authorCount, published / published-print / p… |
| filter | object | – | Structured filter object using Crossref hyphen-separated keys. All values must be strings. Boolean flag keys (has-abstract, has-references, has-full-text) require string values "true" or "false". Exa… |
| offset | integer | – | Zero-based result offset for offset-based paging. Cannot be used with cursor. Capped at ~10K: offset + rows cannot pass it, so a page that would returns the rows that fit and says so in notice, and a… |
| order | – | – | Sort direction (asc or desc). Applies only alongside sort; without one it has no effect. |
| query | string | – | Free-text search query, e.g. "CRISPR gene editing" or "climate change adaptation" |
| queryAuthor | string | – | Match against author names only, e.g. "Charles R. Harris". |
| queryBibliographic | string | – | Whole-citation match to resolve a known reference to its DOI. Combine title, author, year, and container into one string, e.g. "Watson Crick molecular structure of nucleic acids Nature 1953". |
| queryContainerTitle | string | – | Match against the container title (journal or book name) only, e.g. "Nature". |
| queryTitle | string | – | Match against work titles only, e.g. "Array programming with NumPy". |
| rows | integer | – | Number of results to return per page (1–250 per call, default 20). A larger value, up to 1000, returns 250 and says so in notice — on an offset page the notice also names the offset that continues af… |
| sort | – | – | Sort field. Omitted, an offset page with a query term is ranked by relevance, and so is a cursor walk with one (sent as score). The publication-date sorts (published, published-print, published-onlin… |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The per-work author cap applied to this page. Absent when no list was cut. |
| error | object | – | Present when the call failed. Absent on success. |
| nextCursor | string | – | Cursor token to pass as cursor on the next call to continue a cursor walk. Present only on a page requested with cursor, and absent once the walk reaches the end of the list. |
| notice | string | – | Guidance on an empty page, naming which of its three causes applies: a query nothing matched, an offset past the end of a list that did match, or a cursor walk that has reached the end of the list. O… |
| returned | number | – | Number of records returned in this response |
| totalResults | number | – | Total matching records in Crossref |
| truncated | boolean | – | True when at least one work on this page had its author list cut by authorLimit. Absent when every work on the page carries its full deposited author list. |
| works | array | – | Matching works. Empty when nothing matched the query, when an offset runs past the end of the results, or on the page that ends a cursor walk — the notice enrichment says which. |
No examples provided.
How do I install the io.github.cyanheads/crossref-mcp-server server?
io.github.cyanheads/crossref-mcp-server is a hosted endpoint at https://crossref.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · crossref.caseyjhand.com
claude mcp add --transport http cyanheads-crossref-mcp-server 'https://crossref.caseyjhand.com/mcp'
What is the io.github.cyanheads/crossref-mcp-server server?
io.github.cyanheads/crossref-mcp-server is listed in the public MCP registry as io.github.cyanheads/crossref-mcp-server. Resolve DOIs, search ~188M scholarly works, and fetch references via the Crossref REST API. This page covers its hosted endpoint (https://crossref.caseyjhand.com/mcp).
Is the io.github.cyanheads/crossref-mcp-server server safe to use?
io.github.cyanheads/crossref-mcp-server scores 88 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.cyanheads/crossref-mcp-server server expose?
io.github.cyanheads/crossref-mcp-server exposes 7 tools: crossref_get_work, crossref_get_references, crossref_search_works, crossref_search_journals, crossref_search_funders, and 2 more. Their descriptions and schemas cost roughly 4,130 tokens of context every time the server is loaded.
Does the io.github.cyanheads/crossref-mcp-server server require authentication?
No. We connected to io.github.cyanheads/crossref-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the io.github.cyanheads/crossref-mcp-server server still maintained?
io.github.cyanheads/crossref-mcp-server is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.