Skip to main content
Glama

iran-quake-mcp: Iran earthquakes MCP server for AI agents

Unofficial, read-only MCP server for earthquakes in Iran (زلزله ایران): latest quakes, history search, the strongest events, one event in full, and activity statistics, from the public USGS, EMSC and IRSC feeds. Works in Claude, Cursor and Copilot.

For AI agents

  • What: earthquake data for Iran from USGS ComCat (source="usgs", default), EMSC via SeismicPortal (source="emsc") and the Iranian Seismological Center (source="irsc", only its latest ~20 events, with province names). Sources are not merged; ids differ.

  • Install: uvx iran-quake-mcp or claude mcp add iran-quake -- uvx iran-quake-mcp. Transport: stdio. Needs uv (Python 3.10+).

  • Auth: none. Optional IRAN_QUAKE_MCP_PROXY (HTTP proxy URL, comma list allowed); system proxy settings are ignored.

  • Access: read-only, no confirmation needed.

  • Units: time_utc (UTC) and time_tehran (UTC+03:30, no daylight saving); search dates are UTC; depth_km in kilometres; mag_type (mb, ml, mw...) says which magnitude it is.

  • Replies: at most 50 events per call (limit 1-50), about 11 KB at the maximum.

  • Places: USGS and EMSC have no province field (USGS gives the nearest town, EMSC a region). place accepts a province name (Tehran, Kerman, Hormozgan, Khuzestan, Fars, Sistan and Baluchestan, Kermanshah, Razavi Khorasan, East Azerbaijan, West Azerbaijan, Bushehr, Mazandaran), which selects an approximate box that overlaps its neighbours; other text is matched against the place text. IRSC places are Town, Province.

  • IRSC: read from http://irsc.ut.ac.ir/events_list.xml (plain HTTP, its https is closed). It holds only the latest ~20 events, so more is true when the dates reach further back; the data is licensed for non-commercial, humanitarian use and must cite the Iranian Seismological Center (University of Tehran). Not a warning service.

Related MCP server: earthquake-mcp-server

Tools

Tool

What it does

eq_latest

Most recent earthquakes (min magnitude, hours back, source), newest first

eq_search

Search by UTC date range, magnitude range, bounding box and place text

eq_significant

Strongest earthquakes of the last N days, largest first

eq_detail

One event in full by id (USGS: review status, felt/shaking, tsunami flag, quality; EMSC: agency, update time; IRSC: nearest towns)

eq_stats

Counts for a window: by magnitude band, top places, strongest event

By default only events inside a coarse Iran outline (about 0.3 degrees on land borders; includes the Iranian Persian Gulf, Gulf of Oman and south Caspian) whose place text names Iran, Persian Gulf, Gulf of Oman or Caspian Sea are returned, so border-region rows across the border are dropped (iran_only=false returns everything in the bounding box 24-40 N, 43.5-64 E).

Development

uv sync
uv run ruff check . && uv run ruff format --check .
uv run python -m pytest -q          # offline
uv run python -m pytest -m live -q  # real USGS/EMSC
uv build

Data: USGS Earthquake Hazards Program and EMSC; see their terms of use. MIT licensed.

Available Tools

5 tools
eq_detailEarthquake detailA
Read-onlyIdempotent

Get one earthquake in full: location, depth_km, magnitude type and source quality fields.

The source is detected from the id format (IRSC: plain number, found only in its latest ~20 events, adds the nearest towns). USGS adds review status, shaking (felt reports, cdi, mmi), tsunami flag, sig (significance 0-1000), nst (stations), gap (degrees), rms; EMSC adds the contributing agency (catalog) and last update. Times in UTC and Tehran (UTC+03:30).

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYesEvent id from another eq_ tool: USGS 'us6000u2w9', EMSC '20261016_0000282' or IRSC '213549'.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), yet the description adds real behavior: the source is inferred from the id format, return fields vary by source, IRSC ids resolve only against the latest ~20 events, and times are returned in both UTC and Tehran. It stops short of describing not-found behavior or error cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and scope are front-loaded in the first clause, before the source-specific detail. The parenthetical field enumerations are information-dense and mostly earn their place, though the per-source listing is long enough to make it slightly heavy for a one-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description effectively enumerates the returned fields per source and states timezone conventions, and annotations cover the read-only/idempotent profile. For a single-parameter lookup, an agent has everything needed to call it and interpret the result.

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

Parameters4/5

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

Schema coverage is 100% and the schema already documents the id pattern and example formats, so the baseline is 3. The description goes further by explaining that the id format itself determines which source (and therefore which fields) you get, which is functional parameter semantics not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

A specific verb ('Get') plus resource ('one earthquake in full') with an explicit scope that sets it apart from the list-oriented siblings eq_search/eq_latest/eq_significant/eq_stats. It never names a sibling directly, so differentiation is by scope inference rather than explicit contrast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: you need a single event's full record and an event_id drawn from another eq_ tool (stated in the schema/description). There is no explicit when-to-use/when-not or a named alternative for the single-event case, leaving the routing to inference.

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

eq_latestLatest earthquakesA
Read-onlyIdempotent

List the most recent earthquakes in Iran, newest first.

Use for "was there an earthquake today?". Times: time_utc and time_tehran (UTC+03:30); depth_km in km; magnitude type in mag_type (mb, ml, mw...). Call eq_detail with an id for more, eq_stats for counts.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoLook back this many hours, e.g. 24.
limitNoMax events to return, 1-50 (a reply stays under 15 KB), e.g. 20.
sourceNoData source: 'usgs' (USGS ComCat, default), 'emsc' (EMSC via SeismicPortal) or 'irsc' (Iranian Seismological Center, only its latest ~20 events, with province names). Magnitudes and locations differ slightly between them; ids are not interchangeable.usgs
iran_onlyNoTrue (default): keep only events inside a coarse Iran outline (lat/lon, includes Iranian waters) whose place text names Iran (or Persian Gulf, Gulf of Oman, Caspian Sea); neighbours across the border are dropped. False: everything in the bounding box.
min_magnitudeNoMinimum magnitude, e.g. 3.0.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds behavior the annotations cannot: results are ordered newest-first, and returned timestamps appear in both UTC and Tehran time (UTC+03:30). It does not discuss rate limits or freshness/latency of the upstream feeds.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with purpose and scenario, followed by field conventions and sibling routing in one line. No filler and nothing repeated from the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With five optional params all fully documented in the schema and no output schema, the description usefully compensates by naming the returned fields (time_utc, time_tehran, depth_km, mag_type) and the result ordering. An agent has everything needed to call it and interpret the response.

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

Parameters3/5

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

Schema coverage is 100%, including enum, ranges and defaults (limit capped at 50 to stay under 15 KB, source ids not interchangeable), so the schema carries the input burden. The description's extra detail (time_utc/time_tehran, depth_km, mag_type) describes output fields rather than adding meaning to the five input parameters, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope and ordering: "List the most recent earthquakes in Iran, newest first." That clearly separates it from eq_detail (single event) and eq_stats (counts), which the description also names. It never distinguishes itself from eq_search or eq_significant, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete triggering scenario ("was there an earthquake today?") and routes to alternatives by function: eq_detail for more on an id, eq_stats for counts. There is no explicit when-not guidance (e.g., non-Iran queries or historical ranges belong elsewhere), so it is clear context without exclusions.

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

eq_significantSignificant earthquakesA
Read-onlyIdempotent

List the strongest recent earthquakes in Iran, largest magnitude first.

Use for "biggest earthquakes this month/year". Times in UTC and Tehran (UTC+03:30), depth_km in km.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLook back this many days, e.g. 30.
limitNoMax events to return, 1-50, e.g. 10.
sourceNoData source: 'usgs' (USGS ComCat, default), 'emsc' (EMSC via SeismicPortal) or 'irsc' (Iranian Seismological Center, only its latest ~20 events, with province names). Magnitudes and locations differ slightly between them; ids are not interchangeable.usgs
iran_onlyNoTrue (default): keep only events inside a coarse Iran outline (lat/lon, includes Iranian waters) whose place text names Iran (or Persian Gulf, Gulf of Oman, Caspian Sea); neighbours across the border are dropped. False: everything in the bounding box.
min_magnitudeNoMinimum magnitude, e.g. 5.0.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/idempotent/non-destructive, so safety is covered. The description adds useful non-schema context about the returned data: times given in both UTC and Tehran (UTC+03:30) and depth_km units, which matters since there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, with the core purpose and ordering front-loaded before the usage cue and unit notes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully discloses the time and depth unit conventions for returned fields, and the schema covers all inputs. It could go further on what fields each event carries, but for this tool it is largely complete.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters (days, limit, source, iran_only, min_magnitude) are already fully documented with defaults and enums. The description adds no parameter-level meaning beyond noting the output units, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List), resource (earthquakes), geographic scope (Iran), and ordering (largest magnitude first). This distinguishes it in spirit from eq_search/eq_latest, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Use for "biggest earthquakes this month/year"' gives a concrete usage cue, but it offers no exclusions or routing against the four sibling tools (eq_search, eq_latest, eq_detail, eq_stats), leaving the agent to infer which one to pick.

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

eq_statsEarthquake statisticsA
Read-onlyIdempotent

Count earthquakes in Iran over a window: by magnitude band, by place, plus the strongest event.

Use for "how active has Iran been this month". Places are USGS nearest towns or EMSC regions (no province data). truncated = the source returned its full 3000 rows before the Iran filter, so the count covers only the newest.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoWindow length in days, ending now, e.g. 30.
sourceNoData source: 'usgs' (USGS ComCat, default), 'emsc' (EMSC via SeismicPortal) or 'irsc' (Iranian Seismological Center, only its latest ~20 events, with province names). Magnitudes and locations differ slightly between them; ids are not interchangeable.usgs
iran_onlyNoTrue (default): keep only events inside a coarse Iran outline (lat/lon, includes Iranian waters) whose place text names Iran (or Persian Gulf, Gulf of Oman, Caspian Sea); neighbours across the border are dropped. False: everything in the bounding box.
min_magnitudeNoMinimum magnitude counted, e.g. 3.0.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the description is free to spend its words on data behavior. It does: places are nearest-town/EMSC-region labels with no province data, and `truncated` reveals that counts can silently reflect only the newest events because the source capped at 3000 rows before Iran filtering. That truncation disclosure is exactly the kind of trait annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The scope and output shape come first, then the usage trigger, then two dense caveats. Three sentences, no filler, and every clause carries information an agent cannot get from the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations on return shape, the description carries the burden and largely meets it: it names the three result components and the truncation flag, and notes source-specific limitations (IRSC only ~20 events). It stops short of describing the exact structure or empty-result behavior, but an agent has enough to call and interpret it.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema lacks: place values depend on which source is chosen, and `truncated` interacts with the iran_only/source filtering. It clarifies semantics rather than restating the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Count) and resource (earthquakes in Iran) plus the exact aggregations returned: magnitude band, place, and strongest event. The counting/aggregation framing is implicitly distinct from siblings like eq_search or eq_detail, but no sibling is named explicitly, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete usage trigger ("how active has Iran been this month"), which maps cleanly onto an activity-summary tool rather than an event-lookup tool. It gives no explicit exclusions or named alternatives (e.g. eq_search for individual events), so it is clear context without routing guidance.

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.

  1. 5 tool updatesv0.1.0
    • First observedeq_detail
    • First observedeq_latest
    • First observedeq_search
    • First observedeq_significant
    • First observedeq_stats

TDQS

A4.1/5.0

Scored across 5 tools

Disambiguation4/5

Each tool has a recognizable role: free-form filtered search, newest-first list, strongest-first list, single-event detail, and aggregate counts. However, eq_search, eq_latest, and eq_significant all return event lists and differ mainly in sort/filter semantics, so a sloppy agent could pick the wrong one; the descriptions do a good job clarifying when to use each.

Naming Consistency4/5

All names use the eq_ prefix with snake_case, which is highly predictable and readable. The one deviation is that search/detail are verb-like while latest/significant/stats are nouns/adjectives, so the verb_noun pattern isn't strictly uniform.

Tool Count5/5

Five tools is well-scoped for an Iran earthquake service: discovery (search/latest/significant), retrieval (detail), and aggregation (stats). No tool feels redundant or padded.

Completeness4/5

The surface covers the core lifecycle: find events by time/place/magnitude, get newest and largest, fetch full detail, and compute activity counts. Gaps are minor (no source/catalog listing or station/network metadata), but nothing blocks typical agent workflows.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides access to the USGS Earthquake Catalog for querying earthquake events via the FDSNWS API, enabling natural language questions about earthquake data.
    10 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables querying seismic station metadata, regional earthquake catalogs, and federated waveform data availability across FDSN web services, letting users locate seismometers, retrieve local seismicity, and identify data holdings through direct tool calls or natural language.
    9 npm
    MIT