Skip to main content
Glama

Search Zenodo records

zenodo_search_records
Read-onlyIdempotent

Search Zenodo's open research repository — datasets, software releases, publications, and other deposits — by keyword query plus filters for resource type, community, funder, grant, creator ORCID, file type, license, access status, and publication date. Returns one summary per deposit (ids, DOIs, title, type, version, creators, license, access, file totals, usage counts) plus facet counts over the full match set, every filter applied. Query terms are OR-ed unless joined with AND, quoted phrases match exactly, and field syntax works on record fields (metadata.title:"…", metadata.subjects.subject:"…"). Only the latest version of each deposit is searched unless all_versions is true, and only the first 10,000 matches are reachable by paging. Resolve community, funder, and grant names to ids with zenodo_lookup_vocabulary first; open one deposit in full with zenodo_get_record.

Input Schema

NameRequiredDescriptionDefault
pageNoResult page, starting at 1. Only the first 10,000 matches are reachable, so the last reachable page is 10,000 ÷ size rounded up (400 at size 25).
sizeNoResults per page, at most 25 per call; larger values return 25.
sortNoSort order: bestmatch, newest, oldest, mostviewed, mostdownloaded, updated-desc, updated-asc. Case, spaces, hyphens, and underscores are ignored when matching (MostViewed reads as mostviewed). Defaults to bestmatch with a query, newest without.
awardNoOne grant: an award id <funder-ror>::<number> (00k4n6c32::101135562), a bare grant number, or a CORDIS award DOI (10.3030/101135562). Find ids with zenodo_lookup_vocabulary (vocabulary: awards).
queryNoKeyword query. Terms are OR-ed unless joined with AND; "quoted phrases" (double quotes) match exactly; field syntax such as metadata.title:"…" or doi:"10.5281/zenodo.N" works. Escape a literal / as \/. A bare DOI or record URL is rejected; open it with zenodo_get_record instead. With any filter other than community and all_versions, a query that is not valid search syntax (AND AND, a field: with no value, an unclosed [a TO b]) is rejected; without one, Zenodo matches it as plain text. Omit to browse with filters only.
funderNoOne funder: a ROR id (01cwqze88), a ROR URL, or a Crossref Funder DOI (10.13039/100000002). Resolve a funder name with zenodo_lookup_vocabulary (vocabulary: funders).
licenseNoLicense id, e.g. cc-by-4.0, cc0-1.0, mit (lowercased). Find ids with zenodo_lookup_vocabulary (vocabulary: licenses).
communityNoOne community: its slug, UUID, or zenodo.org/communities/<slug> URL. Find slugs with zenodo_lookup_vocabulary (vocabulary: communities).
file_typeNoFile extensions, OR-ed (a single string is accepted): csv, zip, pdf, … Lowercased with any leading dot stripped.
all_versionsNoInclude superseded versions; by default only the latest version is searched.
published_toNoLatest publication date, YYYY, YYYY-MM, or YYYY-MM-DD; a partial date ends at its last day.
access_statusNoAccess status: open, restricted, embargoed, or metadata-only. Case, spaces, hyphens, and underscores are ignored when matching (Metadata Only reads as metadata-only).
creator_orcidNoCreator ORCID iD, e.g. 0000-0002-1825-0097; an https://orcid.org/ prefix is stripped and a trailing x uppercased.
resource_typeNoResource type ids, OR-ed (a single string is accepted): dataset, software, publication, publication-article, image-photo, … Any case; a subtype may also be written in the <type>::<id> form zenodo_lookup_vocabulary shows as its search value (publication::publication-article). A top-level type includes its subtypes. Look ids up with zenodo_lookup_vocabulary (vocabulary: resource_types).
published_fromNoEarliest publication date, YYYY, YYYY-MM, or YYYY-MM-DD; a partial date starts at its first day.

Output Schema

NameRequiredDescriptionDefault
capNoPage size applied (at most 25).
hitsNoMatching deposits on this page.
pageNoPage returned.
sizeNoPage size applied: size, or 25 when size asked for more.
errorNoPresent when the call failed. Absent on success.
shownNoHits returned on this page.
totalNoExact number of matching records.
facetsNoFacet counts over the full match set (every filter applied, so they agree with total), not just this page.
noticeNoGuidance on a query Zenodo matched as plain text, empty results, the 10,000-result window, the 25-per-call size cap, or further pages.
has_moreNoTrue when another reachable page follows.
next_pageNoThe next page number, when has_more.
reachableNoMatches reachable by paging: min(total, 10,000).
truncatedNoTrue when more reachable matches follow this page.
totalCountNoExact number of matching records.
allVersionsNoWhether superseded versions were searched.
appliedSortNoThe sort order applied.
effectiveQueryNoThe exact q sent to Zenodo.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • changedInput schema / properties / page / description
      Previous value: -"Result page, starting at 1. page × size may not exceed 10,000."New value: +"Result page, starting at 1. Only the first 10,000 matches are reachable, so the last reachable page is 10,000 ÷ size rounded up (400 at size 25)."
    • changedInput schema / properties / query / description
      Previous value: -"Keyword query. Terms are OR-ed unless joined with AND; \"quoted phrases\" match exactly; field syntax such as metadata.title:\"…\" or doi:\"10.5281/zenodo.N\" works. Escape a literal / as \\/. A bare DOI or record URL is rejected; open it with zenodo_get_record instead. Omit to browse with filters only."New value: +"Keyword query. Terms are OR-ed unless joined with AND; \"quoted phrases\" (double quotes) match exactly; field syntax such as metadata.title:\"…\" or doi:\"10.5281/zenodo.N\" works. Escape a literal / as \\/. A bare DOI or record URL is rejected; open it with zenodo_get_record instead. With any filter other than community and all_versions, a query that is not valid search syntax (AND AND, a field: with no value, an unclosed [a TO b]) is rejected; without one, Zenodo matches it as plain text. Omit to browse with filters only."
    • changedInput schema / properties / size / description
      Previous value: -"Results per page (1–25)."New value: +"Results per page, at most 25 per call; larger values return 25."
    • changedInput schema / properties / size / maximum
      Previous value: -25New value: +10000
    • changedOutput schema / properties / cap / description
      Previous value: -"Page size applied."New value: +"Page size applied (at most 25)."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `query_is_identifier`: The query is a single DOI, doi.org URL, or zenodo.org record URL. `query_syntax`: The query has an unpaired unescaped / outside quotes. `query_failed`: Zenodo answered HTTP 500 for a query that passed the local checks. `upstream_timeout`: The search attempt got no complete response within its time budget. `unknown_community`: community resolves to no Zenodo community. `unknown_funder`: funder is not a known ROR id and no funder carries that Crossref Funder DOI. `invalid_date_range`: The expanded published_from is after published_to. `result_window_exceeded`: page × size exceeds 10,000. `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: `query_is_identifier`: The query is a single DOI, doi.org URL, or zenodo.org record URL. `query_syntax`: The query holds something Zenodo cannot run: a regular expression with no closing / (an unescaped / outside double quotes) or with a \" inside /…/ left open; a \" inside a word whose phrase never closes (with a filter other than community and all_versions set, only when the query still fails once that phrase is closed at its end) or closes past a bracket the query needs; a range bound ending in a backslash, as one holding an escaped space, ] or } does; an unescaped ! with nothing after it; or a boost, fuzziness, or proximity value it cannot convert. Or a filter other than community and all_versions is set and the query is not valid search syntax, which Zenodo would match as plain text with every filter dropped. `query_failed`: Zenodo answered HTTP 500 for a query that passed the local checks. `upstream_timeout`: The search attempt got no complete response within its time budget. `unknown_community`: community resolves to no Zenodo community. `unknown_funder`: funder is not a known ROR id and no funder carries that Crossref Funder DOI. `invalid_date_range`: The expanded published_from is after published_to. `result_window_exceeded`: The page starts past the first 10,000 matches: (page − 1) × size is 10,000 or more, counting a size above 25 as 25. `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 / notice / description
      Previous value: -"Guidance on empty results, the 10,000-result window, or further pages."New value: +"Guidance on a query Zenodo matched as plain text, empty results, the 10,000-result window, the 25-per-call size cap, or further pages."
    • changedOutput schema / properties / size / description
      Previous value: -"Page size applied."New value: +"Page size applied: size, or 25 when size asked for more."
  2. 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 read-only/idempotent/open-world; the description adds substantive behavior the annotations cannot express: only the latest version is searched unless all_versions is true, only the first 10,000 matches are pageable, facets are computed over the full match set, and invalid query syntax is rejected only when certain filters are present. Those are real operational constraints 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?

Front-loaded with purpose and scope, then filter list, then return shape, then syntax/limits/routing — a sensible order for a 15-parameter tool. The middle sentences are dense and pack many clauses, but for a search tool of this breadth the length is largely earned; only minor overlap with the schema could be trimmed.

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?

Covers purpose, filter semantics, result shape, facet behavior, version scoping, pagination ceiling, query-syntax validation, and sibling routing — arguably more than needed given an output schema exists. Nothing an agent requires to call this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and every parameter (page, sort, award, license, community, resource_type, etc.) already carries detailed per-field documentation, so the baseline is 3. The description restates query syntax, version scope, and the id-lookup dependency rather than adding new per-parameter meaning beyond the schema.

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

Purpose5/5

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

Opens with a specific verb+resource ("Search Zenodo's open research repository — datasets, software releases, publications, and other deposits") and enumerates the filter surface, so the agent knows exactly what this tool does. It also names the two siblings it must not be confused with (zenodo_lookup_vocabulary for id resolution, zenodo_get_record for a single deposit), giving clean sibling separation.

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

Usage Guidelines5/5

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

Gives explicit routing rules: resolve community/funder/grant names to ids with zenodo_lookup_vocabulary first, and open one deposit in full with zenodo_get_record. It also states when a query is rejected versus treated as plain text, and that omitting query lets you browse with filters only — clear when-to-use conditions rather than 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.