Skip to main content
Glama

crossref-mcp-server

Server Details

Resolve DOIs, search ~155M scholarly works, and fetch references via the Crossref REST API.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.9% over 22 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/crossref-mcp-server
GitHub Stars
3
Server Listing
crossref-mcp-server

TDQS

A4.6/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct Crossref entity or operation: member resolution, prefix resolution, work lookup, reference retrieval, funder search, journal search, and work search. The two search tools (funders/journals) are clearly separated by entity type, and get_work vs get_references are explicitly differentiated.

Naming Consistency4/5

All tools follow a consistent crossref_<verb>_<entity> pattern (get_member, get_prefix, get_references, get_work, search_funders, search_journals, search_works). Minor deviation: search_* uses entity plural while get_* uses singular, but the pattern is otherwise uniform and predictable.

Tool Count5/5

Seven tools is well-scoped for a Crossref API server: two resolution tools, two work-related tools, and three search tools cover the main Crossref use cases without redundancy. Each tool earns its place.

Completeness4/5

The surface covers the core Crossref workflows: prefix→member→works, DOI→metadata→references, and searching works/funders/journals. Minor gaps: no direct citation lookup (acknowledged as unavailable via Crossref) and no tool for listing all members, but these are reasonable omissions given the API's scope.

Available Tools

7 tools
crossref_get_memberGet Member by IDA
Read-onlyIdempotent
Inspect

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?" Resolve a DOI prefix (e.g. "10.1038") to its member ID with crossref_get_prefix, then pass that ID here.

ParametersJSON Schema
NameRequiredDescriptionDefault
member_idYesCrossref member ID — a positive integer, e.g. 297 (Springer) or 340 (PLOS). Resolve a DOI prefix to a member ID first with crossref_get_prefix.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoCrossref member ID
errorNoPresent when the call failed. Absent on success.
namesNoAlternate and imprint names registered under this member
countsNoRegistered DOI counts
coverageNoPer-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, funders, licenses, and similar metadata.
depositsNoWhether the member deposits any metadata with Crossref
locationNoPublisher location (city, region, country)
prefixesNoDOI prefixes owned by this member, e.g. "10.1038"
primaryNameNoPrimary publisher/organization name
worksByTypeNoDOI counts broken down by work type (all DOIs), sorted by count descending
depositsArticlesNoWhether the member deposits journal-article metadata

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the operation read-only and idempotent, so the bar for additional disclosure is lower. The description adds useful domain context—members are organizations that register DOIs—and spells out the scope of the returned record, including deposit metadata coverage, without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences each carry weight: the first defines the action and return contents, the second supplies domain context, and the third provides the chaining workflow. No filler or redundancy is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only tool with an output schema and clear annotations, this description is fully sufficient. It tells the agent what the result means, what questions it answers, and how to obtain the required input via a sibling tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the member_id parameter already includes type, positive integer constraint, examples, and a pointer to crossref_get_prefix. The description reinforces the concept of a member ID but does not add significant parameter-level meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Resolves a Crossref member ID to its publisher/organization record', and enumerates meaningful output categories. It is clearly distinguished from siblings like crossref_get_prefix and the search tools through the member-ID focus.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states the prerequisite workflow: 'Resolve a DOI prefix... with crossref_get_prefix, then pass that ID here.' This gives direct guidance on when to use this tool versus its sibling resolver, leaving no ambiguity about sequencing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

crossref_get_prefixGet Prefix OwnerA
Read-onlyIdempotent
Inspect

Resolves a DOI prefix — the registrant portion of a DOI, e.g. "10.1038" — to its owning Crossref member: the publisher name and numeric member ID. Answers "who publishes DOIs starting with 10.1038?" 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
prefixYesDOI prefix in the format "10.NNNN" — the registrant portion of a DOI with no "/suffix", e.g. "10.1038" or "10.1371".

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
prefixNoThe DOI prefix that was resolved, e.g. "10.1038"
memberIdNoNumeric Crossref member ID that owns this prefix — pass to crossref_get_member for the full publisher record
ownerNameNoName of the member (publisher) that owns this prefix

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only and idempotent. The description goes further by disclosing that the prefix record carries only these three facts with no counts, coverage, or flags, and that the returned memberId chains into another tool. This usefully manages agent expectations about output richness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the first defines the action and output, the second captures the user question, and the third scopes expectations and links to the sibling tool. No redundant phrases or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a single well-documented parameter, a clear output schema, and annotations covering safety. The description completes the picture by explaining what the result means, what it does not contain, and how to chain into crossref_get_member. Nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents the `prefix` parameter, including the format and the no-suffix requirement. The tool description reinforces this with examples but adds no new semantic information beyond the schema, matching the baseline for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('resolves') and resource ('DOI prefix' to 'owning Crossref member'), and names the exact output: publisher name and numeric member ID. It also differentiates itself from the sibling crossref_get_member by explaining this tool only resolves the prefix, not the full member record.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description frames the use case clearly with the question 'who publishes DOIs starting with 10.1038?' and explicitly points to crossref_get_member as the next step for a full publisher record. It does not state explicit negative conditions, but the context makes the appropriate invocation scenario obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

crossref_get_referencesGet Reference ListA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
doiYesDOI 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 unwrapped.
limitNoMaximum number of references to return in one page (1–500, default 100). Most works fit in a single page; bibliography records can carry tens of thousands.
offsetNoZero-based index of the first reference to return. Pass the nextOffset value from the previous response to continue through a long reference list.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit that was applied to this page.
doiNoDOI of the citing work
errorNoPresent when the call failed. Absent on success.
shownNoNumber of references returned in this page.
noticeNoCoverage guidance when no references are indexed, or a range explanation when the requested offset is past the end of the list. Absent on a normal page.
offsetNoZero-based index of the first returned reference within the deposited list
truncatedNoTrue when references remain beyond this page. Absent when the page is the last.
nextOffsetNoOffset to pass in the next call to retrieve the following page. Absent when this page reaches the end of the reference list.
referencesNoPage of the outgoing reference list
referenceCountNoTotal number of references in the deposited list

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, and the description does not contradict them. It adds valuable behavior beyond annotations: pagination semantics with referenceCount and nextOffset, coverage caveats for older/non-participating publishers, and the explicit statement that incoming citations are not available through Crossref.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, all information-dense and free of filler. The primary purpose is front-loaded, followed by output characteristics, pagination, caveats, and alternatives in a logical order. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, output schema presence, and readOnly annotations, the description is complete. It covers purpose, pagination behavior, limitations, and alternative tools without needing to restate schema fields or return formats.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema carries most parameter meaning. The description adds value by tying offset to the response's nextOffset value, explaining referenceCount as the full deposited total, and noting that most works fit in one page while long bibliographies require paging.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Returns the outgoing reference list for a DOI — the works cited by this paper.' It clearly distinguishes the tool from crossref_get_work by saying resolved DOIs can be looked up with that sibling, and it rules out incoming citations explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells the agent when to use this tool (for works cited by a paper), identifies crossref_get_work as the follow-up for resolved DOIs, and directs incoming-citation use cases to OpenAlex. It also warns about coverage variability by publisher, preventing false expectations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

crossref_get_workGet Work by DOIA
Read-onlyIdempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
doiYesDOI 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 unwrapped.
limitNoMaximum number of authors to return in one page (1–500, default 25). Ordinary records fit in a single page; large-collaboration papers in particle physics and genomics deposit thousands.
offsetNoZero-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 record is returned in full on every page.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit that was applied to this page of authors.
doiNoCanonical DOI
urlNoDOI resolution URL
isbnNoISBN(s) as deposited — for a book chapter, those of the containing book. Omitted when the record deposits none.
issnNoISSN(s) of the containing journal
pageNoPage range as deposited, e.g. "357-362"
typeNoWork type (e.g. journal-article, book-chapter, posted-content)
errorNoPresent when the call failed. Absent on success.
issueNoIssue of the container the work appears in
linksNoRegistered full-text links
shownNoNumber of authors returned in this page.
titleNoWork title
noticeNoWhen updatedBy is present, the update types Crossref records for this work with the source of each, and where the notice is read. Then which authors this page covers and the offset that reaches the next ones, or an explanation when the requested offset is past the end of the author list. Both share this one string when both apply. Absent when the page holds the whole author list and no update is recorded.
offsetNoZero-based index of the first returned author within the deposited list. Omitted alongside authors when the record deposits no author field.
volumeNoVolume of the container the work appears in
authorsNoPage of the author and contributor list, bounded by limit. Omitted when the record deposits no author field at all.
editorsNoEditors 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 record deposits none.
fundersNoFunding acknowledgements
subjectNoSubject classification terms
abstractNoAbstract 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; a link keeps its tag only where its href holds an address the text it wraps does not already carry, and each formula appears once — MathML as the TeX annotation it carries, otherwise written out linearly (x_i, A^{−1}, √(m), (a+b)/c), and TeX deposited beside MathML in whichever notation comes first.
languageNoLanguage code (ISO 639)
licensesNoLicense terms
subtitleNoSubtitle when present
updateToNoWorks 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.
publishedNoPublication 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.
publisherNoPublisher name
relationsNoRelated 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 ids in deposited order. Returned whole. Omitted when the record deposits none.
truncatedNoTrue when authors remain beyond this page. Absent when the page is the last.
updatedByNoUpdate 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 DOI can appear once per source, typed differently by each. Omitted when none is recorded, which does not mean the work was never updated: coverage depends on publisher and Retraction Watch deposits.
nextOffsetNoOffset to pass in the next call to retrieve the following page of authors. Absent when this page reaches the end of the author list.
authorCountNoTotal number of authors in the deposited list, before offset and limit were applied. Omitted alongside authors when the record deposits no author field.
articleNumberNoArticle number, deposited by journals that number articles instead of paging them
containerTitleNoJournal, book, or proceedings name containing this work
referencesCountNoNumber of outgoing references (works cited by this paper)
isReferencedByCountNoIncoming citation count from Crossref — the count of works citing this DOI

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds substantial behavior beyond that: author-list paging with nextOffset mechanics, the caveat that absent updatedBy does not imply no updates due to deposit coverage, the fact that only Crossref-registered DOIs in relations resolve through this tool, and the distinction between referencesCount (a count) and the actual entries available via a sibling tool. This is exactly the kind of behavioral disclosure agents need and it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but information-dense: every sentence earns its place by covering paging, post-publication updates, relations resolution, reference counts, and citation counts, and the core purpose is front-loaded in the first sentence. It loses a point for being a single dense unbroken block that requires careful reading, but there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the tool's complexity, the description covers the tricky aspects an agent needs: pagination over multi-thousand-author papers, update/retraction semantics with naming and source, partial resolvability of relations, and the boundary between Crossref's citation counts and OpenAlex's citation graph. An output schema exists, so return-value structure is already handled; the only omissions, such as error behavior for unresolvable DOIs, are minor and not required for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — doi format/unwrapping, limit bounds and default, and offset semantics with nextOffset are already fully documented in the input schema. The description reinforces the author-paging model and adds the detail that only the author list is paged while all other fields return in full, but this largely echoes the schema. At baseline 3 with no coverage gap to compensate, the schema carries the load and the description adds only marginal extra meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: 'Resolves a DOI to its full Crossref metadata record.' It enumerates the concrete contents (title, authors, container, volume/issue/pages, ISSNs/ISBNs, license, full-text links, funder acknowledgements), and distinguishes itself from siblings by pointing out that reference entries come from crossref_get_references and citing works are not available through Crossref. An agent can tell exactly what this tool does relative to crossref_get_member, crossref_get_prefix, and crossref_get_references.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit routing guidance: 'the reference entries themselves come from crossref_get_references' tells the agent which sibling to call for references, and 'the citing works themselves are not available through Crossref — use OpenAlex for citation graphs' names an external alternative with the condition that selects it. It also warns about updatedBy coverage gaps so the agent knows not to conclude an absent field means no update occurred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

crossref_search_fundersSearch FundersA
Read-only
Inspect

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/"} does not. Returns funder name, registry ID, country, and alternate names. 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 to get the current entry.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNoMaximum funders to return for name queries, or works when include_works is true (1–100, default 10)
queryNoFunder name search query, e.g. "National Science Foundation" or "Wellcome Trust"
offsetNoZero-based offset into the name-query funder list. Pass the nextOffset value from the previous response to continue. Ignored when funder_doi is set, which resolves exactly one record.
funder_doiNoFunder DOI for exact lookup — the full DOI "10.13039/100000001" (NSF) or the bare registry ID "100000001". Supersedes query when provided.
works_cursorNoCursor 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 response. A walk runs by the date each DOI was registered with Crossref, newest first, not by publication date — Crossref does not walk a publication-date sort by cursor. Has no offset ceiling and cannot be combined with works_offset.
works_offsetNoZero-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; use works_cursor to read the whole list. Cannot be combined with works_cursor.
include_worksNoWhen 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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance 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 that stops at one of the route offset ceilings with records still unretrieved, a returned funder that the Funder Registry has deprecated in favor of another entry, or a query or funder_doi supplied blank with nothing else to search by, so the page lists every funder unfiltered. Absent otherwise. A page needing more than one caveat carries them all in this one string.
fundersNoMatching funder records
nextOffsetNoValue to pass as offset on the next call for the following page of funders. Absent when this page ends the matches or the next page would breach the 100000-record offset ceiling.
fundedWorksNoPage 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.
funderCountNoNumber of funder records returned in this page
fundersTotalNoTotal funder records matching the query in Crossref
nextWorksCursorNoValue 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.
nextWorksOffsetNoValue to pass as works_offset on the next call for the following page of funded works. Absent when this page ends the works list, the next page would breach the 10000-record offset ceiling, or the page was requested with works_cursor.
fundedWorksTotalNoTotal count of funded works for the matched funder, when include_works is true

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint, but the description goes far beyond that. It discloses intricate paging behaviors: the offset ceiling (offset + rows = 100000), the two works paging methods with their different ceilings (works_offset capped at 10000, works_cursor with no ceiling), the ordering rules (newest published first vs newest registered first), and why cursor uses registration date. It also explains deprecation handling (replacedBy, notice, no automatic following) and the descendant counting nuance. This is exemplary transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence carries essential information. It is logically organized: exact lookup, name paging, works inclusion with two paging methods, descendant behavior, deprecation handling. No filler or repetition. The critical constraints are front-loaded (exact vs query, paging ceilings) before deeper edge cases. It earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters and two distinct paging schemes, the description covers every operational aspect: how to start a cursor walk ('*'), how to chain tokens, what happens when combining methods (cannot), what the offset ceilings are, how deprecation affects results, and what fields are returned. It even anticipates the confusion about publication vs registration date and the descendant inclusion difference. There is no missing piece an agent would need to call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While schema descriptions cover all 7 parameters, the tool description adds substantial semantic value beyond them. For funder_doi it explains the accepted forms (full DOI, bare ID, with prefixes) and that it supersedes query. For works_cursor and works_offset it clarifies the ceiling difference, the ordering logic, and the mutual exclusivity. It also explains the include_works prerequisite. This goes well beyond the baseline for 100% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise statement: 'Finds funders registered in the Crossref Funder Registry by name or funder DOI.' This names the exact resource (Funder Registry) and the two lookup modes, immediately distinguishing it from sibling tools like crossref_search_works or crossref_search_journals. It also lists the returned fields (name, registry ID, country, alternate names), so an agent knows exactly what to expect.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use each mode: 'Provide funder_doi for an exact single-funder lookup' vs 'or query for name-based search.' It also explains when include_works is needed and the requirement for an unambiguous funder. Crucially, it contrasts with crossref_search_works: '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.' This explicitly routes agents to the right tool for descendant works.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

crossref_search_journalsSearch JournalsA
Read-only
Inspect

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; 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, ISSN-L, subject areas, and total DOI count.

ParametersJSON Schema
NameRequiredDescriptionDefault
issnNoISSN for exact single-journal lookup (print or electronic, with or without hyphen). Example: "1234-5678".
rowsNoMaximum number of journals to return for title queries, or works when include_works is true (1–100, default 10)
queryNoJournal title search query, e.g. "Nature" or "Journal of Machine Learning Research"
offsetNoZero-based offset into the title-query journal list. Pass the nextOffset value from the previous response to continue. Ignored when issn is set, which resolves exactly one record.
works_cursorNoCursor 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 response. A walk runs by the date each DOI was registered with Crossref, newest first, not by publication date — Crossref does not walk a publication-date sort by cursor. Has no offset ceiling and cannot be combined with works_offset.
works_offsetNoZero-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; use works_cursor to read the whole list. Cannot be combined with works_cursor.
include_worksNoWhen 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 issn when a title query matches more than one. A journal with no ISSN registered has no addressable works list; the works lookup is then skipped and the notice enrichment says so.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance 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 that stops at one of the route offset ceilings with records still unretrieved, an include_works request that was skipped because the matched journal has no registered ISSN to address its works list by, or a query or issn supplied blank with nothing else to search by, so the page lists every journal unfiltered. Absent otherwise. A page needing more than one caveat carries them all in this one string.
journalsNoMatching journal records
nextOffsetNoValue to pass as offset on the next call for the following page of journals. Absent when this page ends the matches or the next page would breach the 100000-record offset ceiling.
worksTotalNoTotal works count for the journal, when include_works is true
recentWorksNoPage 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 the matched journal has no registered ISSN — the works list is addressable by ISSN alone, and the notice enrichment says so.
journalCountNoNumber of journal records returned in this page
journalsTotalNoTotal journal records matching the query in Crossref
nextWorksCursorNoValue 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.
nextWorksOffsetNoValue to pass as works_offset on the next call for the following page of works. Absent when this page ends the works list, the next page would breach the 10000-record offset ceiling, or the page was requested with works_cursor.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint. The description adds substantial behavioral context: offset paging caps at offset + rows = 100000, works_offset is capped at 10000, works_cursor has no ceiling, cursor walks order by DOI registration date rather than publication date, initial cursor must be '*', and include_works skips the works lookup when no ISSN is registered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but the complexity of seven parameters and multiple pagination modes justifies it. Every sentence carries operational value, and the structure front-loads the core purpose, then explains exact-lookup versus title search, then pagination modes, then edge cases. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only open API tool with seven optional parameters and rich pagination behavior, the description covers all decision points: how to start, how to page, which limit applies, which ordering to expect, what cannot be combined, and what happens with journals lacking ISSN. The output schema already covers return fields, so nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it explains the exact single-journal behavior of issn, the nextOffset enrichment, the offset ceiling, the cursor initialization and chaining, the ordering difference between offset and cursor pagination, and the constraint that cursor and offset cannot be combined.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Finds Crossref journal records by ISSN or title query.' It clearly distinguishes this tool from sibling tools like crossref_search_works and crossref_get_work by focusing on journal records rather than works, funders, or members.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit selection rules: use issn for exact single-journal lookup, use query for title-based search, and use include_works to also retrieve works. It also states when-not conditions, such as 'The two cannot be combined,' and explains when to choose works_offset versus works_cursor based on depth and ordering needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

crossref_search_worksSearch WorksA
Read-only
Inspect

Searches the Crossref works index (~155M 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. 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. 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. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNoNumber of results to return per page (1–100, default 20)
sortNoSort field. The publication-date sorts (published, published-print, published-online) work with offset paging only — Crossref refuses them alongside cursor; every other sort works with either.
orderNoSort direction (asc or desc)
queryNoFree-text search query, e.g. "CRISPR gene editing" or "climate change adaptation"
cursorNoCursor 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 exhausted. Cannot be combined with offset, or with a publication-date sort (published, published-print, published-online), which Crossref does not walk by cursor.
fieldsNoFields 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 / published-online → published, container-title → containerTitle, publisher → publisher, is-referenced-by-count → isReferencedByCount, score → score, abstract → abstract, volume → volume, issue → issue, page → page, article-number → articleNumber, ISSN → issn. A selected field absent from a work means the record does not deposit it. DOI is always returned whether or not it is listed here, so every result stays resolvable by crossref_get_work, which also returns the fields this list does not cover (license, funder, references, and the rest of the record).
filterNoStructured 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". Example: {"type":"journal-article","has-abstract":"true","from-pub-date":"2023-01-01"}
offsetNoZero-based result offset for offset-based paging. Cannot be used with cursor. Capped at ~10K; use cursor for deeper paging.
queryTitleNoMatch against work titles only, e.g. "Array programming with NumPy".
authorLimitNoMaximum number of authors to return per work (1–500, default 25). Ordinary records fit under the default; large-collaboration papers deposit thousands, and a page of them is large enough to exhaust a client context. Each work reports its full deposited total as authorCount — call crossref_get_work with that work doi to page the authors this cap left out.
queryAuthorNoMatch against author names only, e.g. "Charles R. Harris".
queryBibliographicNoWhole-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".
queryContainerTitleNoMatch against the container title (journal or book name) only, e.g. "Nature".

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe per-work author cap applied to this page. Absent when no list was cut.
errorNoPresent when the call failed. Absent on success.
worksNoMatching 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.
noticeNoGuidance 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. On a page carrying records, present when authorLimit cut at least one work list, naming how many and the route to the rest, or when every query term and filter value was supplied blank, so the page lists the whole index unfiltered. A page needing more than one caveat carries them all in this one string.
returnedNoNumber of records returned in this response
truncatedNoTrue 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.
nextCursorNoCursor 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.
totalResultsNoTotal matching records in Crossref

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/openWorldHint annotations, it discloses the ~10K offset cap, cursor-based paging with nextCursor and the exhaustion signal, the authorLimit/authorCount behavior with huge-collaboration papers, and sort restrictions (publication-date sorts incompatible with cursor). This materially affects how an agent pages and interprets results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but structured, leading with the core action, then search strategy, then paging/cursor constraints, then author cap and relationship to crossref_get_work. The fields parameter mapping is deferred to the schema, so the description avoids duplicating the full parameter list while still earning every sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter search tool with no required parameters, this description covers intent, filtering, sorting, paging, cursor behavior, payload reduction, and how to go deeper with crossref_get_work. The output schema exists, so not describing return-value structure is appropriate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema itself is rich, so the baseline is 3. The description adds strategic meaning beyond the schema: which query parameter to prefer depending on need, how cursor walking terminates, and what authorLimit truncation means for the output. It does not radically extend the schema's already detailed parameter descriptions, so 4 rather than 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Searches the Crossref works index (~155M records) by free text and/or structured filters.' It clearly separates this from the sibling get_* tools by explaining that search results are resolvable through crossref_get_work, and from search_journals/funders through the 'works index' scoping.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage strategy: loose generic query vs. field-specific queryTitle/queryAuthor/queryContainerTitle/queryBibliographic, and notes they combine. It also names crossref_get_work as the alternative for full records and for paging truncated author lists, and states cursor/offset cannot be combined.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updates
    • Changedcrossref_get_work11 fields changed
      • changedOutput schema / properties / abstract / description
        Previous value: -"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; a link keeps its tag only where its href holds an address the text it wraps does not already carry, and a formula the deposit encodes more than once — TeX beside MathML — appears once, in the first notation deposited."New value: +"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; a link keeps its tag only where its href holds an address the text it wraps does not already carry, and each formula appears once — MathML as the TeX annotation it carries, otherwise written out linearly (x_i, A^{−1}, √(m), (a+b)/c), and TeX deposited beside MathML in whichever notation comes first."
      • addedOutput schema / properties / articleNumber
        Added value: +{
        +  "description": "Article number, deposited by journals that number articles instead of paging them",
        +  "type": "string"
        +}
      • addedOutput schema / properties / editors
        Added value: +{
        +  "description": "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 record deposits none.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "Author or contributor",
        +    "properties": {
        +      "affiliation": {
        +        "description": "Institutional affiliations",
        +        "items": {
        +          "additionalProperties": false,
        +          "description": "Affiliation",
        +          "properties": {
        +            "name": {
        +              "description": "Affiliation name as deposited. Absent when the publisher asserted the organization by identifier alone, where ror carries it instead.",
        +              "type": "string"
        +            },
        +            "ror": {
        +              "description": "ROR identifier for the affiliated organization, when the deposit carries one. It is the whole identity of an affiliation deposited without a name.",
        +              "type": "string"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "family": {
        +        "description": "Family (last) name",
        +        "type": "string"
        +      },
        +      "given": {
        +        "description": "Given (first) name",
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "Name when no given/family split is available",
        +        "type": "string"
        +      },
        +      "orcid": {
        +        "description": "ORCID identifier URI",
        +        "type": "string"
        +      },
        +      "sequence": {
        +        "description": "Author order role (first, additional)",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / isbn
        Added value: +{
        +  "description": "ISBN(s) as deposited — for a book chapter, those of the containing book. Omitted when the record deposits none.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / issue
        Added value: +{
        +  "description": "Issue of the container the work appears in",
        +  "type": "string"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Which authors this page covers and the offset that reaches the next ones, or an explanation when the requested offset is past the end of the author list. Absent when the page holds the whole list."New value: +"When updatedBy is present, the update types Crossref records for this work with the source of each, and where the notice is read. Then which authors this page covers and the offset that reaches the next ones, or an explanation when the requested offset is past the end of the author list. Both share this one string when both apply. Absent when the page holds the whole author list and no update is recorded."
      • addedOutput schema / properties / page
        Added value: +{
        +  "description": "Page range as deposited, e.g. \"357-362\"",
        +  "type": "string"
        +}
      • addedOutput schema / properties / relations
        Added value: +{
        +  "description": "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 ids in deposited order. Returned whole. Omitted when the record deposits none.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "Related identifiers sharing one relation type, identifier type, and asserting party",
        +    "properties": {
        +      "assertedBy": {
        +        "description": "Whose deposit asserts the relation: subject (this work's depositor) or object (the related record's depositor, whose assertion Crossref shows here inverted)",
        +        "type": "string"
        +      },
        +      "idType": {
        +        "description": "Identifier scheme of ids: doi, uri, pmid, arxiv, accession, issn, isbn, or other",
        +        "type": "string"
        +      },
        +      "ids": {
        +        "description": "Related identifiers in deposited order. A DOI resolves through crossref_get_work only when Crossref registered it; one registered with another agency, such as DataCite, returns doi_not_found there.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "type": {
        +        "description": "Relation type as deposited, read from this work toward ids: is-preprint-of, has-preprint, is-version-of, has-version, has-review, is-supplemented-by, references, has-part, and others",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "idType",
        +      "assertedBy",
        +      "ids"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / updateTo
        Added value: +{
        +  "description": "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.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "Update link",
        +    "properties": {
        +      "doi": {
        +        "description": "DOI on the other side of the link: the notice, in updatedBy; the updated work, in updateTo. It is this work's own DOI when the update was made to this record in place.",
        +        "type": "string"
        +      },
        +      "recordId": {
        +        "description": "Retraction Watch record ID. Present only on retraction-watch entries.",
        +        "type": "string"
        +      },
        +      "source": {
        +        "description": "Who recorded the link: publisher, or retraction-watch for an entry Crossref carries from the Retraction Watch database",
        +        "type": "string"
        +      },
        +      "type": {
        +        "description": "Crossref update type as deposited: correction, erratum, corrigendum, addendum, retraction, withdrawal, expression_of_concern, new_version, new_edition, or another code",
        +        "type": "string"
        +      },
        +      "updated": {
        +        "additionalProperties": false,
        +        "description": "Date the update was issued",
        +        "properties": {
        +          "day": {
        +            "description": "Day of month",
        +            "type": "number"
        +          },
        +          "month": {
        +            "description": "Month (1–12)",
        +            "type": "number"
        +          },
        +          "year": {
        +            "description": "Year",
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "doi",
        +      "type",
        +      "source"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / updatedBy
        Added value: +{
        +  "description": "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 DOI can appear once per source, typed differently by each. Omitted when none is recorded, which does not mean the work was never updated: coverage depends on publisher and Retraction Watch deposits.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "Update link",
        +    "properties": {
        +      "doi": {
        +        "description": "DOI on the other side of the link: the notice, in updatedBy; the updated work, in updateTo. It is this work's own DOI when the update was made to this record in place.",
        +        "type": "string"
        +      },
        +      "recordId": {
        +        "description": "Retraction Watch record ID. Present only on retraction-watch entries.",
        +        "type": "string"
        +      },
        +      "source": {
        +        "description": "Who recorded the link: publisher, or retraction-watch for an entry Crossref carries from the Retraction Watch database",
        +        "type": "string"
        +      },
        +      "type": {
        +        "description": "Crossref update type as deposited: correction, erratum, corrigendum, addendum, retraction, withdrawal, expression_of_concern, new_version, new_edition, or another code",
        +        "type": "string"
        +      },
        +      "updated": {
        +        "additionalProperties": false,
        +        "description": "Date the update was issued",
        +        "properties": {
        +          "day": {
        +            "description": "Day of month",
        +            "type": "number"
        +          },
        +          "month": {
        +            "description": "Month (1–12)",
        +            "type": "number"
        +          },
        +          "year": {
        +            "description": "Year",
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "doi",
        +      "type",
        +      "source"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / volume
        Added value: +{
        +  "description": "Volume of the container the work appears in",
        +  "type": "string"
        +}
    • Changedcrossref_search_works1 field changed
      • changedOutput schema / properties / works / items / properties / abstract / description
        Previous value: -"Abstract when present in the indexed record — the text of the publisher’s JATS deposit, with markup removed and character references decoded; a link keeps its tag only where its href holds an address the text it wraps does not already carry, and a formula the deposit encodes more than once appears once, in the first notation deposited"New value: +"Abstract when present in the indexed record — the text of the publisher’s JATS deposit, with markup removed and character references decoded; a link keeps its tag only where its href holds an address the text it wraps does not already carry, and each formula appears once — MathML as the TeX annotation it carries, otherwise written out linearly (x_i, A^{−1}, √(m), (a+b)/c), and TeX deposited beside MathML in whichever notation comes first"
  2. 3 tool updates
    • Changedcrossref_search_funders9 fields changed
      • addedInput schema / properties / funder_doi / anyOf
        Added value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Funder registry ID or funder DOI, e.g. \"100000001\"",
        +    "pattern": "^(?:(?:https?:\\/\\/(?:dx\\.)?doi\\.org\\/|doi:)?10\\.13039\\/)?\\d+$",
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / funder_doi / pattern
        Removed value: -"^(?:(?:https?:\\/\\/(?:dx\\.)?doi\\.org\\/|doi:)?10\\.13039\\/)?\\d+$"
      • removedInput schema / properties / funder_doi / type
        Removed value: -"string"
      • changedInput schema / properties / rows / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / works_cursor / description
        Previous value: -"Cursor token for deep paging of the funded-works list when include_works is true. Pass \"*\" to start the walk at the newest work, then pass the nextWorksCursor value from each response. Has no offset ceiling and cannot be combined with works_offset. Each token runs about 1500 characters and is returned on both result surfaces, a fixed cost per page — raise rows to spread it across more works on a long walk."New value: +"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 response. A walk runs by the date each DOI was registered with Crossref, newest first, not by publication date — Crossref does not walk a publication-date sort by cursor. Has no offset ceiling and cannot be combined with works_offset."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: Crossref answered HTTP 429 and the limit did not clear inside the retry budget. `upstream_unavailable`: Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON. `malformed_response`: Crossref returned HTTP 200 with a body that is not valid JSON. `request_timeout`: Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504. `funder_not_found`: Funder DOI lookup returned 404 — funder is not in the Crossref Funder Registry. `ambiguous_funder`: include_works is true but the name query matched more than one funder, making the target ambiguous. `offset_too_large`: offset + rows exceeds the 100000-record ceiling Crossref allows on funder name search. `works_offset_too_large`: works_offset + rows exceeds the 10000-record ceiling Crossref allows on a funded-works list. `works_cursor_offset_conflict`: include_works is true and works_cursor was supplied alongside a works_offset above zero. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: Crossref answered HTTP 429 and the limit did not clear inside the retry budget. `upstream_unavailable`: Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON. `malformed_response`: Crossref returned HTTP 200 with a body that is not valid JSON. `request_timeout`: Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504. `invalid_cursor`: Crossref did not recognize the cursor token (HTTP 404 cursor-invalid). `invalid_parameter`: Crossref rejected a parameter value (a filter value of the wrong type or form), or answered HTTP 400 with a body that did not parse. `funder_not_found`: Funder DOI lookup returned 404 — funder is not in the Crossref Funder Registry. `ambiguous_funder`: include_works is true but the name query matched more than one funder, making the target ambiguous. `offset_too_large`: offset + rows exceeds the 100000-record ceiling Crossref allows on funder name search. `works_offset_too_large`: works_offset + rows exceeds the 10000-record ceiling Crossref allows on a funded-works list. `works_cursor_offset_conflict`: include_works is true and works_cursor was supplied alongside a works_offset above zero. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "rate_limited",
        -  "upstream_unavailable",
        -  "malformed_response",
        -  "request_timeout",
        -  "funder_not_found",
        -  "ambiguous_funder",
        -  "offset_too_large",
        -  "works_offset_too_large",
        -  "works_cursor_offset_conflict"
        -]New value: +[
        +  "rate_limited",
        +  "upstream_unavailable",
        +  "malformed_response",
        +  "request_timeout",
        +  "invalid_cursor",
        +  "invalid_parameter",
        +  "funder_not_found",
        +  "ambiguous_funder",
        +  "offset_too_large",
        +  "works_offset_too_large",
        +  "works_cursor_offset_conflict"
        +]
      • changedOutput schema / properties / fundedWorks / description
        Previous value: -"Page of works funded by the matched funder, ordered by publication date (newest first). Only present when include_works is true."New value: +"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."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance on a page that needs a caveat: a query nothing matched, an offset past the end of a list that did match, a page that stops at one of the route offset ceilings with records still unretrieved, or a returned funder that the Funder Registry has deprecated in favor of another entry. Absent otherwise. A page needing more than one caveat carries them all in this one string."New value: +"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 that stops at one of the route offset ceilings with records still unretrieved, a returned funder that the Funder Registry has deprecated in favor of another entry, or a query or funder_doi supplied blank with nothing else to search by, so the page lists every funder unfiltered. Absent otherwise. A page needing more than one caveat carries them all in this one string."
    • Changedcrossref_search_journals10 fields changed
      • changedInput schema / properties / include_works / description
        Previous value: -"When true, also return a page of the journal's most recent works by publication date. Requires an unambiguous journal — pass issn when a title query matches more than one. A journal with no ISSN registered has no addressable works list; the works lookup is then skipped and the notice enrichment says so."New value: +"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 issn when a title query matches more than one. A journal with no ISSN registered has no addressable works list; the works lookup is then skipped and the notice enrichment says so."
      • addedInput schema / properties / issn / anyOf
        Added value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "ISSN, e.g. \"1234-5678\"",
        +    "pattern": "^\\d{4}-?\\d{3}[\\dX]$",
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / issn / pattern
        Removed value: -"^\\d{4}-?\\d{3}[\\dX]$"
      • removedInput schema / properties / issn / type
        Removed value: -"string"
      • changedInput schema / properties / rows / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / works_cursor / description
        Previous value: -"Cursor token for deep paging of the journal works list when include_works is true. Pass \"*\" to start the walk at the newest work, then pass the nextWorksCursor value from each response. Has no offset ceiling and cannot be combined with works_offset. Each token runs about 1500 characters and is returned on both result surfaces, a fixed cost per page — raise rows to spread it across more works on a long walk."New value: +"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 response. A walk runs by the date each DOI was registered with Crossref, newest first, not by publication date — Crossref does not walk a publication-date sort by cursor. Has no offset ceiling and cannot be combined with works_offset."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: Crossref answered HTTP 429 and the limit did not clear inside the retry budget. `upstream_unavailable`: Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON. `malformed_response`: Crossref returned HTTP 200 with a body that is not valid JSON. `request_timeout`: Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504. `issn_not_found`: ISSN lookup returned 404 — ISSN is not registered in Crossref. `ambiguous_journal`: include_works is true but the title query matched more than one journal, making the target ambiguous. `offset_too_large`: offset + rows exceeds the 100000-record ceiling Crossref allows on journal title search. `works_offset_too_large`: works_offset + rows exceeds the 10000-record ceiling Crossref allows on a journal works list. `works_cursor_offset_conflict`: include_works is true and works_cursor was supplied alongside a works_offset above zero. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: Crossref answered HTTP 429 and the limit did not clear inside the retry budget. `upstream_unavailable`: Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON. `malformed_response`: Crossref returned HTTP 200 with a body that is not valid JSON. `request_timeout`: Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504. `invalid_cursor`: Crossref did not recognize the cursor token (HTTP 404 cursor-invalid). `invalid_parameter`: Crossref rejected a parameter value (a filter value of the wrong type or form), or answered HTTP 400 with a body that did not parse. `issn_not_found`: ISSN lookup returned 404 — ISSN is not registered in Crossref. `ambiguous_journal`: include_works is true but the title query matched more than one journal, making the target ambiguous. `offset_too_large`: offset + rows exceeds the 100000-record ceiling Crossref allows on journal title search. `works_offset_too_large`: works_offset + rows exceeds the 10000-record ceiling Crossref allows on a journal works list. `works_cursor_offset_conflict`: include_works is true and works_cursor was supplied alongside a works_offset above zero. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "rate_limited",
        -  "upstream_unavailable",
        -  "malformed_response",
        -  "request_timeout",
        -  "issn_not_found",
        -  "ambiguous_journal",
        -  "offset_too_large",
        -  "works_offset_too_large",
        -  "works_cursor_offset_conflict"
        -]New value: +[
        +  "rate_limited",
        +  "upstream_unavailable",
        +  "malformed_response",
        +  "request_timeout",
        +  "invalid_cursor",
        +  "invalid_parameter",
        +  "issn_not_found",
        +  "ambiguous_journal",
        +  "offset_too_large",
        +  "works_offset_too_large",
        +  "works_cursor_offset_conflict"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance on a page that needs a caveat: a query nothing matched, an offset past the end of a list that did match, a page that stops at one of the route offset ceilings with records still unretrieved, or an include_works request that was skipped because the matched journal has no registered ISSN to address its works list by. Absent otherwise."New value: +"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 that stops at one of the route offset ceilings with records still unretrieved, an include_works request that was skipped because the matched journal has no registered ISSN to address its works list by, or a query or issn supplied blank with nothing else to search by, so the page lists every journal unfiltered. Absent otherwise. A page needing more than one caveat carries them all in this one string."
      • changedOutput schema / properties / recentWorks / description
        Previous value: -"Page of works from the matched journal, ordered by publication date (newest first). Requires include_works, and absent even then when the matched journal has no registered ISSN — the works list is addressable by ISSN alone, and the notice enrichment says so."New value: +"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 the matched journal has no registered ISSN — the works list is addressable by ISSN alone, and the notice enrichment says so."
    • Changedcrossref_search_works23 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"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 exhausted. Cannot be combined with offset."New value: +"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 exhausted. Cannot be combined with offset, or with a publication-date sort (published, published-print, published-online), which Crossref does not walk by cursor."
      • changedInput schema / properties / fields / description
        Previous value: -"Fields to return (reduces payload). Names are case-sensitive. Useful set: DOI, title, author, published, type, is-referenced-by-count, abstract, container-title, publisher, score. DOI is always returned whether or not it is listed here, so every result stays resolvable by crossref_get_work."New value: +"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 / published-online → published, container-title → containerTitle, publisher → publisher, is-referenced-by-count → isReferencedByCount, score → score, abstract → abstract, volume → volume, issue → issue, page → page, article-number → articleNumber, ISSN → issn. A selected field absent from a work means the record does not deposit it. DOI is always returned whether or not it is listed here, so every result stays resolvable by crossref_get_work, which also returns the fields this list does not cover (license, funder, references, and the rest of the record)."
      • addedInput schema / properties / fields / items / description
        Added value: +"Crossref select name"
      • addedInput schema / properties / fields / items / enum
        Added value: +[
        +  "DOI",
        +  "title",
        +  "type",
        +  "author",
        +  "published",
        +  "published-print",
        +  "published-online",
        +  "container-title",
        +  "publisher",
        +  "is-referenced-by-count",
        +  "score",
        +  "abstract",
        +  "volume",
        +  "issue",
        +  "page",
        +  "article-number",
        +  "ISSN"
        +]
      • changedInput schema / properties / filter / description
        Previous value: -"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\". Example: {\"type\":\"journal-article\",\"has-abstract\":\"true\",\"from-pub-date\":\"2023-01-01\",\"directory\":\"DOAJ\"}"New value: +"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\". Example: {\"type\":\"journal-article\",\"has-abstract\":\"true\",\"from-pub-date\":\"2023-01-01\"}"
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / offset / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / order / anyOf
        Added value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Sort direction",
        +    "enum": [
        +      "asc",
        +      "desc"
        +    ],
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / order / enum
        Removed value: -[
        -  "asc",
        -  "desc"
        -]
      • removedInput schema / properties / order / type
        Removed value: -"string"
      • changedInput schema / properties / rows / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / sort / anyOf
        Added value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Crossref sort field",
        +    "enum": [
        +      "relevance",
        +      "score",
        +      "is-referenced-by-count",
        +      "published",
        +      "published-print",
        +      "published-online",
        +      "deposited",
        +      "indexed",
        +      "created",
        +      "updated",
        +      "references-count"
        +    ],
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / sort / description
        Previous value: -"Sort field"New value: +"Sort field. The publication-date sorts (published, published-print, published-online) work with offset paging only — Crossref refuses them alongside cursor; every other sort works with either."
      • removedInput schema / properties / sort / enum
        Removed value: -[
        -  "relevance",
        -  "score",
        -  "is-referenced-by-count",
        -  "published",
        -  "published-print",
        -  "published-online",
        -  "deposited",
        -  "indexed",
        -  "created",
        -  "updated",
        -  "references-count"
        -]
      • removedInput schema / properties / sort / type
        Removed value: -"string"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: Crossref answered HTTP 429 and the limit did not clear inside the retry budget. `upstream_unavailable`: Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON. `malformed_response`: Crossref returned HTTP 200 with a body that is not valid JSON. `request_timeout`: Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504. `cursor_offset_conflict`: Both cursor and offset were supplied in the same request. `offset_too_large`: The requested offset exceeds the ~10K Crossref limit for offset-based paging. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: Crossref answered HTTP 429 and the limit did not clear inside the retry budget. `upstream_unavailable`: Crossref was unreachable, returned a 5xx status, or served an HTML error page instead of JSON. `malformed_response`: Crossref returned HTTP 200 with a body that is not valid JSON. `request_timeout`: Crossref did not respond within CROSSREF_TIMEOUT_MS, or answered HTTP 408/504. `unknown_filter`: Crossref rejected a filter key it does not recognize (filter-not-available). `sort_cursor_conflict`: A publication-date sort (published, published-print, published-online) was combined with cursor paging, which Crossref refuses. `invalid_cursor`: Crossref did not recognize the cursor token (HTTP 404 cursor-invalid). `invalid_parameter`: Crossref rejected a parameter value (a filter value of the wrong type or form), or answered HTTP 400 with a body that did not parse. `cursor_offset_conflict`: Both cursor and offset were supplied in the same request. `offset_too_large`: The requested offset exceeds the ~10K Crossref limit for offset-based paging. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "rate_limited",
        -  "upstream_unavailable",
        -  "malformed_response",
        -  "request_timeout",
        -  "cursor_offset_conflict",
        -  "offset_too_large"
        -]New value: +[
        +  "rate_limited",
        +  "upstream_unavailable",
        +  "malformed_response",
        +  "request_timeout",
        +  "unknown_filter",
        +  "sort_cursor_conflict",
        +  "invalid_cursor",
        +  "invalid_parameter",
        +  "cursor_offset_conflict",
        +  "offset_too_large"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"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. On a page carrying records, present only when authorLimit cut at least one work list, naming how many and the route to the rest."New value: +"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. On a page carrying records, present when authorLimit cut at least one work list, naming how many and the route to the rest, or when every query term and filter value was supplied blank, so the page lists the whole index unfiltered. A page needing more than one caveat carries them all in this one string."
      • addedOutput schema / properties / works / items / properties / articleNumber
        Added value: +{
        +  "description": "Article number, deposited by journals that number articles instead of paging them",
        +  "type": "string"
        +}
      • addedOutput schema / properties / works / items / properties / issn
        Added value: +{
        +  "description": "ISSN(s) of the containing journal",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / works / items / properties / issue
        Added value: +{
        +  "description": "Issue of the container the work appears in",
        +  "type": "string"
        +}
      • addedOutput schema / properties / works / items / properties / page
        Added value: +{
        +  "description": "Page range as deposited, e.g. \"357-362\"",
        +  "type": "string"
        +}
      • addedOutput schema / properties / works / items / properties / volume
        Added value: +{
        +  "description": "Volume of the container the work appears in",
        +  "type": "string"
        +}
  3. 7 tool updates
    • First observedcrossref_get_member
    • First observedcrossref_get_prefix
    • First observedcrossref_get_references
    • First observedcrossref_get_work
    • First observedcrossref_search_funders
    • First observedcrossref_search_journals
    • First observedcrossref_search_works

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables searching academic papers, journals, and citations via the Crossref API, and resolving DOIs to canonical metadata with authors, references, and citation graphs.
    234 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Searches and retrieves scholarly metadata from the CrossRef REST API, covering over 150 million records across all disciplines, without requiring an API key.
    35 PyPI
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables searching and retrieving scholarly metadata from Crossref's public REST API, including works, journals, funders, and members, without requiring an API key.
    10
    1
    -
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.