Skip to content

NASA Earthdata MCP

by nasa · remote · no sign-in to list tools · v1.0.0 · published by GitHub user nasa

Discover, verify, and access NASA Earth science datasets via the Common Metadata Repository (CMR)

Read only

7 tools: 7 only read.

Scanned Oct 21, 2026

2 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http earthdata https://cmr.earthdata.nasa.gov/mcp/v1

Findings

Matches of fixed checks, with the text they matched.

2 info
  • The description is 3,346 characters long, over the 2,000 this check looks for.

    Matched text

    description ends: "...s for highest precision - Use short_name when you already know the target product"

    What this check looks for
  • The description is 2,698 characters long, over the 2,000 this check looks for.

    Matched text

    description ends: "...ear" or "cloud-free" imagery, set cloud_cover_max to a low value (e.g., 10 or 20)"

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

7 tools

Only reads 7Claude Code: allow
  • get_citationsDiscover citation records directly associated with a collection, or look up a citation by identifier (e.g.No findings

    Why it is in this group

    • The name "get_citations" says "get": a word for reading.
    Description, as the server wrote it
    Discover citation records directly associated with a collection, or look up a citation by identifier (e.g. DOI). Use this tool to evaluate citation relevance for a collection. Key fields in each returned item: - concept_id: CMR citation concept ID - name: The title or name of the citation - identifier: The primary DOI or identifier - abstract: Abstract text - citation_metadata: Nested metadata including Year, Publisher, and Author list
  • get_collectionsSearch NASA CMR collections and return up to 10 lightweight normalized results.Reads text others write1 finding

    Why it is in this group

    • The name "get_collections" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.

    Findings

    • Info

      The description is 3,346 characters long, over the 2,000 this check looks for.

      Matched text

      description ends: "...s for highest precision - Use short_name when you already know the target product"

      What this check looks for
    Description, as the server wrote it
    Search NASA CMR collections and return up to 10 lightweight normalized results. Key return fields in each item: - concept_id: CMR collection concept ID - native_id: native ID of the collection record - revision_id: revision ID of the collection metadata - provider_id: provider ID of the collection - short_name: collection short name - entry_title: collection title - time_start / time_end: temporal coverage bounds - processing_level_id: processing level (e.g., L3, L4) - doi: digital object identifier - collection_data_type: data type (e.g., SCIENCE_QUALITY, NEAR_REAL_TIME) - temporal_resolution / spatial_resolution: extracted resolution strings - related_urls: links to landing pages, documentation, and tools Unfiltered searches are supported when you need broad exploration. IMPORTANT — relevance and coverage: A keyword-only search returns all collections whose metadata mentions those terms, regardless of whether they actually hold data for the user's region or time period. Collection declared extents are often global or multi-decadal, so a collection appearing in results does not mean it has granules for a specific area or date. When the user's question involves a time period or geographic region, include temporal_start_date/temporal_end_date and/or spatial_wkt_geometry to restrict results to collections that overlap that window. Follow up with get_granules (with the same filters) to confirm actual data availability. IMPORTANT — keyword AND logic: CMR treats each space-separated keyword as an independent term and requires ALL of them to appear somewhere in a collection's metadata (title, summary, science keywords, instruments, platforms, etc.). Words do not need to appear in the same field or adjacent to each other. Because every term must match, adding more words makes the search STRICTER, not broader — the opposite of typical web search engines. Prefer 2–4 precise scientific terms. If a search returns 0 results, try removing the least essential word before broadening other filters. Phrase search (exact word sequence) is available by wrapping the value in escaped double quotes, but you cannot mix a phrase with additional standalone keywords. Key parameters: - keyword: free-text keyword search over collection metadata (AND logic; see above) - concept_id: exact collection concept ID - short_name: collection short name - provider: data provider short name - temporal_start_date / temporal_end_date: restrict to collections whose declared range overlaps this window; set when the user specifies a time period - spatial_wkt_geometry: restrict to collections whose declared extent intersects this area; set when the user specifies a geographic region Iteration & Refinement: - Results are strictly capped at 10 items to optimize context window usage. - If total_hits exceeds 10 and you lack the necessary results, do not attempt to page. Refine your search by adding tighter spatial, temporal, or keyword constraints. Tips: - Use scientific terms (variables, instruments, platforms) for better keyword relevance - Keep keyword queries to 2–4 precise terms; more words = stricter filter - If 0 results, drop the least essential keyword and retry before broadening other filters - Combine keyword + temporal + spatial filters for highest precision - Use short_name when you already know the target product

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_granulesSearch NASA CMR granules for a specific parent collection and return up to 10 lightweight normalized results.Reads text others write1 finding

    Why it is in this group

    • The name "get_granules" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.

    Findings

    • Info

      The description is 2,698 characters long, over the 2,000 this check looks for.

      Matched text

      description ends: "...ear" or "cloud-free" imagery, set cloud_cover_max to a low value (e.g., 10 or 20)"

      What this check looks for
    Description, as the server wrote it
    Search NASA CMR granules for a specific parent collection and return up to 10 lightweight normalized results. Key return fields in each item: - concept_id: CMR granule concept ID - native_id: native ID of the granule record - revision_id: revision ID of the granule metadata - provider_id: provider ID of the granule - granule_ur: primary granule identifier - time_start / time_end: temporal coverage bounds - access_urls: actionable data access URLs - cloud_cover: cloud cover percentage - day_night_flag: DAY, NIGHT, BOTH, or UNSPECIFIED - size_mb: file size in megabytes - data_format: file format (e.g., NetCDF-4, GeoTIFF) - bounding_box: [West, South, East, North] Minimum Bounding Rectangle (MBR) footprint. Note: for swath data or irregular polygons, this bounding box fully encloses the data but may contain empty space at the corners. IMPORTANT — data availability checks: Without temporal and/or spatial filters, results represent ALL granules ever archived in the collection, which may span decades and the entire globe. total_hits without filters tells you the full archive size, NOT whether data exists for a specific area or time period. To verify availability for a specific region and/or period, apply the corresponding spatial or temporal filters. Single-filter queries (e.g., temporal-only) are completely valid and should be used when the user only specifies one constraint, but combining both provides the most precise availability answer. Key parameters: - collection_concept_id: required parent collection concept ID - temporal_start_date / temporal_end_date: filter to granules overlapping this time window — always set when the user specifies a time period - spatial_wkt_geometry: filter to granules intersecting this area — always set when the user specifies a geographic region - cloud_cover_min / cloud_cover_max: filter optical imagery by cloud cover percentage (0–100). Only set for optical/visible imagery collections (Landsat, MODIS, VIIRS, Sentinel-2 via CMR). Do NOT set for non-optical data (SAR, altimetry, model output, etc.) Iteration & Refinement: - Results are strictly capped at 10 items to optimize context window usage. - If total_hits exceeds 10 and you lack the necessary results, do not attempt to page. Refine your query by adding tighter spatial or temporal constraints. Tips: - For the most precise availability check, provide both temporal and spatial filters if the user specifies both; otherwise, apply whichever constraint they provided - total_hits in the response reflects the filtered count — zero means no data for that combination - When users ask for "clear" or "cloud-free" imagery, set cloud_cover_max to a low value (e.g., 10 or 20)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_keywordsDiscover official Earthdata vocabulary (like 'ATMOSPHERIC WATER VAPOR') directly from NASA's Keyword Management System (KMS).No findings

    Why it is in this group

    • The name "get_keywords" says "get": a word for reading.
    Description, as the server wrote it
    Discover official Earthdata vocabulary (like 'ATMOSPHERIC WATER VAPOR') directly from NASA's Keyword Management System (KMS). Use this to find the exact preferred labels to construct successful get_collections searches. Key fields in each returned item: - prefLabel: The preferred label to use in searches - uuid: The KMS concept UUID - definition: Context and expanded acronyms - scheme: The vocabulary scheme (e.g. sciencekeywords, platforms)
  • get_servicesSearch NASA CMR services for a specific parent collection and return all associated normalized UMM-S records.Reads text others writeNo findings

    Why it is in this group

    • The name "get_services" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Search NASA CMR services for a specific parent collection and return all associated normalized UMM-S records. Key fields in each returned item: - concept_id: CMR service concept ID - native_id: native ID of the service record - revision_id: revision ID of the service metadata - provider_id: provider ID of the service - name: service name - type: service type (e.g., OPeNDAP, WCS, Harmony, WMS, WMTS, ESI, EGI - No Processing) - version: service version string - description: human-readable service description - url: Primary endpoint URL information - service_options: supported output formats, projections, subset types, and interpolation methods - operation_metadata: operation names (e.g., GetCapabilities, GetMap) and distributed computing platform Key parameters: - collection_concept_id: required parent collection concept ID Iteration & Refinement: - All services associated with the collection are fetched in a single request. Paging is not supported. Note: A collection may be associated with multiple services of different types. Check type to distinguish between data access services (e.g., OPeNDAP, WCS) and discovery/visualization services (e.g., WMS, WMTS).

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_toolsSearch NASA CMR tools for a specific parent collection and return all associated normalized UMM-T records.Reads text others writeNo findings

    Why it is in this group

    • The name "get_tools" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Search NASA CMR tools for a specific parent collection and return all associated normalized UMM-T records. Key fields in each returned item: - concept_id: CMR tool concept ID - native_id: native ID of the tool record - revision_id: revision ID of the tool metadata - provider_id: provider ID of the tool - name: tool name - type: tool type (e.g., Downloadable Tool, Web User Interface, Web Portal, Model) - version: tool version string - description: human-readable tool description - url: Primary URL for directly accessing the tool - supported_input_formats: file formats the tool can read (e.g., HDF5, NETCDF-4, GeoTIFF) - supported_output_formats: file formats the tool can produce - supported_operating_systems: OS compatibility (name and version) - supported_browsers: browser compatibility (name and version) - supported_software_languages: programming language compatibility - tool_keywords: Earth science keyword taxonomy for the tool - organizations: providers, developers, or publishers of the tool - potential_action: smart handoff definition for parameterized deep links (e.g., 'Open in Giovanni') Key parameters: - collection_concept_id: required parent collection concept ID Iteration & Refinement: - All tools associated with the collection are fetched in a single request. Paging is not supported. Note: A collection may be associated with multiple tools of different types. Check type to distinguish between downloadable tools, web user interfaces, and web portals.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_variablesDiscover scientific variables and measurements associated with a collection, or look up variables by keyword.No findings

    Why it is in this group

    • The name "get_variables" says "get": a word for reading.
    Description, as the server wrote it
    Discover scientific variables and measurements associated with a collection, or look up variables by keyword. Use this tool to understand dataset variables, dimensions, and data processing parameters (such as scale, offset, and fill values) before downloading or analyzing data. Key fields in each returned item: - concept_id: CMR variable concept ID - name: Variable short name - long_name: Variable long name - definition: Variable definition - data_type: Data type of the variable - units: Units of measurement - scale: Scale factor - offset: Offset value - fill_values: Values indicating missing or invalid data - valid_ranges: Valid data ranges - dimensions: Variable dimensions

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged private-data or outbound.

Reads private data0
Reads files, mail, messages, databases, secrets, calendars or repositories.
Reads text others write4
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Install

Pinned to version 1.0.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http earthdata https://cmr.earthdata.nasa.gov/mcp/v1

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__earthdata__get_citations",
      "mcp__earthdata__get_collections",
      "mcp__earthdata__get_granules",
      "mcp__earthdata__get_keywords",
      "mcp__earthdata__get_services",
      "mcp__earthdata__get_tools",
      "mcp__earthdata__get_variables"
    ],
    "ask": [],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as earthdata. Review it before you use it.

Capability tags behind 4 rules
  • mcp__earthdata__get_collections untrusted-input
  • mcp__earthdata__get_granules untrusted-input
  • mcp__earthdata__get_services untrusted-input
  • mcp__earthdata__get_tools untrusted-input