Skip to main content
Glama

NASA Earthdata CMR search

nasa_cmr
Read-onlyIdempotent

Search NASA's Common Metadata Repository for Earth science datasets or granule files using spatial, temporal, platform, and identifier filters, with cursor pagination.

Instructions

Search NASA's Common Metadata Repository (CMR) for Earth science collections (datasets) or granules (files). Supports identifiers, temporal and spatial filters (bounding_box, point, polygon, line, circle), platform/instrument/project, facets and sorting. Returns a compact normalized envelope by default (response_mode raw for upstream metadata) and a next_cursor for Search After pagination: continue by passing only {"cursor": next_cursor}. Collection matches describe datasets; they do not prove granules exist for a given time or place. No API key needed.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
doiNoCollections only: DOI, e.g. 10.5067/GHGMR-4FJ04.
bboxNoCompatibility alias for bounding_box (sent to CMR as bounding_box).
lineNoLine "lon1,lat1,lon2,lat2,...".
pageNoDEPRECATED page-number pagination (CMR page_num). Prefer cursor. Cannot be combined with cursor or offset.
limitNoRecords per page (1-100).
pointNoPoint "lon,lat".
circleNoCircle "lon,lat,radius" with radius in metres (10-6000000).
cursorNonext_cursor from a previous response. Continue with the cursor alone; omitted filters are restored from it.
fieldsNoCompact mode only: normalized fields to return. concept_id is always included. Defaults to all fields except summary.
formatNoUpstream CMR metadata format. json/umm_json support compact output; others are returned raw. dif, dif10, opendata: collections only; stac: granules only.json
offsetNoDEPRECATED offset pagination. Prefer cursor. Cannot be combined with cursor or page.
keywordNoCollections only: free-text keyword search.
polygonNoPolygon "lon1,lat1,...,lon1,lat1": closed, counter-clockwise (CMR rejects clockwise rings).
projectNoProject/campaign short name(s).
versionNoCollection version.
platformNoPlatform short name(s), e.g. Terra.
providerNoProvider ID(s), e.g. POCLOUD, LPCLOUD.
sort_keyNoSort key(s), "-" prefix for descending. Collections: score, usage_score, entry_title, dataset_id, short_name, entry_id, start_date, end_date, platform, instrument, sensor, provider, revision_date, has_granules, create-data-date, ongoing. Granules: start_date, end_date, producer_granule_id, readable_granule_name, granule_ur, revision_date, cloud_cover, day_night_flag, data_size, provider, platform, instrument, sensor, online_only, browsable, entry_title, short_name, version, campaign, project.
temporalNoTemporal range "start,end" in ISO 8601 (date or date-time, UTC assumed). Either side may be empty, e.g. "2020-01-01T00:00:00Z,".
browsableNoOnly records with (true) or without (false) browse imagery.
concept_idNoConcept ID(s). For granule searches a collection concept ID (C...) also selects that collection, as in CMR.
instrumentNoInstrument short name(s), e.g. MODIS.
short_nameNoCollection short name(s).
cloud_coverNoGranules only: cloud cover range "min,max" in percent.
entry_titleNoCollection entry title.
online_onlyNoOnly online (true) or offline (false) records.
search_typeNoSearch collections (datasets) or granules (files).collections
bounding_boxNoBounding box west,south,east,north (lon/lat degrees). west > east crosses the antimeridian (supported by CMR).
cloud_hostedNoCollections only: restrict to cloud-hosted (true) or not (false).
downloadableNoOnly records with (true) or without (false) downloadable data links.
has_granulesNoCollections only: require (true) or exclude (false) collections with granules.
response_modeNocompact (default for json/umm_json): normalized records. raw: upstream metadata as returned (default for other formats).
day_night_flagNoGranules only: DAY, NIGHT, BOTH or UNSPECIFIED.
include_facetsNoInclude CMR v2 facets (counts by keyword, platform, ...).
granule_data_formatNoCollections only: granule data format(s), e.g. netCDF-4.
processing_level_idNoCollections only: processing level(s), e.g. 3, L2.
producer_granule_idNoGranules only: producer granule ID.
collection_concept_idNoGranules only: collection concept ID(s) to search within.
readable_granule_nameNoGranules only: granule name (supports CMR * and ? wildcards).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
rawNo
errorNo
facetsNo
formatYes
sourceYes
statusYes
resultsYes
warningsYes
total_hitsYes
next_cursorYes
search_typeYes
retrieved_atYes
response_modeYes
returned_countYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed54 schema fields changedv1.2.0
    • addedInput schema / additionalProperties
      Added value: +false
    • addedInput schema / properties / bbox
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "type": "number"
      +      },
      +      "maxItems": 4,
      +      "minItems": 4,
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Compatibility alias for bounding_box (sent to CMR as bounding_box)."
      +}
    • addedInput schema / properties / bounding_box
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "type": "number"
      +      },
      +      "maxItems": 4,
      +      "minItems": 4,
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Bounding box west,south,east,north (lon/lat degrees). west > east crosses the antimeridian (supported by CMR)."
      +}
    • addedInput schema / properties / browsable
      Added value: +{
      +  "description": "Only records with (true) or without (false) browse imagery.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / circle
      Added value: +{
      +  "description": "Circle \"lon,lat,radius\" with radius in metres (10-6000000).",
      +  "type": "string"
      +}
    • addedInput schema / properties / cloud_cover
      Added value: +{
      +  "description": "Granules only: cloud cover range \"min,max\" in percent.",
      +  "pattern": "^(\\d+(\\.\\d+)?)?,(\\d+(\\.\\d+)?)?$",
      +  "type": "string"
      +}
    • addedInput schema / properties / cloud_hosted
      Added value: +{
      +  "description": "Collections only: restrict to cloud-hosted (true) or not (false).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / collection_concept_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "pattern": "^[A-Z]{1,4}\\d+-[A-Za-z0-9_]+$",
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "pattern": "^[A-Z]{1,4}\\d+-[A-Za-z0-9_]+$",
      +        "type": "string"
      +      },
      +      "maxItems": 100,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Granules only: collection concept ID(s) to search within."
      +}
    • addedInput schema / properties / concept_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "pattern": "^[A-Z]{1,4}\\d+-[A-Za-z0-9_]+$",
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "pattern": "^[A-Z]{1,4}\\d+-[A-Za-z0-9_]+$",
      +        "type": "string"
      +      },
      +      "maxItems": 100,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Concept ID(s). For granule searches a collection concept ID (C...) also selects that collection, as in CMR."
      +}
    • addedInput schema / properties / cursor
      Added value: +{
      +  "description": "next_cursor from a previous response. Continue with the cursor alone; omitted filters are restored from it.",
      +  "maxLength": 8192,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / day_night_flag
      Added value: +{
      +  "description": "Granules only: DAY, NIGHT, BOTH or UNSPECIFIED.",
      +  "enum": [
      +    "DAY",
      +    "NIGHT",
      +    "BOTH",
      +    "UNSPECIFIED"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / doi
      Added value: +{
      +  "description": "Collections only: DOI, e.g. 10.5067/GHGMR-4FJ04.",
      +  "maxLength": 200,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / downloadable
      Added value: +{
      +  "description": "Only records with (true) or without (false) downloadable data links.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / entry_title
      Added value: +{
      +  "description": "Collection entry title.",
      +  "maxLength": 1000,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / fields
      Added value: +{
      +  "description": "Compact mode only: normalized fields to return. concept_id is always included. Defaults to all fields except summary.",
      +  "items": {
      +    "enum": [
      +      "concept_id",
      +      "title",
      +      "short_name",
      +      "version",
      +      "provider",
      +      "time_start",
      +      "time_end",
      +      "platforms",
      +      "instruments",
      +      "processing_level",
      +      "doi",
      +      "cloud_hosted",
      +      "online_access",
      +      "links",
      +      "summary",
      +      "collection_concept_id",
      +      "producer_granule_id",
      +      "day_night_flag",
      +      "cloud_cover",
      +      "browse_available"
      +    ],
      +    "type": "string"
      +  },
      +  "maxItems": 20,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • changedInput schema / properties / format / description
      Previous value: -"Response format"New value: +"Upstream CMR metadata format. json/umm_json support compact output; others are returned raw. dif, dif10, opendata: collections only; stac: granules only."
    • changedInput schema / properties / format / enum
      Previous value: -[
      -  "json",
      -  "umm_json",
      -  "atom",
      -  "echo10",
      -  "iso19115",
      -  "iso_smap",
      -  "kml"
      -]New value: +[
      +  "json",
      +  "umm_json",
      +  "atom",
      +  "echo10",
      +  "iso19115",
      +  "kml",
      +  "csv",
      +  "xml",
      +  "native",
      +  "dif",
      +  "dif10",
      +  "opendata",
      +  "stac"
      +]
    • addedInput schema / properties / granule_data_format
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 256,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Collections only: granule data format(s), e.g. netCDF-4."
      +}
    • addedInput schema / properties / has_granules
      Added value: +{
      +  "description": "Collections only: require (true) or exclude (false) collections with granules.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / include_facets
      Added value: +{
      +  "description": "Include CMR v2 facets (counts by keyword, platform, ...).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / instrument
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 256,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Instrument short name(s), e.g. MODIS."
      +}
    • changedInput schema / properties / keyword / description
      Previous value: -"Search keyword"New value: +"Collections only: free-text keyword search."
    • addedInput schema / properties / keyword / maxLength
      Added value: +1000
    • addedInput schema / properties / keyword / minLength
      Added value: +1
    • addedInput schema / properties / limit / default
      Added value: +10
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum number of results to return"New value: +"Records per page (1-100)."
    • addedInput schema / properties / limit / maximum
      Added value: +100
    • addedInput schema / properties / limit / minimum
      Added value: +1
    • changedInput schema / properties / limit / type
      Previous value: -"number"New value: +"integer"
    • addedInput schema / properties / line
      Added value: +{
      +  "description": "Line \"lon1,lat1,lon2,lat2,...\".",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • addedInput schema / properties / offset
      Added value: +{
      +  "description": "DEPRECATED offset pagination. Prefer cursor. Cannot be combined with cursor or page.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / online_only
      Added value: +{
      +  "description": "Only online (true) or offline (false) records.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / page / description
      Previous value: -"Page number for pagination"New value: +"DEPRECATED page-number pagination (CMR page_num). Prefer cursor. Cannot be combined with cursor or offset."
    • addedInput schema / properties / page / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / page / minimum
      Added value: +1
    • changedInput schema / properties / page / type
      Previous value: -"number"New value: +"integer"
    • addedInput schema / properties / platform
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 256,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Platform short name(s), e.g. Terra."
      +}
    • addedInput schema / properties / point
      Added value: +{
      +  "description": "Point \"lon,lat\".",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • addedInput schema / properties / polygon
      Added value: +{
      +  "description": "Polygon \"lon1,lat1,...,lon1,lat1\": closed, counter-clockwise (CMR rejects clockwise rings).",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • addedInput schema / properties / processing_level_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 40,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "maxLength": 40,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Collections only: processing level(s), e.g. 3, L2."
      +}
    • addedInput schema / properties / producer_granule_id
      Added value: +{
      +  "description": "Granules only: producer granule ID.",
      +  "maxLength": 1000,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / project
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 256,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Project/campaign short name(s)."
      +}
    • addedInput schema / properties / provider
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 80,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "maxLength": 80,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Provider ID(s), e.g. POCLOUD, LPCLOUD."
      +}
    • addedInput schema / properties / readable_granule_name
      Added value: +{
      +  "description": "Granules only: granule name (supports CMR * and ? wildcards).",
      +  "maxLength": 1000,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / response_mode
      Added value: +{
      +  "description": "compact (default for json/umm_json): normalized records. raw: upstream metadata as returned (default for other formats).",
      +  "enum": [
      +    "compact",
      +    "raw"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / search_type / description
      Previous value: -"Search type (collections or granules)"New value: +"Search collections (datasets) or granules (files)."
    • addedInput schema / properties / short_name
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 256,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Collection short name(s)."
      +}
    • addedInput schema / properties / sort_key / anyOf
      Added value: +[
      +  {
      +    "pattern": "^[+-]?[a-z_-]+$",
      +    "type": "string"
      +  },
      +  {
      +    "items": {
      +      "pattern": "^[+-]?[a-z_-]+$",
      +      "type": "string"
      +    },
      +    "maxItems": 3,
      +    "minItems": 1,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / sort_key / description
      Previous value: -"Field to sort results by"New value: +"Sort key(s), \"-\" prefix for descending. Collections: score, usage_score, entry_title, dataset_id, short_name, entry_id, start_date, end_date, platform, instrument, sensor, provider, revision_date, has_granules, create-data-date, ongoing. Granules: start_date, end_date, producer_granule_id, readable_granule_name, granule_ur, revision_date, cloud_cover, day_night_flag, data_size, provider, platform, instrument, sensor, online_only, browsable, entry_title, short_name, version, campaign, project."
    • removedInput schema / properties / sort_key / type
      Removed value: -"string"
    • addedInput schema / properties / temporal
      Added value: +{
      +  "description": "Temporal range \"start,end\" in ISO 8601 (date or date-time, UTC assumed). Either side may be empty, e.g. \"2020-01-01T00:00:00Z,\".",
      +  "type": "string"
      +}
    • addedInput schema / properties / version
      Added value: +{
      +  "description": "Collection version.",
      +  "maxLength": 80,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • removedInput schema / required
      Removed value: -[
      -  "keyword",
      -  "search_type",
      -  "format"
      -]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "error": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "http_status": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "kind": {
      +          "type": "string"
      +        },
      +        "message": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "message",
      +        "http_status"
      +      ],
      +      "type": "object"
      +    },
      +    "facets": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "name": {
      +            "type": "string"
      +          },
      +          "values": {
      +            "items": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "count": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "title": {
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "title",
      +                "count"
      +              ],
      +              "type": "object"
      +            },
      +            "type": "array"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "values"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "format": {
      +      "enum": [
      +        "json",
      +        "umm_json",
      +        "atom",
      +        "echo10",
      +        "iso19115",
      +        "kml",
      +        "csv",
      +        "xml",
      +        "native",
      +        "dif",
      +        "dif10",
      +        "opendata",
      +        "stac"
      +      ],
      +      "type": "string"
      +    },
      +    "next_cursor": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "raw": {},
      +    "response_mode": {
      +      "enum": [
      +        "compact",
      +        "raw"
      +      ],
      +      "type": "string"
      +    },
      +    "results": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "browse_available": {
      +            "type": [
      +              "boolean",
      +              "null"
      +            ]
      +          },
      +          "cloud_cover": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "cloud_hosted": {
      +            "type": [
      +              "boolean",
      +              "null"
      +            ]
      +          },
      +          "collection_concept_id": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "concept_id": {
      +            "type": "string"
      +          },
      +          "day_night_flag": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "doi": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "instruments": {
      +            "anyOf": [
      +              {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "links": {
      +            "anyOf": [
      +              {
      +                "items": {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "title": {
      +                      "type": [
      +                        "string",
      +                        "null"
      +                      ]
      +                    },
      +                    "type": {
      +                      "type": [
      +                        "string",
      +                        "null"
      +                      ]
      +                    },
      +                    "url": {
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "url",
      +                    "type",
      +                    "title"
      +                  ],
      +                  "type": "object"
      +                },
      +                "type": "array"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "online_access": {
      +            "type": [
      +              "boolean",
      +              "null"
      +            ]
      +          },
      +          "platforms": {
      +            "anyOf": [
      +              {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "processing_level": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "producer_granule_id": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "provider": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "short_name": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "summary": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "time_end": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "time_start": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "title": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "version": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "concept_id"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "retrieved_at": {
      +      "type": "string"
      +    },
      +    "returned_count": {
      +      "anyOf": [
      +        {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "search_type": {
      +      "enum": [
      +        "collections",
      +        "granules"
      +      ],
      +      "type": "string"
      +    },
      +    "source": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "request_id": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "retrieved_at": {
      +          "type": "string"
      +        },
      +        "service": {
      +          "type": "string"
      +        },
      +        "took_ms": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "url": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "service",
      +        "url",
      +        "request_id",
      +        "took_ms",
      +        "retrieved_at"
      +      ],
      +      "type": "object"
      +    },
      +    "status": {
      +      "enum": [
      +        "success",
      +        "no_results",
      +        "error"
      +      ],
      +      "type": "string"
      +    },
      +    "total_hits": {
      +      "anyOf": [
      +        {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "warnings": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "status",
      +    "search_type",
      +    "format",
      +    "response_mode",
      +    "results",
      +    "returned_count",
      +    "total_hits",
      +    "next_cursor",
      +    "source",
      +    "retrieved_at",
      +    "warnings"
      +  ],
      +  "type": "object"
      +}
  2. Changed3 schema fields changedv1.0.0
    • addedInput schema / properties / format
      Added value: +{
      +  "default": "json",
      +  "description": "Response format",
      +  "enum": [
      +    "json",
      +    "umm_json",
      +    "atom",
      +    "echo10",
      +    "iso19115",
      +    "iso_smap",
      +    "kml"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / search_type
      Added value: +{
      +  "default": "collections",
      +  "description": "Search type (collections or granules)",
      +  "enum": [
      +    "collections",
      +    "granules"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "keyword"
      -]New value: +[
      +  "keyword",
      +  "search_type",
      +  "format"
      +]
  3. First observed

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, open-world, non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: compact envelope is the default with raw for upstream metadata, cursor-based Search After pagination semantics, and 'No API key needed' (auth requirement).

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?

Purpose is front-loaded in the first sentence and each subsequent sentence carries distinct payload (filters, response mode, pagination, caveat, auth). It is dense but every clause earns its place; only the filter enumeration is slightly list-like.

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 values need not be explained, yet the description still clarifies the compact-vs-raw envelope and the next_cursor contract. Combined with the auth note and the granules caveat, an agent has everything needed to call it correctly.

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 39 parameters are fully documented structurally; baseline 3 applies. The description usefully groups the filter families (identifiers, temporal/spatial, platform/instrument/project, facets, sorting) and flags the compact/raw response_mode behavior, but adds no syntax beyond the schema.

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 (Search) plus the exact resource (NASA's Common Metadata Repository) and the two search domains (collections/datasets vs granules/files). Among siblings it is the only CMR metadata-search tool, so an agent can place it immediately.

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 practical usage direction: continue pagination by passing only {"cursor": next_cursor}, and warns that collection matches do not prove granules exist for a time/place. It does not name explicit when-not-to-use scenarios, but no sibling tool overlaps enough to require exclusion guidance, so 4 is fair.

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