Skip to main content
Glama
MSKazemi

mcp-zenodo

by MSKazemi

mcp-zenodo — Zenodo MCP Server

mcp-zenodo is a Zenodo MCP server: it connects large language models to Zenodo, the CERN-hosted open-access research repository, through the Model Context Protocol (MCP). It lets an LLM search Zenodo records, read metadata, retrieve citations, and list or download files as callable tools. It is built for developers and researchers who want AI assistants to work with open research datasets, software, and publications. Use it when you want tools like Claude Desktop, Cursor IDE, or a LangChain/LangGraph agent to ground answers in real Zenodo records with DOIs. Do not use it if you need to deposit or publish to Zenodo, since this project is read/retrieval oriented and does not implement upload workflows. Compared with calling the Zenodo REST API directly, mcp-zenodo packages that access as MCP tools so any MCP-compatible client can use Zenodo without writing custom integration code.

One-line value prop: an MCP server for Zenodo that turns open-access research data into LLM-callable tools.

Written in Python. Licensed under Apache-2.0.


What it does

mcp-zenodo exposes Zenodo's repository of research outputs to LLMs through MCP tools:

  • Search and retrieve records — find Zenodo records by query.

  • Get citations — retrieve citations in formats such as BibTeX and APA.

  • Detect data types — classify a record as dataset, software, or article.

  • Access metadata — get detailed metadata for a record.

  • List and download files — browse and download files attached to records.

Available tools

Tool

Description

search_records

Search for records in Zenodo

get_metadata

Retrieve detailed metadata of a Zenodo record

get_citation

Return a BibTeX or APA citation of a Zenodo record

detect_data_type

Determine if a record is a dataset, software, or article

compare_records

Compare metadata of multiple Zenodo records

list_files

List available files in a Zenodo record

download_file

Download a specific file from a record

generate_embed_link

Create a direct embeddable link for a record (PDF, dataset)

extract_keywords

Extract top keywords from a record's abstract or text

get_related_records

Find records related to a given Zenodo record

summarize_record

Generate a summary from a record's metadata


Related MCP server: cds-mcp

Repository structure

This repository contains two implementations for two different use cases:

  1. MCP SDK Core (/mcp_sdk_core) — a Python MCP server for integration with MCP-enabled environments such as Cursor IDE and Claude Desktop.

  2. MCP API (/mcp_api) — a FastAPI service that exposes MCP-compatible tools for LLM frameworks such as LangChain and LangGraph, and OpenAI-compatible clients.

MCP SDK Core

The MCP SDK Core implementation is designed for direct integration with MCP-enabled environments. It provides:

  • Direct MCP integration — follows the Model Context Protocol standard.

  • Cursor IDE / Claude Desktop compatibility — connects through the standard MCP client config.

  • Simple configuration — managed through a JSON config file.

  • Unified API — standardized access to Zenodo resources.

This is ideal for developers who want to access Zenodo directly from their development environment without additional middleware.

Learn more about the MCP SDK Core implementation →

MCP API

The MCP API implementation is a FastAPI service that provides MCP-compatible tools for LLM frameworks. It offers:

  • LangChain integration — use the tools with LangChain agents.

  • LangGraph compatibility — use the tools in LangGraph workflows.

  • OpenAI-compatible API — usable with OpenAI-compatible clients.

  • LibreChat support — compatible with LibreChat and similar platforms.

  • Custom tool creation — extensible architecture for adding tools.

This is ideal for developers building LLM applications that interact with Zenodo as part of a larger workflow.

Learn more about the MCP API implementation →


30-second quickstart

Option A — MCP server for Cursor IDE / Claude Desktop

# Clone the repository
git clone https://github.com/MSKazemi/mcp-zenodo.git
cd mcp-zenodo/mcp_sdk_core

# Install dependencies
pip install -r requirements.txt

Then register the server with your MCP client. For Cursor IDE, create an mcp.json (in your project root or ~/.cursor/); for Claude Desktop, add the same block to claude_desktop_config.json:

{
  "mcpServers": {
    "Zenodo": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/mcp-zenodo/mcp_sdk_core/server",
        "run",
        "server.py"
      ]
    }
  }
}

Adjust the --directory path to your local checkout. Restart the client; it will detect and start the Zenodo MCP server. You can then ask the assistant to search Zenodo, fetch metadata, or retrieve a citation.

Option B — FastAPI service for LangChain / LangGraph / OpenAI-compatible clients

# Clone the repository
git clone https://github.com/MSKazemi/mcp-zenodo.git
cd mcp-zenodo/mcp_api

# Install dependencies
pip install -r requirements.txt

# Set up environment variables
cp .env.example .env
# Edit .env with your Zenodo API token

# Run the API server
uvicorn server.main:app --host 0.0.0.0 --port 8000

Example

Ask an MCP-enabled assistant (Claude Desktop, Cursor) a question that triggers the search_records tool:

"Search Zenodo for records about climate model output and show me the top result with its DOI."

The assistant calls the search_records tool, then get_metadata, and returns a record's title, authors, DOI, and description. A representative (abbreviated) tool result looks like:

{
  "hits": [
    {
      "title": "Example Climate Model Output Dataset",
      "doi": "10.5281/zenodo.1234567",
      "type": "dataset",
      "url": "https://zenodo.org/record/1234567"
    }
  ]
}

You can then follow up with get_citation to obtain a BibTeX or APA citation, or list_files / download_file to access the record's files. (Exact fields and values depend on the live Zenodo record returned.)


Use cases

  • Literature and dataset discovery — let an AI assistant search Zenodo and surface relevant datasets, software, and papers with DOIs.

  • Citation retrieval — pull BibTeX or APA citations for records directly into a manuscript or notebook.

  • Research agents — give LangChain/LangGraph agents a Zenodo tool so they can ground answers in open research data.

  • In-editor research — query Zenodo from Cursor IDE or Claude Desktop while writing code or documentation.

  • Reproducibility workflows — locate, inspect metadata for, and download research artifacts programmatically.


Comparison and alternatives

  • vs. calling the Zenodo REST API directly — the Zenodo REST API gives full control (including deposition/upload), but you must write and maintain the integration yourself. mcp-zenodo wraps common read/retrieval operations as MCP tools so any MCP client can use them with no custom code.

  • vs. general-purpose HTTP/fetch MCP servers — a generic fetch tool can hit Zenodo URLs but has no knowledge of records, metadata, citations, or file listings. mcp-zenodo provides Zenodo-specific, typed tools.

  • vs. other research-repository MCP servers — comparable MCP servers exist for sources such as arXiv and other data repositories; mcp-zenodo is focused specifically on Zenodo. It ships two integration paths (a stdio MCP server and a FastAPI service), which lets you choose between direct MCP clients and LLM-framework/OpenAI-compatible usage.


Limitations / when NOT to use

  • Not for depositing or publishing — this project focuses on searching and retrieving from Zenodo; it does not implement Zenodo deposition/upload workflows.

  • Depends on the Zenodo API — availability, rate limits, and returned fields are governed by Zenodo; some operations may require a Zenodo API token.

  • Retrieval quality depends on Zenodo metadata — data-type detection, keyword extraction, and summaries are derived from record metadata and are best-effort.

  • Two separate implementations — the MCP SDK Core server and the FastAPI service are configured differently; pick the one matching your client rather than expecting a single unified deployment.


FAQ

What is mcp-zenodo? mcp-zenodo is a Zenodo MCP server — an implementation of the Model Context Protocol that exposes Zenodo (the CERN open-access research repository) to large language models as callable tools for searching records, reading metadata, retrieving citations, and listing or downloading files.

How do I use Zenodo with Claude or ChatGPT via MCP? For Claude Desktop or Cursor IDE, install the mcp_sdk_core server and add it to your MCP client config (claude_desktop_config.json or mcp.json) as shown in the quickstart. For OpenAI-compatible / ChatGPT-style workflows, run the mcp_api FastAPI service and call its MCP-compatible tools from your framework (e.g., LangChain, LangGraph) or OpenAI-compatible client.

Which MCP clients are supported? Any MCP-compatible client can use the mcp_sdk_core server over the standard MCP transport; it is tested with Cursor IDE and works with Claude Desktop. The mcp_api service targets LLM frameworks such as LangChain and LangGraph, OpenAI-compatible clients, and platforms such as LibreChat.

Do I need a Zenodo API token? The FastAPI service reads a Zenodo API token from .env (see .env.example). Some Zenodo operations work without a token, but a token is recommended for reliable access.

Is mcp-zenodo on PyPI? Not at this time — install it by cloning the repository as shown in the quickstart.


Contributing

Contributions to both implementations are welcome. Please see the implementation READMEs (mcp_sdk_core, mcp_api) for details.


License

This project is licensed under the Apache License 2.0 — see the LICENSE file for details.


Citation

If you use mcp-zenodo in your work, please cite it. Citation metadata is provided in CITATION.cff. Example:

Seyedkazemi Ardebili, M. mcp-zenodo: A Zenodo MCP server. https://github.com/MSKazemi/mcp-zenodo

Available Tools

5 tools
detect_data_typeA

Determine if a Zenodo record is a dataset, software, or article.

Args:
    record_id: The ID of the Zenodo record to analyze
    
Returns:
    Dictionary containing the detected data type and confidence score
ParametersJSON Schema
NameRequiredDescriptionDefault
record_idYes

TDQS

A3.9/5.0
Behavior3/5

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

The description discloses the return format (dictionary with data type and confidence score), which is useful. However, without annotations, it does not state whether the operation is read-only, what permissions are required, or how errors are handled. This leaves gaps for a tool that could involve network calls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single clear purpose statement followed by a brief Args/Returns section. It is front-loaded with the main action and contains no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description provides the essential information about input and output. However, it does not explain what confidence score means, possible data type values beyond the initial three, or fallback behavior for unclassifiable records.

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?

The input schema only defines record_id as a string with no explanation. The description compensates by specifying that it is 'The ID of the Zenodo record to analyze', giving semantic meaning. However, it does not specify the expected format (e.g., numeric ID or DOI), leaving some ambiguity.

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 description uses the specific verb 'Determine' with a clear resource ('a Zenodo record') and identifies the classification categories (dataset, software, article). This distinguishes it from sibling tools like search_records or get_metadata, which perform different operations.

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

Usage Guidelines3/5

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

The description implies usage for classification but does not explicitly state when to use this tool versus siblings, nor does it mention any exclusions. There is no guidance on what to do if the record is not one of the listed types.

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

get_citationA

Get a citation for a Zenodo record in the specified format.

Args:
    record_id: The ID of the Zenodo record
    format: The citation format (bibtex, apa, etc.)
    
Returns:
    CitationResponse containing the citation
ParametersJSON Schema
NameRequiredDescriptionDefault
formatNobibtex
record_idYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations provided, the description carries the transparency burden. It discloses the return type (CitationResponse) but does not mention potential errors, accepted format values beyond examples, or any read-only guarantees. The behavioral scope is minimally covered but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a concise docstring with a clear one-sentence purpose, followed by structured Args and Returns sections. It contains no fluff and efficiently communicates essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool, the description covers purpose, parameters, and return type. It lacks details on error handling or a definite list of supported formats ('etc.' is vague), but overall it is reasonably complete given the tool's simplicity and lack of an output schema.

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

Parameters5/5

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

The description explicitly explains both parameters: record_id as 'The ID of the Zenodo record' and format as 'The citation format (bibtex, apa, etc.)'. Since the schema only provides field names and defaults, the description adds meaningful examples and clarifies the expected semantics, compensating for the 0% schema coverage.

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 description clearly states 'Get a citation for a Zenodo record in the specified format.' It uses a specific verb ('Get') with a clear resource ('citation for a Zenodo record') and distinguishes itself from sibling tools like search_records and get_metadata by focusing on citation generation.

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?

The description implies usage when a citation is needed for a Zenodo record, providing clear context. However, it does not explicitly state when not to use this tool or mention alternatives, such as using get_metadata for record details instead of a formatted citation.

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

get_metadataB

Retrieve detailed metadata for a Zenodo record.

Args:
    record_id: The ID of the Zenodo record
    include_files: Whether to include file information
    include_versions: Whether to include version information
    
Returns:
    MetadataResponse containing the record metadata
ParametersJSON Schema
NameRequiredDescriptionDefault
record_idYes
include_filesNo
include_versionsNo

TDQS

B3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It discloses only the basic operation and return type ('MetadataResponse'), but lacks information about prerequisites, error behavior, rate limits, or any non-obvious side effects. The include_files/include_versions args are mentioned but only as schema parameter semantics.

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 description is concise and logically structured: a one-sentence overview, an Args block, and a Returns line. There is no redundant text, though the Args block is formatted with colons instead of bullets, which is slightly less scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description relies on the vague statement 'Returns: MetadataResponse containing the record metadata.' It does not explain what fields are in the response, how include_files/versions affect the output, or any edge cases. The absence of usage context further limits completeness.

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?

The input schema has 0% description coverage, but the description compensates by explaining all three parameters: record_id as 'The ID of the Zenodo record', include_files as 'Whether to include file information', and include_versions as 'Whether to include version information'. These explanations provide the meaning missing from the schema.

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

Purpose4/5

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

The description clearly states the tool's function: 'Retrieve detailed metadata for a Zenodo record.' The verb 'retrieve' and the resource 'metadata' distinguish it from siblings like search_records and list_files, though it does not explicitly name alternatives.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. It does not mention that this is for fetching a record by ID rather than searching, nor does it reference sibling tools. The agent must infer usage from the tool name and args.

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

list_filesA

List all files available in a Zenodo record.

Args:
    record_id: The ID of the Zenodo record
    include_metadata: Whether to include file metadata
    
Returns:
    Dictionary containing the list of files and their metadata
ParametersJSON Schema
NameRequiredDescriptionDefault
record_idYes
include_metadataNo

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries full responsibility. It discloses the action (listing files) and the return type (dictionary with files and metadata), but it does not mention permissions, error behavior, or pagination. For a simple read-only tool, it's adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and structured into Args and Returns sections, with each sentence adding value. It is front-loaded with the primary purpose and does not waste words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with only two parameters and no output schema, the description covers the essential context: what it lists, the parameters, and the return format. It lacks edge-case details (e.g., record not found), but that is acceptable given its simplicity.

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 description coverage is 0%, so the description must explain parameters. It provides meaningful explanations for both 'record_id' ('The ID of the Zenodo record') and 'include_metadata' ('Whether to include file metadata'), going beyond the schema's bare names.

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 description clearly states the tool's function: 'List all files available in a Zenodo record.' It uses a specific verb ('list') with a specific resource ('files in a Zenodo record'), and it distinguishes from siblings like search_records and get_metadata by focusing on file listing.

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

Usage Guidelines3/5

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

The description implies usage context (when you need to see files in a Zenodo record) but does not explicitly contrast with sibling tools or provide exclusions. It does not say when to prefer this over search_records or get_metadata, but the purpose is distinct enough to infer.

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

search_recordsB
Search for records in Zenodo.

Args:
    query: Search query
    max_results: Maximum number of results to return
    sort: Sort order (bestmatch, mostrecent)
    
Returns:
    Dictionary containing search results
ParametersJSON Schema
NameRequiredDescriptionDefault
sortNomostrecent
queryYes
max_resultsNo

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It only mentions return type ('Dictionary containing search results') but discloses no behavioral traits such as rate limits, pagination, authentication requirements, or whether the operation is read-only. There is no indication of side effects or edge cases.

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 description is concise and well-structured with separate Args and Returns sections. It avoids excess verbiage, though the Args section partly duplicates schema information. Overall, it is efficient and front-loaded with the purpose statement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple search tool with 3 parameters and no output schema, the description provides the essential purpose, parameter meanings, and return type. However, it lacks usage context (e.g., when to use vs alternatives) and gives no detail about the returned dictionary structure. It is adequate for invocation but not comprehensive.

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 0%, so the description must compensate. It lists all three parameters, but 'query: Search query' is tautological. 'max_results: Maximum number of results to return' and 'sort: Sort order (bestmatch, mostrecent)' add useful semantics, including sort options not present in the schema. However, descriptions are minimal and lack constraints or format details.

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 description states 'Search for records in Zenodo,' which is a specific verb (Search) and resource (records in Zenodo). This clearly distinguishes it from sibling tools like get_citation, detect_data_type, get_metadata, and list_files, which have different purposes.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It does not mention any exclusions, prerequisites, or context that would help an agent decide between search_records and sibling tools.

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. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observeddetect_data_type
    • First observedget_citation
    • First observedget_metadata
    • First observedlist_files
    • First observedsearch_records

TDQS

A3.8/5.0
Disambiguation5/5

Each tool targets a distinct aspect: search_records for querying, get_citation for citations, detect_data_type for classification, get_metadata for detailed metadata, and list_files for files. There is no meaningful overlap between their purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (search_records, get_citation, detect_data_type, get_metadata, list_files). The verbs clearly indicate the action, and the nouns indicate the resource aspect.

Tool Count5/5

Five tools is well-scoped for a server focused on searching and retrieving Zenodo records. Each tool earns its place, and the count is within the ideal 3-15 range without feeling thin or bloated.

Completeness4/5

The tool set covers the core read-only workflow: search, retrieve metadata, list files, get citations, and detect data types. Minor gaps exist (e.g., no direct record download, no deposit/update functionality), but for a read-oriented server the surface is largely complete.

Maintenance

ActivityStale
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/MSKazemi/mcp-zenodo'

If you have feedback or need assistance with the MCP directory API, please join our Discord server