Featured

Deploy OpenClaw in 60 seconds — 20% off logoDeploy OpenClaw in 60 seconds — 20% off

Launch OpenClaw on Hostinger in about 60 seconds and keep your agent live 24/7. Our referral link gives you 20% off, no coupon code needed.

Launch on Hostinger
Run your Hermes agent on Hostinger, fully managed logoRun your Hermes agent on Hostinger, fully managed

Launch Hermes on Hostinger in one click, fully managed, no VPS knowledge needed. Use code ZACAARON10 for 10% off.

Launch on Hostinger
Crawl and scrape any site into clean data, 10% off logoCrawl and scrape any site into clean data, 10% off

Firecrawl crawls and scrapes any site into clean markdown for your agent. Get 1,000 free credits, and new users get 10% off their first purchase.

Try Firecrawl free
6,000+ web scrapers for your AI agent, start free logo6,000+ web scrapers for your AI agent, start free

Apify gives your agent live web data: 6,000+ prebuilt scrapers and actors, MCP-ready. Sign up free with $5 in usage credits.

Try Apify free
One API to scrape, enrich, and extract the internet. logoOne API to scrape, enrich, and extract the internet.

Context.dev gives your agents a single API to scrape, enrich, and extract live web data — no proxies, no parsers, no maintenance.

Start building free
SetupClaw: done-for-you OpenClaw for founders & exec teams logoSetupClaw: done-for-you OpenClaw for founders & exec teams

White-glove OpenClaw for founders and exec teams (4–50+ employees): we install, harden, integrate your tools, and maintain it — secured from day one.

Get it set up for you
SEO data APIs for your agent, $1 free credit logoSEO data APIs for your agent, $1 free credit

DataForSEO gives your agent live access to SERP results, keyword data, backlinks, and on-page SEO data through one API. New accounts get a $1 credit, good for up to 20,000 keyword or backlink lookups.

Try DataForSEO free
Reach 48,000+ AI builders

A flat monthly placement in front of developers actively installing AI tools. No lock-in, cancel anytime.

Advertise here

Works with

Claude CodeClaude DesktopCursorVS CodeClineCodex CLIOpenClaw+ any MCP client

Install to Claude Code

This server doesn't publish a one-line install command. Follow the setup in the source repository.

Summary

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

README.md

<div align="center"> <h1>@cyanheads/earthquake-mcp-server</h1> <p><b>Search USGS and EMSC seismic data — real-time feeds, event queries, and earthquake counts via MCP. STDIO or Streamable HTTP.</b> <div>4 Tools • 2 Resources</div> </p> </div>

<div align="center">

![Version](./CHANGELOG.md) ![License](./LICENSE) ![Docker](https://github.com/users/cyanheads/packages/container/package/earthquake-mcp-server) ![MCP SDK](https://modelcontextprotocol.io/) ![npm](https://www.npmjs.com/package/@cyanheads/earthquake-mcp-server) ![TypeScript](https://www.typescriptlang.org/) ![Bun](https://bun.sh/)

</div>

<div align="center">

![Install in Claude Desktop](https://github.com/cyanheads/earthquake-mcp-server/releases/latest/download/earthquake-mcp-server.mcpb) ![Install in Cursor](https://cursor.com/en/install-mcp?name=earthquake-mcp-server&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBjeWFuaGVhZHMvZWFydGhxdWFrZS1tY3Atc2VydmVyIl19) ![Install in VS Code](https://vscode.dev/redirect?url=vscode:mcp/install?%7B%22name%22%3A%22earthquake-mcp-server%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40cyanheads%2Fearthquake-mcp-server%22%5D%7D)

![Framework](https://www.npmjs.com/package/@cyanheads/mcp-ts-core)

</div>

<div align="center">

Public Hosted Server: https://earthquake.caseyjhand.com/mcp

</div>

---

Tools

4 tools for querying global earthquake data from USGS and EMSC:

| Tool | Description | |:---|:---| | earthquake_get_feed | Fetch a USGS pre-computed real-time earthquake feed by magnitude tier and time window | | earthquake_search | Search earthquakes by time range, magnitude, depth, location radius, PAGER alert level, or felt reports | | earthquake_count | Count earthquakes matching filters without fetching full records | | earthquake_get_event | Fetch complete detail for a specific earthquake by USGS event ID |

earthquake_get_feed

Fetch a USGS pre-computed real-time earthquake feed by magnitude tier and time window.

  • CDN-cached by USGS — faster and more available than the FDSN query API
  • Five magnitude tiers: all (microseisms), 1.0, 2.5, 4.5, and significant (USGS-curated by magnitude, felt reports, and PAGER impact)
  • Four time windows: hour, day, week, month
  • Returns event list with counts and the source feed URL
  • Paged with an opaque cursor: limit bounds a page (default 100, max 1000), totalCount reports the whole feed, and nextCursor retrieves the rest — the broad tiers run past 10,000 events for month
  • The cursor is opaque because these feeds have no upstream paging parameter and USGS regenerates them about once a minute; a numeric offset across two calls would skip or repeat events
  • Best for real-time "what's happening now" queries; use earthquake_search for historical or filtered queries

---

earthquake_search

Search earthquakes by time range, magnitude, depth, location radius, PAGER alert level, or felt reports.

  • Dual-source: USGS (global, richer metadata) or EMSC (an independent global catalog from the European-Mediterranean Seismological Centre, for cross-verification anywhere)
  • Full FDSN ComCat query API parameters: time range, magnitude, depth, location radius
  • USGS-specific filters: PAGER alert level (green/yellow/orange/red), DYFI felt reports count, significance score, event type
  • Every event carries its upstream event_type — USGS spells it out (earthquake, quarry blast, explosion, ice quake), EMSC publishes a code (ke known earthquake, ue unknown event) — and the event_type filter narrows to one of them on USGS
  • Location-based queries: provide latitude, longitude, and radius_km together
  • Sort by time (newest first) or magnitude (largest first), ascending or descending
  • One call returns at most 20,000 events; page beyond that with offset, forwarded straight to the upstream FDSN offset parameter on both sources
  • offset counts from 1, matching both upstream APIs — a capped result carries totalCount and the nextOffset to pass on the following call
  • Use earthquake_count first to gauge result size
  • USGS-specific filters are not supported by EMSC — when source=emsc they are dropped and named in ignoredFilters, so an unconstrained result set is never mistaken for a filtered one

---

earthquake_count

Count earthquakes matching filters without fetching full records.

  • Lightweight alternative to earthquake_search for statistical queries ("how many M5+ events in 2025?")
  • Same filter surface as earthquake_search: time, magnitude, depth, location radius, PAGER, DYFI, significance, event type
  • A radius over a mining region counts quarry blasts alongside earthquakes — pass event_type="earthquake" on USGS to exclude them
  • Returns exceeds_limit flag when count exceeds 20,000 — signals a full search needs paging
  • Echoes the effective query back as queryEcho, including the resolved time window — omitting start_time counts only the last 30 days
  • USGS returns the max_allowed cap (20,000); EMSC count endpoint does not expose this field (max_allowed will be null)
  • USGS-specific filters are dropped and named in ignoredFilters when source=emsc, the same as on earthquake_search

---

earthquake_get_event

Fetch complete detail for a specific earthquake by USGS event ID.

  • Returns the normalized event a search result already carries, plus detail — a projection of the analysis products only the single-event response holds
  • detail groups: PAGER alert and report link, ShakeMap peak MMI/PGA/PGV and intensity map, DYFI response count and max CDI, moment-tensor scalar moment and nodal planes, landslide and liquefaction alerts, origin quality (azimuthal gap, station count, location and depth uncertainty), finite-fault rupture length and width
  • A group is omitted when USGS produced no such product — a small automatic event usually has none, a large reviewed one has most of them
  • Event IDs appear in the id field of earthquake_get_feed and earthquake_search results (e.g. us6000sznj, hv74966427)
  • USGS-only — EMSC events have no per-event detail endpoint

Resources

| Type | URI pattern | Description | |:---|:---|:---| | Resource | earthquake://feed/{magnitude_tier}/{time_window} | USGS real-time earthquake feed as injectable context — returns the whole feed, so use the earthquake_get_feed tool for the broad tiers | | Resource | earthquake://event/{event_id} | Full USGS earthquake event detail by ID as injectable context, including the same detail product projection as earthquake_get_event |

Features

Built on @cyanheads/mcp-ts-core:

  • Declarative tool definitions — single file per tool, framework handles registration and validation
  • Unified error handling across all tools
  • Pluggable auth (none, jwt, oauth)
  • Swappable storage backends: in-memory, filesystem, Supabase, Cloudflare KV/R2/D1
  • Structured logging with optional OpenTelemetry tracing
  • Runs locally (stdio/HTTP) or on Cloudflare Workers from the same codebase

Earthquake-specific:

  • Two independent global data sources: USGS ComCat (full metadata) and EMSC SeismicPortal (an independent catalog from the European-Mediterranean Seismological Centre, with no PAGER/DYFI/ShakeMap metadata and station coverage densest around Europe and the Mediterranean)
  • USGS real-time GeoJSON feeds (CDN-cached, fast availability) plus FDSN event query API
  • EMSC FDSN-WS event and count endpoints
  • No API key required — both USGS and EMSC are fully public

Agent-friendly output:

  • Source attribution on every response (usgs / emsc) so agents can reason about data provenance
  • exceeds_limit flag on count responses surfaces truncation risk before a full search
  • Fields a source does not publish come back null, never as a fabricated zero — tsunami and status are null on EMSC events, and the rendered text says "not published by source" rather than "no tsunami" or "reviewed"
  • source_catalog and auth carry provenance (which catalog and which authoritative agency produced a solution) so agents can weigh two sources against each other
  • USGS-only filters dropped for an EMSC query are named in ignoredFilters on both earthquake_search and earthquake_count
  • An upstream rejection surfaces the service's own explanation (the offending parameter and its accepted format) in the error message, not just a status code; when the service explains nothing, the error says so under its own reason rather than passing the raw upstream body through
  • event_type travels with every event, so a quarry blast or explosion is never silently read as an earthquake

Getting started

Public Hosted Instance

A public instance is available at https://earthquake.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:

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

Self-Hosted / Local

Add the following to your MCP client configuration file.

{
  "mcpServers": {
    "earthquake-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["@cyanheads/earthquake-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

Or with npx (no Bun required):

{
  "mcpServers": {
    "earthquake-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@cyanheads/earthquake-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

Or with Docker:

{
  "mcpServers": {
    "earthquake-mcp-server": {
      "type": "stdio",
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/earthquake-mcp-server:latest"]
    }
  }
}

For Streamable HTTP, set the transport and start the server:

MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp

Prerequisites

  • Bun v1.3.0 or higher.
  • No API keys required — USGS and EMSC data is fully public.

Installation

  1. Clone the repository:
git clone https://github.com/cyanheads/earthquake-mcp-server.git
  1. Navigate into the directory:
cd earthquake-mcp-server
  1. Install dependencies:
bun install

Configuration

All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:

| Variable | Description | Default | |:---|:---|:---| | MCP_TRANSPORT_TYPE | Transport: stdio or http | stdio | | MCP_HTTP_PORT | HTTP server port | 3010 | | MCP_HTTP_ENDPOINT_PATH | HTTP endpoint path where the MCP server is mounted | /mcp | | MCP_PUBLIC_URL | Public origin override for TLS-terminating reverse-proxy deployments | none | | MCP_AUTH_MODE | Authentication: none, jwt, or oauth | none | | MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.) | info | | MCP_GC_PRESSURE_INTERVAL_MS | Opt-in Bun-only forced-GC pressure loop (ms). Try 60000 if heap growth is observed under sustained HTTP load. | 0 (disabled) | | LOGS_DIR | Directory for log files (Node.js only) | <project-root>/logs | | STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1 | in-memory | | USGS_BASE_URL | USGS API base URL. Override for testing or mirroring. | https://earthquake.usgs.gov | | EMSC_BASE_URL | EMSC API base URL. Override for testing or mirroring. | https://www.seismicportal.eu | | DEFAULT_LIMIT | Default result limit for earthquake_search | 100 | | REQUEST_TIMEOUT_MS | HTTP timeout in milliseconds for upstream API calls | 10000 | | OTEL_ENABLED | Enable OpenTelemetry | false |

Running the server

Local development

  • Build and run the production version:
  # One-time build
  bun run rebuild

  # Run the built server
  bun run start:http
  # or
  bun run start:stdio
  • Run checks and tests:
  bun run devcheck  # Lints, formats, type-checks, and more
  bun run test      # Runs the test suite

Project structure

| Directory | Purpose | |:---|:---| | src/mcp-server/tools | Tool definitions (*.tool.ts). Four tools across USGS and EMSC. | | src/mcp-server/resources | Resource definitions. Feed and event resources. | | src/services/usgs | USGS ComCat service — GeoJSON feed fetcher and FDSN query API client. | | src/services/emsc | EMSC SeismicPortal service — FDSN event search and count endpoints. | | src/config | Server-specific environment variable parsing and validation with Zod. | | tests/ | Unit and integration tests, mirroring the src/ structure. |

Development guide

See CLAUDE.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for logging, ctx.state for storage
  • Register new tools and resources in the createApp() arrays

Contributing

Issues and pull requests are welcome. Run checks and tests before submitting:

bun run devcheck
bun run test

License

This project is licensed under the Apache 2.0 License. See the LICENSE file for details.

See related servers & alternatives →

Related MCP servers

Browse all →

Related guides

Hand-picked reading to help you choose and use Search servers.