Skip to main content
Glama

earthquake-mcp-server

Search Earthquakes

earthquake_search
Read-onlyIdempotent

Search earthquakes by time range, magnitude, depth, location radius, PAGER alert level, or felt reports. Supports USGS (global, richer metadata: PAGER, DYFI, ShakeMap) and EMSC, an independent global catalog operated by the European-Mediterranean Seismological Centre. For location-based queries, provide latitude, longitude, and radius_km together. A rectangular study area is expressed with min_latitude, max_latitude, min_longitude, and max_longitude — each independently optional, so a single edge is a valid constraint. Combining the box with the lat/lon/radius circle intersects the two, returning only events inside both. Both catalogs include non-tectonic records (quarry blasts, explosions) — every event carries its event_type, and event_type="earthquake" filters the rest out on USGS. USGS-specific filters (alert_level, event_type, min_felt, min_significance) are not sent when source=emsc — the response names them in ignoredFilters. Use earthquake_count first to gauge result size before requesting large result sets. A single call returns at most 20,000 events; larger result sets are retrieved by paging with offset, which is passed straight through to the upstream FDSN API. When a result is capped, nextOffset carries the offset for the following page and totalCount the full match count — or countUnavailable reports that the count lookup failed and the total is unknown.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum events to return per call. Default 100. Large limits (>1000) may result in slow responses. Max 20000. Combine with offset to retrieve match sets larger than one call can return.
offsetNoIndex of the first event to return, counting from 1 — offset=1 is the first match (both upstream APIs reject 0). Omit for the first page, then pass the nextOffset value from a capped result to fetch the next one. Ordering is set by order_by, so keep order_by, limit, and every filter identical across pages.
sourceNoData source. Both catalogs are global. "usgs" covers global events with PAGER, DYFI, and ShakeMap metadata. "emsc" is an independent global catalog operated by the European-Mediterranean Seismological Centre — use it to cross-check any event, anywhere, against a separate network. It publishes no PAGER, DYFI, or ShakeMap metadata and no per-event detail endpoint; its station coverage is densest around Europe and the Mediterranean.usgs
end_timeNoEnd of time range as ISO 8601, in the same forms start_time accepts. Defaults to current time if omitted.
latitudeNoLatitude for radius search. Requires longitude and radius_km.
min_feltNoMinimum number of DYFI (Did You Feel It?) reports. Use to find events with confirmed public impact. Only available from USGS.
order_byNoSort order. "time" returns newest first; "magnitude" returns largest first.time
longitudeNoLongitude for radius search. Requires latitude and radius_km.
radius_kmNoSearch radius in kilometers from the lat/lon point. 100 km covers a metro region; 500 km covers a large country. Max 20001.6, the ceiling USGS enforces. Converted to degrees for EMSC (1° ≈ 111.2 km).
event_typeNoFilter by upstream event classification, e.g. "earthquake" to exclude quarry blasts and explosions, or "quarry blast" to see only those. Matched verbatim against the USGS catalog, which accepts any string and returns zero matches for an unrecognized one. Only available from USGS.
start_timeNoStart of time range as ISO 8601 (e.g. "2026-01-01" or "2026-05-23T00:00:00"). A bare year expands to January 1st and an unpadded month or day is zero-padded, so both sources honor the same window. Defaults to 30 days before end_time (or before the current time) if omitted — applied server-side so USGS and EMSC honor the same window.
alert_levelNoMinimum PAGER alert level. PAGER estimates economic loss and casualties. "green" = minimal impact; "red" = extreme. Only available from USGS.
max_depth_kmNoMaximum depth in kilometers. Bounded to the documented -100 to 1000 km catalog envelope.
max_latitudeNoNorthern edge of a bounding-box search, in degrees.
min_depth_kmNoMinimum depth in kilometers. Bounded to the documented -100 to 1000 km catalog envelope. Shallow quakes (0–70 km) typically cause more surface damage than deep quakes (>300 km).
min_latitudeNoSouthern edge of a bounding-box search, in degrees. Independent of the other three box parameters — supply any of them. Must not exceed max_latitude when both are given.
max_longitudeNoEastern edge of a bounding-box search, in degrees.
max_magnitudeNoMaximum magnitude.
min_longitudeNoWestern edge of a bounding-box search, in degrees. Range extends beyond ±180 so a box can cross the antimeridian (e.g. min_longitude=170, max_longitude=190) — always keep min_longitude at or below max_longitude rather than inverting the pair.
min_magnitudeNoMinimum magnitude (Richter or equivalent). M2.5+ is felt by some people; M5+ can cause damage; M7+ is major.
min_significanceNoMinimum USGS significance score (0–2000+). Combines magnitude, felt reports, and PAGER estimates. Significant events typically score 600+. Only available from USGS.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
countNoNumber of events returned.
errorNoPresent when the call failed. Absent on success.
eventsNoMatching earthquake events.
noticeNoRecovery guidance when results are empty or capped — how to broaden filters or get the full count. Absent when the result set is non-empty and within the limit.
sourceNoData source used.
queryEchoNoEcho of the effective parameters sent to the upstream API, including server-resolved defaults. Use to diagnose unexpected or empty results — a filter absent here was not sent upstream.
truncatedNoTrue when results were capped by the limit parameter. totalCount carries the full match count when available, and nextOffset the input for the following page. With countUnavailable set the total is unknown, so this flag means the page was filled, not that more events are confirmed to remain.
nextOffsetNoValue to pass as the offset input to retrieve the next page, with every other input unchanged. Present only when more events remain; absent means this was the last page.
totalCountNoTotal events matching the query before the limit was applied. Fetched via a follow-up count query when results are truncated at the limit. Absent when results were not capped, and when that follow-up query failed — countUnavailable separates the two.
ignoredFiltersNoUSGS-only filters supplied in the input but not sent upstream because source=emsc does not support them. The result set is NOT constrained by these — re-run with source=usgs to apply them. Absent when every supplied filter was applied.
countUnavailableNoTrue when the follow-up total-count query failed, so the total is unknown for this call rather than never requested. The returned events are complete and unaffected; only totalCount is missing. Retry earthquake_count with the same filters to recover the total. Absent whenever the count succeeded or was never needed.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed14 schema fields changed
    • removedOutput schema / properties / events / items / properties / cdi / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / events / items / properties / cdi / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / events / items / properties / depth_km / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / events / items / properties / depth_km / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / events / items / properties / felt / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / events / items / properties / felt / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / events / items / properties / magnitude / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / events / items / properties / magnitude / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / events / items / properties / mmi / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / events / items / properties / mmi / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / events / items / properties / significance / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / events / items / properties / significance / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / events / items / properties / tsunami / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / events / items / properties / tsunami / type
      Added value: +[
      +  "number",
      +  "null"
      +]
  2. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "count",
      +      "source",
      +      "events"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_radius`: latitude or longitude provided without radius_km, or vice versa. `invalid_bounding_box`: min_latitude exceeds max_latitude, or min_longitude exceeds max_longitude. `source_unavailable`: Selected source API returns a 5xx or is unreachable. `source_timeout`: Selected source API did not answer before the request deadline. `upstream_rejected`: The source API rejected the query parameters and explained why in its response body. `upstream_rejected_no_reason`: The source API rejected the query but its response body carried no usable explanation. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "invalid_radius",
      +            "invalid_bounding_box",
      +            "source_unavailable",
      +            "source_timeout",
      +            "upstream_rejected",
      +            "upstream_rejected_no_reason"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "count",
      -  "source",
      -  "events"
      -]
  3. Changed5 schema fields changed
    • addedOutput schema / properties / countUnavailable
      Added value: +{
      +  "description": "True when the follow-up total-count query failed, so the total is unknown for this call rather than never requested. The returned events are complete and unaffected; only totalCount is missing. Retry earthquake_count with the same filters to recover the total. Absent whenever the count succeeded or was never needed.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / events / items / properties / event_certainty
      Added value: +{
      +  "description": "How certain the source is of event_type: \"known\" (asserted), \"suspected\", \"unknown\", or \"unreported\". EMSC publishes this as the first character of its event-type code — a suspected explosion is not a confirmed one, and this is the only field that says so. Absent for USGS, which publishes no certainty axis, and absent for an EMSC code outside the published nomenclature.",
      +  "enum": [
      +    "known",
      +    "suspected",
      +    "unknown",
      +    "unreported"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / events / items / properties / event_type / description
      Previous value: -"Upstream event classification. USGS spells it out — \"earthquake\", \"quarry blast\", \"explosion\", \"ice quake\" — while EMSC publishes a two-letter evtype code, \"ke\" for a known earthquake and \"ue\" for an unknown event. Not every record in either catalog is a tectonic earthquake. Absent when the source publishes no classification."New value: +"What kind of event this is, in one vocabulary whichever source served it — the QuakeML type names USGS publishes (\"earthquake\", \"quarry blast\", \"explosion\", \"ice quake\"). EMSC's two-character code is decoded to the same names, so the same event carries the same value from either source; how sure the source is rides on event_certainty instead. A code outside the published nomenclature is forwarded verbatim rather than guessed at. Not every record in either catalog is a tectonic earthquake. Absent when the source publishes no classification."
    • changedOutput schema / properties / totalCount / description
      Previous value: -"Total events matching the query before the limit was applied. Fetched via a follow-up count query when results are truncated at the limit; absent otherwise."New value: +"Total events matching the query before the limit was applied. Fetched via a follow-up count query when results are truncated at the limit. Absent when results were not capped, and when that follow-up query failed — countUnavailable separates the two."
    • changedOutput schema / properties / truncated / description
      Previous value: -"True when results were capped by the limit parameter and more events remain. totalCount carries the full match count when available, and nextOffset the input for the following page."New value: +"True when results were capped by the limit parameter. totalCount carries the full match count when available, and nextOffset the input for the following page. With countUnavailable set the total is unknown, so this flag means the page was filled, not that more events are confirmed to remain."
  4. Changed21 schema fields changed
    • changedInput schema / properties / end_time / description
      Previous value: -"End of time range as ISO 8601. Defaults to current time if omitted."New value: +"End of time range as ISO 8601, in the same forms start_time accepts. Defaults to current time if omitted."
    • addedInput schema / properties / end_time / pattern
      Added value: +"^\\d{4}(-\\d{1,2}(-\\d{1,2})?)?([T ]\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$"
    • addedInput schema / properties / event_type / minLength
      Added value: +1
    • changedInput schema / properties / max_depth_km / description
      Previous value: -"Maximum depth in kilometers."New value: +"Maximum depth in kilometers. Bounded to the documented -100 to 1000 km catalog envelope."
    • addedInput schema / properties / max_depth_km / maximum
      Added value: +1000
    • addedInput schema / properties / max_depth_km / minimum
      Added value: +-100
    • addedInput schema / properties / max_latitude
      Added value: +{
      +  "description": "Northern edge of a bounding-box search, in degrees.",
      +  "maximum": 90,
      +  "minimum": -90,
      +  "type": "number"
      +}
    • addedInput schema / properties / max_longitude
      Added value: +{
      +  "description": "Eastern edge of a bounding-box search, in degrees.",
      +  "maximum": 360,
      +  "minimum": -360,
      +  "type": "number"
      +}
    • changedInput schema / properties / min_depth_km / description
      Previous value: -"Minimum depth in kilometers. Shallow quakes (0–70 km) typically cause more surface damage than deep quakes (>300 km)."New value: +"Minimum depth in kilometers. Bounded to the documented -100 to 1000 km catalog envelope. Shallow quakes (0–70 km) typically cause more surface damage than deep quakes (>300 km)."
    • addedInput schema / properties / min_depth_km / maximum
      Added value: +1000
    • addedInput schema / properties / min_depth_km / minimum
      Added value: +-100
    • addedInput schema / properties / min_latitude
      Added value: +{
      +  "description": "Southern edge of a bounding-box search, in degrees. Independent of the other three box parameters — supply any of them. Must not exceed max_latitude when both are given.",
      +  "maximum": 90,
      +  "minimum": -90,
      +  "type": "number"
      +}
    • addedInput schema / properties / min_longitude
      Added value: +{
      +  "description": "Western edge of a bounding-box search, in degrees. Range extends beyond ±180 so a box can cross the antimeridian (e.g. min_longitude=170, max_longitude=190) — always keep min_longitude at or below max_longitude rather than inverting the pair.",
      +  "maximum": 360,
      +  "minimum": -360,
      +  "type": "number"
      +}
    • changedInput schema / properties / radius_km / description
      Previous value: -"Search radius in kilometers from the lat/lon point. 100 km covers a metro region; 500 km covers a large country. Converted to degrees for EMSC (1° ≈ 111.2 km)."New value: +"Search radius in kilometers from the lat/lon point. 100 km covers a metro region; 500 km covers a large country. Max 20001.6, the ceiling USGS enforces. Converted to degrees for EMSC (1° ≈ 111.2 km)."
    • changedInput schema / properties / radius_km / maximum
      Previous value: -20002New value: +20001.6
    • changedInput schema / properties / start_time / description
      Previous value: -"Start of time range as ISO 8601 (e.g. \"2026-01-01\" or \"2026-05-23T00:00:00\"). Defaults to 30 days before end_time (or before the current time) if omitted — applied server-side so USGS and EMSC honor the same window."New value: +"Start of time range as ISO 8601 (e.g. \"2026-01-01\" or \"2026-05-23T00:00:00\"). A bare year expands to January 1st and an unpadded month or day is zero-padded, so both sources honor the same window. Defaults to 30 days before end_time (or before the current time) if omitted — applied server-side so USGS and EMSC honor the same window."
    • addedInput schema / properties / start_time / pattern
      Added value: +"^\\d{4}(-\\d{1,2}(-\\d{1,2})?)?([T ]\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$"
    • addedOutput schema / properties / queryEcho / properties / max_latitude
      Added value: +{
      +  "description": "Northern bounding-box edge sent upstream, in degrees.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / queryEcho / properties / max_longitude
      Added value: +{
      +  "description": "Eastern bounding-box edge sent upstream, in degrees.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / queryEcho / properties / min_latitude
      Added value: +{
      +  "description": "Southern bounding-box edge sent upstream, in degrees.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / queryEcho / properties / min_longitude
      Added value: +{
      +  "description": "Western bounding-box edge sent upstream, in degrees.",
      +  "type": "number"
      +}
  5. Changed3 schema fields changed
    • addedInput schema / properties / event_type
      Added value: +{
      +  "description": "Filter by upstream event classification, e.g. \"earthquake\" to exclude quarry blasts and explosions, or \"quarry blast\" to see only those. Matched verbatim against the USGS catalog, which accepts any string and returns zero matches for an unrecognized one. Only available from USGS.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / events / items / properties / event_type
      Added value: +{
      +  "description": "Upstream event classification. USGS spells it out — \"earthquake\", \"quarry blast\", \"explosion\", \"ice quake\" — while EMSC publishes a two-letter evtype code, \"ke\" for a known earthquake and \"ue\" for an unknown event. Not every record in either catalog is a tectonic earthquake. Absent when the source publishes no classification.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / queryEcho / properties / event_type
      Added value: +{
      +  "description": "Event-type filter sent upstream. Absent for EMSC — not supported there.",
      +  "type": "string"
      +}
  6. Changed16 schema fields changed
    • changedInput schema / properties / source / description
      Previous value: -"Data source. \"usgs\" covers global events with PAGER, DYFI, and ShakeMap metadata. \"emsc\" covers the European-Mediterranean region with an independent catalog — useful for cross-verification or European-focused queries."New value: +"Data source. Both catalogs are global. \"usgs\" covers global events with PAGER, DYFI, and ShakeMap metadata. \"emsc\" is an independent global catalog operated by the European-Mediterranean Seismological Centre — use it to cross-check any event, anywhere, against a separate network. It publishes no PAGER, DYFI, or ShakeMap metadata and no per-event detail endpoint; its station coverage is densest around Europe and the Mediterranean."
    • changedOutput schema / properties / events / items / properties / alert / description
      Previous value: -"PAGER estimated impact alert level. Null if not computed. USGS only."New value: +"PAGER estimated impact alert level. Null when USGS ran no PAGER assessment, and always null for EMSC, which publishes no such field."
    • addedOutput schema / properties / events / items / properties / auth
      Added value: +{
      +  "description": "Code of the agency or network the source names as authoritative for this solution, e.g. \"NEIC\", \"BMKG\", \"NDI\" from EMSC or \"us\", \"ci\", \"ak\" from USGS. Absent when the source reports none.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / events / items / properties / cdi / description
      Previous value: -"Maximum reported intensity (Community Decimal Intensity, 0–12 scale). USGS only."New value: +"Maximum reported intensity (Community Decimal Intensity, 0–12 scale), derived from DYFI responses. Null when USGS computed no DYFI intensity, and always null for EMSC, which publishes no such field."
    • changedOutput schema / properties / events / items / properties / felt / description
      Previous value: -"Number of DYFI (Did You Feel It?) responses. Null if no reports. USGS only."New value: +"Number of DYFI (Did You Feel It?) responses. Null when USGS has received no reports for the event, and always null for EMSC, which publishes no DYFI field — a null is not evidence the event went unfelt."
    • changedOutput schema / properties / events / items / properties / mmi / description
      Previous value: -"Maximum ShakeMap instrumental intensity (Modified Mercalli, 0–12 scale). USGS only."New value: +"Maximum ShakeMap instrumental intensity (Modified Mercalli, 0–12 scale). Null when USGS produced no ShakeMap for the event, and always null for EMSC, which publishes no such field."
    • changedOutput schema / properties / events / items / properties / significance / description
      Previous value: -"USGS significance score (0–2000+). Combines magnitude, felt reports, PAGER. USGS only."New value: +"USGS significance score (0–2000+). Combines magnitude, felt reports, PAGER. Null when USGS computed no score, and always null for EMSC, which publishes no such field."
    • addedOutput schema / properties / events / items / properties / source_catalog
      Added value: +{
      +  "description": "Upstream catalog this solution came from, e.g. \"EMSC-RTS\" (EMSC real-time seismicity, revised as analysis continues). Absent for USGS, which publishes no catalog identifier on event records.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / events / items / properties / status / anyOf
      Added value: +[
      +  {
      +    "enum": [
      +      "automatic",
      +      "reviewed",
      +      "deleted"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / events / items / properties / status / description
      Previous value: -"Review status. Automatic detections may be revised."New value: +"Human-review state: \"automatic\" (posted by automatic processing, not yet verified by a person), \"reviewed\" (examined by an analyst), or \"deleted\". Null when the source publishes no review status — EMSC does not, so treat an EMSC solution as unverified and subject to revision rather than final."
    • removedOutput schema / properties / events / items / properties / status / enum
      Removed value: -[
      -  "automatic",
      -  "reviewed",
      -  "deleted"
      -]
    • removedOutput schema / properties / events / items / properties / status / type
      Removed value: -"string"
    • addedOutput schema / properties / events / items / properties / tsunami / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / events / items / properties / tsunami / description
      Previous value: -"1 if a tsunami warning was issued; 0 otherwise. USGS only; 0 for EMSC events."New value: +"USGS tsunami flag: 1 for large events in oceanic regions, 0 otherwise. It is not a warning — USGS states the flag does not indicate whether a tsunami did or will exist; check NOAA (tsunami.gov) for actual alert status. Null when the source publishes no such flag, as EMSC does not."
    • removedOutput schema / properties / events / items / properties / tsunami / type
      Removed value: -"number"
    • addedOutput schema / properties / ignoredFilters
      Added value: +{
      +  "description": "USGS-only filters supplied in the input but not sent upstream because source=emsc does not support them. The result set is NOT constrained by these — re-run with source=usgs to apply them. Absent when every supplied filter was applied.",
      +  "items": {
      +    "description": "Name of an input filter that was not applied.",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  7. Changed5 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum events to return. Default 100. Large limits (>1000) may result in slow responses. Max 20000."New value: +"Maximum events to return per call. Default 100. Large limits (>1000) may result in slow responses. Max 20000. Combine with offset to retrieve match sets larger than one call can return."
    • addedInput schema / properties / offset
      Added value: +{
      +  "description": "Index of the first event to return, counting from 1 — offset=1 is the first match (both upstream APIs reject 0). Omit for the first page, then pass the nextOffset value from a capped result to fetch the next one. Ordering is set by order_by, so keep order_by, limit, and every filter identical across pages.",
      +  "maximum": 9007199254740991,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / nextOffset
      Added value: +{
      +  "description": "Value to pass as the offset input to retrieve the next page, with every other input unchanged. Present only when more events remain; absent means this was the last page.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / queryEcho / properties / offset
      Added value: +{
      +  "description": "1-based paging offset sent upstream. Absent when the first page was fetched.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / truncated / description
      Previous value: -"True when results were capped by the limit parameter and more events likely exist. totalCount carries the full match count when available."New value: +"True when results were capped by the limit parameter and more events remain. totalCount carries the full match count when available, and nextOffset the input for the following page."
  8. Changed7 schema fields changed
    • changedInput schema / properties / start_time / description
      Previous value: -"Start of time range as ISO 8601 (e.g. \"2026-01-01\" or \"2026-05-23T00:00:00\"). Defaults to 30 days before end_time if omitted."New value: +"Start of time range as ISO 8601 (e.g. \"2026-01-01\" or \"2026-05-23T00:00:00\"). Defaults to 30 days before end_time (or before the current time) if omitted — applied server-side so USGS and EMSC honor the same window."
    • addedOutput schema / properties / events / items / properties / magnitude / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / events / items / properties / magnitude / description
      Previous value: -"Preferred magnitude value."New value: +"Preferred magnitude value. Null when no magnitude was computed for the event (the title renders it as \"M ?\")."
    • removedOutput schema / properties / events / items / properties / magnitude / type
      Removed value: -"number"
    • addedOutput schema / properties / queryEcho
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Echo of the effective parameters sent to the upstream API, including server-resolved defaults. Use to diagnose unexpected or empty results — a filter absent here was not sent upstream.",
      +  "properties": {
      +    "alert_level": {
      +      "description": "PAGER alert filter sent upstream. Absent for EMSC — not supported there.",
      +      "type": "string"
      +    },
      +    "end_time": {
      +      "description": "Effective query end time. Absent when omitted from input — the upstream defaults to the current time.",
      +      "type": "string"
      +    },
      +    "latitude": {
      +      "description": "Radius-search latitude sent upstream.",
      +      "type": "number"
      +    },
      +    "limit": {
      +      "description": "Effective result limit sent upstream.",
      +      "type": "number"
      +    },
      +    "longitude": {
      +      "description": "Radius-search longitude sent upstream.",
      +      "type": "number"
      +    },
      +    "max_depth_km": {
      +      "description": "Maximum depth filter sent upstream.",
      +      "type": "number"
      +    },
      +    "max_magnitude": {
      +      "description": "Maximum magnitude filter sent upstream.",
      +      "type": "number"
      +    },
      +    "min_depth_km": {
      +      "description": "Minimum depth filter sent upstream.",
      +      "type": "number"
      +    },
      +    "min_felt": {
      +      "description": "DYFI felt-report filter sent upstream. Absent for EMSC — not supported there.",
      +      "type": "number"
      +    },
      +    "min_magnitude": {
      +      "description": "Minimum magnitude filter sent upstream.",
      +      "type": "number"
      +    },
      +    "min_significance": {
      +      "description": "Significance filter sent upstream. Absent for EMSC — not supported there.",
      +      "type": "number"
      +    },
      +    "order_by": {
      +      "description": "Sort order sent upstream.",
      +      "type": "string"
      +    },
      +    "radius_km": {
      +      "description": "Search radius in km sent upstream (converted to degrees for EMSC).",
      +      "type": "number"
      +    },
      +    "source": {
      +      "description": "Data source queried.",
      +      "enum": [
      +        "usgs",
      +        "emsc"
      +      ],
      +      "type": "string"
      +    },
      +    "start_time": {
      +      "description": "Effective query start time sent upstream — server-resolved to a 30-day window when omitted from input.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "source",
      +    "limit",
      +    "order_by"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / totalCount / description
      Previous value: -"Total events matching the query before the limit was applied. Absent when the upstream API does not report a total count."New value: +"Total events matching the query before the limit was applied. Fetched via a follow-up count query when results are truncated at the limit; absent otherwise."
    • changedOutput schema / properties / truncated / description
      Previous value: -"True when results were capped by the limit parameter and more events likely exist. Use earthquake_count to get the total match count."New value: +"True when results were capped by the limit parameter and more events likely exist. totalCount carries the full match count when available."
  9. Changed3 schema fields changed
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Recovery guidance when results are empty or capped — how to broaden filters or get the full count. Absent when the result set is non-empty and within the limit.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / totalCount
      Added value: +{
      +  "description": "Total events matching the query before the limit was applied. Absent when the upstream API does not report a total count.",
      +  "type": "number"
      +}
    • removedOutput schema / properties / total_count
      Removed value: -{
      -  "description": "Total events matching the query before the limit was applied. Absent when the upstream API does not report total count.",
      -  "type": "number"
      -}
  10. Changed3 schema fields changed
    • addedOutput schema / properties / events / items / properties / depth_km / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / events / items / properties / depth_km / description
      Previous value: -"Hypocenter depth in kilometers. Shallow (<70 km), intermediate (70–300 km), or deep (>300 km)."New value: +"Hypocenter depth in kilometers. Shallow (<70 km), intermediate (70–300 km), or deep (>300 km). Null for historical events where depth was not measured."
    • removedOutput schema / properties / events / items / properties / depth_km / type
      Removed value: -"number"
  11. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/openWorld, but the description adds substantial behavior beyond them: the 20,000-event cap, offset-based paging through the upstream FDSN API, ignoredFilters on the EMSC path, nextOffset/totalCount/countUnavailable response semantics, and the presence of non-tectonic records filtered by event_type.

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 and source selection are front-loaded, then location semantics, then paging. Dense but nearly every sentence carries operational information; the source paragraph is the longest and slightly over-explains EMSC's metadata gaps, though that detail is genuinely decision-relevant.

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?

For a 21-parameter, dual-backend, paged tool, the description covers source selection, geometry composition, cap/paging behavior, and ignored-filter behavior — and an output schema exists so return-shape explanation is largely unnecessary. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds relational meaning the schema cannot: that lat/lon/radius and the four box edges form an intersection rather than an alternative, that each box edge is independently optional, and that USGS-only filters are dropped for EMSC. This goes beyond restating per-parameter docs.

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?

Opens with a specific verb+resource ('Search earthquakes') and enumerates the filter dimensions, then distinguishes the two data sources by their metadata profiles. An agent can immediately tell this apart from earthquake_count, earthquake_get_event, and earthquake_get_feed.

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?

Gives explicit when-to-use-the-alternative guidance ('Use earthquake_count first to gauge result size'), states the prerequisite for radius queries (provide latitude, longitude, radius_km together), explains how box and circle queries combine, and warns which filters are silently ignored on EMSC. This is routing-grade guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.