Skip to main content
Glama

Get a Zenodo record

zenodo_get_record
Read-onlyIdempotent

Resolve one Zenodo deposit from a record id, a Zenodo DOI (10.5281/zenodo.N), a concept DOI or concept record id (resolves to the latest version), another DOI deposited on Zenodo, or a zenodo.org or doi.org URL, and return its full metadata: description, creators with ORCIDs and ROR affiliations, license, access and embargo, funding and grants, related identifiers, communities, version position, usage counts, and the first 25 files. Optionally includes a formatted citation. Long text and lists are cut at display caps with their totals reported; every cut except the file list (paged with zenodo_list_files) is listed in continuations with a cursor and the record id it is bound to, and passing both back returns the next window of that field (8,000 characters of text, or the next page of entries) in place of the record. A miss (an unknown id, a deleted record with its removal tombstone, restricted metadata, or a DOI not registered on Zenodo) returns found: false with guidance instead of an error.

Input Schema

NameRequiredDescriptionDefault
idYesThe deposit to resolve: a record id (22705923), a Zenodo DOI (10.5281/zenodo.22705923, doi: prefix and any case accepted), a concept DOI or concept record id such as 10.5281/zenodo.591564 (resolves to the latest version), another DOI registered to a Zenodo record, or a zenodo.org/records or doi.org URL.
cursorNoA continuations[].cursor from an earlier zenodo_get_record response, passed unchanged with that continuation’s id as id. Returns that field’s next window (8,000 characters of text, or the next page of entries) as window, in place of record. Omit to get the record.
citation_styleNoInclude a formatted citation of the resolved version: bibtex, csl-json, or a text style (apa, chicago-author-date, harvard-cite-them-right, ieee, modern-language-association, nature). Case, spaces, hyphens, and underscores are ignored when matching (BibTeX, APA, CSL JSON). Omit for none.

Output Schema

NameRequiredDescriptionDefault
capNoWithout cursor: maximum file entries shown (25). With cursor: the window size (8,000 characters, or the field’s page of entries).
errorNoPresent when the call failed. Absent on success.
foundNoTrue when the record resolved.
shownNoWithout cursor: file entries shown. With cursor: characters or entries in the window.
noticeNoFile access notes or a pointer to zenodo_list_files.
recordNoThe record. Present when found and no cursor was passed.
windowNoThe next window of the field the cursor continues. Present when found and a cursor was passed, in place of record.
citationNoThe formatted citation. Present when requested and found.
guidanceNoWhat to do next. Present when not found.
miss_kindNoWhy nothing resolved. Present when not found.
tombstoneNoRemoval tombstone. Present when miss_kind is deleted.
truncatedNoWithout cursor: true when anything was cut, files past the 25 shown or any field in continuations. With cursor: true when continuations lists a next step, because the field continues past this window or an additional description on this page was cut.
input_kindNoHow id was parsed: record_id (digits), zenodo_doi (10.5281/zenodo.N or zenodo.N), external_doi (another DOI), or url (a zenodo.org or doi.org link).
continuationsNoEvery field this response cut short, each with a cursor for the rest. Absent when nothing was cut; files are paged with zenodo_list_files instead.
resolved_fromNoHow the record was reached: a version id, a concept id resolved to the latest version, or a non-Zenodo DOI. Present when found.
citation_styleNoThe citation style used. Present with citation.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed24 schema fields changed
    • addedInput schema / properties / cursor
      Added value: +{
      +  "description": "A continuations[].cursor from an earlier zenodo_get_record response, passed unchanged with that continuation’s id as id. Returns that field’s next window (8,000 characters of text, or the next page of entries) as window, in place of record. Omit to get the record.",
      +  "maxLength": 500,
      +  "type": "string"
      +}
    • changedOutput schema / properties / cap / description
      Previous value: -"Maximum file entries shown (25)."New value: +"Without cursor: maximum file entries shown (25). With cursor: the window size (8,000 characters, or the field’s page of entries)."
    • addedOutput schema / properties / continuations
      Added value: +{
      +  "description": "Every field this response cut short, each with a cursor for the rest. Absent when nothing was cut; files are paged with zenodo_list_files instead.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "One field cut short in this response.",
      +    "properties": {
      +      "cursor": {
      +        "description": "Pass as cursor, with this entry’s id, to get the next window of this field.",
      +        "type": "string"
      +      },
      +      "field": {
      +        "description": "The field that was cut.",
      +        "enum": [
      +          "description",
      +          "additional_descriptions",
      +          "creators",
      +          "contributors",
      +          "keywords",
      +          "funding",
      +          "related_identifiers",
      +          "communities"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Record id the cursor is bound to; pass it as id beside the cursor, whatever id form this call took.",
      +        "type": "string"
      +      },
      +      "index": {
      +        "description": "Position of the additional description whose text was cut (0 = first). Present only for an additional description’s text.",
      +        "type": "number"
      +      },
      +      "shown": {
      +        "description": "Characters or entries of the field returned so far, counted from its start; the cursor resumes here.",
      +        "type": "number"
      +      },
      +      "total": {
      +        "description": "Full length of the field in characters, or its total entries.",
      +        "type": "number"
      +      },
      +      "unit": {
      +        "description": "characters for description text, entries for a list (additional_descriptions without index is the list).",
      +        "enum": [
      +          "characters",
      +          "entries"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "field",
      +      "unit",
      +      "shown",
      +      "total",
      +      "id",
      +      "cursor"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_identifier`: id matches no accepted form, or is a GitHub-badge latestdoi id or a non-zenodo.org host. `record_unavailable`: Zenodo could not serve this record: HTTP 500 after one retry, HTTP 500 while resolving a non-Zenodo DOI, or no complete response within the time budget (its gateway cuts off near 30 s, which deposits with about 10,000 or more files hit). `rate_limited`: Zenodo answered HTTP 429, or this server's shared Zenodo request budget is spent for the current window. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_identifier`: id matches no accepted form, or is a GitHub-badge latestdoi id or a non-zenodo.org host. `invalid_cursor`: cursor is not one this tool returned in continuations, belongs to another record, or the record was edited after the cursor was issued. `record_unavailable`: Zenodo could not serve this record: HTTP 500 after one retry, HTTP 500 while resolving a non-Zenodo DOI, or no complete response within the time budget (its gateway cuts off near 30 s, which deposits with about 10,000 or more files hit). `rate_limited`: Zenodo answered HTTP 429, or this server's shared Zenodo request budget is spent for the current window. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "invalid_identifier",
      -  "record_unavailable",
      -  "rate_limited"
      -]New value: +[
      +  "invalid_identifier",
      +  "invalid_cursor",
      +  "record_unavailable",
      +  "rate_limited"
      +]
    • changedOutput schema / properties / record / description
      Previous value: -"The record. Present when found."New value: +"The record. Present when found and no cursor was passed."
    • addedOutput schema / properties / record / properties / additional_description_count
      Added value: +{
      +  "description": "Total additional descriptions.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / record / properties / additional_descriptions / description
      Previous value: -"Up to 5 additional descriptions."New value: +"First 5 additional descriptions, in record order (index 0 first)."
    • addedOutput schema / properties / record / properties / additional_descriptions / items / properties / length
      Added value: +{
      +  "description": "Full plain-text length in characters.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / record / properties / additional_descriptions / items / properties / text / description
      Previous value: -"Plain text, capped at 1,000 characters."New value: +"Plain text, first 1,000 characters."
    • addedOutput schema / properties / record / properties / additional_descriptions / items / properties / truncated
      Added value: +{
      +  "description": "True when text was cut at 1,000 characters; continuations carries a cursor for the rest.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / record / properties / additional_descriptions / items / required
      Previous value: -[
      -  "text"
      -]New value: +[
      +  "text",
      +  "length",
      +  "truncated"
      +]
    • changedOutput schema / properties / record / properties / communities / description
      Previous value: -"Up to 25 communities holding this record."New value: +"First 25 communities holding this record."
    • addedOutput schema / properties / record / properties / community_count
      Added value: +{
      +  "description": "Total communities holding this record.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / record / properties / description / description
      Previous value: -"Description converted from HTML to plain text, capped at 4,000 characters; absent when the record has none."New value: +"Description converted from HTML to plain text, first 4,000 characters; absent when the record has none."
    • changedOutput schema / properties / record / properties / description_truncated / description
      Previous value: -"True when the description was cut at 4,000 characters. Present with description."New value: +"True when the description was cut at 4,000 characters; continuations carries a cursor for the rest. Present with description."
    • changedOutput schema / properties / record / properties / funding / description
      Previous value: -"Up to 50 funding entries (funders and grants)."New value: +"First 50 funding entries (funders and grants)."
    • addedOutput schema / properties / record / properties / funding_count
      Added value: +{
      +  "description": "Total funding entries.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / record / properties / keyword_count
      Added value: +{
      +  "description": "Total subject keywords.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / record / properties / keywords / description
      Previous value: -"Up to 50 subject keywords."New value: +"First 50 subject keywords."
    • changedOutput schema / properties / record / required
      Previous value: -[
      -  "recid",
      -  "title",
      -  "additional_descriptions",
      -  "creators",
      -  "creator_count",
      -  "contributors",
      -  "contributor_count",
      -  "keywords",
      -  "rights",
      -  "access",
      -  "funding",
      -  "related_identifiers",
      -  "related_identifier_count",
      -  "communities",
      -  "versions",
      -  "files",
      -  "zenodo_url"
      -]New value: +[
      +  "recid",
      +  "title",
      +  "additional_descriptions",
      +  "additional_description_count",
      +  "creators",
      +  "creator_count",
      +  "contributors",
      +  "contributor_count",
      +  "keywords",
      +  "keyword_count",
      +  "rights",
      +  "access",
      +  "funding",
      +  "funding_count",
      +  "related_identifiers",
      +  "related_identifier_count",
      +  "communities",
      +  "community_count",
      +  "versions",
      +  "files",
      +  "zenodo_url"
      +]
    • changedOutput schema / properties / shown / description
      Previous value: -"File entries shown."New value: +"Without cursor: file entries shown. With cursor: characters or entries in the window."
    • changedOutput schema / properties / truncated / description
      Previous value: -"True when the record has more files than the 25 shown."New value: +"Without cursor: true when anything was cut, files past the 25 shown or any field in continuations. With cursor: true when continuations lists a next step, because the field continues past this window or an additional description on this page was cut."
    • addedOutput schema / properties / window
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The next window of the field the cursor continues. Present when found and a cursor was passed, in place of record.",
      +  "properties": {
      +    "additional_descriptions": {
      +      "description": "Up to 5 additional descriptions starting at offset, each text cut at 1,000 characters. Present when field is additional_descriptions and unit is entries.",
      +      "items": {
      +        "additionalProperties": false,
      +        "description": "One additional description.",
      +        "properties": {
      +          "length": {
      +            "description": "Full plain-text length in characters.",
      +            "type": "number"
      +          },
      +          "text": {
      +            "description": "Plain text, first 1,000 characters.",
      +            "type": "string"
      +          },
      +          "truncated": {
      +            "description": "True when text was cut at 1,000 characters; continuations carries a cursor for the rest.",
      +            "type": "boolean"
      +          },
      +          "type": {
      +            "description": "Description type, e.g. Notes or Methods.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "text",
      +          "length",
      +          "truncated"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "communities": {
      +      "description": "Up to 25 communities starting at offset. Present when field is communities.",
      +      "items": {
      +        "additionalProperties": false,
      +        "description": "One community.",
      +        "properties": {
      +          "slug": {
      +            "description": "Community slug — feeds zenodo_search_records community.",
      +            "type": "string"
      +          },
      +          "title": {
      +            "description": "Community title.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "slug"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "contributors": {
      +      "description": "Up to 25 contributors starting at offset. Present when field is contributors.",
      +      "items": {
      +        "additionalProperties": false,
      +        "description": "A creator or contributor.",
      +        "properties": {
      +          "affiliations": {
      +            "description": "Affiliations as deposited.",
      +            "items": {
      +              "additionalProperties": false,
      +              "description": "One affiliation.",
      +              "properties": {
      +                "name": {
      +                  "description": "Affiliation name.",
      +                  "type": "string"
      +                },
      +                "ror": {
      +                  "description": "Affiliation ROR id, when linked.",
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "name": {
      +            "description": "Display name as deposited.",
      +            "type": "string"
      +          },
      +          "orcid": {
      +            "description": "ORCID iD, when the depositor supplied one.",
      +            "type": "string"
      +          },
      +          "role": {
      +            "description": "Contributor role, e.g. Editor (contributors only).",
      +            "type": "string"
      +          },
      +          "type": {
      +            "description": "personal or organizational.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "affiliations"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "creators": {
      +      "description": "Up to 25 creators starting at offset. Present when field is creators.",
      +      "items": {
      +        "additionalProperties": false,
      +        "description": "A creator or contributor.",
      +        "properties": {
      +          "affiliations": {
      +            "description": "Affiliations as deposited.",
      +            "items": {
      +              "additionalProperties": false,
      +              "description": "One affiliation.",
      +              "properties": {
      +                "name": {
      +                  "description": "Affiliation name.",
      +                  "type": "string"
      +                },
      +                "ror": {
      +                  "description": "Affiliation ROR id, when linked.",
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "name": {
      +            "description": "Display name as deposited.",
      +            "type": "string"
      +          },
      +          "orcid": {
      +            "description": "ORCID iD, when the depositor supplied one.",
      +            "type": "string"
      +          },
      +          "role": {
      +            "description": "Contributor role, e.g. Editor (contributors only).",
      +            "type": "string"
      +          },
      +          "type": {
      +            "description": "personal or organizational.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "affiliations"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "field": {
      +      "description": "The field this window continues.",
      +      "enum": [
      +        "description",
      +        "additional_descriptions",
      +        "creators",
      +        "contributors",
      +        "keywords",
      +        "funding",
      +        "related_identifiers",
      +        "communities"
      +      ],
      +      "type": "string"
      +    },
      +    "funding": {
      +      "description": "Up to 50 funding entries starting at offset. Present when field is funding.",
      +      "items": {
      +        "additionalProperties": false,
      +        "description": "One funding entry.",
      +        "properties": {
      +          "award_acronym": {
      +            "description": "Award acronym.",
      +            "type": "string"
      +          },
      +          "award_doi": {
      +            "description": "Award DOI, e.g. 10.3030/101135562.",
      +            "type": "string"
      +          },
      +          "award_id": {
      +            "description": "Award id (<funder-ror>::<number>) — feeds zenodo_search_records award.",
      +            "type": "string"
      +          },
      +          "award_number": {
      +            "description": "Grant number.",
      +            "type": "string"
      +          },
      +          "award_program": {
      +            "description": "Funding program.",
      +            "type": "string"
      +          },
      +          "award_title": {
      +            "description": "Award title.",
      +            "type": "string"
      +          },
      +          "award_url": {
      +            "description": "Award landing page URL.",
      +            "type": "string"
      +          },
      +          "funder_id": {
      +            "description": "Funder ROR id.",
      +            "type": "string"
      +          },
      +          "funder_name": {
      +            "description": "Funder name.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "index": {
      +      "description": "Position of the additional description whose text this window continues (0 = first). Present only for an additional description’s text.",
      +      "type": "number"
      +    },
      +    "keywords": {
      +      "description": "Up to 50 subject keywords starting at offset. Present when field is keywords.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "offset": {
      +      "description": "Characters or entries of the field before this window.",
      +      "type": "number"
      +    },
      +    "related_identifiers": {
      +      "description": "Up to 50 related identifiers starting at offset. Present when field is related_identifiers.",
      +      "items": {
      +        "additionalProperties": false,
      +        "description": "One related identifier.",
      +        "properties": {
      +          "identifier": {
      +            "description": "The related identifier (DOI, arXiv id, URL, PMID, …).",
      +            "type": "string"
      +          },
      +          "relation": {
      +            "description": "Relation type id, e.g. issupplementto or cites.",
      +            "type": "string"
      +          },
      +          "resource_type": {
      +            "description": "Resource type id of the related item.",
      +            "type": "string"
      +          },
      +          "scheme": {
      +            "description": "Identifier scheme, e.g. doi, arxiv, url.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "identifier"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "shown": {
      +      "description": "Characters or entries in this window.",
      +      "type": "number"
      +    },
      +    "text": {
      +      "description": "Up to 8,000 characters of the field’s plain text, starting at offset. Present when unit is characters.",
      +      "type": "string"
      +    },
      +    "total": {
      +      "description": "Full length of the field in characters, or its total entries.",
      +      "type": "number"
      +    },
      +    "unit": {
      +      "description": "characters for a text window, entries for a list window.",
      +      "enum": [
      +        "characters",
      +        "entries"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "field",
      +    "unit",
      +    "offset",
      +    "shown",
      +    "total"
      +  ],
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent/openWorld annotations: it discloses display caps, the continuations/cursor mechanism bound to a record id, the 8,000-character window size, and that misses return found: false with guidance rather than an error. This is exactly the behavioral context an agent needs before calling.

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?

Purpose is front-loaded in the first clause and every sentence carries substantive information about resolution, truncation, and failure. The three sentences are very dense/long, which slightly hurts readability, but little is wasted.

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 resolver with an output schema and annotations covering safety, the description supplies the remaining behavior an agent needs: identifier acceptance, truncation/continuation flow, optional citation, and miss handling. Nothing essential is missing.

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 baseline is 3, but the description adds the interaction rule that cursor and the continuation's id must be passed together to return the next window in place of the record. It reinforces rather than duplicates the enum and id semantics.

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?

States a specific verb (resolve/get) and resource (one Zenodo deposit) and enumerates the accepted identifier forms. It also distinguishes itself from the sibling zenodo_list_files by naming it as the tool for the paged file list.

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 context for when to use it (resolving a single record from an id/DOI/URL) and it names zenodo_list_files as the alternative for file pagination. It does not explicitly say when to prefer sibling tools like zenodo_search_records or zenodo_list_versions, leaving that to inference.

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.