Environmental Hazard MCP Server is an MCP (Model Context Protocol) server on ApifyForge. MCP server for environmental hazard intelligence. Wraps 6 specialized actors: EPA ECHO (facility compliance/violations), NOAA (weather alerts), USGS (earthquakes), FEMA (disaster declarations), GDACS (global disaster... It costs $0.05 per epa-compliance. It exposes 7 tools: epa-compliance, weather-alerts, earthquake-search, fema-disasters, global-disasters, air-quality, location-risk. Best for AI developers and agent builders who need structured real-world data inside Claude, Cursor, or other MCP-compatible clients. Not ideal for non-AI workflows or use cases that don't involve an MCP-compatible client. Maintenance pulse: 90/100. Last verified March 27, 2026. Built by Ryan Clinton (ryanclinton on Apify).
Environmental Hazard MCP Server
Environmental Hazard MCP Server is an MCP (Model Context Protocol) server available on ApifyForge at $0.05 per epa-compliance. MCP server for environmental hazard intelligence. Wraps 6 specialized actors: EPA ECHO (facility compliance/violations), NOAA (weather alerts), USGS (earthquakes), FEMA (disaster declarations), GDACS (global disaster alerts), and OpenAQ (air quality). Includes composite location risk assessment.
Best for AI developers and agent builders who need structured real-world data inside Claude, Cursor, or other MCP-compatible clients.
Not ideal for non-AI workflows or use cases that don't involve an MCP-compatible client.
Tools exposed
Each pricing event corresponds to a tool your AI agent can call through MCP.
epa-complianceSearch EPA environmental compliance facility records. · $0.05/callweather-alertsGet active NOAA weather alerts. · $0.05/callearthquake-searchSearch USGS earthquake event records. · $0.05/callfema-disastersSearch FEMA disaster declaration records. · $0.05/callglobal-disastersSearch GDACS global disaster alert records. · $0.05/callair-qualitySearch OpenAQ air quality measurement data. · $0.05/calllocation-riskComposite environmental risk assessment combining weather, seismic, and air quality data. · $0.15/callExample prompts
Natural language queries you can ask your AI assistant that would trigger this MCP server.
What to know
- Requires an MCP-compatible client (Claude Desktop, Cursor, Windsurf, or similar).
- Tool call results depend on the availability of upstream public APIs.
- Requires an Apify account and API token for authentication.
Maintenance Pulse
90/100Cost Estimate
How many results do you need?
Pricing
Pay Per Event model. You only pay for what you use.
| Event | Description | Price |
|---|---|---|
| epa-compliance | Search EPA environmental compliance facility records. | $0.05 |
| weather-alerts | Get active NOAA weather alerts. | $0.05 |
| earthquake-search | Search USGS earthquake event records. | $0.05 |
| fema-disasters | Search FEMA disaster declaration records. | $0.05 |
| global-disasters | Search GDACS global disaster alert records. | $0.05 |
| air-quality | Search OpenAQ air quality measurement data. | $0.05 |
| location-risk | Composite environmental risk assessment combining weather, seismic, and air quality data. | $0.15 |
Example: 100 events = $5.00 · 1,000 events = $50.00
Documentation

Environmental Hazard MCP is a pay-per-call, agent-native environmental risk stack for AI agents, due-diligence workflows, and emergency-response automation.
It wires six public-records environmental and disaster sources into one MCP endpoint: EPA ECHO facility compliance, NOAA active weather alerts, USGS earthquakes, FEMA disaster declarations, GDACS global multi-hazard alerts, and OpenAQ air quality. A composite env_location_risk tool fans four U.S. sources out in parallel for site-level screening. Built for environmental due-diligence consultants, real-estate and insurance analysts, ESG teams, emergency managers, and AI agents that need live hazard context without a CAT-model license.
The category
Environmental Hazard MCP is an agent-native environmental hazard stack, not a catastrophe model and not a GIS layer. Unlike ESRI Living Atlas (a paid mapping platform requiring an ArcGIS license), RMS or AIR Worldwide (six-figure CAT-model seats sold to underwriters), or manual EPA-ECHO plus NOAA plus USGS tab juggling, it produces deterministic, machine-readable JSON straight into Claude Desktop, Cursor, LangChain, or any MCP-aware client. Pay per call, no seat license, no subscription, no model output. The MCP returns the raw public-records signals; your agent or analyst makes the decision.
In one sentence
Screen a U.S. site for EPA-regulated facility violations, active NOAA severe-weather alerts, recent earthquakes inside a 200 km radius, and current-fiscal-year FEMA disaster declarations in a single MCP tool call, or query any of the six environmental data sources individually.
What you get from one call
env_location_risk fans out to four U.S. sources in parallel (EPA ECHO, NOAA, USGS, FEMA) and returns:
riskSignals[], a plain-language summary of every triggered signal (SNC facility count, penalty total, severe weather alert count, M4.5+ quakes within 200 km in the past year, FEMA declarations in the current fiscal year)signalCount, headline integer your agent can branch onepaCompliance, facility count plus significant-noncompliance count, total penalties, and top-5 violators with programs and statusweatherAlerts, active alert count, severe/extreme count, and top-5 alerts with event, severity, headline, and expiryseismicActivity, earthquake count within the radius, M4.5+ event count, max magnitude, and top-5 recent eventsdisasterDeclarations, FEMA declaration count this fiscal year and top-5 declarations with title, type, date, and designationsources, the four upstream datasets that contributed

What makes this different
- Deterministic public-records signals, no LLM in the result path. Every value is a count, a magnitude, a severity enum, or a dollar penalty pulled straight from EPA, NOAA, USGS, FEMA, GDACS, and OpenAQ. The MCP does not summarise, judge, or paraphrase.
- Live NOAA alerts, not stale RSS.
env_weather_alertsqueries the National Weather Service directly:active_only=truereturns currently-in-effect warnings, watches, and advisories. - USGS radius search around a real lat-lon.
env_earthquakestakeslatitude,longitude, andmax_radius_km(up to 20,001 km) so you can screen a specific site, not just a country. - EPA SNC and penalties surfaced as headline aggregates. The MCP rolls up
significantNoncompliancecount andtotalPenaltiesacross the result set so an agent can branch on one number instead of walking a facility list. - Multi-hazard global view via GDACS. Earthquakes, floods, tropical cyclones, volcanoes, droughts, and wildfires in one Red/Orange/Green alert stream for non-U.S. coverage.
Before vs after
| Without this MCP | With this MCP |
|---|---|
| Open EPA ECHO, NWS api.weather.gov, USGS earthquake feed, FEMA OpenFEMA portal, GDACS, and OpenAQ in six tabs | One MCP endpoint, six tools, one composite call |
| Manually filter EPA results to "significant noncompliance" facilities | compliance_status="3" flag plus rolled-up significantNoncompliance count |
| Eyeball severe NOAA alerts by state | bySeverity breakdown returned per call |
| Run a USGS GeoJSON query, parse coordinates, compute distance | Pass latitude, longitude, max_radius_km; USGS returns the radius set |
| Re-query four sources separately for a single property due-diligence file | env_location_risk runs EPA + NOAA + USGS + FEMA in parallel for one $0.15 charge |
| Pay for a CAT-model seat or ArcGIS license | $0.05 per single-source call, $0.15 per composite, no subscription |
Architecture
6 environmental + disaster sources 8 MCP tools
(U.S. cluster) ↓
EPA ECHO ─────────────┐ env_epa_compliance $0.05
NOAA / NWS ───────────┤ env_weather_alerts $0.05
USGS Earthquakes ─────┼──→ env_earthquakes $0.05
FEMA OpenFEMA ────────┤ env_fema_disasters $0.05
└──→ env_location_risk $0.15
(parallel fan-out, U.S.-only)
(Global cluster)
GDACS ────────────────────→ env_global_disasters $0.05
OpenAQ ───────────────────→ env_air_quality $0.05 (OpenAQ key)
env_list_sources free
(no upstream fetch)
The U.S. cluster (EPA + NOAA + USGS + FEMA) feeds the composite. The global cluster (GDACS + OpenAQ) covers non-U.S. hazard and pollution monitoring. Each tool is a thin orchestration layer over a published sibling actor; the MCP never scrapes upstream sources directly.
Built for
Environmental due-diligence consultants running Phase I ESAs, commercial real-estate and property analysts screening sites before close, insurance underwriters writing property and parametric policies, ESG and sustainability analysts auditing facility portfolios, emergency-management teams tracking active incidents, climate-risk and resilience teams building geospatial dashboards, environmental-justice researchers mapping pollution and noncompliance, and AI agents that need live hazard context wired into a chat or workflow.
This server runs in Standby mode on the Apify platform. It orchestrates six sibling actors (epa-echo-search, noaa-weather-alerts, usgs-earthquake-search, fema-disaster-search, gdacs-disaster-alerts, openaq-air-quality) and returns structured JSON your AI agent reasons over directly.
Questions this MCP answers
- "What are the active severe weather alerts in Florida right now?"
- "Has there been a M4+ earthquake within 200 km of these coordinates in the past year?"
- "Which EPA-regulated facilities in Houston are in significant noncompliance?"
- "How many FEMA disasters did Louisiana have this fiscal year?"
- "What is the current PM2.5 reading near Delhi?"
- "Are there any Red-level GDACS tropical cyclone alerts in the Pacific right now?"
- "Give me a one-call environmental risk summary for a property at 34.0522, -118.2437 in California."
- "Which fire-management declarations did FEMA issue in California in FY2025?"
For AI agents
- Call
env_list_sourcesfirst. It is free, has no upstream fetch, and returns the tool catalogue plus which source each tool wraps. Use it to plan the rest of the workflow. - The composite is U.S.-only.
env_location_riskruns EPA, NOAA, and FEMA, which are U.S.-only datasets. For non-U.S. sites, callenv_global_disasters(GDACS) andenv_air_quality(OpenAQ) directly. - OpenAQ needs a free key. If no
api_key(per-tool argument orOPENAQ_API_KEYenv var) is set,env_air_qualityreturns a structuredwarningpayload, not silent sample data. Handle the warning and prompt for a key. - Branch on
riskSignals[], not the raw counts. The signals array is the curated, human-readable summary your agent should reason over. Counts and breakdowns are available below for citation and follow-up. - USGS radius search needs all three parameters.
latitude,longitude, andmax_radius_kmare all required for a radius query. Omit any and you get a global time-window query instead. - EPA SNC screens use
compliance_status="3"or"4". Status 3 is significant noncompliance, status 4 is multiple significant noncompliance. Status 2 is any noncompliance and returns a noisier set.
Use this MCP when an AI agent needs to:
- assess environmental risk for a U.S. property or facility
- monitor active severe-weather alerts in a state or territory
- check recent seismic activity near a specific lat-lon
- pull current-fiscal-year FEMA declarations for a state
- track global multi-hazard alerts via GDACS
- read current or historical air-quality measurements worldwide
What data can you access?
| Source | Records | Example |
|---|---|---|
| 🏭 EPA ECHO | Facility compliance status, significant-noncompliance flag, penalties, programs (Air/Water/RCRA/SDWA/TRI/GHG/RMP), NAICS, major-facility flag | 3 facilities in significant noncompliance, $487,200 in penalties |
| 🌪️ NOAA / NWS | Active and historical weather alerts: event, severity (Extreme/Severe/Moderate/Minor), urgency, headline, expiry | 2 Tornado Warnings, severity Extreme, urgency Immediate |
| 🌍 USGS Earthquakes | Magnitude, depth, place, time, PAGER alert level (green/yellow/orange/red), tsunami flag, radius search | M5.2 at 18 km depth, 47 km NE of San Bernardino, no tsunami |
| 🚨 FEMA OpenFEMA | Disaster declarations: DR/EM/FM, incident type, declaration date, fiscal year, designation string | FEMA-4734-DR-CA, Severe Storm(s), declared 2025-02-14 |
| 🌐 GDACS | Global multi-hazard alerts: EQ/FL/TC/VO/DR/WF, Red/Orange/Green severity, date range | Red TC alert, Tropical Cyclone Mawar, Pacific basin |
| 💨 OpenAQ | Air quality measurements: PM2.5, PM10, O3, NO2, SO2, CO by country / city / lat-lon radius (max 25 km) | PM2.5 avg 187 µg/m³, n=12 stations, Delhi metro |
Why use Environmental Hazard MCP?
Site-level environmental risk work today is:
- manual and slow (an analyst opens EPA ECHO, NWS, USGS, and FEMA portals in separate tabs for every property file)
- inconsistent across reviewers and not reproducible run to run
- gated behind expensive licenses for any tool that tries to consolidate the same public sources
- impossible to wire directly into an AI agent without a custom integration per source
This MCP collapses that into one endpoint. A single env_location_risk call queries EPA, NOAA, USGS, and FEMA in parallel and returns a deterministic JSON envelope your agent can branch on. Individual-source tools cover the long tail of single-question lookups (live storm tracking, global pollution, GDACS alerts). All six sources are free public APIs; only OpenAQ requires a free user key.
- Scheduling, run periodic environmental sweeps on Apify Scheduler and trigger alerts on new signals
- API access, call from Python, JavaScript, or any HTTP client using standard MCP protocol
- Parallel data fetching,
env_location_riskfans out to four actors simultaneously, not sequentially - Monitoring, push HIGH-severity NOAA alerts or Red GDACS events to Slack or email via Apify webhooks
- Integrations, pipe results into Notion, Airtable, or any webhook-compatible system
Features
Compliance and enforcement signals
- EPA ECHO facility search by state, city, ZIP, NAICS, program (Air / Water / RCRA / SDWA / TRI / GHG / RMP), and major-facility flag.
- Significant-noncompliance (
complianceStatus="3") and multiple-SNC ("4") screens with rolled-up SNC count. - Total-penalties aggregate across the result set surfaced as a headline number.
- Optional
include_detailedflag pulls permits, violations, inspections, and actions detail.
Weather and seismic signals
- NOAA active-alerts mode (
active_only=true) returns currently-in-effect warnings, watches, and advisories. - Historical NOAA mode via
start_dateandend_datefor date-range queries. - Severity breakdown (
bySeverity) returned per call. - USGS magnitude, depth, and PAGER-alert filtering with date-range support.
- USGS radius search around a real lat-lon (max 20,001 km).
- Tsunami-warning count surfaced as a headline aggregate.
Disaster declarations and global alerts
- FEMA disaster declarations by state, incident type, declaration type (DR / EM / FM), fiscal year, and date range.
- Incident-type breakdown (
byIncidentType) returned per call. - GDACS global multi-hazard alerts (EQ / FL / TC / VO / DR / WF) with Red / Orange / Green severity.
- Alert-level and event-type breakdowns returned per call.
Air quality
- OpenAQ measurements by ISO country code, city partial match, or lat-lon radius (max 25,000 m).
- Six pollutants: PM2.5, PM10, O3, NO2, SO2, CO.
- Historical mode via
date_fromanddate_to. - Average value and unit rolled up across the result set.
- Structured
warningpayload when no API key is set (no silent fallback to sample data).
Composite + orchestration
env_location_riskfans EPA + NOAA + USGS + FEMA out in parallel viaPromise.all.riskSignals[]is the curated, plain-language summary your agent branches on.- Per-source breakdowns (
epaCompliance,weatherAlerts,seismicActivity,disasterDeclarations) for citation and drill-down. - Free
env_list_sourcestool returns the tool catalogue with no charge and no upstream fetch.
Quickstart workflows
Site-risk pre-purchase screen
property address resolved to state + lat-lon
→ env_location_risk(state, city, zip_code, latitude, longitude)
→ branch on signalCount and riskSignals[]
→ if SNC > 0 OR severe alerts > 0 OR FEMA declarations > 0 → flag for human review
Live storm tracker
state of interest
→ env_weather_alerts(active_only=true, area=state, severity="Severe")
→ poll on a schedule
→ push new events to Slack via Apify webhook
Facility compliance screen by ZIP
ZIP code list
→ env_epa_compliance(zip_code, program="A", compliance_status="3", major_facility="Y")
→ return significantNoncompliance count + totalPenalties per ZIP
Global pollution snapshot
city or country
→ env_air_quality(country, city, parameter="pm25", api_key=OPENAQ_API_KEY)
→ env_global_disasters(event_type="ALL", alert_level="Red")
→ combine for a non-U.S. hazard view
Use cases
Commercial property risk pre-close
A commercial real-estate analyst running an environmental file before close pulls one env_location_risk call for the target site (state, city, lat-lon). The MCP returns EPA SNC facilities within the search, current NOAA alerts, M3.0+ earthquakes within 200 km in the past year, and FEMA declarations for the state this fiscal year. The analyst attaches the structured JSON to the deal file and routes any SNC or M4.5+ result to a Phase I consultant for follow-up. Replaces a half-day of multi-portal lookups with a 90-second call.
Parametric insurance underwriting
A parametric-insurance underwriter writing a hurricane or earthquake trigger policy uses the MCP to ground portfolio-level exposure in current data. env_earthquakes with latitude, longitude, and max_radius_km returns recent seismic activity around insured assets; env_weather_alerts with event_type="Hurricane Warning" flags active tropical storms in coastal states; env_fema_disasters with incident_type="Hurricane" returns the federal-declaration history per state. None of this replaces a licensed CAT model, but it gives the underwriter live signal between model refreshes.
ESG facility audit
An ESG analyst auditing a manufacturing portfolio runs env_epa_compliance per facility ZIP with program="A" (Air), program="W" (Water), or program="ALL", then compliance_status="3" to filter to SNC-only results. The rolled-up significantNoncompliance count and totalPenalties aggregate go directly into the audit memo. Pairs with env_fema_disasters to flag facilities in flood-prone or hurricane-prone states.
Emergency-response coordination
An emergency-management coordinator polls env_weather_alerts(active_only=true, area=state, severity="Extreme") on a 5-minute schedule and pushes new Extreme alerts to a Slack channel via Apify webhook. env_global_disasters with alert_level="Red" covers cross-border incidents. The MCP gives a live, single-pane view across NOAA and GDACS without standing up a custom alert pipeline.
Environmental-justice research
A researcher mapping pollution near a community runs env_epa_compliance by city and ZIP with program="A" (Air), then env_air_quality(latitude, longitude, radius=25000, parameter="pm25") for monitoring-station PM2.5 levels within 25 km. The combined output supports geospatial overlays of regulated emitters and measured air quality.
Climate-resilience dashboards
A climate-risk team building a resilience dashboard for a multi-state operations footprint runs env_location_risk per site on a weekly schedule, persists the signalCount series, and surfaces sites where the signal count is rising. env_global_disasters and env_air_quality extend the same dashboard to international locations where the U.S.-composite does not apply.
How to connect this environmental hazard MCP
Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"environmental-hazard": {
"url": "https://environmental-hazard-mcp.apify.actor/mcp",
"headers": {
"Authorization": "Bearer YOUR_APIFY_TOKEN"
}
}
}
}
Cursor, Windsurf, or Cline
Use the same URL and token in your MCP server settings panel. The server communicates via standard MCP protocol over HTTP POST to /mcp.
Python (via requests)
import requests
response = requests.post(
"https://environmental-hazard-mcp.apify.actor/mcp",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_APIFY_TOKEN"
},
json={
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "env_location_risk",
"arguments": {
"state": "CA",
"city": "Los Angeles",
"latitude": 34.0522,
"longitude": -118.2437
}
},
"id": 1
}
)
result = response.json()
report = result["result"]["content"][0]["text"]
print(report)
JavaScript
const response = await fetch(
"https://environmental-hazard-mcp.apify.actor/mcp",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_APIFY_TOKEN"
},
body: JSON.stringify({
jsonrpc: "2.0",
method: "tools/call",
params: {
name: "env_weather_alerts",
arguments: { active_only: true, area: "FL", severity: "Severe" }
},
id: 1
})
}
);
const data = await response.json();
const report = JSON.parse(data.result.content[0].text);
console.log(`Active severe alerts in FL: ${report.total}`);
cURL
curl -X POST "https://environmental-hazard-mcp.apify.actor/mcp" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "env_earthquakes",
"arguments": {
"min_magnitude": 4.5,
"latitude": 34.0522,
"longitude": -118.2437,
"max_radius_km": 200,
"start_time": "2025-01-01"
}
},
"id": 1
}'
Environment variables
| Variable | Required | Purpose |
|---|---|---|
OPENAQ_API_KEY | Recommended | Free key from explore.openaq.org. Required for live air-quality data. When absent, env_air_quality returns a structured warning payload instead of measurements. The per-tool api_key argument overrides this env var when both are set. |
STANDBY_IDLE_TIMEOUT_SECS | Optional | Standby idle-shutdown window in seconds (default 300, minimum 60). The instance exits after this idle period to release platform compute; the next request cold-starts a fresh one. |
EPA ECHO, NOAA, USGS, FEMA, and GDACS are keyless. Only OpenAQ needs credentials.
MCP tools

| Tool | Source | Price | What it returns |
|---|---|---|---|
env_epa_compliance | EPA ECHO | $0.05 | Facility list, significantNoncompliance count, totalPenalties aggregate, per-facility status / programs / penalties |
env_weather_alerts | NOAA / NWS | $0.05 | Active or historical alerts, bySeverity breakdown, per-alert event / severity / urgency / headline / expiry |
env_earthquakes | USGS | $0.05 | Earthquake list, maxMagnitude, tsunamiWarnings count, per-event magnitude / place / depth / time / PAGER alert |
env_fema_disasters | FEMA OpenFEMA | $0.05 | Declaration list, byIncidentType breakdown, per-declaration title / type / date / designation |
env_global_disasters | GDACS | $0.05 | Global alerts, byAlertLevel and byEventType breakdowns, per-alert event / severity / location |
env_air_quality | OpenAQ | $0.05 | Measurements, averageValue, unit, per-station value / pollutant / station / coordinates. Returns structured warning if no API key. |
env_location_risk | EPA + NOAA + USGS + FEMA | $0.15 | Composite U.S. site screen, riskSignals[] plain-language summary, per-source breakdowns (epaCompliance / weatherAlerts / seismicActivity / disasterDeclarations) |
env_list_sources | (no fetch) | Free | Tool catalogue: 8 tools, 6 upstream sources, credentials-required flag per tool |
The $0.05 single-source tools cover the long tail of one-question lookups. The $0.15 composite covers the most common U.S. site-screening workflow in one call. env_list_sources is free for agent planning.
Tool input reference
| Tool | Parameter | Type | Required | Description |
|---|---|---|---|---|
env_epa_compliance | facility_name | string | No | Facility name, partial match (e.g. "EXXON") |
env_epa_compliance | state | string | No | 2-letter state code(s), comma-separated (e.g. "TX", "CA,NY") |
env_epa_compliance | city | string | No | City name |
env_epa_compliance | zip_code | string | No | 5-digit ZIP code(s), comma-separated |
env_epa_compliance | program | enum | No | A=Air, W=Water, R=RCRA, S=SDWA, T=TRI, G=GHG, M=RMP, ALL=All programs |
env_epa_compliance | compliance_status | enum | No | 2=Any noncompliance, 3=Significant NC, 4=Multiple significant NC |
env_epa_compliance | naics_code | string | No | NAICS industry code (2-6 digit prefix) |
env_epa_compliance | major_facility | enum | No | Y / N major-facility flag |
env_epa_compliance | include_detailed | boolean | No | Include permits, violations, inspections, actions detail (slower) |
env_epa_compliance | max_results | number | No | 1-500, default 50 |
env_weather_alerts | active_only | boolean | No | Default true. False enables historical mode and unlocks date range |
env_weather_alerts | area | string | No | 2-letter U.S. state / territory code |
env_weather_alerts | severity | enum | No | Extreme / Severe / Moderate / Minor / Unknown |
env_weather_alerts | urgency | enum | No | Immediate / Expected / Future / Past / Unknown |
env_weather_alerts | event_type | string | No | e.g. "Tornado Warning", "Flood Warning", "Winter Storm Watch" |
env_weather_alerts | start_date / end_date | string | No | YYYY-MM-DD, only when active_only=false |
env_earthquakes | min_magnitude | number | No | Default 4.0 |
env_earthquakes | max_magnitude | number | No | Optional cap |
env_earthquakes | latitude + longitude + max_radius_km | number | No | All three required together for radius search; max 20,001 km |
env_earthquakes | alert_level | enum | No | PAGER green / yellow / orange / red |
env_earthquakes | start_time / end_time | string | No | YYYY-MM-DD |
env_fema_disasters | state | string | No | 2-letter state code |
env_fema_disasters | incident_type | enum | No | Fire / Hurricane / Flood / Tornado / Severe Storm(s) / Earthquake / Snow / Drought / Biological / Coastal Storm / Other |
env_fema_disasters | declaration_type | enum | No | DR=Major Disaster, EM=Emergency, FM=Fire Management |
env_fema_disasters | fiscal_year | number | No | Federal FY (starts Oct 1) |
env_fema_disasters | date_start / date_end | string | No | Declaration date range YYYY-MM-DD |
env_global_disasters | event_type | enum | No | ALL / EQ / FL / TC / VO / DR / WF |
env_global_disasters | alert_level | enum | No | ALL / Red / Orange / Green |
env_global_disasters | date_from / date_to | string | No | YYYY-MM-DD |
env_air_quality | country | string | No | ISO 2-letter, default "US" |
env_air_quality | city | string | No | Partial match |
env_air_quality | parameter | enum | No | pm25 / pm10 / o3 / no2 / so2 / co, default pm25 |
env_air_quality | latitude + longitude + radius | number | No | All three required for radius search; radius in meters, max 25,000 |
env_air_quality | api_key | string | No | Free OpenAQ key; overrides OPENAQ_API_KEY env var |
env_air_quality | date_from / date_to | string | No | YYYY-MM-DD, triggers historical mode |
env_location_risk | state | string | Yes | 2-letter U.S. state code |
env_location_risk | city | string | No | For EPA facility search |
env_location_risk | zip_code | string | No | For EPA facility search |
env_location_risk | latitude + longitude | number | No | Both required for the USGS earthquake radius search inside the composite |
Output example
env_location_risk for state="CA", city="Los Angeles", latitude=34.0522, longitude=-118.2437:
{
"location": {
"state": "CA",
"city": "Los Angeles",
"zipCode": null,
"latitude": 34.0522,
"longitude": -118.2437
},
"sources": ["EPA ECHO", "NOAA Weather", "USGS Earthquakes", "FEMA Disasters"],
"riskSignals": [
"3 facility/ies in significant environmental noncompliance",
"$487,200 in environmental penalties at nearby facilities",
"2 active severe/extreme weather alert(s)",
"4 earthquake(s) M4.5+ within 200km in the past year",
"6 FEMA disaster declaration(s) in CA this fiscal year"
],
"signalCount": 5,
"epaCompliance": {
"facilitiesFound": 18,
"significantNoncompliance": 3,
"totalPenalties": 487200,
"topViolators": [
{
"name": "PACIFIC METAL FINISHING INC",
"status": "Significant Violator",
"penalties": 215000,
"programs": ["A", "W"]
},
{
"name": "HARBOR CHEMICAL HOLDINGS LLC",
"status": "Significant Violator",
"penalties": 178400,
"programs": ["R"]
},
{
"name": "CENTRAL VALLEY POWER FACILITY",
"status": "Significant Violator",
"penalties": 93800,
"programs": ["A", "G"]
}
]
},
"weatherAlerts": {
"activeAlerts": 7,
"severe": 2,
"alerts": [
{
"event": "Red Flag Warning",
"severity": "Severe",
"headline": "Red Flag Warning issued for Los Angeles County mountains until 8 PM PDT",
"expires": "2026-05-24T20:00:00-07:00"
},
{
"event": "High Wind Warning",
"severity": "Severe",
"headline": "High Wind Warning in effect from 6 AM to 10 PM PDT Thursday",
"expires": "2026-05-24T22:00:00-07:00"
}
]
},
"seismicActivity": {
"earthquakes": 11,
"significantEvents": 4,
"maxMagnitude": 5.2,
"recentEvents": [
{
"magnitude": 5.2,
"place": "47km NE of San Bernardino, CA",
"time": "2026-02-14T03:18:42.000Z",
"depth": 18.4
},
{
"magnitude": 4.8,
"place": "12km SW of Ridgecrest, CA",
"time": "2025-11-02T19:42:11.000Z",
"depth": 8.1
}
]
},
"disasterDeclarations": {
"total": 6,
"declarations": [
{
"title": "California Severe Winter Storms, Flooding, and Mudslides",
"type": "Severe Storm(s)",
"date": "2026-02-14T00:00:00.000Z",
"designation": "FEMA-4734-DR-CA"
},
{
"title": "California Wildfires (Park Fire Complex)",
"type": "Fire",
"date": "2025-11-22T00:00:00.000Z",
"designation": "FEMA-FM-5512-CA"
}
]
}
}
Output fields
Composite (env_location_risk)
| Field | Type | Description |
|---|---|---|
location | object | Echoed input (state, city, zipCode, latitude, longitude) |
sources | string[] | The four contributing datasets |
riskSignals | string[] | Curated plain-language summary, branch on this |
signalCount | number | Integer count of triggered signals |
epaCompliance | object | facilitiesFound, significantNoncompliance, totalPenalties, topViolators[] |
weatherAlerts | object | activeAlerts, severe, alerts[] top 5 |
seismicActivity | object | earthquakes, significantEvents, maxMagnitude, recentEvents[] top 5 |
disasterDeclarations | object | total, declarations[] top 5 |
Single-source tools
| Field | Type | Description |
|---|---|---|
total | number | Records returned for the query |
data | object[] | Per-record source payload (facility / alert / event / declaration / measurement) |
significantNoncompliance / totalPenalties | number | EPA-only rolled-up aggregates |
bySeverity | object | NOAA-only severity histogram |
maxMagnitude / tsunamiWarnings | number | USGS-only rolled-up aggregates |
byIncidentType | object | FEMA-only incident-type histogram |
byAlertLevel / byEventType | object | GDACS-only histograms |
averageValue / unit | number / string | OpenAQ-only rolled-up aggregate |
warning | string | OpenAQ-only, present when no API key is supplied |
How much does it cost to screen environmental hazards?
Environmental Hazard MCP uses pay-per-event pricing. Single-source tools charge $0.05 per call; the composite env_location_risk charges $0.15 per call because it runs four sub-actors in parallel. env_list_sources is free. Platform compute is included.
| Scenario | Tool calls | Cost |
|---|---|---|
| Quick test, single state weather check | 1 × $0.05 | $0.05 |
| Full composite site risk screen, one property | 1 × $0.15 | $0.15 |
| EPA SNC sweep across 10 facility ZIPs | 10 × $0.05 | $0.50 |
| 50-property due-diligence batch (composite per site) | 50 × $0.15 | $7.50 |
| Monthly 200-facility ESG audit (EPA only) | 200 × $0.05 | $10.00 |
| Daily NOAA poll for one state (30 days) | 30 × $0.05 | $1.50 |
| Weekly global-pollution snapshot (GDACS + OpenAQ, 4 calls per week, monthly) | ~16 × $0.05 | $0.80 |
You can set a maximum spending limit per run to control costs. The actor stops when the budget is reached, returning a structured error your pipeline handles gracefully.
Apify's free tier includes $5 of monthly platform credits: enough for 100 single-source calls or 33 composite calls before any payment is required.
How it works
- Tool dispatch. Each MCP tool calls one sibling actor (
ryanclinton/epa-echo-search,noaa-weather-alerts,usgs-earthquake-search,fema-disaster-search,gdacs-disaster-alerts,openaq-air-quality) viaapify-client.actor(...).call()with a 120-second timeout and 256 MB memory. - Result filtering. The MCP filters out source-emitted error envelopes (
{ message: ... }) so a partial upstream failure never silently inflates a count. - Aggregation. Each tool computes its own rolled-up headline aggregates (SNC count, severity breakdown, max magnitude, incident-type histogram, average pollutant value).
- Composite parallel fan-out.
env_location_riskcalls EPA, NOAA, USGS (only iflatitudeandlongitudeare both set), and FEMA viaPromise.all. The USGS call usesstarttimeset to the prior calendar year andminmagnitude=3.0inside a 200 km radius. The FEMA call usesfyDeclaredset to the current calendar year. - Signal generation. The composite walks the four sub-results and pushes a plain-language string into
riskSignals[]for each triggered condition (SNC > 0, penalties > 0, severe alerts > 0, M4.5+ events > 0, FEMA declarations > 0). - Standby lifecycle. Idle-shutdown fires after
STANDBY_IDLE_TIMEOUT_SECS(default 300) of no inbound requests; the instance exits to release platform compute and the next request cold-starts a fresh one.
Tips for best results
-
Use
compliance_status="3"for SNC-only EPA screens. Status 2 is "any noncompliance" and returns a noisy set. Status 3 is significant noncompliance, the result most due-diligence workflows care about. -
Keep
active_only=trueon NOAA when you do not need history. Historical NOAA queries are slower and return larger result sets. Active-only is what you want for live storm tracking and emergency monitoring. -
Pair USGS radius search with a real lat-lon. The radius search needs all three of
latitude,longitude, andmax_radius_km. Omit any one and the query degrades to a global time-window search. -
Remember FEMA fiscal year starts Oct 1. A query for
fiscal_year=2025covers Oct 1 2024 through Sep 30 2025. In Q4 of the calendar year, setfiscal_yearto the upcoming federal FY to capture recent declarations. -
Filter GDACS to Red and Orange for a low-noise feed. GDACS Green alerts include routine events that rarely warrant action. Use
alert_level="Red"oralert_level="Orange"for a signal-only stream. -
For non-U.S. sites, skip the composite.
env_location_riskruns EPA, NOAA, and FEMA, which are U.S.-only. For international sites, callenv_global_disastersandenv_air_qualitydirectly. -
Set spending limits for batch workflows. When running 50+ composite calls, set
maxTotalChargeUsdon the Apify run to cap exposure. The server returns a structured error when the limit is reached. -
Cache
env_list_sourcesonce per session. It is free, has no upstream fetch, and the catalogue rarely changes. Call it once on agent startup, then reuse the result for planning.
Combine with other Apify actors
| Actor | How to combine |
|---|---|
| EPA ECHO Search | Pull raw EPA facility records directly for deep facility-level review outside the MCP |
| NOAA Weather Alerts | Run scheduled NOAA polls and persist the dataset for historical storm tracking |
| USGS Earthquake Search | Bulk seismic queries with the full USGS GeoJSON record for geospatial dashboards |
| FEMA Disaster Search | Pull full FEMA declaration metadata for federal-assistance research |
| GDACS Disaster Alerts | Persist GDACS alert streams for international hazard monitoring |
| OpenAQ Air Quality | Bulk air-quality queries with full station metadata for monitoring-network analysis |
| Company Deep Research | Pair environmental site signals with company-level intelligence for facility-owner due diligence |
| WHOIS Domain Lookup | Resolve a facility-owner domain to registration data when building an ESG audit file |
Limitations
- The composite is U.S.-only.
env_location_riskruns EPA, NOAA, and FEMA, which are U.S.-only datasets. International sites needenv_global_disasters(GDACS) andenv_air_quality(OpenAQ) called directly. - EPA ECHO data lags 60-90 days. Facility compliance status, penalties, and inspection records reflect EPA's quarterly reporting cycle. Treat the data as recent history, not a real-time enforcement feed.
- FEMA declarations are federal only. State-only emergencies, county-level declarations, and tribal declarations that did not escalate to a federal request are not in OpenFEMA. Cross-check with state emergency-management portals for full local coverage.
- OpenAQ coverage is uneven outside major cities. PM2.5 and PM10 monitoring is dense in North America, Europe, and East Asia, sparser in Africa, Central Asia, and Latin America. A city query that returns no stations is a coverage limit, not a clean reading.
- GDACS alerts are coordination signals, not authoritative impact assessments. Red/Orange severity reflects model-estimated potential impact at the time of the alert. Use official national disaster agencies for authoritative figures.
- USGS radius search is capped at 20,001 km. Practically a global cap, but worth noting if you pass an unbounded radius value.
- Air quality without an OpenAQ key returns a warning, not data. This is intentional: the MCP refuses to silently fall back to sample data. Get a free key at explore.openaq.org.
- Child-actor timeout is 120 seconds. If an upstream source is slow, that source returns an empty array and the rest of the composite still resolves. Re-run the same query; subsequent runs typically succeed.
- All scoring is signal aggregation, not impact modelling. Counts, severities, and magnitudes are pulled from public records and rolled up. The MCP does not predict damage, casualty, or financial impact.
Integrations
- Apify API, trigger environmental screenings programmatically from due-diligence, ESG, or insurance workflow software
- Webhooks, push Extreme NOAA alerts or Red GDACS events to Slack, email, or case-management tools the moment a screening completes
- Zapier, connect to Airtable or Google Sheets property registers; auto-log site-risk signals when new addresses are added
- Make, build emergency-response automations that route severe alerts to on-call rotations
- Google Sheets, export batch screening results to shared spreadsheets for analyst review
- LangChain / LlamaIndex, embed environmental hazard screening as a tool in LLM agent pipelines for automated site due diligence
Troubleshooting
env_air_quality returned a warning field instead of measurements. No OpenAQ API key was supplied. Get a free key at explore.openaq.org and pass it either as the per-tool api_key argument or as the OPENAQ_API_KEY env var on the actor.
env_earthquakes returned no events despite coordinates being passed. USGS radius search requires latitude, longitude, AND max_radius_km together. If any one is missing the query degrades to a global time-window search and may return nothing for a narrow magnitude band. Re-call with all three set.
env_fema_disasters returned no declarations for the current calendar year. FEMA uses federal fiscal years (Oct 1 to Sep 30). In Q4 of the calendar year, set fiscal_year to the next federal FY (calendar year + 1) to capture recent declarations.
env_epa_compliance returned zero facilities in noncompliance. Try lowering the threshold (compliance_status="2" for any noncompliance) or removing the filter entirely to confirm facilities exist in the search area. SNC is genuinely rare in some ZIPs.
env_location_risk returned an empty seismicActivity block. The composite only runs the USGS sub-call when both latitude and longitude are supplied. Pass both to enable the seismic component, or call env_earthquakes directly with a state-level query.
Composite returned faster than expected with thin breakdowns. One of the four sub-actors likely timed out (120 s upstream timeout). The composite still resolves with empty arrays for the failing source. Re-run the same query; subsequent runs typically succeed.
Responsible use
- All data accessed by this server comes from publicly available environmental, weather, seismic, and disaster databases (EPA ECHO, NOAA / NWS, USGS, FEMA OpenFEMA, GDACS, OpenAQ).
- Outputs are hazard signal aggregations, not impact predictions or forensic determinations. Insurance underwriting, life-safety decisions, and emergency response require licensed CAT models, official national hazard agencies, and human review.
- Air-quality readings represent monitoring-station measurements at a given time and location, not personal exposure measurements.
- Comply with applicable data-protection regulations when storing or sharing facility-level results that name specific operators.
- For guidance on web scraping and data-use legality, see Apify's guide.
FAQ
How is this different from RMS, AIR Worldwide, or other catastrophe models? RMS and AIR are licensed catastrophe models priced in the tens to hundreds of thousands per seat per year, used by reinsurers and large insurers to model expected losses across a portfolio of risks. This MCP is not a CAT model. It returns the underlying public-records hazard signals (EPA violations, active NOAA alerts, recent USGS events, FEMA declarations, GDACS alerts, OpenAQ readings) as deterministic JSON, priced per call. The two are complementary: use a licensed CAT model for portfolio loss modelling, use this MCP for live signal between model refreshes and for AI-agent workflows.
How is this different from ESRI Living Atlas or other GIS layers? ESRI Living Atlas is a curated map-layer catalogue inside ArcGIS, optimised for analyst visual workflows and requiring an ArcGIS license. This MCP is text-out and agent-native: it returns structured JSON your agent or pipeline reasons over without a mapping client. There is no license seat; you pay per call.
What is EPA ECHO?
EPA's Enforcement and Compliance History Online is the U.S. Environmental Protection Agency's public-records system for tracking regulated facilities' compliance with the Clean Air Act, Clean Water Act, RCRA, SDWA, TRI, GHG, and RMP programs. It surfaces facility violations, inspections, formal enforcement actions, and penalties. env_epa_compliance is a thin wrapper over EPA ECHO's search API.
What does PAGER alert level mean on earthquake results?
PAGER (Prompt Assessment of Global Earthquakes for Response) is USGS's automated impact-estimation system. Green means no expected impact, Yellow means localised impact possible, Orange means significant impact likely, Red means catastrophic impact likely. Filter env_earthquakes with alert_level="orange" or "red" for high-impact events only.
Why is env_location_risk U.S.-only?
The composite calls EPA ECHO (U.S. regulated facilities), NOAA / NWS (U.S. states and territories), and FEMA (U.S. federal disaster declarations). Three of the four sub-sources do not cover non-U.S. territory. For international site screening, call env_global_disasters (GDACS) and env_air_quality (OpenAQ) directly and skip the composite.
How often does NOAA / USGS / FEMA data update? NOAA active alerts refresh in near real-time via the NWS api.weather.gov feed. USGS earthquake data publishes within minutes of detection. FEMA OpenFEMA refreshes daily for new declarations. EPA ECHO lags 60-90 days because of EPA's quarterly reporting cycle. GDACS alerts refresh hourly. OpenAQ measurements refresh as monitoring stations publish, typically hourly.
What counts as "significant noncompliance" in EPA ECHO?
EPA defines Significant Noncompliance differently per program, but in general it covers facilities with severe, persistent, or systemic violations of permit conditions or regulatory requirements. The MCP exposes this directly: compliance_status="3" returns facilities flagged SNC in any covered program; "4" returns facilities flagged SNC in multiple programs at once.
Does GDACS replace national disaster agencies? No. GDACS is a global multi-hazard coordination system run by the EU and UN that aggregates and triages alerts for international emergency response. Authoritative figures come from national disaster agencies (FEMA in the U.S., national civil-protection bodies elsewhere). Use GDACS for early signal and breadth, use national systems for authoritative response data.
Can I schedule this MCP to run periodic environmental sweeps?
Yes. Use the Apify Scheduler to trigger the actor on a daily, weekly, or monthly cadence. Configure a webhook to push severe alerts or new SNC facilities to Slack, email, or a case-management system. A common pattern is a daily env_weather_alerts(active_only=true, severity="Extreme") poll per state of interest with new-event webhook delivery.
Is it legal to use this tool for site screening? All underlying data sources are publicly available U.S. federal records (EPA, NOAA, USGS, FEMA), the EU/UN GDACS feed, and the OpenAQ open-data platform. Querying public records for environmental due diligence is a standard practice in real estate, insurance, ESG, and emergency management. See Apify's guide on web scraping legality for broader context. Decisions made on the output (purchase, underwriting, hiring) should follow your jurisdiction's professional standards.
Help us improve
If you encounter issues, you can help us debug faster by enabling run sharing in your Apify account:
- Go to Account Settings > Privacy
- Enable Share runs with public Actor creators
This lets us see your run details when something goes wrong, so we can fix issues faster. Your data is only visible to the actor developer, not publicly.
Support
Found a bug or have a feature request? Open an issue in the Issues tab on this actor's page. For custom solutions or enterprise integrations, reach out through the Apify platform.
Related actors
AI Cold Email Writer — $0.01/Email, Zero LLM Markup
Generates personalized cold emails from enriched lead data using your own OpenAI or Anthropic key. Subject line, body, CTA, and optional follow-up sequence — $0.01/email, zero LLM markup.
AI Outreach Personalizer — Emails with Your LLM Key
Generate personalized cold emails using your own OpenAI or Anthropic API key. Subject lines, opening lines, full bodies — tailored to each lead's role, company, and signals. $0.01/lead compute + your LLM costs. Zero AI markup.
Bulk Email Verifier — MX, SMTP & Disposable Detection at Scale
Verify email deliverability in bulk — MX records, SMTP mailbox checks, disposable detection (55K+ domains), role-based flagging, catch-all detection, domain health scoring (SPF/DKIM/DMARC), and confidence scores. $0.005/email, no subscription.
CFPB Complaint Search — By Company, Product & State
Search the CFPB consumer complaint database with 5M+ complaints. Filter by company, product, state, date range, and keyword. Extract complaint details, company responses, and consumer narratives. Free US government data, no API key required.
Ready to try Environmental Hazard MCP Server?
This actor is coming soon to the Apify Store.
Coming soon