MCP server for interacting with Zenodo research repository, providing tools to search, retrieve metadata, download files, compare records, and extract information from Zenodo records.
The server defines 11 tools with reasonable coverage for Zenodo record discovery and analysis. Tool names follow verb_noun conventions (search_records, get_metadata, download_file, etc.), which is good. However, significant quality gaps exist: (1) Parameter descriptions are sparse or missing entirely for many tools, e.g., sort parameter in search_records lacks enum values or constraints; (2) Output schemas are not documented in the tool definitions, forcing LLMs to infer result structure; (3) Error handling is minimal, no guidance on retryability, user-fixable errors, or recovery paths; (4) Some parameter relationships are undocumented (e.g., include_files and include_versions in get_metadata have no explanation of what they control in the response); (5) Descriptions are brief but generally adequate (60-80 chars on average), meeting the 10-1024 character rule but not optimized for LLM decision-making. The citation_tool.py shows reasonable implementation (extracts creators, pub_date, formats BibTeX/APA), but the compare_tool.py exposes a pattern anti-pattern: it accepts a generic 'compare_fields' array without enumerating valid field names, inviting hallucinated field names like 'invented_field'. Overall, the tools are well-intentioned but lack polish in parameter validation, schema documentation, and error guidance.
Compares metadata of multiple Zenodo records
Determines if a Zenodo record is a dataset, software, or article
Downloads a specific file from a record
Extracts top keywords from a Zenodo record's abstract or text
Creates a direct embeddable link for a Zenodo record (PDF, dataset)
Returns BibTeX or APA citation of a Zenodo record
No output schemas documented for any tool. LLMs must infer result structure, causing guessing on field names and types. For example, search_records likely returns an array of records, but does each record include record_id, title, url, date? Does it include pagination info?
Parameter enum constraints are missing or informal. sort in search_records, format in get_citation, and compare_fields in compare_records are described as '(value1, value2, ...)' in natural language rather than JSON Schema enums. LLMs frequently hallucinate values outside documented sets when enums are absent.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | D | 55 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 8 | - | v1 |
Retrieves detailed metadata of a Zenodo record
Find records related to a given Zenodo record
Lists available files in a Zenodo record
Search for records in Zenodo
Generates a summary from a Zenodo record's metadata
No error guidance in descriptions. Tools lack recovery hints. E.g., download_file does not explain what happens if file_name is invalid, get_citation does not clarify handling of unsupported formats, get_related_records does not explain failure modes if similarity computation fails.
No numeric parameter constraints. max_results, max_keywords, max_length, and similarity_threshold lack min/max bounds in schema. This allows LLMs to pass absurd values (e.g., max_results=999999) that could timeout or exhaust resources.
Parameter relationships undocumented. In get_metadata, include_files and include_versions toggle certain response fields, but the descriptions don't state which fields appear when each flag is true/false. In compare_records, the behavior when record_ids has <2 items is not pre-described (code throws ValueError at runtime).
No pagination support documented for tools that return lists. search_records and list_files return potentially large result sets (Zenodo can have millions of records, records can have dozens of files) but lack limit/offset or cursor parameters.
Some descriptions are too generic. 'Retrieves detailed metadata of a Zenodo record' (get_metadata), 'Lists available files in a Zenodo record' (list_files), and 'Generates a summary from a Zenodo record's metadata' (summarize_record) don't explain when to use them vs. similar tools or what specific metadata is returned.