earthquake-mcp-server
Server Details
Search USGS and EMSC seismic data — real-time feeds, event queries, and earthquake counts.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- cyanheads/earthquake-mcp-server
- GitHub Stars
- 1
- Server Listing
- earthquake-mcp-server
Available Tools
4 toolsearthquake_countCount EarthquakesARead-onlyIdempotentInspect
Count earthquakes matching filters without fetching full records. Use for statistical queries ("how many M5+ earthquakes in 2025?") or to gauge result size before calling earthquake_search. Omitting start_time counts only the last 30 days, so pass an explicit range for any period-specific question; queryEcho reports the window and filters the count actually covers. When exceeds_limit is true, the count exceeds 20,000 and a full search would be truncated — narrow filters before fetching. USGS returns the max_allowed cap (20,000); EMSC count endpoint does not return this field (max_allowed will be null). Counts can be scoped to a rectangular study area with min_latitude, max_latitude, min_longitude, and max_longitude — each independently optional. Combining the box with the lat/lon/radius circle intersects the two, counting only events inside both. Both catalogs include non-tectonic records, so a radius over a mining region counts quarry blasts alongside earthquakes — pass event_type="earthquake" on USGS to exclude them. USGS-specific filters (alert_level, event_type, min_felt, min_significance) are not sent when source=emsc — the response names them in ignoredFilters.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | 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 a count from a separate network. It has no PAGER, DYFI, or ShakeMap metadata; its station coverage is densest around Europe and the Mediterranean, so counts of small events differ most by region. | usgs |
| end_time | No | End of time range as ISO 8601, in the same forms start_time accepts. Defaults to current time if omitted. | |
| latitude | No | Latitude for radius search. Requires longitude and radius_km. | |
| min_felt | No | Minimum number of DYFI (Did You Feel It?) reports. Use to count events with confirmed public impact. Only available from USGS. | |
| longitude | No | Longitude for radius search. Requires latitude and radius_km. | |
| radius_km | No | Search radius in kilometers from the lat/lon point. Max 20001.6, the ceiling USGS enforces — half the Earth's great-circle circumference. Converted to degrees for EMSC (1° ≈ 111.2 km). | |
| event_type | No | Filter by upstream event classification, e.g. "earthquake" to exclude quarry blasts and explosions from the count, or "quarry blast" to count only those. Matched verbatim against the USGS catalog, which accepts any string and returns a count of zero for an unrecognized one. Only available from USGS. | |
| start_time | No | 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. | |
| alert_level | No | Minimum PAGER alert level. PAGER estimates economic loss and casualties. "green" = minimal impact; "red" = extreme. Only available from USGS. | |
| max_depth_km | No | Maximum depth in kilometers. Bounded to the documented -100 to 1000 km catalog envelope. | |
| max_latitude | No | Northern edge of a bounding-box search, in degrees. | |
| min_depth_km | No | 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). | |
| min_latitude | No | 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. | |
| max_longitude | No | Eastern edge of a bounding-box search, in degrees. | |
| max_magnitude | No | Maximum magnitude. | |
| min_longitude | No | 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. | |
| min_magnitude | No | Minimum magnitude (Richter or equivalent). M2.5+ is felt by some people; M5+ can cause damage; M7+ is major. | |
| min_significance | No | Minimum USGS significance score (0–2000+). Combines magnitude, felt reports, and PAGER estimates. Significant events typically score 600+. Only available from USGS. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of events matching the query. |
| error | No | Present when the call failed. Absent on success. |
| source | No | Data source used. |
| queryEcho | No | Echo of the effective parameters the count covers, including server-resolved defaults. Read start_time and end_time to know which window the count spans — a filter absent here was not sent upstream. |
| max_allowed | No | Maximum events the API would return for a full fetch. 20000 for USGS. Null for EMSC — the EMSC count endpoint does not return this field. |
| exceeds_limit | No | True when count exceeds 20000 — a full earthquake_search would be truncated. For EMSC, evaluated against the known 20000 limit since max_allowed is not returned. Narrow filters to retrieve all matching events. |
| ignoredFilters | No | USGS-only filters supplied in the input but not sent upstream because source=emsc does not support them. The count is NOT constrained by these — re-run with source=usgs to apply them. Absent when every supplied filter was applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly, openWorld, and idempotent hints, but the description adds substantial behavioral context: the default 30-day window, the 20,000 cap and exceeds_limit flag, EMSC's lack of max_allowed, non-tectonic records inclusion, and ignoredFilters for EMSC. This goes far beyond the annotations, enriching the agent's understanding of what happens 'under the hood.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. It front-loads the core purpose, then layers specific behavioral caveats in a logical order. There is no fluff; the density is justified by the tool's complexity (18 params, dual sources).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description covers all critical pitfalls: time-range defaults, result caps, source-specific behavior, filter interactions, and the queryEcho mechanism. Since an output schema exists, the description need not explain return values, but it still provides enough context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Though schema coverage is 100%, the description adds cross-parameter semantics not in the schema: the intersection of bounding box and radius circle, the independent optionality of box parameters, and the effect of omitting start_time. It also explains how event_type 'earthquake' excludes quarry blasts but isn't sent to EMSC, which is critical for accurate counts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific verb 'Count' and resource 'earthquakes matching filters,' immediately distinguishing it from earthquake_search. It explicitly states the tool counts without fetching full records and gives concrete examples of statistical queries, making the purpose unambiguous and distinguishable from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use for statistical queries... or to gauge result size before calling earthquake_search.' It also covers edge cases like the 30-day default, the exceeds_limit behavior with a directive to narrow filters, and cross-source differences (USGS vs. EMSC). This is comprehensive routing advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
earthquake_get_eventGet Earthquake Event DetailARead-onlyIdempotentInspect
Fetch detail for a specific earthquake by USGS event ID. Returns the same normalized event a search result carries, plus a projection of the analysis products only the single-event response holds: PAGER impact alert and report link, ShakeMap peak intensity and ground motion, DYFI felt-report totals, the moment-tensor focal mechanism, landslide and liquefaction alerts, origin quality (azimuthal gap, station count, location uncertainty), and finite-fault rupture dimensions. Products are omitted when USGS produced none — a small automatic event typically has no detail at all, while a large reviewed one has most of it. Event IDs appear in the "id" field of earthquake_get_feed and earthquake_search results. This tool is USGS-only — EMSC events have no per-event detail endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | USGS event ID, e.g. "hv74966427" or "us6000sznj". Found in the "id" field of earthquake_get_feed and earthquake_search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| event | No | Full earthquake event detail. |
| detail | No | Analysis products USGS attached to this event. Absent when the event carries none — that means no product was produced, not that impact was zero. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and idempotentHint=true, so the description correctly aligns with those. It adds valuable context about behavior: products are omitted when none exist, and small automatic events may have no detail while large reviewed ones have most. It also states this is USGS-only, which is a behavioral constraint. No contradictions with annotations. The description goes beyond structured fields by explaining output variability based on 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence contributes. It leads with the purpose, then lists the projection of products, notes the omission behavior, mentions the source of event IDs, and ends with the USGS-only limitation. No redundancy or filler. While it's longer than minimal, the complexity of listing many products warrants the length. It's well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one parameter, an output schema exists, and the description covers the purpose, the source of the event ID, what to expect in terms of product presence, and the USGS-only constraint. It also differentiates from siblings. For a single-event detail tool, everything an agent needs to decide when and how to call it is present. The absence of pagination or authorization details is irrelevant given read-only and open-world hints. The description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already describes event_id with examples and where to find it. The description adds a little extra by confirming that event IDs come from the 'id' field of feed/search results, which reinforces the schema. While the schema is fully descriptive, the description provides the same information in prose, which slightly enhances clarity but is not strictly necessary. Given high schema coverage, a baseline of 3 is appropriate, but the description adds just enough context to justify a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: fetch detail for a specific earthquake by USGS event ID. It distinguishes itself from feed/search by explaining it returns the same normalized event plus analysis products only available in a single-event response. It also explicitly limits to USGS events, which differentiates it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use: when you already have an event ID from feed/search results, and it explicitly says this is USGS-only, so not for EMSC events. It doesn't explicitly say 'use this instead of search when you have an ID', but the context of 'Event IDs appear in the 'id' field of earthquake_get_feed and earthquake_search results' and 'returns the same normalized event a search result carries' makes the use case clear. It could be more explicit about alternatives, but it's sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
earthquake_get_feedGet USGS Earthquake FeedARead-onlyIdempotentInspect
Fetch a USGS pre-computed real-time earthquake feed by magnitude tier and time window. These feeds are CDN-cached by USGS and faster and more available than the query API — use them for "what's happening now" queries. "all" includes microseisms (M<1); "significant" is a USGS curation based on magnitude, felt reports, and PAGER impact estimates. "hour" returns 0–10 events typically; "month" can exceed 10,000 for the "all" tier, so results are returned a page at a time: count is the page size, totalCount the whole feed, and nextCursor the input for the following page. The cursor is opaque and must be passed back verbatim — unlike earthquake_search, these feeds have no upstream paging parameter and USGS regenerates them about once a minute, so a numeric offset across two calls would skip or repeat events. For historical or filtered queries, use earthquake_search instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum events to return in this call. Default 100, max 1000. Applies to the first page; later pages carry the page size inside the cursor, so set it on the first call rather than changing it mid-sequence. | |
| cursor | No | Opaque token for the next page, taken verbatim from a previous call's nextCursor. Omit for the first page. Do not construct, parse, or edit it — it encodes a position in the feed snapshot and is rejected if malformed. | |
| time_window | No | Time window for the feed. "hour" typically returns 0–10 events; "month" can exceed 10,000 for the "all" tier. Prefer "hour" or "day" for real-time status checks. | day |
| magnitude_tier | No | Minimum magnitude threshold for the feed. "all" includes microseisms (M<1). "1.0" is M1.0+. "2.5" is M2.5+. "4.5" is M4.5+. "significant" is a USGS curated selection based on magnitude, felt reports, and PAGER impact estimates — not purely magnitude-based. | 2.5 |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of events returned in this page, not the whole feed. |
| error | No | Present when the call failed. Absent on success. |
| events | No | Earthquake events for this page, newest first. |
| notice | No | Recovery guidance when the feed contains no events, or how to continue when a page was capped — narrowing the magnitude tier, widening the time window, paging with the cursor, or using earthquake_search for filtered queries. Absent when a single page covers the whole feed. |
| feed_url | No | Source feed URL. |
| truncated | No | True when the feed holds more events than this page returned. nextCursor carries the input for the following page. |
| nextCursor | No | Opaque token to pass back as the cursor input for the next page. Present only when more events remain; absent means this was the last page. |
| totalCount | No | Number of events in the whole feed, across every page. |
| generated_at | No | ISO 8601 UTC timestamp when this feed was generated by USGS. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint), the description discloses crucial runtime behavior: feeds are CDN-cached, regenerated about once a minute, results are paginated via opaque cursor, and attempting to use a numeric offset would skip/repeat events. This level of detail preempts common misuse and is far more than annotations provide. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized logically: purpose, then usage context, then paging details, then pointer to alternatives. Every sentence contributes new information; there is no filler. Despite its length, it feels tight because each clause carries operational value, and key constraints are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (pagination, cursor semantics, multiple enum-based parameters), the description covers all critical aspects an agent needs: how results are returned (count, totalCount, nextCursor), the fragility of cursor handling, and the distinction from search. The presence of an output schema further reduces the need to describe return structure, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema already describes 100% of parameters, the description adds substantial meaning: it explains typical event counts per time window, clarifies that 'significant' is curated rather than purely magnitude-based, and warns that the cursor must be passed back verbatim. These enrich the schema descriptions, making selection and invocation more reliable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise action and resource: 'Fetch a USGS pre-computed real-time earthquake feed by magnitude tier and time window.' It also differentiates from sibling earthquake_search by stating its real-time feed nature and explicitly pointing to search for historical/filtered queries. This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use: for 'what's happening now' queries, and when not to use: 'For historical or filtered queries, use earthquake_search instead.' It also advises preferring 'hour' or 'day' windows for real-time checks, giving practical selection guidance beyond raw parameter definitions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
earthquake_searchSearch EarthquakesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 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. | |
| offset | No | 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. | |
| source | No | 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. | usgs |
| end_time | No | End of time range as ISO 8601, in the same forms start_time accepts. Defaults to current time if omitted. | |
| latitude | No | Latitude for radius search. Requires longitude and radius_km. | |
| min_felt | No | Minimum number of DYFI (Did You Feel It?) reports. Use to find events with confirmed public impact. Only available from USGS. | |
| order_by | No | Sort order. "time" returns newest first; "magnitude" returns largest first. | time |
| longitude | No | Longitude for radius search. Requires latitude and radius_km. | |
| radius_km | No | 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). | |
| event_type | No | 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. | |
| start_time | No | 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. | |
| alert_level | No | Minimum PAGER alert level. PAGER estimates economic loss and casualties. "green" = minimal impact; "red" = extreme. Only available from USGS. | |
| max_depth_km | No | Maximum depth in kilometers. Bounded to the documented -100 to 1000 km catalog envelope. | |
| max_latitude | No | Northern edge of a bounding-box search, in degrees. | |
| min_depth_km | No | 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). | |
| min_latitude | No | 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. | |
| max_longitude | No | Eastern edge of a bounding-box search, in degrees. | |
| max_magnitude | No | Maximum magnitude. | |
| min_longitude | No | 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. | |
| min_magnitude | No | Minimum magnitude (Richter or equivalent). M2.5+ is felt by some people; M5+ can cause damage; M7+ is major. | |
| min_significance | No | Minimum USGS significance score (0–2000+). Combines magnitude, felt reports, and PAGER estimates. Significant events typically score 600+. Only available from USGS. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of events returned. |
| error | No | Present when the call failed. Absent on success. |
| events | No | Matching earthquake events. |
| notice | No | 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. |
| source | No | Data source used. |
| queryEcho | No | 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. |
| truncated | No | 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. |
| nextOffset | No | 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. |
| totalCount | No | 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. |
| ignoredFilters | No | 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. |
| countUnavailable | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint, openWorldHint, idempotentHint) declare a safe, read-only op, and the description does not contradict them. It adds substantial behavior beyond annotations: the 20,000-event cap and offset paging, nextOffset/totalCount/countUnavailable reporting, the ignoredFilters behavior for USGS-specific params when source=emsc, inclusion of non-tectonic records, and the box+circle intersection semantics. This richly exceeds the annotation baseline for a read-only search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long (roughly 280 words) but dense, and every sentence carries distinct information: scope, source comparison, location semantics, non-tectonic filtering, ignoredFilters, size-guard guidance, and paging. For a 21-parameter, dual-source tool with complex location and paging behavior, this length is justified rather than padded. It is front-loaded with purpose before procedural detail, though it is not as terse as it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (21 parameters, two sources, antimeridian crossing, box+circle intersection, ignoredFilters, paging), the description is remarkably complete. Non-obvious semantics are all covered: source-specific filter behavior, count-unavailable edge case, and 'single edge is a valid constraint.' Since an output schema exists, the description need not explain return shape, and the schema handles per-parameter format details at 100% coverage. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds genuine value beyond the schema by expressing cross-parameter relationships: lat/long/radius_km must be supplied together, the four box edges are independently optional, and combining box with circle 'intersects the two, returning only events inside both.' These relational constraints are not fully legible from the individual property descriptions, elevating the contribution to a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource statement: 'Search earthquakes by time range, magnitude, depth, location radius, PAGER alert level, or felt reports.' It names the two data sources (USGS, EMSC) and explicitly routes to a sibling: 'Use earthquake_count first to gauge result size,' making it distinguishable from earthquake_count, earthquake_get_event, and earthquake_get_feed without inspecting their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance for the most likely confusion: 'Use earthquake_count first to gauge result size before requesting large result sets' and explains when to prefer EMSC ('use it to cross-check any event, anywhere, against a separate network'). It also details paging usage with nextOffset. It does not, however, explicitly contrast against earthquake_get_event/earthquake_get_feed, so a small routing gap remains.
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. Dates show when Glama detected each change.
4 tool updates
- Changed
earthquake_count6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "count", + "max_allowed", + "source", + "exceeds_limit" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "count", - "max_allowed", - "source", - "exceeds_limit" -]
- Changed
earthquake_get_event6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "event" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `not_found`: No event matches the provided event_id. `source_unavailable`: The USGS event API returns a 5xx, serves HTML, or is unreachable. `source_timeout`: The USGS event API did not answer before the request deadline. Other values are possible when a failure originates below the handler.", + "examples": [ + "not_found", + "source_unavailable", + "source_timeout" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "event" -]
- Changed
earthquake_get_feed6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "count", + "generated_at", + "events", + "feed_url" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `feed_unavailable`: USGS feed endpoint returns a 5xx, HTML, or is unreachable. `feed_timeout`: USGS feed endpoint did not answer before the request deadline. Other values are possible when a failure originates below the handler.", + "examples": [ + "feed_unavailable", + "feed_timeout" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "count", - "generated_at", - "events", - "feed_url" -]
- Changed
earthquake_search6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "count", + "source", + "events" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "count", - "source", - "events" -]
3 tool updates
- Changed
earthquake_get_event3 fields changed- changed
Output schema / properties / detail / properties / shakemap / properties / max_pga / descriptionPrevious value: -"Maximum modeled peak ground acceleration, in percent of g."New value: +"Maximum modeled peak ground acceleration, in g — a fraction of standard gravity, as USGS ShakeMap publishes it (0.4 is four tenths of g)." - added
Output schema / properties / event / properties / event_certaintyAdded 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" +} - changed
Output schema / properties / event / properties / event_type / descriptionPrevious 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."
- Changed
earthquake_get_feed2 fields changed- added
Output schema / properties / events / items / properties / event_certaintyAdded 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" +} - changed
Output schema / properties / events / items / properties / event_type / descriptionPrevious 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."
- Changed
earthquake_search5 fields changed- added
Output schema / properties / countUnavailableAdded 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" +} - added
Output schema / properties / events / items / properties / event_certaintyAdded 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" +} - changed
Output schema / properties / events / items / properties / event_type / descriptionPrevious 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." - changed
Output schema / properties / totalCount / descriptionPrevious 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." - changed
Output schema / properties / truncated / descriptionPrevious 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."
2 tool updates
- Changed
earthquake_count21 fields changed- changed
Input schema / properties / end_time / descriptionPrevious 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." - added
Input schema / properties / end_time / patternAdded value: +"^\\d{4}(-\\d{1,2}(-\\d{1,2})?)?([T ]\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$" - added
Input schema / properties / event_type / minLengthAdded value: +1 - changed
Input schema / properties / max_depth_km / descriptionPrevious value: -"Maximum depth in kilometers."New value: +"Maximum depth in kilometers. Bounded to the documented -100 to 1000 km catalog envelope." - added
Input schema / properties / max_depth_km / maximumAdded value: +1000 - added
Input schema / properties / max_depth_km / minimumAdded value: +-100 - added
Input schema / properties / max_latitudeAdded value: +{ + "description": "Northern edge of a bounding-box search, in degrees.", + "maximum": 90, + "minimum": -90, + "type": "number" +} - added
Input schema / properties / max_longitudeAdded value: +{ + "description": "Eastern edge of a bounding-box search, in degrees.", + "maximum": 360, + "minimum": -360, + "type": "number" +} - changed
Input schema / properties / min_depth_km / descriptionPrevious 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)." - added
Input schema / properties / min_depth_km / maximumAdded value: +1000 - added
Input schema / properties / min_depth_km / minimumAdded value: +-100 - added
Input schema / properties / min_latitudeAdded 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" +} - added
Input schema / properties / min_longitudeAdded 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" +} - changed
Input schema / properties / radius_km / descriptionPrevious value: -"Search radius in kilometers from the lat/lon point. Converted to degrees for EMSC (1° ≈ 111.2 km)."New value: +"Search radius in kilometers from the lat/lon point. Max 20001.6, the ceiling USGS enforces — half the Earth's great-circle circumference. Converted to degrees for EMSC (1° ≈ 111.2 km)." - changed
Input schema / properties / radius_km / maximumPrevious value: -20002New value: +20001.6 - changed
Input schema / properties / start_time / descriptionPrevious 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." - added
Input schema / properties / start_time / patternAdded value: +"^\\d{4}(-\\d{1,2}(-\\d{1,2})?)?([T ]\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$" - added
Output schema / properties / queryEcho / properties / max_latitudeAdded value: +{ + "description": "Northern bounding-box edge sent upstream, in degrees.", + "type": "number" +} - added
Output schema / properties / queryEcho / properties / max_longitudeAdded value: +{ + "description": "Eastern bounding-box edge sent upstream, in degrees.", + "type": "number" +} - added
Output schema / properties / queryEcho / properties / min_latitudeAdded value: +{ + "description": "Southern bounding-box edge sent upstream, in degrees.", + "type": "number" +} - added
Output schema / properties / queryEcho / properties / min_longitudeAdded value: +{ + "description": "Western bounding-box edge sent upstream, in degrees.", + "type": "number" +}
- Changed
earthquake_search21 fields changed- changed
Input schema / properties / end_time / descriptionPrevious 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." - added
Input schema / properties / end_time / patternAdded value: +"^\\d{4}(-\\d{1,2}(-\\d{1,2})?)?([T ]\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$" - added
Input schema / properties / event_type / minLengthAdded value: +1 - changed
Input schema / properties / max_depth_km / descriptionPrevious value: -"Maximum depth in kilometers."New value: +"Maximum depth in kilometers. Bounded to the documented -100 to 1000 km catalog envelope." - added
Input schema / properties / max_depth_km / maximumAdded value: +1000 - added
Input schema / properties / max_depth_km / minimumAdded value: +-100 - added
Input schema / properties / max_latitudeAdded value: +{ + "description": "Northern edge of a bounding-box search, in degrees.", + "maximum": 90, + "minimum": -90, + "type": "number" +} - added
Input schema / properties / max_longitudeAdded value: +{ + "description": "Eastern edge of a bounding-box search, in degrees.", + "maximum": 360, + "minimum": -360, + "type": "number" +} - changed
Input schema / properties / min_depth_km / descriptionPrevious 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)." - added
Input schema / properties / min_depth_km / maximumAdded value: +1000 - added
Input schema / properties / min_depth_km / minimumAdded value: +-100 - added
Input schema / properties / min_latitudeAdded 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" +} - added
Input schema / properties / min_longitudeAdded 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" +} - changed
Input schema / properties / radius_km / descriptionPrevious 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)." - changed
Input schema / properties / radius_km / maximumPrevious value: -20002New value: +20001.6 - changed
Input schema / properties / start_time / descriptionPrevious 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." - added
Input schema / properties / start_time / patternAdded value: +"^\\d{4}(-\\d{1,2}(-\\d{1,2})?)?([T ]\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$" - added
Output schema / properties / queryEcho / properties / max_latitudeAdded value: +{ + "description": "Northern bounding-box edge sent upstream, in degrees.", + "type": "number" +} - added
Output schema / properties / queryEcho / properties / max_longitudeAdded value: +{ + "description": "Eastern bounding-box edge sent upstream, in degrees.", + "type": "number" +} - added
Output schema / properties / queryEcho / properties / min_latitudeAdded value: +{ + "description": "Southern bounding-box edge sent upstream, in degrees.", + "type": "number" +} - added
Output schema / properties / queryEcho / properties / min_longitudeAdded value: +{ + "description": "Western bounding-box edge sent upstream, in degrees.", + "type": "number" +}
4 tool updates
- Changed
earthquake_count2 fields changed- added
Input schema / properties / event_typeAdded value: +{ + "description": "Filter by upstream event classification, e.g. \"earthquake\" to exclude quarry blasts and explosions from the count, or \"quarry blast\" to count only those. Matched verbatim against the USGS catalog, which accepts any string and returns a count of zero for an unrecognized one. Only available from USGS.", + "type": "string" +} - added
Output schema / properties / queryEcho / properties / event_typeAdded value: +{ + "description": "Event-type filter sent upstream. Absent for EMSC — not supported there.", + "type": "string" +}
- Changed
earthquake_get_event2 fields changed- added
Output schema / properties / detailAdded value: +{ + "additionalProperties": false, + "description": "Analysis products USGS attached to this event. Absent when the event carries none — that means no product was produced, not that impact was zero.", + "properties": { + "dyfi": { + "additionalProperties": false, + "description": "Felt-report summary. Absent when no DYFI product exists for the event.", + "properties": { + "map_url": { + "description": "URL of the rendered DYFI intensity map image.", + "type": "string" + }, + "max_cdi": { + "description": "Maximum Community Decimal Intensity derived from those reports (0–12 scale).", + "type": "number" + }, + "responses": { + "description": "Number of \"Did You Feel It?\" reports the public submitted.", + "type": "number" + } + }, + "type": "object" + }, + "finite_fault": { + "additionalProperties": false, + "description": "Finite-fault rupture model. Produced only for large events.", + "properties": { + "model_url": { + "description": "URL of the finite-fault rupture model file.", + "type": "string" + }, + "rupture_length_km": { + "description": "Modeled rupture length along strike, in kilometers.", + "type": "number" + }, + "rupture_width_km": { + "description": "Modeled rupture width down dip, in kilometers.", + "type": "number" + } + }, + "type": "object" + }, + "ground_failure": { + "additionalProperties": false, + "description": "Secondary-hazard alert levels. Absent when no ground-failure model was run.", + "properties": { + "landslide_alert": { + "description": "Landslide hazard alert level — \"green\", \"yellow\", \"orange\", or \"red\".", + "type": "string" + }, + "liquefaction_alert": { + "description": "Liquefaction hazard alert level — \"green\", \"yellow\", \"orange\", or \"red\".", + "type": "string" + } + }, + "type": "object" + }, + "losspager": { + "additionalProperties": false, + "description": "PAGER impact assessment. Estimated fatality and economic-loss brackets live in a separate content file and are not part of this response — fetch report_url for them.", + "properties": { + "alert_level": { + "description": "PAGER impact alert level — \"green\", \"yellow\", \"orange\", or \"red\".", + "type": "string" + }, + "report_url": { + "description": "URL of the PAGER one-page PDF summary of estimated impact.", + "type": "string" + } + }, + "type": "object" + }, + "moment_tensor": { + "additionalProperties": false, + "description": "Focal-mechanism solution. Absent for events with no moment-tensor inversion.", + "properties": { + "derived_depth_km": { + "description": "Centroid depth in kilometers derived from the moment-tensor inversion.", + "type": "number" + }, + "nodal_plane_1": { + "additionalProperties": false, + "description": "First nodal plane of the focal mechanism. Either plane can be the true fault.", + "properties": { + "dip": { + "description": "Fault plane dip in degrees from horizontal (0–90).", + "type": "number" + }, + "rake": { + "description": "Slip direction in degrees (-180 to 180). Near 90 is reverse faulting, near -90 normal, near 0 or 180 strike-slip.", + "type": "number" + }, + "strike": { + "description": "Fault plane strike in degrees clockwise from north (0–360).", + "type": "number" + } + }, + "required": [ + "strike", + "dip", + "rake" + ], + "type": "object" + }, + "nodal_plane_2": { + "additionalProperties": false, + "description": "Second nodal plane — the auxiliary solution, indistinguishable from the first on seismic data alone.", + "properties": { + "dip": { + "description": "Fault plane dip in degrees from horizontal (0–90).", + "type": "number" + }, + "rake": { + "description": "Slip direction in degrees (-180 to 180). Near 90 is reverse faulting, near -90 normal, near 0 or 180 strike-slip.", + "type": "number" + }, + "strike": { + "description": "Fault plane strike in degrees clockwise from north (0–360).", + "type": "number" + } + }, + "required": [ + "strike", + "dip", + "rake" + ], + "type": "object" + }, + "scalar_moment_nm": { + "description": "Scalar seismic moment in newton-metres — the physical size of the rupture.", + "type": "number" + } + }, + "type": "object" + }, + "origin": { + "additionalProperties": false, + "description": "Location-quality metrics for the preferred origin.", + "properties": { + "azimuthal_gap_deg": { + "description": "Largest azimuthal gap between stations, in degrees. Gaps above ~180 make the location poorly constrained.", + "type": "number" + }, + "depth_error_km": { + "description": "Depth uncertainty in kilometers.", + "type": "number" + }, + "horizontal_error_km": { + "description": "Horizontal location uncertainty in kilometers.", + "type": "number" + }, + "num_stations_used": { + "description": "Number of seismic stations used in the location solution.", + "type": "number" + }, + "review_status": { + "description": "Review state of the origin solution as the contributing network published it.", + "type": "string" + } + }, + "type": "object" + }, + "shakemap": { + "additionalProperties": false, + "description": "ShakeMap modeled ground-motion summary. Absent when no ShakeMap was produced.", + "properties": { + "intensity_map_url": { + "description": "URL of the rendered ShakeMap intensity map image.", + "type": "string" + }, + "max_mmi": { + "description": "Maximum modeled shaking intensity across the ShakeMap grid (Modified Mercalli).", + "type": "number" + }, + "max_pga": { + "description": "Maximum modeled peak ground acceleration, in percent of g.", + "type": "number" + }, + "max_pgv": { + "description": "Maximum modeled peak ground velocity, in cm/s.", + "type": "number" + } + }, + "type": "object" + } + }, + "type": "object" +} - added
Output schema / properties / event / properties / event_typeAdded 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" +}
- Changed
earthquake_get_feed1 field changed- added
Output schema / properties / events / items / properties / event_typeAdded 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" +}
- Changed
earthquake_search3 fields changed- added
Input schema / properties / event_typeAdded 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" +} - added
Output schema / properties / events / items / properties / event_typeAdded 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" +} - added
Output schema / properties / queryEcho / properties / event_typeAdded value: +{ + "description": "Event-type filter sent upstream. Absent for EMSC — not supported there.", + "type": "string" +}
4 tool updates
- Changed
earthquake_count2 fields changed- changed
Input schema / properties / source / descriptionPrevious value: -"Data source. \"usgs\" covers global events with PAGER, DYFI, and ShakeMap metadata. \"emsc\" covers the European-Mediterranean region."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 a count from a separate network. It has no PAGER, DYFI, or ShakeMap metadata; its station coverage is densest around Europe and the Mediterranean, so counts of small events differ most by region." - added
Output schema / properties / ignoredFiltersAdded value: +{ + "description": "USGS-only filters supplied in the input but not sent upstream because source=emsc does not support them. The count 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" +}
- Changed
earthquake_get_event14 fields changed- changed
Output schema / properties / event / properties / alert / descriptionPrevious 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." - added
Output schema / properties / event / properties / authAdded 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" +} - changed
Output schema / properties / event / properties / cdi / descriptionPrevious 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." - changed
Output schema / properties / event / properties / felt / descriptionPrevious 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." - changed
Output schema / properties / event / properties / mmi / descriptionPrevious 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." - changed
Output schema / properties / event / properties / significance / descriptionPrevious 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." - added
Output schema / properties / event / properties / source_catalogAdded 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" +} - added
Output schema / properties / event / properties / status / anyOfAdded value: +[ + { + "enum": [ + "automatic", + "reviewed", + "deleted" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / event / properties / status / descriptionPrevious 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." - removed
Output schema / properties / event / properties / status / enumRemoved value: -[ - "automatic", - "reviewed", - "deleted" -] - removed
Output schema / properties / event / properties / status / typeRemoved value: -"string" - added
Output schema / properties / event / properties / tsunami / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / event / properties / tsunami / descriptionPrevious 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." - removed
Output schema / properties / event / properties / tsunami / typeRemoved value: -"number"
- Changed
earthquake_get_feed14 fields changed- changed
Output schema / properties / events / items / properties / alert / descriptionPrevious 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." - added
Output schema / properties / events / items / properties / authAdded 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" +} - changed
Output schema / properties / events / items / properties / cdi / descriptionPrevious 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." - changed
Output schema / properties / events / items / properties / felt / descriptionPrevious 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." - changed
Output schema / properties / events / items / properties / mmi / descriptionPrevious 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." - changed
Output schema / properties / events / items / properties / significance / descriptionPrevious 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." - added
Output schema / properties / events / items / properties / source_catalogAdded 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" +} - added
Output schema / properties / events / items / properties / status / anyOfAdded value: +[ + { + "enum": [ + "automatic", + "reviewed", + "deleted" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / events / items / properties / status / descriptionPrevious 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." - removed
Output schema / properties / events / items / properties / status / enumRemoved value: -[ - "automatic", - "reviewed", - "deleted" -] - removed
Output schema / properties / events / items / properties / status / typeRemoved value: -"string" - added
Output schema / properties / events / items / properties / tsunami / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / events / items / properties / tsunami / descriptionPrevious 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." - removed
Output schema / properties / events / items / properties / tsunami / typeRemoved value: -"number"
- Changed
earthquake_search16 fields changed- changed
Input schema / properties / source / descriptionPrevious 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." - changed
Output schema / properties / events / items / properties / alert / descriptionPrevious 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." - added
Output schema / properties / events / items / properties / authAdded 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" +} - changed
Output schema / properties / events / items / properties / cdi / descriptionPrevious 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." - changed
Output schema / properties / events / items / properties / felt / descriptionPrevious 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." - changed
Output schema / properties / events / items / properties / mmi / descriptionPrevious 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." - changed
Output schema / properties / events / items / properties / significance / descriptionPrevious 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." - added
Output schema / properties / events / items / properties / source_catalogAdded 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" +} - added
Output schema / properties / events / items / properties / status / anyOfAdded value: +[ + { + "enum": [ + "automatic", + "reviewed", + "deleted" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / events / items / properties / status / descriptionPrevious 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." - removed
Output schema / properties / events / items / properties / status / enumRemoved value: -[ - "automatic", - "reviewed", - "deleted" -] - removed
Output schema / properties / events / items / properties / status / typeRemoved value: -"string" - added
Output schema / properties / events / items / properties / tsunami / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / events / items / properties / tsunami / descriptionPrevious 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." - removed
Output schema / properties / events / items / properties / tsunami / typeRemoved value: -"number" - added
Output schema / properties / ignoredFiltersAdded 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" +}
3 tool updates
- Changed
earthquake_count1 field changed- added
Output schema / properties / queryEchoAdded value: +{ + "additionalProperties": false, + "description": "Echo of the effective parameters the count covers, including server-resolved defaults. Read start_time and end_time to know which window the count spans — 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" + }, + "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" + }, + "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" + ], + "type": "object" +}
- Changed
earthquake_get_feed8 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque token for the next page, taken verbatim from a previous call's nextCursor. Omit for the first page. Do not construct, parse, or edit it — it encodes a position in the feed snapshot and is rejected if malformed.", + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Maximum events to return in this call. Default 100, max 1000. Applies to the first page; later pages carry the page size inside the cursor, so set it on the first call rather than changing it mid-sequence.", + "maximum": 1000, + "minimum": 1, + "type": "integer" +} - changed
Output schema / properties / count / descriptionPrevious value: -"Number of events in the feed."New value: +"Number of events returned in this page, not the whole feed." - changed
Output schema / properties / events / descriptionPrevious value: -"Earthquake events, newest first."New value: +"Earthquake events for this page, newest first." - added
Output schema / properties / nextCursorAdded value: +{ + "description": "Opaque token to pass back as the cursor input for the next page. Present only when more events remain; absent means this was the last page.", + "type": "string" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Recovery guidance when the feed contains no events — suggests narrowing the magnitude tier, widening the time window, or using earthquake_search for filtered queries. Absent when the feed contains events."New value: +"Recovery guidance when the feed contains no events, or how to continue when a page was capped — narrowing the magnitude tier, widening the time window, paging with the cursor, or using earthquake_search for filtered queries. Absent when a single page covers the whole feed." - added
Output schema / properties / totalCountAdded value: +{ + "description": "Number of events in the whole feed, across every page.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the feed holds more events than this page returned. nextCursor carries the input for the following page.", + "type": "boolean" +}
- Changed
earthquake_search5 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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." - added
Input schema / properties / offsetAdded 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" +} - added
Output schema / properties / nextOffsetAdded 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" +} - added
Output schema / properties / queryEcho / properties / offsetAdded value: +{ + "description": "1-based paging offset sent upstream. Absent when the first page was fetched.", + "type": "number" +} - changed
Output schema / properties / truncated / descriptionPrevious 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."
4 tool updates
- Changed
earthquake_count1 field changed- changed
Input schema / properties / start_time / descriptionPrevious 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."
- Changed
earthquake_get_event3 fields changed- added
Output schema / properties / event / properties / magnitude / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / event / properties / magnitude / descriptionPrevious value: -"Preferred magnitude value."New value: +"Preferred magnitude value. Null when no magnitude was computed for the event (the title renders it as \"M ?\")." - removed
Output schema / properties / event / properties / magnitude / typeRemoved value: -"number"
- Changed
earthquake_get_feed3 fields changed- added
Output schema / properties / events / items / properties / magnitude / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / events / items / properties / magnitude / descriptionPrevious value: -"Preferred magnitude value."New value: +"Preferred magnitude value. Null when no magnitude was computed for the event (the title renders it as \"M ?\")." - removed
Output schema / properties / events / items / properties / magnitude / typeRemoved value: -"number"
- Changed
earthquake_search7 fields changed- changed
Input schema / properties / start_time / descriptionPrevious 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." - added
Output schema / properties / events / items / properties / magnitude / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / events / items / properties / magnitude / descriptionPrevious value: -"Preferred magnitude value."New value: +"Preferred magnitude value. Null when no magnitude was computed for the event (the title renders it as \"M ?\")." - removed
Output schema / properties / events / items / properties / magnitude / typeRemoved value: -"number" - added
Output schema / properties / queryEchoAdded 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" +} - changed
Output schema / properties / totalCount / descriptionPrevious 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." - changed
Output schema / properties / truncated / descriptionPrevious 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."
2 tool updates
- Changed
earthquake_get_feed1 field changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Recovery guidance when the feed contains no events — suggests narrowing the magnitude tier, widening the time window, or using earthquake_search for filtered queries. Absent when the feed contains events.", + "type": "string" +}
- Changed
earthquake_search3 fields changed- added
Output schema / properties / noticeAdded 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" +} - added
Output schema / properties / totalCountAdded 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" +} - removed
Output schema / properties / total_countRemoved value: -{ - "description": "Total events matching the query before the limit was applied. Absent when the upstream API does not report total count.", - "type": "number" -}
3 tool updates
- Changed
earthquake_get_event3 fields changed- added
Output schema / properties / event / properties / depth_km / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / event / properties / depth_km / descriptionPrevious 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." - removed
Output schema / properties / event / properties / depth_km / typeRemoved value: -"number"
- Changed
earthquake_get_feed3 fields changed- added
Output schema / properties / events / items / properties / depth_km / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / events / items / properties / depth_km / descriptionPrevious 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." - removed
Output schema / properties / events / items / properties / depth_km / typeRemoved value: -"number"
- Changed
earthquake_search3 fields changed- added
Output schema / properties / events / items / properties / depth_km / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / events / items / properties / depth_km / descriptionPrevious 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." - removed
Output schema / properties / events / items / properties / depth_km / typeRemoved value: -"number"
4 tool updates
- First observed
earthquake_count - First observed
earthquake_get_event - First observed
earthquake_get_feed - First observed
earthquake_search
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Real-time earthquake events from the US Geological Survey
Global earthquake events from the USGS, 2150 BC-present: magnitude, depth, location, counts.
Our Earthquake Monitor harnesses the USGS earthquake feed to provide you with up-to-the-minute
USGS Earthquake Catalog MCP (FDSNWS event API).
Related MCP Servers
- AlicenseAqualityDmaintenanceReal-time earthquake data and seismic monitoring for AI agents via the USGS Earthquake Catalog API.8MIT
- AlicenseNot gradedqualityCmaintenanceProvides live earthquake data from the USGS feed, enabling users to query recent seismic activity and view interactive earthquake widgets within the chat.46MIT
- AlicenseNot gradedqualityCmaintenanceProvides access to the USGS Earthquake Catalog for querying earthquake events via the FDSNWS API, enabling natural language questions about earthquake data.15MIT
- FlicenseNot gradedqualityCmaintenanceEnables users to explore live earthquake data from USGS, with an interactive widget for filtering and visualizing seismic events worldwide.-
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Each tool serves a clear, distinct purpose: count for statistical queries, search for filtered record retrieval, feed for pre-computed real-time data, and get_event for per-event detail. Overlap between count and search is explicitly addressed with guidance on when to use each. No two tools appear interchangeable.
All tools follow the consistent pattern of earthquake_ + verb (count, get_event, get_feed, search), making the action and resource unambiguous. The naming is uniform across all four tools, with no mixed conventions or vague verbs.
With 4 tools, the surface is tightly scoped and each tool covers a necessary operation for the domain. This is well within the ideal 3-15 range and neither feels thin nor overloaded for an earthquake data server.
The tool set covers the core workflows: searching with rich filters, counting for statistics, retrieving detailed event info, and accessing real-time feeds. No significant gaps are apparent—the server supports both USGS and EMSC sources, and the read-only nature is appropriate for the domain.