iran-quake-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@iran-quake-mcpshow me the latest earthquakes in Iran"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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-mcporclaude 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) andtime_tehran(UTC+03:30, no daylight saving); search dates are UTC;depth_kmin kilometres;mag_type(mb, ml, mw...) says which magnitude it is.Replies: at most 50 events per call (
limit1-50), about 11 KB at the maximum.Places: USGS and EMSC have no province field (USGS gives the nearest town, EMSC a region).
placeaccepts 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 areTown, 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, somoreis 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 |
| Most recent earthquakes (min magnitude, hours back, source), newest first |
| Search by UTC date range, magnitude range, bounding box and place text |
| Strongest earthquakes of the last N days, largest first |
| One event in full by id (USGS: review status, felt/shaking, tsunami flag, quality; EMSC: agency, update time; IRSC: nearest towns) |
| 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 buildData: USGS Earthquake Hazards Program and EMSC; see their terms of use. MIT licensed.
Available Tools
5 toolseq_detailEarthquake detailARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event id from another eq_ tool: USGS 'us6000u2w9', EMSC '20261016_0000282' or IRSC '213549'. |
TDQS
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.
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.
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.
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.
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.
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 earthquakesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | Look back this many hours, e.g. 24. | |
| limit | No | Max events to return, 1-50 (a reply stays under 15 KB), e.g. 20. | |
| source | No | Data 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_only | No | True (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_magnitude | No | Minimum magnitude, e.g. 3.0. |
TDQS
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.
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.
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.
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.
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.
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_searchSearch earthquakesARead-onlyIdempotent
Search earthquakes in Iran by date range, magnitude, bounding box and place text.
Use for history ("M5+ in 2026", "quakes near Bam"). USGS and EMSC have no province field: USGS gives the nearest
town ('70 km NNE of Minab, Iran'), EMSC a region ('SOUTHERN IRAN'); filter by place (a province name works) or
bbox. source='irsc' only knows its latest ~20 events, so older dates give more=true with few rows.
Times: time_utc and time_tehran (UTC+03:30); depth_km in km. more = more results may exist beyond limit
(or beyond the newest 500 events scanned when filtering by place/iran_only: narrow the dates or bbox).
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | Box 'min_lat,min_lon,max_lat,max_lon', e.g. '35,50,36,52' (Tehran area). Default: all Iran. | |
| limit | No | Max events to return, 1-50 (a reply stays under 15 KB), e.g. 20. | |
| order | No | 'time' (newest first, default) or 'magnitude' (largest first). | time |
| place | No | Text the place must contain, case and accents ignored, e.g. 'Minab' or 'southern iran' (EMSC region); IRSC places are 'Town, Province'. A province name (Tehran, Kerman, Hormozgan, Khuzestan, Fars, Sistan and Baluchestan, Kermanshah, Razavi Khorasan, East Azerbaijan, West Azerbaijan, Bushehr, Mazandaran) selects its approximate box instead. English names only. | |
| source | No | Data 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 |
| end_date | No | End, UTC, same format, e.g. '2026-10-15' (a date alone includes that whole day). Default: now. | |
| iran_only | No | True (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. | |
| start_date | Yes | Start, UTC: 'YYYY-MM-DD' or 'YYYY-MM-DDTHH:MM:SS', e.g. '2026-10-01'. | |
| max_magnitude | No | Maximum magnitude, e.g. 6. | |
| min_magnitude | No | Minimum magnitude, e.g. 4.5. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this safe/idempotent/open-world, so the description correctly spends its budget on non-obvious behavior: USGS/EMSC lack a province field, IRSC keeps only ~20 events, `more` semantics including the newest-500-event scan cap, UTC vs Tehran time fields, and depth units. This is exactly the extra context that 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and use cases, then grouped caveats. Dense and mostly earned, though the second paragraph stacks several distinct warnings (source limits, time fields, `more` semantics) that could be tightened into a cleaner list.
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?
With 10 parameters, no output schema and rich source-dependent behavior, the description covers the gaps an agent needs: partial-result signalling via `more`, which returned fields exist, and how source choice changes filtering. Nothing essential to calling it 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 description coverage is 100%, so the baseline is 3. The description mostly restates what the schema already documents (place matching, bbox default of all Iran, source enum meanings); the genuinely additive lines (cross-source field differences, IRSC's recency window) are behavioral rather than parameter semantics.
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?
States a specific verb (Search), resource (earthquakes), scope (in Iran) and the four filter dimensions (date range, magnitude, bbox, place). The sibling set (eq_latest, eq_significant, eq_detail, eq_stats) is implicitly differentiated: this is the historical/filtered query tool, not latest/significant/detail/stats.
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?
Gives explicit use cases ('Use for history: "M5+ in 2026", "quakes near Bam"') and practical caveats (source='irsc' only has ~20 latest events; narrow dates or bbox when more=true). It does not, however, name the sibling tools it should be preferred over (eq_latest, eq_significant), so the routing guidance is one-sided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eq_significantSignificant earthquakesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look back this many days, e.g. 30. | |
| limit | No | Max events to return, 1-50, e.g. 10. | |
| source | No | Data 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_only | No | True (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_magnitude | No | Minimum magnitude, e.g. 5.0. |
TDQS
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.
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.
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.
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.
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.
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 statisticsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Window length in days, ending now, e.g. 30. | |
| source | No | Data 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_only | No | True (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_magnitude | No | Minimum magnitude counted, e.g. 3.0. |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v0.1.0- First observed
eq_detail - First observed
eq_latest - First observed
eq_search - First observed
eq_significant - First observed
eq_stats
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
Search USGS and EMSC seismic data — real-time feeds, event queries, and earthquake counts.
Real-time earthquake events from the US Geological Survey
Real-world data for agents: air quality, geocoding, quakes, holidays, web search
Persian and Iranian utilities for agents: Jalali dates, national ID, IBAN, holidays. Paid via x402.
271
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides access to the USGS Earthquake Catalog for querying earthquake events via the FDSNWS API, enabling natural language questions about earthquake data.10 npmMIT
- 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.6 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables 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 npmMIT