Skip to main content
Glama

crossref-mcp-server

Get Work by DOI

crossref_get_work
Read-onlyIdempotent

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.

Input 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 per call, default 25). A larger value, up to 100000, returns 500 and says so in notice; nextOffset continues after the authors returned. 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

NameRequiredDescriptionDefault
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, when limit was above its per-call cap, the value requested and the cap applied. 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. All share this one string when more than one applies. Absent when the page holds the whole author list, no update is recorded, and limit was within its cap.
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; numeric JATS superscripts retain caret notation (10^{16}, GeV^2), 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

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema 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 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."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; numeric JATS superscripts retain caret notation (10^{16}, GeV^2), 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 / licenses / items / properties / start
      Added value: +{
      +  "description": "License start date-time as deposited by the publisher",
      +  "type": "string"
      +}
    • addedOutput schema / properties / links / items / properties / contentVersion
      Added value: +{
      +  "description": "Content version of the linked manuscript as deposited (e.g. vor, am)",
      +  "type": "string"
      +}
  2. Changed3 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"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."New value: +"Maximum number of authors to return in one page (1–500 per call, default 25). A larger value, up to 100000, returns 500 and says so in notice; nextOffset continues after the authors returned. Ordinary records fit in a single page; large-collaboration papers in particle physics and genomics deposit thousands."
    • changedInput schema / properties / limit / maximum
      Previous value: -500New value: +100000
    • changedOutput schema / properties / notice / description
      Previous 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."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, when limit was above its per-call cap, the value requested and the cap applied. 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. All share this one string when more than one applies. Absent when the page holds the whole author list, no update is recorded, and limit was within its cap."
  3. Changed11 schema 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"
      +}
  4. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnly and idempotent; the description goes well beyond them, disclosing that the author list is paged with a 25 default, a 100k ceiling collapsing to 500 with a notice, a nextOffset continuation token, and that every non-author field is returned in full on every page. It also warns that an absent updatedBy is not proof of no updates, that only Crossref-registered DOIs in relations resolve, and that isReferencedByCount is a total with no citing list available.

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 purpose and scoping constraint are front-loaded, and every later sentence maps to a distinct response field or caveat. It is dense — the opening sentence is a long comma-chained enumeration — and some field lists (ISSNs/ISBNs, license, funder acknowledgements) could be compressed, but nothing is redundant padding.

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?

An output schema exists, yet the description still supplies the interpretive context an agent needs: paging protocol, the meaning and limits of update/relations data, and which fields are counts rather than payloads. For a read-only lookup with three parameters, nothing consequential is left unspecified.

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 already 100%, so the baseline is 3; the description earns above that by explaining the offset/limit interaction in terms of authorCount and nextOffset rather than restating the schema, and by motivating the range (thousands of authors in particle physics and genomics). It adds the continuation protocol the schema alone does not express.

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 opening clause states a specific verb and resource — 'Resolves a DOI to its full Crossref metadata record' — then enumerates the resolved fields (title, authors, container, ISSNs, dates, license, funders). It explicitly separates itself from crossref_get_references (counts vs. entries) and from OpenAlex (citation graphs), so an agent can place it among the siblings without opening any schema.

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?

Clear positive guidance: call it with a DOI to get the full record, and it names the alternatives for the sub-resources it does not return (references via crossref_get_references, citing works via OpenAlex). It stops short of stating when to prefer crossref_search_works (i.e., when you have no DOI yet), but the exclusions for the adjacent cases are explicit.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.