cyanheads avatar

Fema Mcp Server

cyanheads/fema-mcp-server

Connects Claude to FEMA's OpenFEMA API for querying disaster declarations, public assistance grants, housing aid, and NFIP flood insurance claims. Eight tools cover the main datasets: search disasters by state, incident type, or date range; fetch designated areas and funded projects; pull housing assistance breakdowns by county and ZIP; and query NFIP claims with optional DuckDB spillover for SQL analytics on large result sets. When NFIP queries exceed the inline cap, results land in a DataCanvas table you can aggregate and filter with standard SQL. Generic OData query tool included for datasets the convenience wrappers don't cover. Useful for journalists, researchers, and anyone tracking federal disaster response or flood insurance payouts.

GitHub stars
2
tools
8
transport
STDIO, HTTP
env vars
7
last updated
Nov 4, 2026

Install

From registry metadata
$ npx add-mcp https://fema.caseyjhand.com/mcp --name fema

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http fema https://fema.caseyjhand.com/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 8 tools

Verified live against the running server on Nov 6, 2026.

fema_search_disastersSearch federal disaster declarations by title, state, incident type, declaration type, date range, and county. Returns deduplicated declaration-level summaries — each disaster number appears once with a designated_area_count showing how many counties/municipalities were design...9 params

Search federal disaster declarations by title, state, incident type, declaration type, date range, and county. Returns deduplicated declaration-level summaries — each disaster number appears once with a designated_area_count showing how many counties/municipalities were design...

Parameters* required
countystring
Filter by designated area / county name (e.g., Harris, Harris County, Harris (County)). Case-insensitive substring match: bare harris also matches Harrison. Recognized terminal County, Parish, Boro...
date_fromvalue
Start of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-01-01). Inclusive; not after date_to.
date_tovalue
End of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-12-31). Inclusive; equal to date_from for a single day.
declaration_typestring
Declaration type: DR (major disaster declaration), EM (emergency declaration), FM (fire management assistance declaration).one of DR · EM · FM
incident_typestring
Incident type filter (e.g., Flood, Hurricane, Tornado, Fire, Earthquake, Severe Storm). Case-insensitive substring match: storm also matches Snowstorm and Winter Storm.
limitinteger
Maximum number of unique disaster declarations to return (1–1000, default 50). A page also stops at 100,000 characters of declarations (roughly 290 declarations, about 190 with county); when either...default: 50
offsetinteger
Pagination offset in declarations (default 0). Pass the previous page’s next_offset to continue.default: 0
statestring
Two-letter US state/territory code (e.g., TX, CA, FL, PR). Filters by state.
titlestring
Case-insensitive substring of the declaration title (e.g., harvey). A substring can also match unrelated names such as HARVEYTOWN FIRE; it does not identify a unique storm.
fema_get_disasterFetch up to 1,000 designated-area rows for a specific FEMA disaster by disaster number (e.g., 4781). Discloses partial area and program coverage when more rows exist. Returns counties/municipalities along with programs observed, incident period, and state info. Use fema_search...1 params

Fetch up to 1,000 designated-area rows for a specific FEMA disaster by disaster number (e.g., 4781). Discloses partial area and program coverage when more rows exist. Returns counties/municipalities along with programs observed, incident period, and state info. Use fema_search...

Parameters* required
disaster_number*integer
FEMA disaster number (e.g., 4781). Obtain from fema_search_disasters.
fema_get_public_assistanceRetrieve Public Assistance (PA) funded project records for a disaster or state — shows where federal recovery money was obligated. Returns applicant, damage category, project size and status, federal share obligated, and total obligated amounts. Either disaster_number or state...5 params

Retrieve Public Assistance (PA) funded project records for a disaster or state — shows where federal recovery money was obligated. Returns applicant, damage category, project size and status, federal share obligated, and total obligated amounts. Either disaster_number or state...

Parameters* required
countystring
Filter by county name (e.g., Harris, dekalb). Case-insensitive substring match: harris also matches Harrison. Recognized terminal County, Parish, Borough, and Census Area names accept plain or pare...
disaster_numberinteger
FEMA disaster number to scope results to a single declaration. Numbers above 32767 match no declaration.
limitinteger
Maximum number of projects to return (1–10000, default 100). A page also stops at 100,000 characters of projects (roughly 220 projects); when either bound leaves matching projects out, next_offset...default: 100
offsetinteger
Pagination offset (default 0). Pass the previous page’s next_offset to continue.default: 0
statestring
Two-letter state code to browse all PA projects for a state.
fema_get_housing_assistanceRetrieve Individual Assistance (IA) housing data for a disaster by disaster number. Returns owner and/or renter records aggregated by county, city, and ZIP code — valid registrations, total approved IHP amounts, repair/rental/other-needs amounts, and inspection counts (owners...7 params

Retrieve Individual Assistance (IA) housing data for a disaster by disaster number. Returns owner and/or renter records aggregated by county, city, and ZIP code — valid registrations, total approved IHP amounts, repair/rental/other-needs amounts, and inspection counts (owners...

Parameters* required
countystring
Filter by county name (e.g., Harris, Harris County, Harris (County)). Case-insensitive substring match: bare harris also matches Harrison. Recognized terminal County, Parish, Borough, and Census Ar...
disaster_number*integer
FEMA disaster number. Obtain from fema_search_disasters. Numbers above 32767 match no declaration.
limitinteger
Maximum records per dataset to return (1–10000, default 100). A page also stops at 100,000 characters of owner and renter records together, cutting both datasets at the same row count; when either...default: 100
offsetinteger
Pagination offset into each queried dataset (default 0). Pass the previous page’s next_offset to continue both.default: 0
statestring
Two-letter state code to narrow results when a disaster spans multiple states.
typestring
Which housing assistance dataset to query: owners, renters, or both (default).one of owners · renters · bothdefault: both
zip_codevalue
Filter by 5-digit ZIP code, as a string with leading zeros kept (e.g., 77084, 00609). ZIP+4 is not accepted. One ZIP can return several records, one per county and city spelling.
fema_search_nfipSearch National Flood Insurance Program (NFIP) claims data by state, county, ZIP code, and year range. Returns the matching claim count and claim records — amounts paid on building and contents, damage estimates, flood zones, cause and occupancy codes, and loss dates — newest...8 params

Search National Flood Insurance Program (NFIP) claims data by state, county, ZIP code, and year range. Returns the matching claim count and claim records — amounts paid on building and contents, damage estimates, flood zones, cause and occupancy codes, and loss dates — newest...

Parameters* required
canvas_idstring
Optional canvas ID from a prior call, to stage this match as another table on that canvas. Used only when the match is staged; omit it to stage on a fresh canvas. Pass the returned canvas_id to fem...
county_codestring
County FIPS code to narrow results within the state: the full 5-digit state+county code (e.g., 48201 for Harris County TX), or the 3-digit county part (e.g., 201), to which the server prepends the...
limitinteger
Maximum claims to return inline (1–10000, default 1000). A page also stops at 100,000 characters of claims (roughly 330 claims); when either bound leaves matching claims out, next_offset names the...default: 1000
offsetinteger
Pagination offset into the matching claims, ordered newest date of loss first (default 0). Pass the previous page’s next_offset to continue. Only a call at offset 0 stages a match on a canvas; a la...default: 0
state*string
Two-letter US state code (required). NFIP dataset is 2.7M rows — state filter is mandatory.
year_frominteger
Start year of loss, inclusive (e.g., 2020). Not after year_to.
year_tointeger
End year of loss, inclusive (e.g., 2023). Equal to year_from for a single year.
zip_codestring
ZIP code to narrow results to a specific area (5-digit, e.g., 77002).
fema_dataframe_queryRun a read-only SQL SELECT against a DataCanvas table staged by fema_search_nfip. Enables aggregation, GROUP BY, SUM/COUNT, time-series, and filtered analysis over the full NFIP claims result without re-fetching from the API. Call fema_dataframe_describe first to get the exact...2 params

Run a read-only SQL SELECT against a DataCanvas table staged by fema_search_nfip. Enables aggregation, GROUP BY, SUM/COUNT, time-series, and filtered analysis over the full NFIP claims result without re-fetching from the API. Call fema_dataframe_describe first to get the exact...

Parameters* required
canvas_id*string
Canvas ID from the fema_search_nfip response (the canvas_id field).
query*string
SQL SELECT statement to run against the staged table. Use the table name from fema_dataframe_describe. Results are capped at the canvas row limit and at 100,000 characters of rows; append LIMIT/OFF...
fema_dataframe_describeList tables and column schemas on a DataCanvas staged by fema_search_nfip. Call this before fema_dataframe_query to discover the exact table name, column names, and DuckDB data types needed to write valid SQL. Row count reflects what was actually staged — check truncated in th...1 params

List tables and column schemas on a DataCanvas staged by fema_search_nfip. Call this before fema_dataframe_query to discover the exact table name, column names, and DuckDB data types needed to write valid SQL. Row count reflects what was actually staged — check truncated in th...

Parameters* required
canvas_id*string
Canvas ID from the fema_search_nfip response.
fema_query_datasetGeneric OData query against any dataset in the OpenFEMA dataset catalog — the escape hatch for datasets the convenience tools do not cover (e.g., NfipPolicies, IndividualAssistanceHousingRegistrantsLargeDisasters, FemaWebDeclarationAreas, PublicAssistanceApplicants). Accepts r...6 params

Generic OData query against any dataset in the OpenFEMA dataset catalog — the escape hatch for datasets the convenience tools do not cover (e.g., NfipPolicies, IndividualAssistanceHousingRegistrantsLargeDisasters, FemaWebDeclarationAreas, PublicAssistanceApplicants). Accepts r...

Parameters* required
dataset*string
OpenFEMA dataset entity name (case-sensitive, e.g., NfipPolicies, FemaWebDeclarationAreas, PublicAssistanceApplicants).
filterstring
OData $filter expression (e.g., "state eq 'TX' and declarationDate ge '2024-01-01T00:00:00.000Z'"). String values in single quotes. For a list of values use field in ('a','b'): OpenFEMA rejects fil...
limitinteger
Maximum records to return (1–10000, default 100). A page also stops at 100,000 characters of records; when either bound leaves matching records out, next_offset names the offset to continue from.default: 100
offsetinteger
Pagination offset (default 0). Pass the previous page’s next_offset to continue.default: 0
orderbystring
OData $orderby expression (e.g., "declarationDate desc").
selectstring
Comma-separated field names to return (e.g., "disasterNumber,state,declarationDate").

Sponsors

Configuration

FEMA_ENABLE_CANVAS_DROPdefault: false

Enable the destructive fema_dataframe_drop tool for removing staged canvas data.

MCP_LOG_LEVELdefault: info

Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

MCP_TRANSPORT_TYPEdefault: http

Selects the HTTP transport.

MCP_HTTP_HOSTdefault: 127.0.0.1

The hostname for the HTTP server.

MCP_HTTP_PORTdefault: 3010

The port to run the HTTP server on.

MCP_HTTP_ENDPOINT_PATHdefault: /mcp

The endpoint path for the MCP server.

MCP_AUTH_MODEdefault: none

Authentication mode to use: 'none', 'jwt', or 'oauth'.

Readme

@cyanheads/fema-mcp-server

Query FEMA disaster declarations, public assistance grants, housing aid, and NFIP flood insurance claims via MCP. STDIO or Streamable HTTP.

8 Tools • 1 Opt-in Tool • 1 Resource • 1 Skill

Details

Repository
github.com/cyanheads/fema-mcp-server
Package
@cyanheads/fema-mcp-server
Transport
STDIO, HTTP
Registry
MCP registry, active
Resources
1
Tools verified
Nov 6, 2026

More from cyanheads