io.github.cyanheads/fema-mcp-server
REMOTE · FEMA.CASEYJHAND.COM · 2 COMPONENTS · SCANNED AUG 3
Query FEMA disaster declarations, public assistance grants, housing aid, and NFIP claims.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security66
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation not fully verified: no authorisation is required to call this server, and 8 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability63
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 2049 tokens (~256/item across 8 items; 8 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · fema.caseyjhand.com
claude mcp add --transport http cyanheads-fema-mcp-server https://fema.caseyjhand.com/mcp
[mcp_servers.cyanheads-fema-mcp-server] url = "https://fema.caseyjhand.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cyanheads-fema-mcp-server": {
"type": "remote",
"url": "https://fema.caseyjhand.com/mcp",
"enabled": true
}
}
} openclaw mcp add cyanheads-fema-mcp-server --url https://fema.caseyjhand.com/mcp --transport streamable-http
mcp_servers:
cyanheads-fema-mcp-server:
url: "https://fema.caseyjhand.com/mcp" {
"mcpServers": {
"cyanheads-fema-mcp-server": {
"type": "http",
"url": "https://fema.caseyjhand.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Jul 26 +2
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.
- 28 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Jul 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 62
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://fema.caseyjhand.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=caseyjhand.com | CN=WE1,O=Google Trust Services,C=US | 7 Jul 2026 | 5 Oct 2026 | ECDSA 256 | ECDSA-SHA256 | 5aad900eb2055a0b0ea55912ec19680c |
| SANs: caseyjhand.com, *.caseyjhand.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
DNSSEC secure
Validation of fema.caseyjhand.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| caseyjhand.com. | present | 2371 | 13 | Verified |
| fema.caseyjhand.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://fema.caseyjhand.com/mcp | Verified | 200 | |
| http (plaintext) | http://fema.caseyjhand.com/mcp | HTTPS enforced | 301 | https://fema.caseyjhand.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
fema_dataframe_describe Describe FEMA DataCanvas Tables ~103
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 the fema_search_nfip response to know whether the canvas holds the full matching set.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | yes | Canvas ID from the fema_search_nfip response. |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | yes | Canvas ID that was described — pass to fema_dataframe_query. |
| tables | array | yes | All tables and views available on this canvas. |
No examples provided.
fema_dataframe_query Query FEMA DataCanvas Table ~233
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 table name and column names needed for valid SQL. Only SELECT statements are allowed — DDL, DML, COPY, and file-reading functions are blocked.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | yes | Canvas ID from the fema_search_nfip response (the canvas_id field). |
| query | string | yes | 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; append LIMIT/OFFSET to page through additional rows,… |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | yes | Canvas ID that was queried — reuse for follow-up queries. |
| cap | number | — | The canvas row limit that was applied when the result was capped. |
| notice | string | — | Continuation guidance when capped — how to page the remainder with LIMIT/OFFSET. |
| row_count | number | yes | Number of rows in this response (may be capped at the canvas row limit). |
| rows | array | yes | Result rows from the query. May be capped at the canvas row limit — when the truncated enrichment field is set, page the remainder with LIMIT/OFFSET (see the notice guidance). |
| shown | number | — | Number of rows returned in this (capped) response. |
| truncated | boolean | — | True when the result was capped at the canvas row limit — more rows match than were returned. |
No examples provided.
fema_get_disaster Get FEMA Disaster Details ~112
Fetch all designated-area rows for a specific FEMA disaster by disaster number (e.g., 4781). Returns every county/municipality designated under the declaration along with programs activated, incident period, and state info. Use fema_search_disasters to find disaster numbers. The returned disaster_number chains to fema_get_public_assistance and fema_get_housing_assistance.
| Name | Type | Req | Description |
|---|---|---|---|
| disaster_number | integer | yes | FEMA disaster number (e.g., 4781). Obtain from fema_search_disasters. |
| Name | Type | Req | Description |
|---|---|---|---|
| declaration_date | string | yes | ISO 8601 date the declaration was signed. |
| declaration_type | string | yes | Declaration type: DR (major disaster), EM (emergency), or FM (fire management). |
| designated_area_count | number | yes | Total number of designated areas in this declaration. |
| designated_areas | array | yes | All counties/municipalities designated for assistance under this declaration. |
| disaster_number | number | yes | FEMA disaster number — use as the chain key for PA and housing assistance tools. |
| hm_declared | boolean | yes | True when Hazard Mitigation grants were declared. |
| ia_declared | boolean | yes | True when the Individuals and Households Program (IHP) was declared — indicates IA housing/personal grants are available. |
| incident_begin_date | string | — | ISO 8601 start date of the incident. Absent when not recorded. |
| incident_end_date | string | — | ISO 8601 end date of the incident. Absent for ongoing or unrecorded incidents. |
| incident_type | string | yes | Type of incident (e.g., Flood, Hurricane, Severe Storm). |
| pa_declared | boolean | yes | True when Public Assistance (infrastructure recovery grants) was declared. |
| state | string | yes | Two-letter state/territory code. |
| title | string | yes | Official declaration title (e.g., "SEVERE STORMS AND FLOODING"). |
No examples provided.
fema_get_housing_assistance Get FEMA Housing Assistance Data ~173
Retrieve Individual Assistance (IA) housing data for a disaster by disaster number. Returns owner and/or renter breakdowns by county and ZIP code — valid registrations, total approved IHP amounts, repair/rental amounts, and inspection data. Use type to select owners, renters, or both (default). Use disaster_number from fema_search_disasters.
| Name | Type | Req | Description |
|---|---|---|---|
| disaster_number | integer | yes | FEMA disaster number. Obtain from fema_search_disasters. |
| limit | integer | — | Maximum records per dataset to return (default 100). |
| offset | integer | — | Pagination offset (default 0). |
| state | string | — | Two-letter state code to narrow results when a disaster spans multiple states. |
| type | string | — | Which housing assistance dataset to query: owners, renters, or both (default). |
| Name | Type | Req | Description |
|---|---|---|---|
| notice | string | — | Guidance when no results were found. |
| owners | array | yes | Homeowner (HousingAssistanceOwners) records. Empty when type is "renters" or no owner data exists. |
| owners_count | number | yes | Total owner records available before the per-dataset limit. |
| renters | array | yes | Renter (HousingAssistanceRenters) records. Empty when type is "owners" or no renter data exists. |
| renters_count | number | yes | Total renter records available before the per-dataset limit. |
| totalCount | number | — | Total owner + renter records available before the per-dataset limit — exceeds the returned count when either dataset was capped. |
No examples provided.
fema_get_public_assistance Get FEMA Public Assistance Projects ~198
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 must be provided. Use disaster_number (from fema_search_disasters) to scope to a single declaration, or state to browse all PA projects for a state. PA projects are created only when the PA program is declared (pa_declared: true on the disaster).
| Name | Type | Req | Description |
|---|---|---|---|
| county | string | — | Filter by county name substring. |
| disaster_number | integer | — | FEMA disaster number to scope results to a single declaration. |
| limit | integer | — | Maximum number of projects to return (1–1000, default 100). |
| offset | integer | — | Pagination offset (default 0). |
| state | string | — | Two-letter state code to browse all PA projects for a state. |
| Name | Type | Req | Description |
|---|---|---|---|
| notice | string | — | Guidance when no results were found. |
| projects | array | yes | Public assistance funded project records. |
| returned_count | number | yes | Number of projects in this response. |
| totalCount | number | — | Total matching projects before pagination — exceeds returned_count when results were capped at the limit. |
| total_count | number | yes | Total matching projects before pagination. |
No examples provided.
fema_query_dataset Query Any OpenFEMA Dataset ~316
Generic OData query against any OpenFEMA v2 dataset — the escape hatch for datasets the convenience tools do not cover (e.g., FimaNfipPolicies, IndividualAssistanceHousingRegistrantsLargeDisasters, FemaWebDeclarationAreas, PublicAssistanceApplicants). Accepts raw OData filter, select, orderby, and pagination parameters. For NFIP Policies, use propertyState (not state) as the state field — always include a county or ZIP filter to avoid timeout. The dataset name must match the exact OpenFEMA v2 entity name (case-sensitive, e.g., FimaNfipClaims). Unknown dataset names return an unknown_dataset error.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset | string | yes | OpenFEMA v2 dataset entity name (case-sensitive, e.g., FimaNfipPolicies, FemaWebDeclarationAreas, PublicAssistanceApplicants). |
| filter | string | — | OData $filter expression (e.g., "state eq 'TX' and declarationDate ge '2024-01-01T00:00:00.000Z'"). String values in single quotes. |
| limit | integer | — | Maximum records to return (1–10000, default 100). |
| offset | integer | — | Pagination offset (default 0). |
| orderby | string | — | OData $orderby expression (e.g., "declarationDate desc"). |
| select | string | — | Comma-separated field names to return (e.g., "disasterNumber,state,declarationDate"). |
| Name | Type | Req | Description |
|---|---|---|---|
| dataset | string | yes | The dataset that was queried. |
| notice | string | — | Guidance when no results were found. |
| returned_count | number | yes | Number of records in this response. |
| rows | array | yes | Records returned from the dataset. Field names depend on the queried dataset. |
| totalCount | number | — | Total matching records before pagination — exceeds returned_count when results were capped at the limit. |
| total_count | number | yes | Total matching records before pagination. |
No examples provided.
fema_search_disasters Search FEMA Disaster Declarations ~370
Search federal disaster declarations by state, incident type, declaration type, date range, and county. Returns deduplicated declaration-level summaries — each disaster number appears once with a designatedAreaCount showing how many counties/municipalities were designated. The disaster number is the chain key for fema_get_disaster, fema_get_public_assistance, and fema_get_housing_assistance. Use declaration_type to filter: DR (major disaster, most common), EM (emergency), FM (fire management). Date filters apply to the declaration date. Use fema_get_disaster to retrieve all designated-area rows for a specific declaration.
| Name | Type | Req | Description |
|---|---|---|---|
| county | string | — | Filter by designated area / county name substring (e.g., Harris, Los Angeles). Case-insensitive. |
| date_from | string | — | Start of declaration date range in ISO 8601 format (e.g., 2024-01-01). Inclusive. |
| date_to | string | — | End of declaration date range in ISO 8601 format (e.g., 2024-12-31). Inclusive. |
| declaration_type | string | — | Declaration type: DR (major disaster declaration), EM (emergency declaration), FM (fire management assistance declaration). |
| incident_type | string | — | Incident type filter (e.g., Flood, Hurricane, Tornado, Fire, Earthquake, Severe Storm). Case-insensitive substring match. |
| limit | integer | — | Maximum number of unique disaster declarations to return (1–1000, default 50). |
| offset | integer | — | Pagination offset in declarations (default 0). Use with limit to page through results. |
| state | string | — | Two-letter US state/territory code (e.g., TX, CA, FL, PR). Filters by state. |
| Name | Type | Req | Description |
|---|---|---|---|
| declarations | array | yes | Disaster declarations matching the search, one entry per unique disaster number. |
| notice | string | — | Guidance when no results were found. |
| returned_count | number | yes | Number of unique deduplicated declarations in this response. |
| totalCount | number | — | Total unique disaster declarations matching the query — the unit declaration-level pagination pages over. Exceeds returned_count when the matches span more than one page. |
| total_area_rows | number | yes | Total matching designated-area rows from the API (raw row count, not declaration count). DisasterDeclarationsSummaries returns one row per designated area per disaster, so this is always ≥ the number… |
| total_declarations | number | yes | Total unique disaster declarations matching the query, before offset/limit paging — the bound for declaration-level pagination (limit/offset apply to declarations, not area rows). A floor rather than… |
No examples provided.
fema_search_nfip Search NFIP Flood Insurance Claims ~392
Search National Flood Insurance Program (NFIP) claims data by state, county, ZIP code, and year range. Returns claim counts, amounts paid on building and contents, flood zones, and loss years. state is required — the full NFIP dataset is 2.7 million rows; unfiltered access is prohibited. When DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) and results exceed the inline preview, the full result set is staged on a canvas for SQL aggregation via fema_dataframe_query. Use fema_dataframe_describe to inspect the staged table schema before writing SQL. Without canvas, results are returned inline up to the limit.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | — | Optional canvas ID from a prior call. Omit to create a fresh canvas. The response returns the canvas_id to pass to fema_dataframe_query. |
| county_code | string | — | County code to narrow results within the state. Accepts the full 5-digit state+county FIPS (e.g., 48201 for Harris County TX) or the 3-digit county portion (e.g., 201) when state is provided — the se… |
| limit | integer | — | Maximum claim rows to return in the inline preview (1–10000, default 1000). When DataCanvas is enabled, the canvas stages the full matching result set regardless of this value. |
| state | string | yes | Two-letter US state code (required). NFIP dataset is 2.7M rows — state filter is mandatory. |
| year_from | integer | — | Start year of loss, inclusive (e.g., 2020). |
| year_to | integer | — | End year of loss, inclusive (e.g., 2023). |
| zip_code | string | — | ZIP code to narrow results to a specific area (5-digit, e.g., 77002). |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | — | Canvas ID for the staged full result set. Pass to fema_dataframe_query and fema_dataframe_describe. Present only when spilled=true. |
| canvas_table | string | — | DuckDB table name on the canvas holding all fetched rows. Reference in SQL FROM clauses. Present when spilled=true. |
| claims | array | yes | Inline preview of claim records (first N rows). Full dataset available via canvas_id when spilled=true. |
| notice | string | — | Guidance on canvas usage or result scope. |
| returned_count | number | yes | Number of claim records in the inline preview. |
| spilled | boolean | yes | True when the full result set was staged on DataCanvas; use canvas_id + fema_dataframe_query for SQL analysis. False when all results fit inline. |
| total_count | number | yes | Total matching claims in the filtered dataset before the limit. |
| truncated | boolean | — | True when the canvas row cap (50,000) was reached before the full matching set was staged — the canvas holds a partial result. Apply tighter filters (county_code, zip_code, year range) to stage the c… |
No examples provided.