# io.github.cyanheads/earthquake-mcp-server (remote · earthquake.caseyjhand.com)

Search USGS and EMSC seismic data — real-time feeds, event queries, and earthquake counts.

- Trust score: 72/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `earthquake.caseyjhand.com`: 72/100 (this document), [markdown](https://verifymcp.io/servers/cyanheads-earthquake-mcp-server/earthquake.md), [page](https://verifymcp.io/servers/cyanheads-earthquake-mcp-server/earthquake)
- npm · `@cyanheads/earthquake-mcp-server`: 35/100, [markdown](https://verifymcp.io/servers/cyanheads-earthquake-mcp-server/cyanheads-earthquake-mcp-server.md), [page](https://verifymcp.io/servers/cyanheads-earthquake-mcp-server/cyanheads-earthquake-mcp-server)

## Channel facts

- Endpoint: `https://earthquake.caseyjhand.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.3.1`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 66/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 4 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 84/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3127 tokens (~130/item across 24 items; 4 tools + 20 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http cyanheads-earthquake-mcp-server https://earthquake.caseyjhand.com/mcp
```

### Codex

```toml
[mcp_servers.cyanheads-earthquake-mcp-server]
url = "https://earthquake.caseyjhand.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-earthquake-mcp-server": {
      "type": "remote",
      "url": "https://earthquake.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add cyanheads-earthquake-mcp-server --url https://earthquake.caseyjhand.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  cyanheads-earthquake-mcp-server:
    url: "https://earthquake.caseyjhand.com/mcp"
```

### Other

```json
{
  "mcpServers": {
    "cyanheads-earthquake-mcp-server": {
      "type": "http",
      "url": "https://earthquake.caseyjhand.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 72, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 71, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 70, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 70, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-28 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 68, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 68)

First indexed and scored.

## MCP tools (4)

### `earthquake_get_feed` (~462 tokens)

Get USGS Earthquake Feed

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.

Input parameters:

- `cursor` (string): 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 reje…
- `limit` (integer): 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-seq…
- `magnitude_tier` (string): 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,…
- `time_window` (string): 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.

Output parameters:

- `count` (number): Number of events returned in this page, not the whole feed.
- `events` (array): Earthquake events for this page, newest first.
- `feed_url` (string): Source feed URL.
- `generated_at` (string): ISO 8601 UTC timestamp when this feed was generated by USGS.
- `nextCursor` (string): 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.
- `notice` (string): 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_sea…
- `totalCount` (number): Number of events in the whole feed, across every page.
- `truncated` (boolean): True when the feed holds more events than this page returned. nextCursor carries the input for the following page.

### `earthquake_search` (~962 tokens)

Search Earthquakes

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

Input parameters:

- `alert_level` (string): Minimum PAGER alert level. PAGER estimates economic loss and casualties. "green" = minimal impact; "red" = extreme. Only available from USGS.
- `end_time` (string): End of time range as ISO 8601. Defaults to current time if omitted.
- `event_type` (string): 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 s…
- `latitude` (number): Latitude for radius search. Requires longitude and radius_km.
- `limit` (integer): 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.
- `longitude` (number): Longitude for radius search. Requires latitude and radius_km.
- `max_depth_km` (number): Maximum depth in kilometers.
- `max_magnitude` (number): Maximum magnitude.
- `min_depth_km` (number): Minimum depth in kilometers. Shallow quakes (0–70 km) typically cause more surface damage than deep quakes (>300 km).
- `min_felt` (integer): Minimum number of DYFI (Did You Feel It?) reports. Use to find events with confirmed public impact. Only available from USGS.
- `min_magnitude` (number): Minimum magnitude (Richter or equivalent). M2.5+ is felt by some people; M5+ can cause damage; M7+ is major.
- `min_significance` (integer): Minimum USGS significance score (0–2000+). Combines magnitude, felt reports, and PAGER estimates. Significant events typically score 600+. Only available from USGS.
- `offset` (integer): 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…
- `order_by` (string): Sort order. "time" returns newest first; "magnitude" returns largest first.
- `radius_km` (number): 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).
- `source` (string): 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 Seismologica…
- `start_time` (string): 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…

Output parameters:

- `count` (number): Number of events returned.
- `events` (array): Matching earthquake events.
- `ignoredFilters` (array): 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 whe…
- `nextOffset` (number): 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.
- `notice` (string): 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.
- `queryEcho` (object): 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.
- `source` (string): Data source used.
- `totalCount` (number): 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.
- `truncated` (boolean): 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.

### `earthquake_get_event` (~213 tokens)

Get Earthquake Event Detail

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.

Input parameters:

- `event_id` (string, required): USGS event ID, e.g. "hv74966427" or "us6000sznj". Found in the "id" field of earthquake_get_feed and earthquake_search results.

Output parameters:

- `detail` (object): Analysis products USGS attached to this event. Absent when the event carries none — that means no product was produced, not that impact was zero.
- `event` (object): Full earthquake event detail.

### `earthquake_count` (~775 tokens)

Count Earthquakes

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). 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.

Input parameters:

- `alert_level` (string): Minimum PAGER alert level. PAGER estimates economic loss and casualties. "green" = minimal impact; "red" = extreme. Only available from USGS.
- `end_time` (string): End of time range as ISO 8601. Defaults to current time if omitted.
- `event_type` (string): 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, wh…
- `latitude` (number): Latitude for radius search. Requires longitude and radius_km.
- `longitude` (number): Longitude for radius search. Requires latitude and radius_km.
- `max_depth_km` (number): Maximum depth in kilometers.
- `max_magnitude` (number): Maximum magnitude.
- `min_depth_km` (number): Minimum depth in kilometers. Shallow quakes (0–70 km) typically cause more surface damage than deep quakes (>300 km).
- `min_felt` (integer): Minimum number of DYFI (Did You Feel It?) reports. Use to count events with confirmed public impact. Only available from USGS.
- `min_magnitude` (number): Minimum magnitude (Richter or equivalent). M2.5+ is felt by some people; M5+ can cause damage; M7+ is major.
- `min_significance` (integer): Minimum USGS significance score (0–2000+). Combines magnitude, felt reports, and PAGER estimates. Significant events typically score 600+. Only available from USGS.
- `radius_km` (number): Search radius in kilometers from the lat/lon point. Converted to degrees for EMSC (1° ≈ 111.2 km).
- `source` (string): 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 Seismologica…
- `start_time` (string): 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…

Output parameters:

- `count` (number): Number of events matching the query.
- `exceeds_limit` (boolean): 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 matchi…
- `ignoredFilters` (array): 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 eve…
- `max_allowed`: 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.
- `queryEcho` (object): 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.
- `source` (string): Data source used.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/cyanheads-earthquake-mcp-server/earthquake#diagnostics

## Score history

- 2026-08-03: 72
- 2026-08-02: 72
- 2026-08-01: 71
- 2026-07-31: 71
- 2026-07-30: 70
- 2026-07-29: 70
- 2026-07-28: 69
- 2026-07-27: 68
- 2026-07-26: 68

## Links

- Remote endpoint: https://earthquake.caseyjhand.com/mcp
- Repository: https://github.com/cyanheads/earthquake-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/cyanheads-earthquake-mcp-server/earthquake/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/cyanheads-earthquake-mcp-server/earthquake/changelog.json
- HTML version of this page: https://verifymcp.io/servers/cyanheads-earthquake-mcp-server/earthquake
