iran-quake-mcp
Read-only MCP server for checking earthquakes in Iran from USGS, EMSC, and IRSC.
List the latest earthquakes in Iran, newest first, with magnitude, depth, and UTC/Tehran times.
Search historical earthquakes by UTC date range, magnitude range, bounding box, and place text.
List the strongest recent earthquakes over a chosen number of days.
Get full details for one earthquake by event ID, including source-specific quality and review fields.
Compute earthquake statistics for a window: counts by magnitude band, top places, and strongest event.
Choose between USGS, EMSC, or IRSC as the data source.
Filter to events inside Iran by default, or include neighboring areas with
iran_only=false.Use it for informational queries only; it is read-only and does not provide alerts or early warning.
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
Let your AI agent check the latest earthquakes in Iran (زلزله ایران). An unofficial, read-only MCP server for earthquake data from USGS, EMSC and the Iranian Seismological Center: latest quakes, history search, the strongest events, one event in full and activity statistics, from Claude, Cursor or Copilot.
For AI agents · Quick start · What it can do · Tools · FAQ · فارسی
For AI agents
What: unofficial MCP server (model context protocol) for earthquakes in Iran. Sources: 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; their event ids differ.Install:
uvx iran-quake-mcporclaude mcp add iran-quake -- uvx iran-quake-mcp. Transport: stdio. Needs uv (Python 3.10+).Auth: none, no API key or account. Optional
IRAN_QUAKE_MCP_PROXY(HTTP proxy URL, or a comma-separated list); system proxy settings are ignored.Access: read-only. It cannot write or subscribe, so no confirmation is needed before calling any tool.
Tools: 5, all prefixed
eq_. Typical sequence:eq_latestoreq_significant->eq_detailwith an id from the list.eq_searchfor a date range, bounding box or place;eq_statsfor counts.Use when: the user asks about recent or past earthquakes in Iran, the strongest quakes, quakes near a province or city, or how active a period was.
Do not use when: the user needs an official warning or alert (this is not a warning service; see the Iranian Seismological Center, irsc.ut.ac.ir), or asks about earthquakes outside Iran and its neighbours.
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 12 KB at the maximum, under 15 KB.Machine-readable:
server.jsonand the iran-mcp catalog.
Related MCP server: earthquake-mcp-server
Why
Earthquake feeds are built for seismologists: different servers, different id formats, UTC timestamps, no province field.
Asking "was there a quake above 4.5 near Kerman this week, and what was the strongest one in Iran this month?" means
querying a map or a query form and converting times by hand. With iran-quake-mcp an agent answers it in a few calls
and returns a short summary with Tehran time and depth in kilometres.
You: Were there any strong earthquakes in Iran in the last 30 days?
Agent: calls
eq_significant(days=30, min_magnitude=5.0)->eq_detail(...)for the largest oneIt lists the events from largest to smallest with magnitude, place, depth and Tehran time, then adds the review status and felt reports of the biggest one.
Every reply stays under 15 KB (about 12 KB at the maximum), so it does not flood the agent's context.
What it can do
Latest earthquakes in Iran by minimum magnitude and hours back, newest first
Search by UTC date range, magnitude range, bounding box and place text, ordered by time or magnitude
Strongest events of the last N days, largest first
One event in full by id: for USGS review status, felt/shaking, tsunami flag and quality; for EMSC the agency and update time; for IRSC the nearest towns
Statistics for a window: counts by magnitude band, top places and the strongest event
Three sources in one server: USGS, EMSC and the Iranian Seismological Center
Read-only by design: nothing is written or subscribed to
Example prompts:
"Show earthquakes of magnitude 4 or more in Iran in the last 48 hours."
"What were the 10 strongest earthquakes in Iran in the last year?"
"Any earthquakes near Kerman this month?"
"Give me the quake statistics for Iran over the last 30 days."
"Details of the latest quake on the Iranian Seismological Center feed, with province."
آخرین زلزله‌های ایران در ۲۴ ساعت گذشته کدام‌اند؟
قوی‌ترین زلزله‌های ماه اخیر در ایران را با عمق و ساعت تهران بده.
آیا در هفته گذشته در هرمزگان زلزله بالای ۴ ریشتر آمده؟
Quick start
You need uv. No API key or account.
claude mcp add iran-quake -- uvx iran-quake-mcpSettings → Developer → Edit Config, then add:
{
"mcpServers": {
"iran-quake": { "command": "uvx", "args": ["iran-quake-mcp"] }
}
}Add the Claude Desktop block above to ~/.cursor/mcp.json (or .cursor/mcp.json in a project).
Click Install in VS Code above, or add to .vscode/mcp.json:
{
"servers": {
"iran-quake": { "type": "stdio", "command": "uvx", "args": ["iran-quake-mcp"] }
}
}codex mcp add iran-quake -- uvx iran-quake-mcpOr in ~/.codex/config.toml:
[mcp_servers.iran-quake]
command = "uvx"
args = ["iran-quake-mcp"]Add to ~/.gemini/settings.json:
{
"mcpServers": {
"iran-quake": { "command": "uvx", "args": ["iran-quake-mcp"] }
}
}Add the Claude Desktop block to ~/.codeium/windsurf/mcp_config.json.
It is a standard stdio MCP server: run uvx iran-quake-mcp, or pip install iran-quake-mcp and run iran-quake-mcp.
Tools
The list tools (eq_latest, eq_search, eq_significant, eq_stats) take an optional source (usgs default, emsc, irsc) and iran_only (default true).
Tool | What it does |
| List the most recent earthquakes in Iran, newest first |
| Search earthquakes in Iran by date range, magnitude, bounding box and place text |
| List the strongest recent earthquakes in Iran, largest magnitude first |
| Get one earthquake in full: location, depth_km, magnitude type and source quality fields |
| Count earthquakes in Iran over a window: by magnitude band, by place, plus the strongest event |
All 5 tools are annotated readOnlyHint: true.
How it works
AI agent (Claude, Cursor, Copilot, ...)
│
│ MCP over stdio
▼
iran-quake-mcp (runs on your machine)
│
│ HTTPS (IRSC: plain HTTP)
├──────▶ earthquake.usgs.gov USGS FDSN event API
├──────▶ www.seismicportal.eu EMSC FDSN event API
└──────▶ irsc.ut.ac.ir events_list.xmliran-quake-mcp runs locally and calls the public feeds of USGS, EMSC and IRSC. It has no hosted server in between
and no API key. It sends at most 2 requests at a time with a little jitter, keeps answers for 60 seconds,
retries a failed GET up to 4 times (USGS sometimes answers a sporadic 502), caps a response body at 5 MB and only
talks to those three hosts. It only reads.
Good to know
Times:
time_utcis UTC,time_tehranis UTC+03:30 (no daylight saving since 2022). Search dates are UTC. Depth isdepth_km, positive.Magnitudes: the type is in
mag_type(mb, ml, mw...). Values from different types or sources are not exactly comparable.Sources are separate: results are not merged or deduplicated and ids differ.
eq_detailtakes only an event id and detects the source from its format: EMSC20261014_0000009, IRSC a plain number such as213549(only found in its latest ~20 events), otherwise USGS.Inside Iran only by default: the event must fall inside a coarse Iran outline (about 0.3 degrees on land borders, plus Iranian waters of the Persian Gulf, Gulf of Oman and south Caspian) and its place text must name Iran, Persian Gulf, Gulf of Oman or Caspian Sea. Events just across the border are dropped.
iran_only=falsereturns everything in the box 24-40 N, 43.5-64 E.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 an English, accent-insensitive substring match. IRSC places areTown, Province.IRSC: read from
http://irsc.ut.ac.ir/events_list.xml(plain HTTP; its https is closed). It lists only the latest ~20 events, with no magnitude type and no history, somoreis true when your dates reach further back. The data is licensed for non-commercial, humanitarian use and must cite the Iranian Seismological Center (University of Tehran).Reply size:
limitis at most 50.eq_statssetstruncatedwhen the raw fetch came back full at 3000 rows.Delays and revisions: feeds list small events with a delay and revise values later. USGS cold queries can take about 10 seconds.
What it does not do: no alerts, no push notifications, no early warning, no shaking maps, no damage estimates.
Network: set
IRAN_QUAKE_MCP_PROXYif the feeds are not reachable directly. System proxy variables are ignored on purpose.
FAQ
Yes. iran-quake-mcp is an unofficial MCP server with 5 read-only tools. It reads the public USGS, EMSC and IRSC
feeds and returns compact JSON for AI agents.
USGS ComCat (default), EMSC through SeismicPortal, and the Iranian Seismological Center (IRSC, University of Tehran).
Pick one with the source argument. They are not merged.
Add the server with claude mcp add iran-quake -- uvx iran-quake-mcp, or use the matching config in
Quick start, then ask in plain language, in Persian or English.
No. It reads public catalogs that list events after the fact, sometimes with a delay, and values get revised. For official information use the Iranian Seismological Center (irsc.ut.ac.ir).
Each event has time_utc and time_tehran (UTC+03:30, no daylight saving). Search dates you pass are UTC.
Partly. The USGS and EMSC feeds have no province field. Pass a province name from the list in
Good to know in place for an approximate box that overlaps neighbouring provinces, other English
text to match the nearest town or region, or a bbox. IRSC rows carry Town, Province text.
The IRSC feed lists only its latest ~20 events and has no history. Use usgs or emsc for longer ranges.
By default only events inside a coarse Iran outline are returned, so events across the border are dropped. Pass
iran_only=false to include neighbours.
npx @modelcontextprotocol/inspector uvx iran-quake-mcpConfiguration
Variable | Default | Meaning |
| unset | Optional HTTP proxy URL for reaching USGS/EMSC; system proxy settings are ignored. A comma-separated list is used one at a time: the next proxy takes over when one is blocked or cannot connect |
فارسی: سرور MCP زلزله ایران
iran-quake-mcp یک سرور MCP غیررسمی و فقط‌خواندنی برای داده‌های زلزله ایران است. این سرور به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می‌دهد آخرین زلزله‌ها، زلزله‌های قوی، تاریخچه و آمار لرزه‌خیزی ایران را از منابع عمومی USGS، EMSC و مرکز لرزه‌نگاری کشوری (IRSC) بخواند.
چه کارهایی می‌کند
آخرین زلزله‌ها با حداقل بزرگا و تعداد ساعت گذشته، از جدیدترین.
جستجو بر اساس بازه تاریخ (UTC)، بزرگا، محدوده جغرافیایی و نام مکان یا استان.
قوی‌ترین زلزله‌ها در چند روز اخیر، از بزرگ‌ترین.
جزئیات یک زلزله با شناسه: عمق، نوع بزرگا، وضعیت بازبینی و منبع.
آمار یک بازه: تعداد به تفکیک بزرگا، پرتکرارترین مکان‌ها و قوی‌ترین رویداد.
نکته‌ها
فقط خواندنی است و هشدار یا پیش‌آگاهی زلزله نیست؛ برای اطلاعات رسمی به مرکز لرزه‌نگاری کشوری (irsc.ut.ac.ir) مراجعه کنید.
زمان هر رویداد هم به UTC و هم به وقت تهران (UTC+03:30) داده می‌شود؛ عمق به کیلومتر است.
منابع با هم ادغام نمی‌شوند و شناسه‌هایشان فرق دارد. منبع IRSC فقط حدود ۲۰ رویداد آخر را دارد.
فیلد استان در USGS و EMSC وجود ندارد؛ نام استان (به انگلیسی، مثل Kerman) محدوده تقریبی آن را انتخاب می‌کند.
کلید API لازم نیست و روی سیستم خود شما اجرا می‌شود. در صورت نیاز متغیر
IRAN_QUAKE_MCP_PROXYرا روی یک پراکسی HTTP بگذارید.
نصب (اول uv را نصب کنید). در Claude Code:
claude mcp add iran-quake -- uvx iran-quake-mcpدر Claude Desktop، Cursor و بقیه برنامه‌ها همان تنظیم بخش Quick start را بگذارید.
نمونه پرسش‌ها
«آخرین زلزله‌های ایران در ۲۴ ساعت گذشته کدام‌اند؟»
«قوی‌ترین زلزله‌های ماه اخیر در ایران را نشان بده.»
«آیا این هفته در کرمان زلزله بالای ۴ ریشتر آمده؟»
«آمار زلزله‌های ایران در ۳۰ روز گذشته را بده.»
Development
git clone https://github.com/sepehr071/iran-quake-mcp && cd iran-quake-mcp
uv sync
uv run ruff check . && uv run ruff format --check .
uv run python -m pytest -q # offline unit tests
uv run python -m pytest -m live -q # calls the real USGS/EMSC feeds
uv buildAll tools live in src/iran_quake_mcp/quakes.py; each is a typed async function with a docstring that tells the agent
when to use it. Issues and PRs are welcome.
Releases: bump the version in pyproject.toml and server.json, then push a v* tag. GitHub Actions publishes to PyPI.
Related servers
iran-mcp: catalog of all Iranian-service MCP servers
iran-news-mcp for Iranian news
iran-apps-mcp for Iranian apps
iran-tax-mcp for Iranian tax and Codal data
tgju-mcp for dollar, gold, coin and commodity prices from TGJU
Listed on mcpfarsi.ir, the Persian MCP marketplace
Disclaimer
Unofficial and not affiliated with or endorsed by USGS, EMSC or the Iranian Seismological Center. It is read-only. Earthquake data is informational, can be delayed and is revised by the sources; this is not a warning service. Check each source's terms of use: IRSC data is licensed for non-commercial, humanitarian use and must cite the Iranian Seismological Center (University of Tehran).
Author
Built and maintained by Sepehr Radmard (سپهر رادمرد). Connect on LinkedIn or follow @sepehr071 on GitHub for more MCP servers for Iranian websites, all listed in iran-mcp. If this saves you time, a star on the repo helps other people find it.
License
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.
Recent earthquakes worldwide or near a place, from USGS. Free, no key.
Real-time earthquake events from the US Geological Survey
Real-world data for agents: air quality, geocoding, quakes, holidays, web search
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.198 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.30 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables 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.495 npmMIT