edi-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@edi-mcpfind recent LTER data packages about stream discharge in Wisconsin"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
edi-mcp
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 everywhereAgent | What the script does |
|
|
| adds |
|
|
|
|
| adds an |
| adds |
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-mcpClaude 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 |
| Search packages by keyword, scope/site, author, time and bounding box |
| Browse the repository hierarchy |
| DOI, landing page, entities and sizes for one package revision |
| Compact projection of the EML metadata |
| Data entities with names, sizes, checksums, formats and attributes |
| First rows of a tabular entity |
| Formatted citation (ESIP, DRYAD, BibTeX) |
| PASTA congruence-check summary (key required) |
| Provenance sources and descendants (key required) |
| Recent inserts, updates and deletes (key required) |
| Download/read counts (key required) |
| Save data locally (stdio only) |
| Server, backend and key status |
License
MIT © 2026 The Regents of the University of New Mexico.
Available Tools
8 toolsedi_get_metadataRead a package's EML metadataRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Sections to return: overview (abstract, keywords, dates), people, coverage (geographic, temporal, taxonomic), methods, rights, project (funding), entities. Default: all. | |
| package | Yes | A 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). | |
| revision | No | Revision when package names none: a number, 'newest' (default) or 'oldest'. | |
| max_text_chars | No | Cut abstract, methods and rights to this length. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | No | |
| title | No | |
| source | No | |
| license | No | |
| methods | No | |
| project | No | |
| pubDate | No | |
| abstract | No | |
| contacts | No | |
| coverage | No | |
| creators | No | |
| entities | No | |
| keywords | No | |
| language | No | |
| resolved | No | |
| nextSteps | No | |
| packageId | Yes | |
| publisher | No | |
| shortName | No | |
| emlVersion | No | |
| maintenance | No | |
| revisionFrom | Yes | |
| creatorsTotal | No | |
| entitiesTotal | No | |
| keywordsTotal | No | |
| abstractTruncated | No | |
| associatedParties | No | |
| alternateIdentifiers | No |
edi_get_packageGet an EDI data packageRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| package | Yes | A 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). | |
| revision | No | Revision when package names none: a number, 'newest' (default) or 'oldest'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| doi | No | |
| notes | No | |
| title | No | |
| doiUrl | No | |
| series | Yes | |
| source | No | |
| license | No | |
| pubDate | No | |
| creators | No | |
| entities | Yes | |
| isNewest | No | |
| resolved | No | |
| revision | Yes | |
| nextSteps | No | |
| packageId | Yes | |
| portalUrl | Yes | |
| totalBytes | No | |
| entityCount | Yes | |
| metadataUrl | Yes | |
| revisionFrom | Yes | |
| creatorsTotal | No | |
| newestRevision | No |
edi_list_entitiesList a package's data entitiesRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Entities per page (1-200). | |
| entity | No | Only this entity: its id, name or file name (case-insensitive). | |
| offset | No | Index of the first entity (paging). | |
| package | Yes | A 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). | |
| revision | No | Revision when package names none: a number, 'newest' (default) or 'oldest'. | |
| include_checksums | No | Fetch missing SHA-1 checksums (one request per entity, at most 25). | |
| include_attributes | No | Return each entity's columns (definitions, units, codes). |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| notes | No | |
| source | No | |
| entities | Yes | |
| resolved | No | |
| nextSteps | No | |
| packageId | Yes | |
| revisionFrom | Yes | |
| attributesElided | No |
edi_list_identifiersList package identifiers in a scopeRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Identifiers per page (1-1000). | |
| scope | Yes | A scope (knb-lter-jrn), LTER site code (JRN) or scope name or location ('Jornada', 'Hubbard Brook'); see edi_list_scopes. | |
| offset | No | Index of the first identifier (paging). |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| notes | No | |
| scope | Yes | |
| source | No | |
| resolved | No | |
| nextSteps | No | |
| identifiers | Yes |
edi_list_revisionsList the revisions of a packageRead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| package | Yes | A 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
| Name | Required | Description |
|---|---|---|
| notes | No | |
| scope | Yes | |
| newest | Yes | |
| oldest | Yes | |
| series | Yes | |
| source | No | |
| resolved | No | |
| nextSteps | No | |
| revisions | Yes | |
| identifier | Yes | |
| newestPackageId | Yes |
edi_list_scopesList EDI scopesRead-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=...).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Only one kind: lter (LTER sites), edi (general EDI submissions), bulk (generated; excluded from search by default), project, agency or other. |
Output Schema
| Name | Required | Description |
|---|---|---|
| live | Yes | |
| page | Yes | |
| notes | No | |
| scopes | Yes | |
| source | No | |
| resolved | No | |
| nextSteps | No | |
| snapshotAsOf | Yes |
edi_pingCheck edi-mcp statusRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| check_api | No | Also 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
| Name | Required | Description |
|---|---|---|
| api | No | |
| pong | No | |
| notes | No | |
| source | No | |
| backend | Yes | |
| version | Yes | |
| resolved | No | |
| endpoints | Yes | |
| keySource | Yes | |
| nextSteps | No | |
| transport | Yes | |
| downloadDir | No | |
| keyConfigured | Yes | |
| protocolVersion | Yes | |
| downloadsEnabled | Yes | |
| keyRequiredTools | Yes |
edi_search_packagesSearch EDI data packagesRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | [west, south, east, north] in decimal degrees; geographic coverage must intersect it. west <= east (no antimeridian crossing). | |
| sort | No | relevance, or publication date: newest or oldest (oldest lists undated packages first). | relevance |
| limit | No | Packages per page (1-50). | |
| query | No | Free text over titles, keywords and abstracts (words, "phrases", AND/OR/NOT). Omit to browse with filters only. | |
| scope | No | Only this scope. A scope (knb-lter-jrn), LTER site code (JRN) or scope name or location ('Jornada', 'Hubbard Brook'); see edi_list_scopes. | |
| author | No | A creator's last name, e.g. 'Likens' (any case). | |
| offset | No | Index of the first result (paging). | |
| end_year | No | Temporal coverage starts in this year or earlier. | |
| start_year | No | Temporal coverage reaches this year or later. | |
| include_bulk | No | Include the generated bulk scopes (ecotrends, lter-landsat, lter-landsat-ledaps; ~36k records) when no scope is given. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| items | Yes | |
| notes | No | |
| source | No | |
| resolved | No | |
| nextSteps | No | |
| totalExact | Yes |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
edi_get_metadata - First observed
edi_get_package - First observed
edi_list_entities - First observed
edi_list_identifiers - First observed
edi_list_revisions - First observed
edi_list_scopes - First observed
edi_ping - First observed
edi_search_packages
Related MCP Connectors
Authenticated public evidence search, verification, research jobs, exports, and webhooks.
Search DataCite datasets and software, fetch DOI metadata, trace relations, format citations.
Discover, verify, and access NASA Earth science datasets via the Common Metadata Repository (CMR)
Search public Australian environmental evidence with provenance across authoritative catalogues.
Related MCP Servers
- AlicenseAqualityAmaintenanceSearches 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.61,605 PyPI4MIT
- AlicenseNot gradedqualityBmaintenanceProvides access to DataCite DOIs for research datasets, enabling searching and retrieval of dataset metadata.42 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP agents to discover, import, query, visualize, select, and cite NEON and local scientific datasets while keeping credentials, private paths, and bulk data out of model context.MIT
- AlicenseAqualityBmaintenanceEnables 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.20MIT