Skip to main content
Glama
idss-mesa
by idss-mesa

edi-mcp

MCP 2026-07-28 License: MIT Docs

A Model Context Protocol server (spec 2026-07-28) for the Environmental Data Initiative (EDI) PASTA+ data repository. It lets agents search, inspect, preview, download and cite LTER and EDI ecological data packages.

Documentation: https://idss-mesa.github.io/edi-mcp/

Status: under construction. The discovery tools (edi_ping, search, list scopes/identifiers/revisions) and the package tools (edi_get_package, edi_get_metadata, edi_list_entities) work; the rest of the tools below are planned. See DESIGN.md for decisions and RESEARCH.md for verified API facts.

Installation

Full instructions for macOS, Linux and Windows: https://idss-mesa.github.io/edi-mcp/getting-started/install/.

Install script

scripts/install.sh registers the server with every supported agent it finds. It creates the server environment with uv sync if .venv/bin/edi-mcp is missing, prefers each agent's own CLI when one is installed (claude mcp add, codex mcp add, gemini mcp add) and otherwise merges an entry into the agent's config file, keeping everything else in the file and leaving a .bak copy. It needs bash and uv.

git clone https://github.com/idss-mesa/edi-mcp.git && cd edi-mcp
scripts/install.sh                               # every agent detected on this machine
scripts/install.sh --with-key                    # also store EDI_API_KEY (read from env or a hidden prompt)
scripts/install.sh --agents all --dry-run        # preview the change for every agent
scripts/install.sh --agents claude,goose         # just Claude Code and Goose
scripts/install.sh --scope project               # project-level config (claude, codex, gemini, opencode)
scripts/install.sh --env EDI_MCP_SERVER__LOG_LEVEL=debug   # any extra environment variable
scripts/install.sh --uninstall                   # remove the registration everywhere

Agent

What the script does

claude (Claude Code)

claude mcp add --scope user edi -- /path/to/edi-mcp/.venv/bin/edi-mcp

claude-desktop

adds mcpServers.edi to claude_desktop_config.json

codex (OpenAI Codex CLI)

codex mcp add edi -- …, or an [mcp_servers.edi] table in ~/.codex/config.toml

gemini (Gemini CLI)

gemini mcp add --scope user edi …, or mcpServers.edi in ~/.gemini/settings.json

goose

adds an edi stdio extension to ~/.config/goose/config.yaml

opencode

adds mcp.servers.edi (v2) or mcp.edi (v1) to ~/.config/opencode/opencode.json

The script writes absolute paths, because desktop apps do not inherit your shell PATH. There is no option that takes the key itself; with --with-key the key is stored in plain text in each agent's config (written owner-only) and never printed. On Windows, run it from Git Bash or follow the manual steps; restart desktop apps after installing.

Manual

uv tool install git+https://github.com/idss-mesa/edi-mcp
claude mcp add edi -s user -e EDI_API_KEY="$EDI_API_KEY" -- edi-mcp

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows, ~/.config/Claude/claude_desktop_config.json on Linux):

{
  "mcpServers": {
    "edi": {
      "command": "/ABSOLUTE/PATH/TO/edi-mcp",
      "args": [],
      "env": { "EDI_API_KEY": "paste-your-key-here" }
    }
  }
}

Other clients (Codex CLI, Gemini CLI, Goose, OpenCode, VS Code, hosted HTTP): https://idss-mesa.github.io/edi-mcp/getting-started/clients/.

Related MCP server: mcp-datacite

Authentication

Since 2026-07-30 EDI requires an API key for every PASTA REST call, including public reads. Create a free key at https://auth.edirepository.org (Profile → API keys) and set it as EDI_API_KEY. Without a key, edi-mcp falls back to the anonymous DataONE replicas of EDI content: search, metadata, entity download and citations work, while quality reports, lineage, change feeds and read counts need a key.

Planned tools

Tool

Purpose

edi_search_packages

Search packages by keyword, scope/site, author, time and bounding box

edi_list_scopes / edi_list_identifiers / edi_list_revisions

Browse the repository hierarchy

edi_get_package

DOI, landing page, entities and sizes for one package revision

edi_get_metadata

Compact projection of the EML metadata

edi_list_entities

Data entities with names, sizes, checksums, formats and attributes

edi_preview_entity

First rows of a tabular entity

edi_get_citation

Formatted citation (ESIP, DRYAD, BibTeX)

edi_get_quality_report

PASTA congruence-check summary (key required)

edi_get_lineage

Provenance sources and descendants (key required)

edi_recent_changes

Recent inserts, updates and deletes (key required)

edi_get_read_counts

Download/read counts (key required)

edi_download_entities / edi_download_package

Save data locally (stdio only)

edi_ping

Server, backend and key status

License

MIT © 2026 The Regents of the University of New Mexico.

Available Tools

8 tools
edi_get_metadataRead a package's EML metadata
Read-onlyIdempotent

The package's EML, projected to compact sections: overview (abstract, keywords, dates), people (creators, contacts with ORCIDs), coverage (bounding boxes, date ranges, taxa), methods, rights and license, project and funding, and entities. Choose sections with include; long text is cut at max_text_chars and lists are capped with totals. Next: call edi_list_entities for column definitions, units and codes.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoSections to return: overview (abstract, keywords, dates), people, coverage (geographic, temporal, taxonomic), methods, rights, project (funding), entities. Default: all.
packageYesA package: knb-lter-hbr.14.22, knb-lter-hbr.14 (newest unless revision is set), a DOI, or a portal or PASTA URL; the scope may be a site code or name (jrn.210548103).
revisionNoRevision when package names none: a number, 'newest' (default) or 'oldest'.
max_text_charsNoCut abstract, methods and rights to this length.

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesNo
titleNo
sourceNo
licenseNo
methodsNo
projectNo
pubDateNo
abstractNo
contactsNo
coverageNo
creatorsNo
entitiesNo
keywordsNo
languageNo
resolvedNo
nextStepsNo
packageIdYes
publisherNo
shortNameNo
emlVersionNo
maintenanceNo
revisionFromYes
creatorsTotalNo
entitiesTotalNo
keywordsTotalNo
abstractTruncatedNo
associatedPartiesNo
alternateIdentifiersNo
edi_get_packageGet an EDI data package
Read-onlyIdempotent

Overview of one package revision: title, publication date, creators, license, DOI, portal and metadata URLs, whether it is the newest revision, and its data entities with sizes and the total. Accepts package ids, series (newest unless revision is set), DOIs, portal or PASTA URLs, and site codes or scope names for the scope. Next: call edi_get_metadata for the full description or edi_list_entities for columns.

ParametersJSON Schema
NameRequiredDescriptionDefault
packageYesA package: knb-lter-hbr.14.22, knb-lter-hbr.14 (newest unless revision is set), a DOI, or a portal or PASTA URL; the scope may be a site code or name (jrn.210548103).
revisionNoRevision when package names none: a number, 'newest' (default) or 'oldest'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
doiNo
notesNo
titleNo
doiUrlNo
seriesYes
sourceNo
licenseNo
pubDateNo
creatorsNo
entitiesYes
isNewestNo
resolvedNo
revisionYes
nextStepsNo
packageIdYes
portalUrlYes
totalBytesNo
entityCountYes
metadataUrlYes
revisionFromYes
creatorsTotalNo
newestRevisionNo
edi_list_entitiesList a package's data entities
Read-onlyIdempotent

Every data entity (table or file) of one package revision: name, type, file name, format, byte size, record count, CSV layout and the columns with definitions, storage types, units, date formats, code lists and missing-value codes; optional SHA-1 checksums. Gives the PASTA data URL and a DataONE URL readable without a key. Next: call edi_preview_entity or edi_download_entities with an entityId.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoEntities per page (1-200).
entityNoOnly this entity: its id, name or file name (case-insensitive).
offsetNoIndex of the first entity (paging).
packageYesA package: knb-lter-hbr.14.22, knb-lter-hbr.14 (newest unless revision is set), a DOI, or a portal or PASTA URL; the scope may be a site code or name (jrn.210548103).
revisionNoRevision when package names none: a number, 'newest' (default) or 'oldest'.
include_checksumsNoFetch missing SHA-1 checksums (one request per entity, at most 25).
include_attributesNoReturn each entity's columns (definitions, units, codes).

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
notesNo
sourceNo
entitiesYes
resolvedNo
nextStepsNo
packageIdYes
revisionFromYes
attributesElidedNo
edi_list_identifiersList package identifiers in a scope
Read-onlyIdempotent

List the package identifiers in one scope, ascending and paginated (offset/limit). The scope may be exact (knb-lter-hbr), an LTER site code (HBR) or a name ('Hubbard Brook'). Identifiers are numbers; a package is scope.identifier.revision. Next: call edi_list_revisions(package='scope.identifier') for one identifier's revisions.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoIdentifiers per page (1-1000).
scopeYesA scope (knb-lter-jrn), LTER site code (JRN) or scope name or location ('Jornada', 'Hubbard Brook'); see edi_list_scopes.
offsetNoIndex of the first identifier (paging).

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
notesNo
scopeYes
sourceNo
resolvedNo
nextStepsNo
identifiersYes
edi_list_revisionsList the revisions of a package
Read-onlyIdempotent

List every revision of one data package (scope.identifier), ascending, with the newest and oldest. Accepts a series (knb-lter-hbr.14), any revision, a DOI, a portal or PASTA URL, and site codes or scope names in place of the scope. Without an API key DataONE answers and can lag new revisions. Next: call edi_get_package(package=newestPackageId).

ParametersJSON Schema
NameRequiredDescriptionDefault
packageYesA package series or any revision of it: knb-lter-hbr.14, knb-lter-hbr.14.22, knb-lter-hbr/14, a DOI, a portal or PASTA URL; the scope may be a site code or name (jrn.210548103).

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesNo
scopeYes
newestYes
oldestYes
seriesYes
sourceNo
resolvedNo
nextStepsNo
revisionsYes
identifierYes
newestPackageIdYes
edi_list_scopesList EDI scopes
Read-onlyIdempotent

List the repository's scopes (knb-lter-hbr, edi, ...) with name, kind, LTER site code, location and package counts on PASTA and DataONE. With an API key the list comes live from PASTA; without one it is edi-mcp's dated snapshot (also edi://reference/scopes). Scope arguments elsewhere also accept these site codes and names. Next: call edi_search_packages(scope=...) or edi_list_identifiers(scope=...).

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoOnly one kind: lter (LTER sites), edi (general EDI submissions), bulk (generated; excluded from search by default), project, agency or other.

Output Schema

ParametersJSON Schema
NameRequiredDescription
liveYes
pageYes
notesNo
scopesYes
sourceNo
resolvedNo
nextStepsNo
snapshotAsOfYes
edi_pingCheck edi-mcp status
Read-onlyIdempotent

Liveness and capability report: server version and protocol, whether an EDI API key is available and therefore which backend serves this caller (pasta with a key, dataone without), which tools need a key, and whether downloads are enabled. Never reveals the key. With check_api=true it also makes one small request to that backend to confirm the key and connectivity. Next: call edi_search_packages to find data packages.

ParametersJSON Schema
NameRequiredDescriptionDefault
check_apiNoAlso make one small request to the backend serving this caller (with a key: exchange it for a token and list PASTA scopes; without: one DataONE query).

Output Schema

ParametersJSON Schema
NameRequiredDescription
apiNo
pongNo
notesNo
sourceNo
backendYes
versionYes
resolvedNo
endpointsYes
keySourceYes
nextStepsNo
transportYes
downloadDirNo
keyConfiguredYes
protocolVersionYes
downloadsEnabledYes
keyRequiredToolsYes
edi_search_packagesSearch EDI data packages
Read-onlyIdempotent

Search EDI/LTER data packages by free text, scope (exact, LTER site code or name such as 'Jornada'), creator last name, temporal overlap (start_year/end_year) and bounding box; sort by relevance or publication date; paginated (offset/limit). Returns the newest revision of each package with title, DOI, coverage dates, creators and keywords. Bulk generated scopes are excluded unless include_bulk=true. Next: call edi_get_package or edi_get_metadata with a packageId.

ParametersJSON Schema
NameRequiredDescriptionDefault
bboxNo[west, south, east, north] in decimal degrees; geographic coverage must intersect it. west <= east (no antimeridian crossing).
sortNorelevance, or publication date: newest or oldest (oldest lists undated packages first).relevance
limitNoPackages per page (1-50).
queryNoFree text over titles, keywords and abstracts (words, "phrases", AND/OR/NOT). Omit to browse with filters only.
scopeNoOnly this scope. A scope (knb-lter-jrn), LTER site code (JRN) or scope name or location ('Jornada', 'Hubbard Brook'); see edi_list_scopes.
authorNoA creator's last name, e.g. 'Likens' (any case).
offsetNoIndex of the first result (paging).
end_yearNoTemporal coverage starts in this year or earlier.
start_yearNoTemporal coverage reaches this year or later.
include_bulkNoInclude the generated bulk scopes (ecotrends, lter-landsat, lter-landsat-ledaps; ~36k records) when no scope is given.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
itemsYes
notesNo
sourceNo
resolvedNo
nextStepsNo
totalExactYes

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv0.1.0
    • First observededi_get_metadata
    • First observededi_get_package
    • First observededi_list_entities
    • First observededi_list_identifiers
    • First observededi_list_revisions
    • First observededi_list_scopes
    • First observededi_ping
    • First observededi_search_packages

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Searches and fetches research datasets across Zenodo, DataCite (Dryad/Figshare/Dataverse/OSF), NCBI omics archives (GEO/SRA/BioProject), and the literature (PubMed/OpenAIRE) through one normalized model — deduplicating by DOI, expanding organism queries with NCBI Taxonomy synonyms, and bridging papers to the datasets they produced. Resolves citations and open-access full text, and downloads files.
    6
    1,605 PyPI
    4
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides access to DataCite DOIs for research datasets, enabling searching and retrieval of dataset metadata.
    42 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to discover NEON ecological data products and sites, check data availability, list and download data files, and generate citations via the NEON Data API.
    20
    MIT