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 metadataA
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

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond them: text is truncated at max_text_chars and lists are returned capped with totals, which tells an agent the payload may be lossy. Auth requirements and error behavior remain unstated.

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?

Two sentences plus a short routing clause, front-loading what the tool returns before the parameter and follow-up guidance. The section enumeration is long but directly useful; there is essentially no filler.

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?

An output schema exists, so return-shape exposition is not required, and the description still sketches the sections usefully. Combined with the truncation/capping note and the sibling handoff, an agent has enough to call it correctly; only permission/error context 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%, so include, package, revision and max_text_chars are fully documented in the schema itself, making 3 the baseline. The description largely restates the section list and truncation rule rather than adding new syntax or format guidance for the parameters.

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?

States a specific resource (a package's EML) and its projection into named sections (overview, people, coverage, methods, rights, project, entities), so an agent knows exactly what comes back. It does not differentiate itself from the closest sibling edi_get_package, leaving some ambiguity about which retrieval tool to pick.

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?

Gives concrete usage for the include parameter ('Choose sections with include') and an explicit next-step handoff ('call edi_list_entities for column definitions, units and codes'). It stops short of stating when to prefer this over edi_get_package or edi_search_packages.

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

edi_get_packageGet an EDI data packageA
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

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered; the description adds useful behavioral context by disclosing the returned surface and the flexible identifier forms (package id, series, DOI, portal/PASTA URL, scope). It stops short of auth/rate-limit or resolution-failure behavior, so not a 5.

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-loads the return contents, then accepted inputs, then the next-step routing — a logical order with no filler. It is somewhat dense and repeats schema-level input details, which keeps it from a 5.

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?

An output schema exists, so enumerating return fields is technically redundant, but it aids selection; the description covers inputs, sibling routing, and scope. Nothing essential for correct invocation 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%, so both parameters are already documented; the description largely restates them ('series (newest unless revision is set)', 'site codes or scope names'). The 'newest unless revision is set' default interaction is mildly clarifying but duplicates the schema's own note, so baseline 3 applies.

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?

States a specific verb (get) and resource (one package revision) and enumerates exactly what the overview contains: title, publication date, creators, license, DOI, URLs, newest-revision flag, and data entities with sizes. It also implicitly distinguishes itself from siblings by pointing at edi_get_metadata and edi_list_entities.

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?

Explicitly routes the agent: 'Next: call edi_get_metadata for the full description or edi_list_entities for columns', naming both alternatives and the condition that selects each. It also states the accepted identifier forms, so the agent knows when this tool is applicable.

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

edi_list_entitiesList a package's data entitiesA
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

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, open-world, and non-destructive behavior, and the description adds useful context such as the PASTA/DataONE URLs and the optional SHA-1 checksum behavior. It could say more about pagination or authentication, but it adds meaningful behavioral detail beyond the annotations.

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 front-loaded with the core operation and remains dense but purposeful; the final sentence routes to next tools. It is somewhat overpacked with return-field details, but nothing is clearly wasteful.

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?

Given the output schema and annotations, the description provides enough context to call the tool correctly and know what to do next. It covers the package-revision scope, returned entity details, checksum option, URLs, and follow-up tools.

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%, so the input schema already documents all seven parameters thoroughly. The description does not add substantive parameter-level semantics beyond what the schema provides, which is appropriate but not exceptional.

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 that this tool lists every data entity in one package revision and enumerates the returned fields, making the resource and scope specific. It does not explicitly name sibling tools such as edi_get_package or edi_get_metadata, so sibling differentiation is implied rather than stated.

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?

It gives clear next-step guidance: call edi_preview_entity or edi_download_entities with an entityId. It does not explicitly say when to choose this over sibling package/metadata tools, but the intended usage context is clear.

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

edi_list_identifiersList package identifiers in a scopeA
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

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds non-obvious domain behavior: results are ascending, paging is offset/limit, and identifiers are numeric with package = scope.identifier.revision. No mention of rate limits or auth, hence not a 5.

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?

Three short sentences, front-loaded with the core action and scope semantics before the pagination note and the next-step pointer. No filler and nothing buried.

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?

An output schema exists, so return shape need not be explained, and all parameters plus the safety annotations are fully specified. Domain specifics an agent needs (scope forms, identifier numbering, paging) are all present, leaving nothing material missing for correct invocation.

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 coverage is 100%, so all three parameters are documented in the schema with bounds and defaults; baseline 3 applies. The description restates the scope forms and paging model but adds no syntax or edge-case detail beyond what the schema already provides.

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?

States a specific verb and resource ("List the package identifiers in one scope") plus ordering and pagination behavior, and clarifies the scope forms with concrete examples. It also distinguishes itself from edi_list_revisions by pointing at the next call, so an agent can tell the two apart without opening either schema.

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?

Gives a clear follow-up path ("Next: call edi_list_revisions(package='scope.identifier')") and directs scope resolution to edi_list_scopes via the schema note. It never says when to prefer this over edi_search_packages, which is the main sibling ambiguity left to inference.

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

edi_list_revisionsList the revisions of a packageA
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

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), but the description adds genuinely useful context beyond them: anonymous calls work yet DataONE 'can lag new revisions' without an API key, and results are returned ascending. That staleness/auth caveat is the kind of trait structured fields cannot express.

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-loads what the tool returns and its ordering, then input forms, then the caveat, then the next step. Dense but every clause carries information; the accepted-input enumeration is the only slightly redundant part.

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?

With an output schema present, return values need no explanation, and the description covers input formats, the anonymous-access caveat, and the follow-up call. It lacks any note on error behavior for an unknown/invalid identifier, which is the one remaining gap for a lookup tool.

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 the single parameter's accepted formats (series, revision, DOI, portal/PASTA URL, site code) are already documented in the schema; the description largely restates them. No additional syntax or normalization rules are added, so the baseline 3 applies.

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?

States a specific verb and resource ('List every revision of one data package'), names the identifier form (scope.identifier), and specifies ordering (ascending, with newest and oldest). An agent can distinguish this from edi_get_package or edi_list_identifiers without opening a schema.

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?

Gives a concrete follow-up chain ('Next: call edi_get_package(package=newestPackageId)') and enumerates accepted input forms, which tells the agent when this tool is the right entry point. It does not explicitly say when to prefer a sibling such as edi_list_identifiers, so it stops short of full when-not guidance.

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

edi_list_scopesList EDI scopesA
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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/openWorld/non-destructive, and the description adds meaningful context beyond them: results come live from PASTA with an API key and from a dated snapshot without one, with a mirror at edi://reference/scopes. It stops short of describing how large the list is or how stale the snapshot is.

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?

Three tight sentences: purpose and payload first, then the API-key/snapshot caveat, then the next-step routing. Every sentence carries information an agent would otherwise have to infer.

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?

With an output schema present, the return values need no further explanation, yet the description still summarizes them. Auth-dependent behavior and downstream usage are both covered, leaving nothing essential missing for a correctly-invoked call.

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?

The single 'kind' parameter is fully documented in the schema with its enum meanings, so the schema does the heavy lifting (100% coverage). The description adds no further explanation of the kind filter, though it does clarify that scope names/site codes serve as identifiers across tools.

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?

States a specific verb and resource (list the repository's scopes) and enumerates the returned fields: name, kind, LTER site code, location and package counts on PASTA and DataONE. The example scope IDs (knb-lter-hbr, edi) make it immediately distinguishable from the sibling list/get tools.

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?

Explicitly frames this as a discovery step and routes onward: 'Next: call edi_search_packages(scope=...) or edi_list_identifiers(scope=...).' It also warns that 'Scope arguments elsewhere also accept these site codes and names,' which tells the agent why to call this before other tools.

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

edi_pingCheck edi-mcp statusA
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

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive/open-world, and the description adds substantial context beyond them: it never reveals the key, it discloses backend routing logic based on key presence, states which tools require a key, and explains that check_api triggers one small (cost-bearing) request to the backend. This is exactly the extra behavioral detail annotations cannot carry.

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 capability list is front-loaded and dense with no filler, and the actionable next step lands last. However, the opening sentence is a long run-on enumerating five separate facts, which slightly hurts scannability.

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?

Although an output schema exists, the description still summarizes the report contents (version, protocol, key availability, backend, key-requiring tools, downloads), and it covers the one optional parameter's side effect. An agent has everything needed to decide whether and how to call this tool.

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 the single parameter is fully documented in the schema, including the token exchange and DataONE query mechanics. The description restates check_api mostly in terms of intent ('confirm the key and connectivity'), adding only marginal meaning beyond the schema, so baseline 3 applies.

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?

States a specific verb+resource ('Liveness and capability report') and enumerates exactly what it reports: server version/protocol, EDI API key availability, backend routing (pasta vs dataone), which tools need a key, and download status. This is clearly distinguishable from the data-fetching siblings like edi_get_package or edi_search_packages.

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?

Gives concrete usage context (use check_api=true to verify the key and connectivity) and an explicit next step: 'call edi_search_packages to find data packages.' It does not name a competing tool it should be chosen over, but for a diagnostic tool the routing guidance is clear. Lacks explicit when-not-to-use guidance, so not a 5.

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

edi_search_packagesSearch EDI data packagesA
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

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld, so the bar is lower, and the description still adds real behavior: only the newest revision of each package is returned, and generated bulk scopes (~36k records) are excluded unless include_bulk=true. It does not cover pagination/result-count limits, but the dedup and exclusion semantics are genuinely useful.

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 what is searchable, then return shape, then the bulk caveat, then the next-step call. It is dense but well ordered; the return-field enumeration slightly duplicates the output schema but costs little.

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?

With 10 parameters, full schema coverage, an output schema, and annotations present, the description supplies everything else an agent needs: bulk exclusion, newest-revision dedup, and explicit follow-up tools.

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 the per-parameter descriptions already carry the semantics (bbox ordering, sort enum nuances, start/end_year overlap logic). The description's parameter list is summary-level restatement rather than added meaning, so the baseline 3 applies.

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 names a specific verb (Search) and resource (EDI/LTER data packages) and immediately enumerates the facets it searches over, so it is unmistakably distinct from the edi_get_* and edi_list_* siblings.

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?

It gives clear context (filter by scope, author, temporal overlap, bbox; sort; paginate) and routes the agent forward with 'Next: call edi_get_package or edi_get_metadata with a packageId', plus points to edi_list_scopes for scope resolution. It lacks an explicit when-not-to-use statement, but the alternative routing is well covered.

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.

  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

TDQS

A4/5.0

Scored across 8 tools

Disambiguation4/5

Tools are mostly distinct, but edi_get_package and edi_get_metadata both retrieve package-level information (summary vs full EML), and edi_list_entities overlaps with the entities section of edi_get_metadata. The descriptions clearly guide which to use, but the tiered granularity creates minor potential for misselection.

Naming Consistency4/5

All tools use the edi_ prefix and snake_case, with a consistent verb_noun pattern except edi_ping (verb only). This is a minor deviation, but the set remains highly readable and predictable.

Tool Count5/5

Eight tools are well-scoped for a data repository client, covering discovery, metadata retrieval, and health checking without redundancy. Each tool earns its place.

Completeness2/5

The descriptions reference edi_preview_entity and edi_download_entities as next steps, but these tools are absent from the set. This leaves a critical gap: agents can discover and inspect metadata but cannot retrieve or preview actual data, which is a core function of the domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

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