crossref-mcp-server
Server Details
Resolve DOIs, search ~155M scholarly works, and fetch references via the Crossref REST API.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/crossref-mcp-server
- GitHub Stars
- 3
- Server Listing
- crossref-mcp-server
TDQS
Scored across 7 tools
Each tool targets a clearly distinct resource or operation: exact DOI lookup, reference retrieval, prefix resolution, member resolution, and searches for works, funders, and journals. The only potentially overlapping pair — get_work and search_works — is distinguished by exact DOI resolution versus query-based search.
All tools follow a consistent crossref_ prefix with a verb_noun pattern: get_resources for exact lookups and search_resources for query-based discovery. There are no mixed conventions or vague verbs.
Seven tools is well-scoped for a read-only Crossref metadata server. Each tool covers a major Crossref API surface area without padding, and none feel redundant or superfluous.
The server covers the core Crossref workflows: resolving works, prefixes, and members; searching works, funders, and journals; and traversing reference lists. Incoming citations are the only notable omission, but the description explicitly notes Crossref does not provide them and points to OpenAlex, so there is no dead end.
Available Tools
7 toolscrossref_get_memberGet Member by IDARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| member_id | Yes | Crossref 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
| Name | Required | Description |
|---|---|---|
| id | No | Crossref member ID |
| error | No | Present when the call failed. Absent on success. |
| names | No | Alternate and imprint names registered under this member |
| counts | No | Registered DOI counts |
| coverage | No | 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, funders, licenses, and similar metadata. |
| deposits | No | Whether the member deposits any metadata with Crossref |
| location | No | Publisher location (city, region, country) |
| prefixes | No | DOI prefixes owned by this member, e.g. "10.1038" |
| primaryName | No | Primary publisher/organization name |
| worksByType | No | DOI counts broken down by work type (all DOIs), sorted by count descending |
| depositsArticles | No | Whether the member deposits journal-article metadata |
TDQS
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.
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.
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.
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.
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.
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 OwnerARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| prefix | Yes | DOI prefix in the format "10.NNNN" — the registrant portion of a DOI with no "/suffix", e.g. "10.1038" or "10.1371". |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| prefix | No | The DOI prefix that was resolved, e.g. "10.1038" |
| memberId | No | Numeric Crossref member ID that owns this prefix — pass to crossref_get_member for the full publisher record |
| ownerName | No | Name of the member (publisher) that owns this prefix |
TDQS
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.
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.
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.
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.
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.
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 ListARead-onlyIdempotentInspect
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 | Required | Description | Default |
|---|---|---|---|
| doi | 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 unwrapped. | |
| limit | No | Maximum 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. | |
| offset | No | Zero-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
| Name | Required | Description |
|---|---|---|
| cap | No | The limit that was applied to this page. |
| doi | No | DOI of the citing work |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of references returned in this page. |
| notice | No | Coverage 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. |
| offset | No | Zero-based index of the first returned reference within the deposited list |
| truncated | No | True when references remain beyond this page. Absent when the page is the last. |
| nextOffset | No | Offset to pass in the next call to retrieve the following page. Absent when this page reaches the end of the reference list. |
| references | No | Page of the outgoing reference list |
| referenceCount | No | Total number of references in the deposited list |
TDQS
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.
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.
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.
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.
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.
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 DOIARead-onlyIdempotentInspect
Resolves a DOI to its full Crossref metadata record: title, authors, affiliations, abstract (when deposited), journal or container, 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. 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 | Required | Description | Default |
|---|---|---|---|
| doi | 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 unwrapped. | |
| limit | No | Maximum 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. | |
| offset | No | 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 record is returned in full on every page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit that was applied to this page of authors. |
| doi | No | Canonical DOI |
| url | No | DOI resolution URL |
| issn | No | ISSN(s) of the containing journal |
| type | No | Work type (e.g. journal-article, book-chapter, posted-content) |
| error | No | Present when the call failed. Absent on success. |
| links | No | Registered full-text links |
| shown | No | Number of authors returned in this page. |
| title | No | Work title |
| notice | No | 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. |
| offset | No | Zero-based index of the first returned author within the deposited list. Omitted alongside authors when the record deposits no author field. |
| authors | No | Page of the author and contributor list, bounded by limit. Omitted when the record deposits no author field at all. |
| funders | No | Funding acknowledgements |
| subject | No | Subject classification terms |
| abstract | No | 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. |
| language | No | Language code (ISO 639) |
| licenses | No | License terms |
| subtitle | No | Subtitle when present |
| published | No | 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 | No | Publisher name |
| truncated | No | True when authors remain beyond this page. Absent when the page is the last. |
| nextOffset | No | 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. |
| authorCount | No | Total number of authors in the deposited list, before offset and limit were applied. Omitted alongside authors when the record deposits no author field. |
| containerTitle | No | Journal, book, or proceedings name containing this work |
| referencesCount | No | Number of outgoing references (works cited by this paper) |
| isReferencedByCount | No | Incoming citation count from Crossref — the count of works citing this DOI |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses important runtime behavior: author-list pagination with authorCount, offset, limit, and nextOffset semantics; referencesCount as a count only; and isReferencedByCount as an incoming-count field whose underlying works are not available via Crossref. These are concrete behavioral details an agent needs to correctly interpret responses and continue paging.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, pagination mechanics, reference count behavior, and citation-count limitations. It is appropriately front-loaded with the tool's main job, then covers edge cases an agent would otherwise discover only at runtime.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich output schema and the read-only, idempotent annotations, the description covers all essential operational knowledge: what fields are returned, how to page through large author lists, which related data is out of scope, and which sibling tool to use for that data. An agent can invoke and interpret this tool correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers DOI format, limit, and offset with 100% coverage, so the baseline is 3. The description adds cross-parameter meaning by explaining that only the author list is paged, that limit defaults to 25, that nextOffset should be passed back as offset, and that all other fields are returned in full on every page. This goes beyond the schema's individual field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 DOI to its full Crossref metadata record' and enumerates the concrete fields returned. It also distinguishes itself from siblings by explicitly routing reference entries to crossref_get_references and citing works to OpenAlex, so an agent cannot confuse it with the search or reference tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states when to use the tool — when you have a DOI and need the full metadata record — and gives explicit when-not guidance: outgoing references come from crossref_get_references, and citation graphs are not available through Crossref at all, pointing to OpenAlex instead. This gives clear alternatives and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crossref_search_fundersSearch FundersARead-onlyInspect
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 works funded by the matched funder; that list pages two ways. works_offset is the simple one and is capped ten times lower at works_offset + rows = 10000. works_cursor has no ceiling and reaches the whole funded-works list: 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 newest 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.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Maximum funders to return for name queries, or works when include_works is true (1–100, default 10) | |
| query | No | Funder name search query, e.g. "National Science Foundation" or "Wellcome Trust" | |
| offset | No | Zero-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_doi | No | Funder DOI for exact lookup — the full DOI "10.13039/100000001" (NSF) or the bare registry ID "100000001". Supersedes query when provided. | |
| works_cursor | No | 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. | |
| works_offset | No | 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; use works_cursor to read the whole list. Cannot be combined with works_cursor. | |
| include_works | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | 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. |
| funders | No | Matching funder records |
| nextOffset | No | Value 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. |
| fundedWorks | No | Page of works funded by the matched funder, ordered by publication date (newest first). Only present when include_works is true. |
| funderCount | No | Number of funder records returned in this page |
| fundersTotal | No | Total funder records matching the query in Crossref |
| nextWorksCursor | No | 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 | No | 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, the next page would breach the 10000-record offset ceiling, or the page was requested with works_cursor. |
| fundedWorksTotal | No | Total count of funded works for the matched funder, when include_works is true |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint=true and openWorldHint=true, the description adds rich behavioral detail: pagination ceilings, cursor walk semantics, the inability to combine offset and cursor, descendant work counting, and deprecated-record replacement behavior. It clearly states what the tool does and does not do automatically.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause earns its place: purpose first, then lookup modes, pagination, works inclusion, and edge-case behavior. No filler or repetition; the ordering follows the natural call flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no required parameters, the description covers accepted ID forms, both pagination mechanisms and their caps, ambiguity requirements, return fields, and the deprecated-registry edge case. With an output schema also present, an agent has everything needed to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description goes beyond it by explaining accepted funder_doi formats, nextOffset and nextWorksCursor chaining, the works_cursor='*' start token, the 10000-row offset cap, and the requirement that include_works needs an unambiguous funder. These are operational details not inferable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Finds funders registered in the Crossref Funder Registry by name or funder DOI.' It immediately distinguishes the two lookup modes and the tool's primary focus from sibling search/get tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: use funder_doi for exact lookup, use name query for search, and use include_works for funded works. It also contrasts descendant-inclusive counting with a crossref_search_works filter and tells the agent to re-run with funder_doi after a deprecated entry rather than following the replacement automatically.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crossref_search_journalsSearch JournalsARead-onlyInspect
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 by publication date; that list pages two ways. works_offset is the simple one and is capped ten times lower at works_offset + rows = 10000. works_cursor has no ceiling and reaches the whole works list: 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 newest work — it cannot resume from an offset. Returns journal metadata: title, publisher, ISSN-L, subject areas, and total DOI count.
| Name | Required | Description | Default |
|---|---|---|---|
| issn | No | ISSN for exact single-journal lookup (print or electronic, with or without hyphen). Example: "1234-5678". | |
| rows | No | Maximum number of journals to return for title queries, or works when include_works is true (1–100, default 10) | |
| query | No | Journal title search query, e.g. "Nature" or "Journal of Machine Learning Research" | |
| offset | No | Zero-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_cursor | No | 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. | |
| works_offset | No | 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; use works_cursor to read the whole list. Cannot be combined with works_cursor. | |
| include_works | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | 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. |
| journals | No | Matching journal records |
| nextOffset | No | Value 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. |
| worksTotal | No | Total works count for the journal, when include_works is true |
| recentWorks | No | 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. |
| journalCount | No | Number of journal records returned in this page |
| journalsTotal | No | Total journal records matching the query in Crossref |
| nextWorksCursor | No | 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 | No | Value 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds substantial behavior beyond that: pagination ceilings (offset + rows = 100000, works_offset + rows = 10000), cursor semantics (no ceiling, starts at the newest work, cannot resume from an offset, chaining via nextWorksCursor), cursor token size and the rows cost tradeoff, and the failure mode when a journal has no registered ISSN. No contradiction with annotations; the open-world hints (enrichments like nextOffset, notice) are even reinforced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense with the core purpose front-loaded in the first sentence; every sentence carries distinct facts with no filler. The ~170-word length is justified by two independent paging systems, though the dense prose would benefit from paragraph breaks to aid scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a complex 7-parameter tool with dual paging mechanisms: exact and fuzzy lookup, both paging modes with ceilings, the cursor walk protocol, mutual exclusions, prerequisites, a documented skip/failure mode, and the returned metadata fields. An output schema covers return values, so nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, establishing a baseline of 3. The description adds genuine interplay semantics the schema lacks: the offset + rows ceiling arithmetic, the '*' start token protocol for works_cursor, the offset/cursor mutual exclusion, and the include_works prerequisite of an unambiguous journal. This goes beyond what the per-parameter schema descriptions provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'Finds Crossref journal records by ISSN or title query' states a specific verb, resource, and the two lookup modes in one sentence. The journal-record scope clearly distinguishes it from sibling tools like crossref_search_works, crossref_search_funders, and crossref_get_member without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description is dense with explicit when/when-not decision rules: issn for exact lookup vs query for title search, works_offset for simple paging capped at 10000 vs works_cursor for full walks, mutual exclusion of the two, and the directive to pass issn when a title query matches more than one journal. However, it never names sibling tools (e.g., crossref_search_works) as alternatives for cross-tool routing, leaving that to inference from tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crossref_search_worksSearch WorksARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Number of results to return per page (1–100, default 20) | |
| sort | No | Sort field | |
| order | No | Sort direction (asc or desc) | |
| query | No | Free-text search query, e.g. "CRISPR gene editing" or "climate change adaptation" | |
| cursor | No | 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. | |
| fields | No | 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. | |
| filter | No | 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"} | |
| offset | No | Zero-based result offset for offset-based paging. Cannot be used with cursor. Capped at ~10K; use cursor for deeper paging. | |
| queryTitle | No | Match against work titles only, e.g. "Array programming with NumPy". | |
| authorLimit | No | Maximum 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. | |
| queryAuthor | No | Match against author names only, e.g. "Charles R. Harris". | |
| queryBibliographic | No | 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 | No | Match against the container title (journal or book name) only, e.g. "Nature". |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The per-work author cap applied to this page. Absent when no list was cut. |
| error | No | Present when the call failed. Absent on success. |
| works | No | 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. |
| notice | No | 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. |
| returned | No | Number of records returned in this response |
| truncated | No | 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. |
| nextCursor | No | 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. |
| totalResults | No | Total matching records in Crossref |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not need to repeat those. It adds substantial behavioral detail beyond annotations: offset paging capped at ~10K, cursor-based paging for deeper results, the rule that cursor and offset cannot be combined, the behavior of authorLimit (at most that many authors, full total in authorCount), and the signal for list exhaustion (nextCursor absent). These are non-obvious and critical for correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized. The first sentence states the core purpose and scale. Subsequent sentences cluster related concepts: query types, filters, sort, author limits, and paging. No sentence is redundant; every clause adds operational detail an agent needs. It is long but not bloated, with front-loaded intent and clear progression.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 13 parameters, a nested filter object, and an open-world dataset, the description covers all operational facets: multiple search modes, filter constraints, sort options, author pagination, and deep paging with cursor. It references crossref_get_work for complementary functionality. With the output schema present and annotations declaring read-only and open-world behavior, nothing essential is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds significant meaning beyond the schema: it explains the purpose of queryBibliographic (whole-citation match to resolve to DOI), the string-value requirement for boolean filter keys, the rationale for authorLimit in large-collaboration papers, and the mechanics of cursor paging. This is more than just restating the schema, but some parameters (e.g., rows, sort, order) are adequately described by the schema alone, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Searches the Crossref works index (~155M records) by free text and/or structured filters.' It clearly states what the tool does and the scope of the index. The mention of structured filters and field-specific parameters distinguishes it from sibling search tools for funders and journals, and from crossref_get_work which retrieves single works.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on choosing among search modes (generic query vs. queryTitle, queryAuthor, queryContainerTitle, queryBibliographic) with examples. It also explains when to use crossref_get_work: when a work's author list is truncated by authorLimit. Paging behavior (offset vs. cursor) is clearly directed, including the exact mechanism to start and end cursor-based paging.
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.
7 tool updates
- First observed
crossref_get_member - First observed
crossref_get_prefix - First observed
crossref_get_references - First observed
crossref_get_work - First observed
crossref_search_funders - First observed
crossref_search_journals - First observed
crossref_search_works
Related MCP Connectors
Search 150M+ academic works, journals, and funders via Crossref API.
Crossref MCP — wraps the Crossref REST API (academic papers, free, no auth)
Free scholarly paper and DOI discovery via Crossref. Self-service registration; no invitation.
Scholarly search: OpenAlex, Crossref, arXiv, OpenCitations and PubMed in one endpoint.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables retrieval of academic literature metadata via DOI or search using the Crossref REST API.2MIT
- AlicenseNot gradedqualityCmaintenanceEnables searching academic papers, journals, and citations via the Crossref API, and resolving DOIs to canonical metadata with authors, references, and citation graphs.5 npmMIT
- AlicenseNot gradedqualityCmaintenanceSearches and retrieves scholarly metadata from the CrossRef REST API, covering over 150 million records across all disciplines, without requiring an API key.24 PyPIMIT
- FlicenseAqualityBmaintenanceEnables searching and retrieving scholarly metadata from Crossref's public REST API, including works, journals, funders, and members, without requiring an API key.101-
Glama MCP Gateway
Add one secure layer between your agents and this server.