Skip to main content
Glama

Server Details

Query FEMA disaster declarations, public assistance grants, housing aid, and NFIP claims.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.9% over 77 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/fema-mcp-server
GitHub Stars
1
Server Listing
fema-mcp-server

TDQS

A4.4/5.0

Scored across 8 tools

Disambiguation4/5

Most tools target clearly distinct operations: searching disasters, fetching a disaster, retrieving PA or housing assistance, searching NFIP claims, and analyzing staged data. The generic fema_query_dataset overlaps conceptually with the convenience search tools, but its description clearly positions it as an escape hatch for datasets not covered elsewhere.

Naming Consistency4/5

All tools use the fema_ prefix and snake_case, with most following a verb_noun pattern such as fema_get_disaster or fema_search_disasters. The dataframe tools use an object_action form (fema_dataframe_describe, fema_dataframe_query), which is a minor but readable deviation.

Tool Count5/5

Eight tools are well scoped for a read-only FEMA data server. Each tool covers a distinct part of the workflow: discovery, detail retrieval, assistance data, NFIP claims, generic dataset access, and staged-data analysis.

Completeness4/5

The set covers disaster search/details, public and individual assistance, NFIP claims, and a generic OpenFEMA query path, so core workflows are supported. A minor gap is the lack of a dataset catalog/list tool, forcing agents to know exact OpenFEMA entity names or rely on error feedback.

Available Tools

8 tools
fema_dataframe_describeDescribe FEMA DataCanvas TablesA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
canvas_idYesCanvas ID from the fema_search_nfip response.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
tablesNoAll tables and views available on this canvas.
canvas_idNoCanvas ID that was described — pass to fema_dataframe_query.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only and idempotent behavior. The description adds a non-obvious behavioral nuance: the returned row count depends on what was actually staged, so the agent must check 'truncated' in the fema_search_nfip response to interpret whether the data is complete. That is valuable context not present in any structured field.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The core purpose is front-loaded, the usage guidance follows immediately, and the truncation caveat is a compact but important addendum. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations declaring read-only/idempotent behavior, the description fully covers staging, the relationship to fema_dataframe_query, and the truncation caveat. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter already explains it is a Canvas ID from fema_search_nfip. The description reinforces the source of the ID in context, but adds no further format or semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb 'List' with a clear resource ('tables and column schemas on a DataCanvas') and explicitly ties the DataCanvas to fema_search_nfip. It differentiates itself from fema_dataframe_query by naming it as the follow-up query tool, so its role as a discovery/preflight step is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit directive to call before fema_dataframe_query and explains why (to learn exact table/column names and DuckDB types needed for valid SQL). Doesn't include exclusions or discuss alternatives like fema_query_dataset, but the ordering guidance is sufficient for an agent to decide when to invoke it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fema_dataframe_queryQuery FEMA DataCanvas TableA
Read-onlyIdempotent
Inspect

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. A response holds at most 100,000 characters of rows; when it holds fewer rows than the query returned, truncated and shown are set and the notice says how to page with OFFSET.

NameRequiredDescriptionDefault
queryYesSQL 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/OFFSET, under an ORDER BY, to page through additional rows, or aggregate (GROUP BY, COUNT, SUM) to summarize the full set in one query. Example: "SELECT year_of_loss, COUNT(*) AS claims, SUM(amount_paid_building) AS total_building_paid FROM df_nfip_abc123 GROUP BY year_of_loss ORDER BY year_of_loss"
canvas_idYesCanvas ID from the fema_search_nfip response (the canvas_id field).

Output Schema

NameRequiredDescription
capNoThe canvas row limit, present only when it capped the result. Absent when only the response budget cut it.
rowsNoResult rows from the query, bounded by the canvas row limit and by 100,000 characters of rows — when the truncated enrichment field is set, page the remainder with OFFSET (see the notice guidance).
errorNoPresent when the call failed. Absent on success.
shownNoNumber of rows in this truncated response — the amount to advance OFFSET by, and to lower any LIMIT by, for the next page.
noticeNoContinuation guidance when truncated — how far to advance OFFSET, and lower any LIMIT, under an ORDER BY, to page the remainder.
canvas_idNoCanvas ID that was queried — reuse for follow-up queries.
row_countNoNumber of rows in this response — fewer than the query returned when truncated is set.
truncatedNoTrue when more rows match than this response holds: the result was capped at the canvas row limit, or cut at the 100,000-character response budget.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover safety (readOnly, idempotent, not open-world); the description goes well beyond them by disclosing the SELECT-only enforcement, the 100,000-character row cap, and the truncation contract (truncated/shown flags plus an OFFSET paging notice). These are exactly the operational traits an agent needs before issuing a query.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each carrying distinct information: purpose, prerequisite, restriction, and result-limit contract. The prerequisite is front-loaded right after the purpose rather than buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, yet the description still documents the truncation signal and how to page — the one piece of response behavior that affects follow-up calls. For a two-parameter, fully-annotated tool, nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 real meaning: it explains where canvas_id comes from and why the query string must use the describe-derived table/column names, plus the LIMIT/OFFSET paging pattern tied to the truncation behavior. Much of the query guidance overlaps the schema example, keeping this below a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run a read-only SQL SELECT against a DataCanvas table staged by fema_search_nfip') and ties the table's provenance to a named sibling, so an agent can tell this apart from fema_query_dataset and the fetch tools. The scope (full NFIP claims result without re-fetching) is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit prerequisite ('Call fema_dataframe_describe first to get the exact table name and column names needed for valid SQL') and states the situation that motivates this tool over re-fetching from the API. It also names what is disallowed (DDL, DML, COPY, file-reading functions), which is genuine when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fema_get_disasterGet FEMA Disaster DetailsA
Read-only
Inspect

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_disasters to find disaster numbers. The returned disaster_number chains to fema_get_public_assistance and fema_get_housing_assistance.

NameRequiredDescriptionDefault
disaster_numberYesFEMA disaster number (e.g., 4781). Obtain from fema_search_disasters.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
stateNoTwo-letter state/territory code.
titleNoOfficial declaration title (e.g., "SEVERE STORMS AND FLOODING").
noticeNoReturned/total area counts and partial program evidence, with the dataset tool for full rows.
hm_declaredNoTrue when HM was declared in a fetched row. When areas_truncated is true, false does not exclude HM in unfetched rows.
ia_declaredNoTrue when IHP was declared in a fetched row. When areas_truncated is true, false does not exclude IHP in unfetched rows.
pa_declaredNoTrue when PA was declared in a fetched row. When areas_truncated is true, false does not exclude PA in unfetched rows.
incident_typeNoType of incident (e.g., Flood, Hurricane, Severe Storm).
areas_truncatedNoTrue when designated-area rows remain unfetched; program flags cover only fetched rows.
disaster_numberNoFEMA disaster number — use as the chain key for PA and housing assistance tools.
declaration_dateNoISO 8601 date the declaration was signed.
declaration_typeNoDeclaration type: DR (major disaster), EM (emergency), or FM (fire management).
designated_areasNoFetched counties/municipalities designated for assistance, up to 1,000 rows.
incident_end_dateNoISO 8601 end date of the incident. Absent for ongoing or unrecorded incidents.
incident_begin_dateNoISO 8601 start date of the incident. Absent when not recorded.
designated_area_countNoNumber of designated-area rows fetched for this declaration.
total_designated_area_countNoUpstream total designated-area rows, present when areas_truncated is true.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: the 1,000-row fetch cap and an explicit signal ('discloses partial area and program coverage when more rows exist') that results may be truncated and partial. It doesn't cover retry/pagination mechanics, so 4 rather than 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation and the row cap, followed by return contents and routing. Every sentence carries information, though the 4781 example and 'use fema_search_disasters' guidance partially duplicate the schema description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a single-parameter, read-only lookup. Return contents are summarized despite an output schema existing, the truncation behavior is disclosed, and the chaining relationships that an agent needs for multi-step workflows are spelled out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and there is only one parameter, so the schema already documents the disaster_number, its type, bounds, and example. The description repeats the example and provenance but adds no new syntax or format meaning. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (fetch designated-area rows for a FEMA disaster by disaster number) and names the exact unit of return (counties/municipalities plus programs, incident period, state). This is clearly distinguishable from siblings like fema_search_disasters or fema_query_dataset.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: use fema_search_disasters to obtain the disaster_number prerequisite, and the returned disaster_number chains to fema_get_public_assistance and fema_get_housing_assistance. Both the entry condition and downstream alternatives are named rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fema_get_housing_assistanceGet FEMA Housing Assistance DataA
Read-only
Inspect

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 also carry inspected damage in USD). Narrow with state, county, or zip_code; owners_count, renters_count, and offset then count the filtered records. Use type to select owners, renters, or both (default). A page holds at most 100,000 characters of records, owners and renters cut at the same row count so one offset continues both; when records remain past it, next_offset is the offset to continue from. Use disaster_number from fema_search_disasters.

NameRequiredDescriptionDefault
typeNoWhich housing assistance dataset to query: owners, renters, or both (default).both
limitNoMaximum 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 bound leaves matching records out, next_offset names the offset to continue from.
stateNoTwo-letter state code to narrow results when a disaster spans multiple states.
countyNoFilter by county name (e.g., Harris, dekalb). Case-insensitive substring match: harris also matches Harrison. OpenFEMA stores the county with its type, such as Harris (County) or Evangeline (Parish), and as the applicant reported it.
offsetNoPagination offset into each queried dataset (default 0). Pass the previous page’s next_offset to continue both.
zip_codeNoFilter 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.
disaster_numberYesFEMA disaster number. Obtain from fema_search_disasters. Numbers above 32767 match no declaration.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoZero-match guidance for supplied filters and declared programs, or paging guidance: the continuation offset and whether limit or the response budget ended the page, and each queried nonzero dataset’s total and last valid offset when past its end.
ownersNoHomeowner (HousingAssistanceOwners) records. Empty when type is "renters" or no owner data exists.
rentersNoRenter (HousingAssistanceRenters) records. Empty when type is "owners" or no renter data exists.
totalCountNoTotal owner + renter records available before the per-dataset limit — exceeds the returned count when either dataset was capped.
next_offsetNoOffset of the next page, for both datasets: offset plus the larger of the owner and renter record counts returned. Present only while records remain in a queried dataset; pass it as offset to continue.
owners_countNoTotal owner records matching the disaster and any state, county, or zip_code filter, before the per-dataset limit.
county_filterNoThe county name both datasets were filtered by, trimmed, matched as a case-insensitive substring. Absent when county was not set.
renters_countNoTotal renter records matching the disaster and any state, county, or zip_code filter, before the per-dataset limit.
zip_code_filterNoThe 5-digit ZIP code both datasets were filtered by. Absent when zip_code was not set.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real behavioral context beyond them: the 100,000-character page cap, owners and renters being cut at the same row count so a single offset continues both, and next_offset as the continuation value. Auth, rate limits, and error behavior are unaddressed, keeping this at a 4 rather than a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then filters, then pagination, so the important material comes first and every sentence carries information. It is still dense — several clauses are packed into single sentences — which costs it the top mark but not readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description covers what an agent needs: the dataset identity, the filter set, the owners/renters/both selection, pagination continuation, and the upstream dependency on fema_search_disasters. Nothing required to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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, but the description adds cross-parameter semantics the schema documents only per-field — namely that offset continues both datasets and that owners_count/renters_count reflect the filtered set. That interaction between type, limit, offset, and next_offset is genuine added meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Retrieve) and resource (Individual Assistance housing data for a disaster by disaster number), then enumerates the returned measures (registrations, IHP amounts, inspection counts). It is clearly distinguishable from siblings like fema_get_public_assistance or fema_get_disaster by naming the IA housing dataset explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete narrowing guidance (state, county, zip_code) and routes the agent to fema_search_disasters for the required disaster_number. It does not explicitly say when to prefer a sibling such as fema_query_dataset or fema_get_public_assistance, so the alternative-selection story is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fema_get_public_assistanceGet FEMA Public Assistance ProjectsA
Read-only
Inspect

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). A page holds at most 100,000 characters of projects; when projects remain past it, next_offset is the offset to continue from.

NameRequiredDescriptionDefault
limitNoMaximum 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 names the offset to continue from.
stateNoTwo-letter state code to browse all PA projects for a state.
countyNoFilter by county name (e.g., Harris, dekalb). Case-insensitive substring match: harris also matches Harrison.
offsetNoPagination offset (default 0). Pass the previous page’s next_offset to continue.
disaster_numberNoFEMA disaster number to scope results to a single declaration. Numbers above 32767 match no declaration.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoZero-match guidance for supplied filters and declared programs, or paging guidance: the continuation offset and whether limit or the response budget ended the page, or the last valid offset for a nonzero total.
projectsNoPublic assistance funded project records from offset onward, bounded by limit and by 100,000 characters of projects.
totalCountNoTotal matching projects before pagination — exceeds returned_count when results were capped at the limit.
next_offsetNoOffset of the next page: offset plus returned_count. Present only while matching projects remain past this page; pass it as offset to continue.
total_countNoTotal matching projects before pagination.
returned_countNoNumber of projects in this response.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only/open-world profile, and the description adds substantial context beyond them: the 100,000-character page cap, the existence of next_offset for continuation, and the pa_declared prerequisite. It does not discuss rate limits or auth requirements, but for a read-only public dataset tool that is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, all front-loaded with purpose first and constraints second; each sentence carries information (scoping rule, source tool, prerequisite, pagination). The return-field enumeration is the one paragraph that could be trimmed given an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not enumerate return fields, yet it does — mildly redundant. What matters is covered: mutually-inclusive-but-required scoping, the disaster-number source, the pa_declared prerequisite, and pagination continuation via next_offset.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 genuinely useful semantics: it explains that disaster_number comes from fema_search_disasters and that state is for browsing, plus the interaction between limit and the character-based page cap. It slightly over-describes the return fields, which is redundant but not harmful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Retrieve Public Assistance (PA) funded project records') and the scoping dimension (disaster or state). The framing around 'where federal recovery money was obligated' clearly distinguishes it from siblings like fema_get_housing_assistance and fema_search_nfip.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the selection rule: 'Either disaster_number or state must be provided,' then names when to use each and points to fema_search_disasters as the source of the disaster number. It also surfaces a real prerequisite — PA projects only exist when pa_declared is true on the disaster — which prevents wasted calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fema_query_datasetQuery Any OpenFEMA DatasetA
Read-only
Inspect

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 raw OData filter, select, orderby, and pagination parameters. For NfipPolicies, use propertyState (not state) for the state and reportedZipCode for the ZIP code — it has no countyCode; always include a ZIP filter to avoid timeout. The dataset name must match the exact OpenFEMA entity name (case-sensitive, e.g., NfipClaims). Names missing from the catalog return an unknown_dataset error; a listed dataset OpenFEMA does not serve through the API, or a retired version, returns dataset_not_served. A page holds at most 100,000 characters of records; when records remain past it, next_offset is the offset to continue from.

NameRequiredDescriptionDefault
limitNoMaximum 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.
filterNoOData $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 filters nested more than 100 levels deep (about 90 chained and/or comparisons) and request URLs past about 8,900 characters.
offsetNoPagination offset (default 0). Pass the previous page’s next_offset to continue.
selectNoComma-separated field names to return (e.g., "disasterNumber,state,declarationDate").
datasetYesOpenFEMA dataset entity name (case-sensitive, e.g., NfipPolicies, FemaWebDeclarationAreas, PublicAssistanceApplicants).
orderbyNoOData $orderby expression (e.g., "declarationDate desc").

Output Schema

NameRequiredDescription
rowsNoRecords from offset onward, bounded by limit and by 100,000 characters of records. Field names depend on the queried dataset.
errorNoPresent when the call failed. Absent on success.
noticeNoPaging guidance — the offset to continue from and whether limit or the response budget ended the page, filter advice when nothing matches, or the total and last valid offset when offset is at or past the end — plus OpenFEMA’s notice when the dataset version is deprecated.
datasetNoThe dataset that was queried.
totalCountNoTotal matching records before pagination — exceeds returned_count when results were capped at the limit.
next_offsetNoOffset of the next page: offset plus returned_count. Present only while matching records remain past this page; pass it as offset to continue.
total_countNoTotal matching records before pagination.
returned_countNoNumber of records in this response.

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description nevertheless adds real value beyond them: case-sensitive entity naming, the unknown_dataset and dataset_not_served error semantics, the 100,000-character page cap, and a timeout warning for NfipPolicies. It does not describe return payload shape, but with an output schema present that is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the escape-hatch framing comes first, then dataset-specific traps, then error and pagination semantics. Every sentence carries operational information, though the NfipPolicies guidance could arguably live in the sibling tool that specializes in it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the full decision surface for a generic query tool: when to reach for it, how to name the dataset, dataset-specific column traps, error outcomes, and pagination continuation. Return values are covered by the output schema, so nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 goes well beyond the schema: it flags the propertyState-vs-state naming trap, requires a ZIP filter on NfipPolicies, explains next_offset propagation, and warns about OpenFEMA's nesting and URL-length limits, none of which appear in the schema text. These are exactly the traps that cause failed invocations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (query) and resource (any OpenFEMA dataset) and frames itself as the generic escape hatch, explicitly positioning it against the convenience tools it complements. An agent can immediately tell this apart from fema_search_nfip or fema_search_disasters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear triggering condition (datasets the convenience tools do not cover) plus concrete example datasets (NfipPolicies, FemaWebDeclarationAreas) and a caveat about NfipPolicies column names and mandatory ZIP filtering. It stops short of naming the specific sibling tools an agent should prefer, so the routing is implied rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fema_search_disastersSearch FEMA Disaster DeclarationsA
Read-only
Inspect

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 designated_area_count 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. county selects the declarations that designated a matching area; their area counts and program flags still describe the whole declaration, and matched_areas lists the matching areas with their own program flags. A search reads the most recent 10,000 designated-area rows; when more match, it returns the declarations dated after the day that window ends, sets truncated, and its notice names the date_to that continues with older declarations. A page holds at most 100,000 characters of declarations; when declarations remain past it, next_offset is the offset to continue from.

NameRequiredDescriptionDefault
limitNoMaximum 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 bound leaves matching declarations out, next_offset names the offset to continue from.
stateNoTwo-letter US state/territory code (e.g., TX, CA, FL, PR). Filters by state.
countyNoFilter by designated area / county name (e.g., Harris, Los Angeles, dekalb). Case-insensitive substring match: harris also matches Harrison. Selects the declarations that designated a matching area; designated_area_count and the program flags still describe the whole declaration, and matched_areas lists the matching areas.
offsetNoPagination offset in declarations (default 0). Pass the previous page’s next_offset to continue.
date_toNoEnd 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.
date_fromNoStart of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-01-01). Inclusive; not after date_to.
incident_typeNoIncident type filter (e.g., Flood, Hurricane, Tornado, Fire, Earthquake, Severe Storm). Case-insensitive substring match: storm also matches Snowstorm and Winter Storm.
declaration_typeNoDeclaration type: DR (major disaster declaration), EM (emergency declaration), FM (fire management assistance declaration).

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoZero-match guidance for supplied filters; paging guidance with continuation or the last valid offset for nonzero totals; when truncated is true, lower-bound totals and the date_to (YYYY-MM-DD) to search next; when area_totals_unavailable is true, why full area totals could not be read.
truncatedNoTrue when more than 10,000 designated-area rows match: the search covers only the declarations dated after the day its 10,000-row window ends. Each returned declaration is complete, the totals are lower bounds, and the notice names the date_to that continues with older declarations. Absent otherwise.
totalCountNoUnique disaster declarations matching the query — the unit declaration-level pagination pages over. Exceeds returned_count when the matches span more than one page. A lower bound when truncated is true.
next_offsetNoOffset of the next page: offset plus returned_count. Present only while matching declarations remain past this page — when truncated is true, only within the declarations dated after the day the window ends. Pass it as offset to continue.
declarationsNoDisaster declarations matching the search from offset onward, one entry per unique disaster number, bounded by limit and by 100,000 characters of declarations.
returned_countNoNumber of unique deduplicated declarations in this response.
total_area_rowsNoTotal matching designated-area rows from the API (raw row count, not declaration count) — with county set, the rows of the matching areas only. DisasterDeclarationsSummaries returns one row per designated area per disaster, so this is always ≥ the number of unique declarations. When it exceeds 10,000, the search reads the most recent 10,000 rows and drops the declarations dated on the oldest day among them, so every returned declaration is complete; the notice names the date_to that continues with older declarations.
total_declarationsNoUnique disaster declarations matching the query, before offset/limit paging — the bound for declaration-level pagination (limit/offset apply to declarations, not area rows). A lower bound when truncated is true: it counts only the declarations dated after the day the 10,000-row window ends.
area_totals_unavailableNoTrue when county is set and reading the returned declarations’ full designated-area rows failed: designated_area_count and the ia/pa/hm flags then count only the areas county matched, and the notice names the cause. Absent otherwise.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover readOnlyHint and openWorldHint, but the description adds substantial behavior: results are deduplicated to one row per disaster number with designated_area_count, the scan window caps at the most recent 10,000 designated-area rows and sets truncated when exceeded, and a page holds at most 100,000 characters of declarations with next_offset for continuation. This is exactly the kind of non-obvious truncation/pagination behavior an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and sibling routing, and every clause carries operational information. The later sentences are long and dense, and the county/pagination details partly duplicate the schema text, so it is slightly over-explained rather than lean.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return shape need not be documented, and the description still covers the tricky parts an agent would otherwise get wrong: deduplication semantics, chain-key relationships, the row-window truncation with the notice naming the continuing date_to, and the character-based page cap with next_offset.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description adds real meaning by clarifying that date filters apply to the declaration date and that county matching is not the same as the declaration's full scope ('their area counts and program flags still describe the whole declaration, and matched_areas lists the matching areas'). It does repeat some county semantics already present in the schema, which keeps it from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search federal disaster declarations') plus the filterable dimensions, and distinguishes itself from siblings by naming fema_get_disaster, fema_get_public_assistance, and fema_get_housing_assistance and explaining the disaster number as the chain key. An agent can tell this is the discovery/listing tool versus the per-declaration detail tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes: 'Use fema_get_disaster to retrieve all designated-area rows for a specific declaration,' and explains when to use declaration_type (DR/EM/FM) and what county filtering does versus what the declaration-level counts mean. The condition selecting each alternative is stated rather than left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fema_search_nfipSearch NFIP Flood Insurance ClaimsA
Read-only
Inspect

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 loss first. state is required — the full NFIP dataset is 2.7 million rows; unfiltered access is prohibited. Page the inline claims with limit and offset; a page holds at most 100,000 characters of claims, and while claims remain past it, next_offset is the offset to continue from. When DataCanvas is enabled and the match exceeds that inline budget, a call at offset 0 stages the match (up to 50,000 claims) on a canvas: inspect the staged table with fema_dataframe_describe, then aggregate it with SQL via fema_dataframe_query.

NameRequiredDescriptionDefault
limitNoMaximum 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 offset to continue from. When DataCanvas is enabled and the match exceeds that character budget, a call at offset 0 stages the match on a canvas regardless of this value.
stateYesTwo-letter US state code (required). NFIP dataset is 2.7M rows — state filter is mandatory.
offsetNoPagination 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 later offset returns just its inline page. After a spill (spilled=true), read rows past the inline claims from the canvas table with fema_dataframe_query.
year_toNoEnd year of loss, inclusive (e.g., 2023). Equal to year_from for a single year.
zip_codeNoZIP code to narrow results to a specific area (5-digit, e.g., 77002).
canvas_idNoOptional 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 fema_dataframe_describe for the table columns, then to fema_dataframe_query for SQL.
year_fromNoStart year of loss, inclusive (e.g., 2020). Not after year_to.
county_codeNoCounty 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 state FIPS. A shorter county part is zero-padded to 3 digits (1 → 001), and a 4-digit code is zero-padded to 5 (1001 → 01001), the form a numeric 01001 arrives in. Any other value is rejected before the search runs.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
claimsNoClaims from offset onward, newest date of loss first, bounded by limit and 100,000 characters of claims. When spilled=true, canvas_table holds the staged match.
noticeNoZero-match, paging, and canvas guidance, composed with county-coverage disclosure: a state/year count of claims without county codes when already available, or an unchecked-coverage notice; this count does not identify any county or ZIP.
spilledNoTrue when the match exceeded the inline budget and was staged on DataCanvas: call fema_dataframe_describe, then fema_dataframe_query, with canvas_id. False when nothing was staged.
canvas_idNoCanvas ID for the staged match. Pass to fema_dataframe_describe and fema_dataframe_query. Present only when spilled=true.
truncatedNoTrue when the 50,000-row canvas cap was reached: canvas_table holds staged_count of the total_count matching claims. Apply tighter filters (county_code, zip_code, year range) to stage the complete set.
next_offsetNoOffset of the next inline page: offset plus returned_count. Present only while matching claims remain past this page, after a spill too; pass it as offset to continue.
total_countNoClaims matching the filters, as counted by OpenFEMA — before offset, limit, and the canvas row cap.
canvas_tableNoDuckDB table on the canvas holding the staged claims. List its columns with fema_dataframe_describe, then reference it in fema_dataframe_query FROM clauses. Present only when spilled=true.
staged_countNoClaims staged on canvas_table: the whole match, or its first 50,000 when truncated=true. Present only when spilled=true.
returned_countNoNumber of claim records in claims.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld annotations: discloses result ordering (newest loss first), the 100,000-character page budget (~330 rows), the 50,000-claim staging cap, that only offset 0 stages a match, and that later offsets return only their inline page. These are non-obvious behaviors an agent could not infer from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Information is front-loaded (what it does, then the mandatory state constraint, then paging, then the canvas escalation path). It is dense and sentence-long with heavy em-dash use, but nearly every clause carries distinct operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the high-complexity cases an 8-parameter search tool needs: mandatory filter, ordering, pagination overflow, and the DataCanvas escalation path with its sibling tools. An agent can invoke it correctly on the first try without reading the schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the schema carries most parameter documentation. The description still adds decision-relevant meaning: it ties limit/offset to the character budget and next_offset continuation, and explains the canvas_id staging semantics in workflow terms rather than field-definition terms.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search), a specific dataset (NFIP flood insurance claims), and the exact filter dimensions and returned fields. It is clearly distinguishable from the generic fema_query_dataset and from the disaster/housing-assistance siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states state is required and why (2.7M rows, unfiltered access prohibited), explains how to page inline results with limit/offset and next_offset, and names the follow-on tools (fema_dataframe_describe, fema_dataframe_query) for the DataCanvas-staged path. When-to-use conditions for both the inline and the canvas route are spelled out.

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.

  1. 5 tool updates
    • Changedfema_get_disaster8 fields changed
      • addedOutput schema / properties / areas_truncated
        Added value: +{
        +  "description": "True when designated-area rows remain unfetched; program flags cover only fetched rows.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / designated_area_count / description
        Previous value: -"Total number of designated areas in this declaration."New value: +"Number of designated-area rows fetched for this declaration."
      • changedOutput schema / properties / designated_areas / description
        Previous value: -"All counties/municipalities designated for assistance under this declaration."New value: +"Fetched counties/municipalities designated for assistance, up to 1,000 rows."
      • changedOutput schema / properties / hm_declared / description
        Previous value: -"True when Hazard Mitigation grants were declared."New value: +"True when HM was declared in a fetched row. When areas_truncated is true, false does not exclude HM in unfetched rows."
      • changedOutput schema / properties / ia_declared / description
        Previous value: -"True when the Individuals and Households Program (IHP) was declared — indicates IA housing/personal grants are available."New value: +"True when IHP was declared in a fetched row. When areas_truncated is true, false does not exclude IHP in unfetched rows."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Returned/total area counts and partial program evidence, with the dataset tool for full rows.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / pa_declared / description
        Previous value: -"True when Public Assistance (infrastructure recovery grants) was declared."New value: +"True when PA was declared in a fetched row. When areas_truncated is true, false does not exclude PA in unfetched rows."
      • addedOutput schema / properties / total_designated_area_count
        Added value: +{
        +  "description": "Upstream total designated-area rows, present when areas_truncated is true.",
        +  "type": "number"
        +}
    • Changedfema_get_housing_assistance3 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `not_found`: The disaster number is above 32767, the highest number OpenFEMA holds, so no declaration exists. `no_results`: No IA housing records found for this disaster and any state, county, or zip_code filter. `request_too_long`: The county value makes the request URL longer than the roughly 8,900 characters OpenFEMA accepts. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `not_found`: The disaster number is above 32767, the highest number OpenFEMA holds, so no declaration exists. `request_too_long`: The county value makes the request URL longer than the roughly 8,900 characters OpenFEMA accepts. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_state",
        -  "not_found",
        -  "no_results",
        -  "request_too_long"
        -]New value: +[
        +  "invalid_state",
        +  "not_found",
        +  "request_too_long"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Paging guidance: the offset to continue from and whether limit or the response budget ended the page, and, for a queried dataset whose end the offset is at or past, its total and last valid offset."New value: +"Zero-match guidance for supplied filters and declared programs, or paging guidance: the continuation offset and whether limit or the response budget ended the page, and each queried nonzero dataset’s total and last valid offset when past its end."
    • Changedfema_get_public_assistance3 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `missing_filter`: Neither disaster_number nor state was provided. `not_found`: The disaster number is above 32767, the highest number OpenFEMA holds, so no declaration exists. `no_results`: No PA project records found for the given filters. `request_too_long`: The county value makes the request URL longer than the roughly 8,900 characters OpenFEMA accepts. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `missing_filter`: Neither disaster_number nor state was provided. `not_found`: The disaster number is above 32767, the highest number OpenFEMA holds, so no declaration exists. `request_too_long`: The county value makes the request URL longer than the roughly 8,900 characters OpenFEMA accepts. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_state",
        -  "missing_filter",
        -  "not_found",
        -  "no_results",
        -  "request_too_long"
        -]New value: +[
        +  "invalid_state",
        +  "missing_filter",
        +  "not_found",
        +  "request_too_long"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Paging guidance: the offset to continue from and whether limit or the response budget ended the page, or, when offset is at or past the end, the total and the last valid offset."New value: +"Zero-match guidance for supplied filters and declared programs, or paging guidance: the continuation offset and whether limit or the response budget ended the page, or the last valid offset for a nonzero total."
    • Changedfema_search_disasters3 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `invalid_range`: date_from is later than date_to, so no declaration could match. `no_results`: Query returned zero disaster declarations. `request_too_long`: The incident_type or county value makes the request URL longer than the roughly 8,900 characters OpenFEMA accepts. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `invalid_range`: date_from is later than date_to, so no declaration could match. `request_too_long`: The incident_type or county value makes the request URL longer than the roughly 8,900 characters OpenFEMA accepts. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_state",
        -  "invalid_range",
        -  "no_results",
        -  "request_too_long"
        -]New value: +[
        +  "invalid_state",
        +  "invalid_range",
        +  "request_too_long"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Paging guidance: the offset to continue from and whether limit or the response budget ended the page; when offset is at or past the end of the matching declarations, the total and the last valid offset; when truncated is true, that the totals are lower bounds and the date_to (YYYY-MM-DD) to search next for older declarations; when area_totals_unavailable is true, why the area totals could not be read."New value: +"Zero-match guidance for supplied filters; paging guidance with continuation or the last valid offset for nonzero totals; when truncated is true, lower-bound totals and the date_to (YYYY-MM-DD) to search next; when area_totals_unavailable is true, why full area totals could not be read."
    • Changedfema_search_nfip3 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `invalid_county_code`: county_code is not 1–5 digits, or is a 1–3-digit county part for a state with no FIPS code (FM, MH, PW). `invalid_range`: year_from is later than year_to, so no claim could match. `no_results`: Query returned zero matching NFIP claims. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `invalid_county_code`: county_code is not 1–5 digits, or is a 1–3-digit county part for a state with no FIPS code (FM, MH, PW). `invalid_range`: year_from is later than year_to, so no claim could match. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_state",
        -  "invalid_county_code",
        -  "invalid_range",
        -  "no_results"
        -]New value: +[
        +  "invalid_state",
        +  "invalid_county_code",
        +  "invalid_range"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Paging and canvas guidance: the offset to continue from when claims were left out, the last valid offset when offset is past the end, or the canvas table and dataframe tools after a spill."New value: +"Zero-match, paging, and canvas guidance, composed with county-coverage disclosure: a state/year count of claims without county codes when already available, or an unchecked-coverage notice; this count does not identify any county or ZIP."
  2. 6 tool updates
    • Changedfema_dataframe_query9 fields changed
      • changedInput schema / properties / query / description
        Previous value: -"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, or aggregate (GROUP BY, COUNT, SUM) to summarize the full set in one query. Example: \"SELECT year_of_loss, COUNT(*) AS claims, SUM(amount_paid_building) AS total_building_paid FROM df_nfip_abc123 GROUP BY year_of_loss ORDER BY year_of_loss\""New value: +"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/OFFSET, under an ORDER BY, to page through additional rows, or aggregate (GROUP BY, COUNT, SUM) to summarize the full set in one query. Example: \"SELECT year_of_loss, COUNT(*) AS claims, SUM(amount_paid_building) AS total_building_paid FROM df_nfip_abc123 GROUP BY year_of_loss ORDER BY year_of_loss\""
      • changedOutput schema / properties / cap / description
        Previous value: -"The canvas row limit that was applied when the result was capped."New value: +"The canvas row limit, present only when it capped the result. Absent when only the response budget cut it."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `sql_execution_error`: A SELECT fails while converting or calculating values in the staged data. `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `canvas_unavailable`: DataCanvas is disabled on this deployment (CANVAS_PROVIDER_TYPE is not set to duckdb). `invalid_query`: The SQL statement is not a valid SELECT, references a non-existent table or column, or uses blocked operations. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: DataCanvas is disabled on this deployment (CANVAS_PROVIDER_TYPE is not set to duckdb). `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `missing_table`: The SELECT names a table that is not staged on this canvas — misspelled, dropped, or expired. `invalid_sql`: A SELECT fails to prepare — an unknown column, function, or type, or an invalid expression. `non_select_statement`: The statement is not a SELECT (DDL, DML, PRAGMA, EXPLAIN, ATTACH) or cannot be parsed. `multi_statement`: The query holds more than one SQL statement. `denied_function`: The SELECT calls a blocked function — a file reader, an engine-setting reader, or query()/query_table() over anything but one literal SELECT. `plan_operator_not_allowed`: The query plan uses an operator outside the read-only allowlist, such as a table function like range() or a system catalog like information_schema. `sql_read_only`: The statement writes or names a file, such as COPY … TO or a quoted file path in FROM. `sql_execution_error`: A SELECT fails while converting or calculating values in the staged data. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "sql_execution_error",
        -  "canvas_not_found",
        -  "canvas_unavailable",
        -  "invalid_query"
        -]New value: +[
        +  "canvas_unavailable",
        +  "canvas_not_found",
        +  "missing_table",
        +  "invalid_sql",
        +  "non_select_statement",
        +  "multi_statement",
        +  "denied_function",
        +  "plan_operator_not_allowed",
        +  "sql_read_only",
        +  "sql_execution_error"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Continuation guidance when capped — how to page the remainder with LIMIT/OFFSET."New value: +"Continuation guidance when truncated — how far to advance OFFSET, and lower any LIMIT, under an ORDER BY, to page the remainder."
      • changedOutput schema / properties / row_count / description
        Previous value: -"Number of rows in this response (may be capped at the canvas row limit)."New value: +"Number of rows in this response — fewer than the query returned when truncated is set."
      • changedOutput schema / properties / rows / description
        Previous value: -"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)."New value: +"Result rows from the query, bounded by the canvas row limit and by 100,000 characters of rows — when the truncated enrichment field is set, page the remainder with OFFSET (see the notice guidance)."
      • changedOutput schema / properties / shown / description
        Previous value: -"Number of rows returned in this (capped) response."New value: +"Number of rows in this truncated response — the amount to advance OFFSET by, and to lower any LIMIT by, for the next page."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the result was capped at the canvas row limit — more rows match than were returned."New value: +"True when more rows match than this response holds: the result was capped at the canvas row limit, or cut at the 100,000-character response budget."
    • Changedfema_get_housing_assistance24 fields changed
      • addedInput schema / properties / county
        Added value: +{
        +  "description": "Filter by county name (e.g., Harris, dekalb). Case-insensitive substring match: harris also matches Harrison. OpenFEMA stores the county with its type, such as Harris (County) or Evangeline (Parish), and as the applicant reported it.",
        +  "type": "string"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum records per dataset to return (default 100)."New value: +"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 bound leaves matching records out, next_offset names the offset to continue from."
      • changedInput schema / properties / limit / maximum
        Previous value: -1000New value: +10000
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default 0)."New value: +"Pagination offset into each queried dataset (default 0). Pass the previous page’s next_offset to continue both."
      • addedInput schema / properties / zip_code
        Added value: +{
        +  "anyOf": [
        +    {
        +      "const": "",
        +      "type": "string"
        +    },
        +    {
        +      "description": "5-digit ZIP code.",
        +      "pattern": "^\\d{5}$",
        +      "type": "string"
        +    }
        +  ],
        +  "description": "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."
        +}
      • addedOutput schema / properties / county_filter
        Added value: +{
        +  "description": "The county name both datasets were filtered by, trimmed, matched as a case-insensitive substring. Absent when county was not set.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `not_found`: The disaster number is above 32767, the highest number OpenFEMA holds, so no declaration exists. `no_results`: No IA housing records found for this disaster. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `not_found`: The disaster number is above 32767, the highest number OpenFEMA holds, so no declaration exists. `no_results`: No IA housing records found for this disaster and any state, county, or zip_code filter. `request_too_long`: The county value makes the request URL longer than the roughly 8,900 characters OpenFEMA accepts. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_state",
        -  "not_found",
        -  "no_results"
        -]New value: +[
        +  "invalid_state",
        +  "not_found",
        +  "no_results",
        +  "request_too_long"
        +]
      • addedOutput schema / properties / next_offset
        Added value: +{
        +  "description": "Offset of the next page, for both datasets: offset plus the larger of the owner and renter record counts returned. Present only while records remain in a queried dataset; pass it as offset to continue.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Paging guidance when offset is at or past the end of a queried dataset — names its total and last valid offset."New value: +"Paging guidance: the offset to continue from and whether limit or the response budget ended the page, and, for a queried dataset whose end the offset is at or past, its total and last valid offset."
      • addedOutput schema / properties / owners / items / properties / average_fema_inspected_damage
        Added value: +{
        +  "description": "Average damage in USD, under FEMA's inspection guidelines, of the homeowners with a completed inspection; 0 when no damage was recorded or no one was inspected (see total_inspected). Measured separately from total_damage, so it is not total_damage divided by a count. Absent when not reported.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / owners / items / properties / no_fema_inspected_damage
        Added value: +{
        +  "description": "Number of inspected homeowner applicants whose inspector recorded no damage; 0 when there were none. Absent when not reported.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / owners / items / properties / total_damage
        Added value: +{
        +  "description": "Total damage in USD recorded at the latest inspections: FEMA Verified Loss for real property (the home) and personal property, excluding transportation; 0 when none was recorded or no one was inspected (see total_inspected). Absent when not reported.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / owners / items / properties / total_inspected
        Added value: +{
        +  "description": "Number of homeowner applicants who received a FEMA inspection. 0 means no one in this area was inspected, so a 0 in average_fema_inspected_damage or total_damage then means not inspected, not $0 of damage. Absent when not reported.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / owners_count / description
        Previous value: -"Total owner records available before the per-dataset limit."New value: +"Total owner records matching the disaster and any state, county, or zip_code filter, before the per-dataset limit."
      • changedOutput schema / properties / renters / items / description
        Previous value: -"Renter housing assistance aggregated by county and ZIP for one disaster."New value: +"Renter housing assistance aggregated by county and ZIP for one disaster. Renter records carry no dollar damage figures."
      • addedOutput schema / properties / renters / items / properties / repair_replace_amount
        Added value: +{
        +  "description": "Home repair and replacement assistance in USD as OpenFEMA records it for renters; 0 when none was approved, as in nearly every renter area, since FEMA's data dictionary notes renters are not eligible for it. Absent when not reported.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / renters / items / properties / total_inspected
        Added value: +{
        +  "description": "Number of renter applicants who received a FEMA inspection; 0 when none did. Absent when not reported.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / renters / items / properties / total_inspected_with_no_damage
        Added value: +{
        +  "description": "Number of valid renter registrations assigned no damage. Renters get a damage degree rather than a full home inspection, so this and the other degree counts count registrations and can exceed total_inspected; 0 when there were none. Absent when not reported.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / renters / items / properties / total_with_major_damage
        Added value: +{
        +  "description": "Number of valid renter registrations assigned a major degree of damage, counted like total_inspected_with_no_damage; 0 when there were none. Absent when not reported.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / renters / items / properties / total_with_moderate_damage
        Added value: +{
        +  "description": "Number of valid renter registrations assigned a moderate degree of damage, counted like total_inspected_with_no_damage; 0 when there were none. Absent when not reported.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / renters / items / properties / total_with_substantial_damage
        Added value: +{
        +  "description": "Number of valid renter registrations assigned a substantial degree of damage, counted like total_inspected_with_no_damage; 0 when there were none. Absent when not reported.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / renters_count / description
        Previous value: -"Total renter records available before the per-dataset limit."New value: +"Total renter records matching the disaster and any state, county, or zip_code filter, before the per-dataset limit."
      • addedOutput schema / properties / zip_code_filter
        Added value: +{
        +  "description": "The 5-digit ZIP code both datasets were filtered by. Absent when zip_code was not set.",
        +  "type": "string"
        +}
    • Changedfema_get_public_assistance13 fields changed
      • changedInput schema / properties / county / description
        Previous value: -"Filter by county name substring."New value: +"Filter by county name (e.g., Harris, dekalb). Case-insensitive substring match: harris also matches Harrison."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of projects to return (1–1000, default 100)."New value: +"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 names the offset to continue from."
      • changedInput schema / properties / limit / maximum
        Previous value: -1000New value: +10000
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default 0)."New value: +"Pagination offset (default 0). Pass the previous page’s next_offset to continue."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `missing_filter`: Neither disaster_number nor state was provided. `not_found`: The disaster number is above 32767, the highest number OpenFEMA holds, so no declaration exists. `no_results`: No PA project records found for the given filters. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `missing_filter`: Neither disaster_number nor state was provided. `not_found`: The disaster number is above 32767, the highest number OpenFEMA holds, so no declaration exists. `no_results`: No PA project records found for the given filters. `request_too_long`: The county value makes the request URL longer than the roughly 8,900 characters OpenFEMA accepts. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_state",
        -  "missing_filter",
        -  "not_found",
        -  "no_results"
        -]New value: +[
        +  "invalid_state",
        +  "missing_filter",
        +  "not_found",
        +  "no_results",
        +  "request_too_long"
        +]
      • addedOutput schema / properties / next_offset
        Added value: +{
        +  "description": "Offset of the next page: offset plus returned_count. Present only while matching projects remain past this page; pass it as offset to continue.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Paging guidance when offset is at or past the end of the matching projects — names the total and the last valid offset."New value: +"Paging guidance: the offset to continue from and whether limit or the response budget ended the page, or, when offset is at or past the end, the total and the last valid offset."
      • changedOutput schema / properties / projects / description
        Previous value: -"Public assistance funded project records."New value: +"Public assistance funded project records from offset onward, bounded by limit and by 100,000 characters of projects."
      • changedOutput schema / properties / projects / items / properties / project_amount / description
        Previous value: -"Total estimated project cost in USD. Absent when not yet determined."New value: +"Estimated total eligible cost of the project in USD from FEMA's damage survey, without administrative costs. Absent when not yet determined."
      • changedOutput schema / properties / projects / items / properties / project_size / description
        Previous value: -"Project size classification: \"small\" (≤$1M) or \"large\" (>$1M). Absent when unclassified."New value: +"Large or Small, set by comparing the eligible amount from the damage survey with the large-project threshold FEMA sets for each fiscal year. Absent when unclassified."
      • changedOutput schema / properties / projects / items / properties / project_status / description
        Previous value: -"Current project status (e.g., Obligated, Closed, In Progress). Absent when not set."New value: +"Eligibility status of the project: Eligible (nearly all projects), Pending Eligibility Review, Ineligible, or Withdrawn. Absent when not set."
      • changedOutput schema / properties / projects / items / properties / total_obligated / description
        Previous value: -"Total obligated amount across all funding sources in USD; 0 when nothing is obligated."New value: +"Federal share of the eligible project amount plus State (recipient) and applicant (subrecipient) administrative costs, in USD; equals federal_share_obligated when no administrative costs are recorded. Holds no non-federal share. 0 when nothing is obligated."
    • Changedfema_query_dataset8 fields changed
      • changedInput schema / properties / filter / description
        Previous value: -"OData $filter expression (e.g., \"state eq 'TX' and declarationDate ge '2024-01-01T00:00:00.000Z'\"). String values in single quotes."New value: +"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 filters nested more than 100 levels deep (about 90 chained and/or comparisons) and request URLs past about 8,900 characters."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum records to return (1–10000, default 100)."New value: +"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."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default 0)."New value: +"Pagination offset (default 0). Pass the previous page’s next_offset to continue."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `unknown_dataset`: The dataset name is not in the OpenFEMA dataset catalog. `dataset_not_served`: The OpenFEMA dataset catalog lists the dataset, but OpenFEMA answers its API endpoint with a 404 page. `catalog_unavailable`: The OpenFEMA dataset catalog could not be read, so the dataset API version is unknown. `invalid_filter`: OpenFEMA rejected the filter expression — an unknown field, a value of the wrong type or range, or unparseable syntax. `invalid_select`: OpenFEMA rejected the select list — an unknown field or unparseable syntax. `invalid_orderby`: OpenFEMA rejected the orderby expression — an unknown field or unparseable syntax. `invalid_odata_syntax`: OpenFEMA could not parse the request and did not say whether filter, select, or orderby was at fault. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_dataset`: The dataset name is not in the OpenFEMA dataset catalog. `dataset_not_served`: The OpenFEMA dataset catalog lists the dataset, but OpenFEMA answers its API endpoint with a 404 page, or the version is past its deprecation date and returns no records. `catalog_unavailable`: The OpenFEMA dataset catalog could not be read, so the dataset API version is unknown. `invalid_filter`: OpenFEMA rejected the filter expression — an unknown field, a value of the wrong type or range, or unparseable syntax. `invalid_select`: OpenFEMA rejected the select list — an unknown field or unparseable syntax. `invalid_orderby`: OpenFEMA rejected the orderby expression — an unknown field or unparseable syntax. `invalid_odata_syntax`: OpenFEMA could not parse the request and did not say whether filter, select, or orderby was at fault. `request_too_long`: The request URL, mostly the filter after percent-encoding, is longer than the roughly 8,900 characters OpenFEMA accepts. `filter_too_complex`: The filter nests more than 100 levels deep, the most OpenFEMA allows; every and/or adds a level. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "unknown_dataset",
        -  "dataset_not_served",
        -  "catalog_unavailable",
        -  "invalid_filter",
        -  "invalid_select",
        -  "invalid_orderby",
        -  "invalid_odata_syntax"
        -]New value: +[
        +  "unknown_dataset",
        +  "dataset_not_served",
        +  "catalog_unavailable",
        +  "invalid_filter",
        +  "invalid_select",
        +  "invalid_orderby",
        +  "invalid_odata_syntax",
        +  "request_too_long",
        +  "filter_too_complex"
        +]
      • addedOutput schema / properties / next_offset
        Added value: +{
        +  "description": "Offset of the next page: offset plus returned_count. Present only while matching records remain past this page; pass it as offset to continue.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance on an empty page — filter advice when nothing matches, or the total and last valid offset when offset is at or past the end."New value: +"Paging guidance — the offset to continue from and whether limit or the response budget ended the page, filter advice when nothing matches, or the total and last valid offset when offset is at or past the end — plus OpenFEMA’s notice when the dataset version is deprecated."
      • changedOutput schema / properties / rows / description
        Previous value: -"Records returned from the dataset. Field names depend on the queried dataset."New value: +"Records from offset onward, bounded by limit and by 100,000 characters of records. Field names depend on the queried dataset."
    • Changedfema_search_disasters18 fields changed
      • changedInput schema / properties / county / description
        Previous value: -"Filter by designated area / county name substring (e.g., Harris, Los Angeles). Case-insensitive."New value: +"Filter by designated area / county name (e.g., Harris, Los Angeles, dekalb). Case-insensitive substring match: harris also matches Harrison. Selects the declarations that designated a matching area; designated_area_count and the program flags still describe the whole declaration, and matched_areas lists the matching areas."
      • changedInput schema / properties / date_from / description
        Previous value: -"Start of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-01-01). Inclusive."New value: +"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."
      • changedInput schema / properties / date_to / description
        Previous value: -"End of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-12-31). Inclusive."New value: +"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."
      • changedInput schema / properties / incident_type / description
        Previous value: -"Incident type filter (e.g., Flood, Hurricane, Tornado, Fire, Earthquake, Severe Storm). Case-insensitive substring match."New value: +"Incident type filter (e.g., Flood, Hurricane, Tornado, Fire, Earthquake, Severe Storm). Case-insensitive substring match: storm also matches Snowstorm and Winter Storm."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of unique disaster declarations to return (1–1000, default 50)."New value: +"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 bound leaves matching declarations out, next_offset names the offset to continue from."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset in declarations (default 0). Use with limit to page through results."New value: +"Pagination offset in declarations (default 0). Pass the previous page’s next_offset to continue."
      • addedOutput schema / properties / area_totals_unavailable
        Added value: +{
        +  "description": "True when county is set and reading the returned declarations’ full designated-area rows failed: designated_area_count and the ia/pa/hm flags then count only the areas county matched, and the notice names the cause. Absent otherwise.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / declarations / description
        Previous value: -"Disaster declarations matching the search, one entry per unique disaster number."New value: +"Disaster declarations matching the search from offset onward, one entry per unique disaster number, bounded by limit and by 100,000 characters of declarations."
      • changedOutput schema / properties / declarations / items / properties / designated_area_count / description
        Previous value: -"Number of counties/municipalities designated — use fema_get_disaster for the full area list."New value: +"Number of counties/municipalities the whole declaration designated, also when county is set — use fema_get_disaster for the full area list."
      • changedOutput schema / properties / declarations / items / properties / hm_declared / description
        Previous value: -"True when Hazard Mitigation grants were declared."New value: +"True when Hazard Mitigation grants were declared for any area of the declaration, also when county is set."
      • changedOutput schema / properties / declarations / items / properties / ia_declared / description
        Previous value: -"True when the Individuals and Households Program (IHP) was declared — indicates IA housing/personal grants are available."New value: +"True when the Individuals and Households Program (IHP) was declared for any area of the declaration — indicates IA housing/personal grants are available. Describes the whole declaration also when county is set; matched_areas carries each matched area’s own flag."
      • addedOutput schema / properties / declarations / items / properties / matched_areas
        Added value: +{
        +  "description": "The designated areas of this declaration that county matched, each with the programs declared for that area — which can differ from the declaration: an area designated for PA and HM only has ia_declared false. Present only when county is set.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One designated area that county matched, with its own program flags.",
        +    "properties": {
        +      "area": {
        +        "description": "Name of the designated area, as stored (e.g., \"Bexar (County)\").",
        +        "type": "string"
        +      },
        +      "fips_county_code": {
        +        "description": "3-digit county FIPS code. Absent when not recorded.",
        +        "type": "string"
        +      },
        +      "fips_state_code": {
        +        "description": "2-digit state FIPS code. Absent when not recorded.",
        +        "type": "string"
        +      },
        +      "hm_declared": {
        +        "description": "True when Hazard Mitigation was declared for this area.",
        +        "type": "boolean"
        +      },
        +      "ia_declared": {
        +        "description": "True when IHP was declared for this area.",
        +        "type": "boolean"
        +      },
        +      "pa_declared": {
        +        "description": "True when Public Assistance was declared for this area.",
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "area",
        +      "ia_declared",
        +      "pa_declared",
        +      "hm_declared"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / declarations / items / properties / pa_declared / description
        Previous value: -"True when Public Assistance (infrastructure recovery grants) was declared."New value: +"True when Public Assistance (infrastructure recovery grants) was declared for any area of the declaration, also when county is set."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `no_results`: Query returned zero disaster declarations. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `invalid_range`: date_from is later than date_to, so no declaration could match. `no_results`: Query returned zero disaster declarations. `request_too_long`: The incident_type or county value makes the request URL longer than the roughly 8,900 characters OpenFEMA accepts. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_state",
        -  "no_results"
        -]New value: +[
        +  "invalid_state",
        +  "invalid_range",
        +  "no_results",
        +  "request_too_long"
        +]
      • addedOutput schema / properties / next_offset
        Added value: +{
        +  "description": "Offset of the next page: offset plus returned_count. Present only while matching declarations remain past this page — when truncated is true, only within the declarations dated after the day the window ends. Pass it as offset to continue.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Paging guidance: when offset is at or past the end of the matching declarations, the total and the last valid offset; when truncated is true, that the totals are lower bounds and the date_to (YYYY-MM-DD) to search next for older declarations."New value: +"Paging guidance: the offset to continue from and whether limit or the response budget ended the page; when offset is at or past the end of the matching declarations, the total and the last valid offset; when truncated is true, that the totals are lower bounds and the date_to (YYYY-MM-DD) to search next for older declarations; when area_totals_unavailable is true, why the area totals could not be read."
      • changedOutput schema / properties / total_area_rows / description
        Previous value: -"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 of unique declarations. When it exceeds 10,000, the search reads the most recent 10,000 rows and drops the declarations dated on the oldest day among them, so every returned declaration is complete; the notice names the date_to that continues with older declarations."New value: +"Total matching designated-area rows from the API (raw row count, not declaration count) — with county set, the rows of the matching areas only. DisasterDeclarationsSummaries returns one row per designated area per disaster, so this is always ≥ the number of unique declarations. When it exceeds 10,000, the search reads the most recent 10,000 rows and drops the declarations dated on the oldest day among them, so every returned declaration is complete; the notice names the date_to that continues with older declarations."
    • Changedfema_search_nfip8 fields changed
      • changedInput schema / properties / county_code / description
        Previous value: -"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 server prepends the state FIPS automatically."New value: +"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 state FIPS. A shorter county part is zero-padded to 3 digits (1 → 001), and a 4-digit code is zero-padded to 5 (1001 → 01001), the form a numeric 01001 arrives in. Any other value is rejected before the search runs."
      • changedInput schema / properties / limit / description
        Previous value: -"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, the notice names the offset to continue from. When DataCanvas is enabled and the match exceeds that character budget, a call at offset 0 stages the match on a canvas regardless of this value."New value: +"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 offset to continue from. When DataCanvas is enabled and the match exceeds that character budget, a call at offset 0 stages the match on a canvas regardless of this value."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset into the matching claims, ordered newest date of loss first (default 0). Use with limit to page through a match. Only a call at offset 0 stages a match on a canvas; a later offset returns just its inline page. After a spill (spilled=true), read rows past the inline claims from the canvas table with fema_dataframe_query."New value: +"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 later offset returns just its inline page. After a spill (spilled=true), read rows past the inline claims from the canvas table with fema_dataframe_query."
      • changedInput schema / properties / year_from / description
        Previous value: -"Start year of loss, inclusive (e.g., 2020)."New value: +"Start year of loss, inclusive (e.g., 2020). Not after year_to."
      • changedInput schema / properties / year_to / description
        Previous value: -"End year of loss, inclusive (e.g., 2023)."New value: +"End year of loss, inclusive (e.g., 2023). Equal to year_from for a single year."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `no_results`: Query returned zero matching NFIP claims. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `invalid_county_code`: county_code is not 1–5 digits, or is a 1–3-digit county part for a state with no FIPS code (FM, MH, PW). `invalid_range`: year_from is later than year_to, so no claim could match. `no_results`: Query returned zero matching NFIP claims. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_state",
        -  "no_results"
        -]New value: +[
        +  "invalid_state",
        +  "invalid_county_code",
        +  "invalid_range",
        +  "no_results"
        +]
      • addedOutput schema / properties / next_offset
        Added value: +{
        +  "description": "Offset of the next inline page: offset plus returned_count. Present only while matching claims remain past this page, after a spill too; pass it as offset to continue.",
        +  "type": "number"
        +}
  3. 5 tool updates
    • Changedfema_get_housing_assistance13 fields changed
      • changedOutput schema / properties / owners / items / properties / approved_for_fema_assistance / description
        Previous value: -"Number of homeowner registrations approved for any FEMA assistance. Absent when zero or not reported."New value: +"Number of homeowner registrations approved for any FEMA assistance; 0 when none were. Absent when not reported."
      • changedOutput schema / properties / owners / items / properties / other_needs_amount / description
        Previous value: -"Other needs assistance (personal property, transportation, etc.) in USD. Absent when zero or not reported."New value: +"Other needs assistance (personal property, transportation, etc.) in USD; 0 when none was approved. Absent when not reported."
      • changedOutput schema / properties / owners / items / properties / rental_amount / description
        Previous value: -"Rental assistance granted in USD. Absent when zero or not reported."New value: +"Rental assistance granted in USD; 0 when none was. Absent when not reported."
      • changedOutput schema / properties / owners / items / properties / repair_replace_amount / description
        Previous value: -"Home repair and replacement assistance in USD. Absent when zero or not reported."New value: +"Home repair and replacement assistance in USD; 0 when none was approved. Absent when not reported."
      • changedOutput schema / properties / owners / items / properties / total_approved_ihp_amount / description
        Previous value: -"Total Individuals and Households Program (IHP) assistance approved in USD. Absent when zero or not reported."New value: +"Total Individuals and Households Program (IHP) assistance approved in USD; 0 when none was. Absent when not reported."
      • changedOutput schema / properties / owners / items / properties / valid_registrations / description
        Previous value: -"Number of valid IA registrations from homeowners in this area. Absent when zero or not reported."New value: +"Number of valid IA registrations from homeowners in this area. Absent when not reported."
      • changedOutput schema / properties / owners / items / properties / zip_code / description
        Previous value: -"5-digit ZIP code. Absent when not recorded."New value: +"5-digit ZIP code; 00000 when OpenFEMA files the records under no ZIP code. Absent when not recorded."
      • changedOutput schema / properties / renters / items / properties / approved_for_fema_assistance / description
        Previous value: -"Number of renter registrations approved for any FEMA assistance. Absent when zero or not reported."New value: +"Number of renter registrations approved for any FEMA assistance; 0 when none were. Absent when not reported."
      • changedOutput schema / properties / renters / items / properties / other_needs_amount / description
        Previous value: -"Other needs assistance in USD. Absent when zero or not reported."New value: +"Other needs assistance in USD; 0 when none was approved. Absent when not reported."
      • changedOutput schema / properties / renters / items / properties / rental_amount / description
        Previous value: -"Rental assistance granted in USD. Absent when zero or not reported."New value: +"Rental assistance granted in USD; 0 when none was. Absent when not reported."
      • changedOutput schema / properties / renters / items / properties / total_approved_ihp_amount / description
        Previous value: -"Total IHP assistance approved for renters in USD. Absent when zero or not reported."New value: +"Total IHP assistance approved for renters in USD; 0 when none was. Absent when not reported."
      • changedOutput schema / properties / renters / items / properties / valid_registrations / description
        Previous value: -"Number of valid IA registrations from renters in this area. Absent when zero or not reported."New value: +"Number of valid IA registrations from renters in this area. Absent when not reported."
      • changedOutput schema / properties / renters / items / properties / zip_code / description
        Previous value: -"5-digit ZIP code. Absent when not recorded."New value: +"5-digit ZIP code; 00000 when OpenFEMA files the records under no ZIP code. Absent when not recorded."
    • Changedfema_get_public_assistance2 fields changed
      • changedOutput schema / properties / projects / items / properties / federal_share_obligated / description
        Previous value: -"Federal dollars obligated for this project in USD. Absent before obligation."New value: +"Federal dollars obligated for this project in USD; 0 when nothing is obligated."
      • changedOutput schema / properties / projects / items / properties / total_obligated / description
        Previous value: -"Total obligated amount across all funding sources in USD. Absent before obligation."New value: +"Total obligated amount across all funding sources in USD; 0 when nothing is obligated."
    • Changedfema_query_dataset2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `unknown_dataset`: The dataset name is not in the OpenFEMA dataset catalog, or OpenFEMA has no endpoint for it. `catalog_unavailable`: The OpenFEMA dataset catalog could not be read, so the dataset API version is unknown. `invalid_filter`: OpenFEMA rejected the filter expression — an unknown field, a value of the wrong type or range, or unparseable syntax. `invalid_select`: OpenFEMA rejected the select list — an unknown field or unparseable syntax. `invalid_orderby`: OpenFEMA rejected the orderby expression — an unknown field or unparseable syntax. `invalid_odata_syntax`: OpenFEMA could not parse the request and did not say whether filter, select, or orderby was at fault. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_dataset`: The dataset name is not in the OpenFEMA dataset catalog. `dataset_not_served`: The OpenFEMA dataset catalog lists the dataset, but OpenFEMA answers its API endpoint with a 404 page. `catalog_unavailable`: The OpenFEMA dataset catalog could not be read, so the dataset API version is unknown. `invalid_filter`: OpenFEMA rejected the filter expression — an unknown field, a value of the wrong type or range, or unparseable syntax. `invalid_select`: OpenFEMA rejected the select list — an unknown field or unparseable syntax. `invalid_orderby`: OpenFEMA rejected the orderby expression — an unknown field or unparseable syntax. `invalid_odata_syntax`: OpenFEMA could not parse the request and did not say whether filter, select, or orderby was at fault. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "unknown_dataset",
        -  "catalog_unavailable",
        -  "invalid_filter",
        -  "invalid_select",
        -  "invalid_orderby",
        -  "invalid_odata_syntax"
        -]New value: +[
        +  "unknown_dataset",
        +  "dataset_not_served",
        +  "catalog_unavailable",
        +  "invalid_filter",
        +  "invalid_select",
        +  "invalid_orderby",
        +  "invalid_odata_syntax"
        +]
    • Changedfema_search_disasters5 fields changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Paging guidance when offset is at or past the end of the matching declarations — names the total and the last valid offset."New value: +"Paging guidance: when offset is at or past the end of the matching declarations, the total and the last valid offset; when truncated is true, that the totals are lower bounds and the date_to (YYYY-MM-DD) to search next for older declarations."
      • changedOutput schema / properties / totalCount / description
        Previous value: -"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."New value: +"Unique disaster declarations matching the query — the unit declaration-level pagination pages over. Exceeds returned_count when the matches span more than one page. A lower bound when truncated is true."
      • changedOutput schema / properties / total_area_rows / description
        Previous value: -"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 of unique declarations. When total_area_rows exceeds 10 000, results are truncated to the most recent 10 000 rows — apply tighter filters to stay within this window."New value: +"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 of unique declarations. When it exceeds 10,000, the search reads the most recent 10,000 rows and drops the declarations dated on the oldest day among them, so every returned declaration is complete; the notice names the date_to that continues with older declarations."
      • changedOutput schema / properties / total_declarations / description
        Previous value: -"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 the exact total when total_area_rows hits the 10,000-row overfetch cap."New value: +"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 lower bound when truncated is true: it counts only the declarations dated after the day the 10,000-row window ends."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when more than 10,000 designated-area rows match: the search covers only the declarations dated after the day its 10,000-row window ends. Each returned declaration is complete, the totals are lower bounds, and the notice names the date_to that continues with older declarations. Absent otherwise.",
        +  "type": "boolean"
        +}
    • Changedfema_search_nfip16 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"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."New value: +"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 fema_dataframe_describe for the table columns, then to fema_dataframe_query for SQL."
      • changedInput schema / properties / limit / description
        Previous value: -"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."New value: +"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, the notice names the offset to continue from. When DataCanvas is enabled and the match exceeds that character budget, a call at offset 0 stages the match on a canvas regardless of this value."
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Pagination offset into the matching claims, ordered newest date of loss first (default 0). Use with limit to page through a match. Only a call at offset 0 stages a match on a canvas; a later offset returns just its inline page. After a spill (spilled=true), read rows past the inline claims from the canvas table with fema_dataframe_query.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"Canvas ID for the staged full result set. Pass to fema_dataframe_query and fema_dataframe_describe. Present only when spilled=true."New value: +"Canvas ID for the staged match. Pass to fema_dataframe_describe and fema_dataframe_query. Present only when spilled=true."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"DuckDB table name on the canvas holding all fetched rows. Reference in SQL FROM clauses. Present when spilled=true."New value: +"DuckDB table on the canvas holding the staged claims. List its columns with fema_dataframe_describe, then reference it in fema_dataframe_query FROM clauses. Present only when spilled=true."
      • changedOutput schema / properties / claims / description
        Previous value: -"Inline preview of claim records (first N rows). Full dataset available via canvas_id when spilled=true."New value: +"Claims from offset onward, newest date of loss first, bounded by limit and 100,000 characters of claims. When spilled=true, canvas_table holds the staged match."
      • changedOutput schema / properties / claims / items / properties / amount_paid_building / description
        Previous value: -"NFIP claim payment for the building structure in USD. Absent when zero or not recorded."New value: +"NFIP claim payment for the building structure in USD; 0 when the claim paid nothing on the building. Absent when not recorded."
      • changedOutput schema / properties / claims / items / properties / amount_paid_contents / description
        Previous value: -"NFIP claim payment for contents (personal property) in USD. Absent when zero or not recorded."New value: +"NFIP claim payment for contents (personal property) in USD; 0 when the claim paid nothing on contents. Absent when not recorded."
      • changedOutput schema / properties / claims / items / properties / cause_of_damage / description
        Previous value: -"Primary cause of the flood damage (e.g., \"Flooding\", \"Tidal Overflow\"). Absent when not recorded."New value: +"OpenFEMA cause-of-damage code, as published: 0 other causes; 1 tidal water overflow; 2 stream, river, or lake overflow; 3 alluvial fan overflow; 4 accumulation of rainfall or snowmelt; 7 erosion-demolition; 8 erosion-removal; 9 earth movement, landslide, land subsidence, sinkholes, etc.; A closed basin lake; B expedited claim handling without site inspection; C expedited claim handling follow-up site inspection; D expedited claim handling by the Adjusting Process Pilot Program (remote adjustment). Other values pass through unchanged. Absent when not recorded."
      • changedOutput schema / properties / claims / items / properties / occupancy_type / description
        Previous value: -"NFIP occupancy type code (e.g., 1=Single Family, 2=2-4 Family, 6=Non-Residential). Absent when not recorded."New value: +"NFIP occupancy type code, as published. Legacy codes: 1 single-family residence; 2 residential building with 2 to 4 units; 3 residential building with more than 4 units; 4 non-residential building; 6 non-residential business. Risk Rating 2.0 codes: 11 single-family residential building (except a mobile home or a single unit within a multi-unit building); 12 residential non-condo building with 2 to 4 units, insuring all units; 13 residential non-condo building with 5 or more units, insuring all units; 14 residential mobile or manufactured home; 15 residential condo association building; 16 single residential unit within a multi-unit building; 17 non-residential mobile or manufactured home; 18 non-residential building; 19 non-residential unit within a multi-unit building. Other values pass through unchanged. Absent when not recorded."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance on canvas usage or result scope."New value: +"Paging and canvas guidance: the offset to continue from when claims were left out, the last valid offset when offset is past the end, or the canvas table and dataframe tools after a spill."
      • changedOutput schema / properties / returned_count / description
        Previous value: -"Number of claim records in the inline preview."New value: +"Number of claim records in claims."
      • changedOutput schema / properties / spilled / description
        Previous value: -"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."New value: +"True when the match exceeded the inline budget and was staged on DataCanvas: call fema_dataframe_describe, then fema_dataframe_query, with canvas_id. False when nothing was staged."
      • addedOutput schema / properties / staged_count
        Added value: +{
        +  "description": "Claims staged on canvas_table: the whole match, or its first 50,000 when truncated=true. Present only when spilled=true.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / total_count / description
        Previous value: -"Total matching claims in the filtered dataset before the limit."New value: +"Claims matching the filters, as counted by OpenFEMA — before offset, limit, and the canvas row cap."
      • changedOutput schema / properties / truncated / description
        Previous value: -"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 complete set."New value: +"True when the 50,000-row canvas cap was reached: canvas_table holds staged_count of the total_count matching claims. Apply tighter filters (county_code, zip_code, year range) to stage the complete set."
  4. 4 tool updates
    • Changedfema_get_housing_assistance4 fields changed
      • changedInput schema / properties / disaster_number / description
        Previous value: -"FEMA disaster number. Obtain from fema_search_disasters."New value: +"FEMA disaster number. Obtain from fema_search_disasters. Numbers above 32767 match no declaration."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `no_results`: No IA housing records found for this disaster. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `not_found`: The disaster number is above 32767, the highest number OpenFEMA holds, so no declaration exists. `no_results`: No IA housing records found for this disaster. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_state",
        -  "no_results"
        -]New value: +[
        +  "invalid_state",
        +  "not_found",
        +  "no_results"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no results were found."New value: +"Paging guidance when offset is at or past the end of a queried dataset — names its total and last valid offset."
    • Changedfema_get_public_assistance4 fields changed
      • changedInput schema / properties / disaster_number / description
        Previous value: -"FEMA disaster number to scope results to a single declaration."New value: +"FEMA disaster number to scope results to a single declaration. Numbers above 32767 match no declaration."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `missing_filter`: Neither disaster_number nor state was provided. `no_results`: No PA project records found for the given filters. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `missing_filter`: Neither disaster_number nor state was provided. `not_found`: The disaster number is above 32767, the highest number OpenFEMA holds, so no declaration exists. `no_results`: No PA project records found for the given filters. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_state",
        -  "missing_filter",
        -  "no_results"
        -]New value: +[
        +  "invalid_state",
        +  "missing_filter",
        +  "not_found",
        +  "no_results"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no results were found."New value: +"Paging guidance when offset is at or past the end of the matching projects — names the total and the last valid offset."
    • Changedfema_query_dataset4 fields changed
      • changedInput schema / properties / dataset / description
        Previous value: -"OpenFEMA v2 dataset entity name (case-sensitive, e.g., FimaNfipPolicies, FemaWebDeclarationAreas, PublicAssistanceApplicants)."New value: +"OpenFEMA dataset entity name (case-sensitive, e.g., NfipPolicies, FemaWebDeclarationAreas, PublicAssistanceApplicants)."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `unknown_dataset`: Dataset name not recognized by the OpenFEMA API. `invalid_filter`: OData filter expression could not be parsed by the API. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_dataset`: The dataset name is not in the OpenFEMA dataset catalog, or OpenFEMA has no endpoint for it. `catalog_unavailable`: The OpenFEMA dataset catalog could not be read, so the dataset API version is unknown. `invalid_filter`: OpenFEMA rejected the filter expression — an unknown field, a value of the wrong type or range, or unparseable syntax. `invalid_select`: OpenFEMA rejected the select list — an unknown field or unparseable syntax. `invalid_orderby`: OpenFEMA rejected the orderby expression — an unknown field or unparseable syntax. `invalid_odata_syntax`: OpenFEMA could not parse the request and did not say whether filter, select, or orderby was at fault. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "unknown_dataset",
        -  "invalid_filter"
        -]New value: +[
        +  "unknown_dataset",
        +  "catalog_unavailable",
        +  "invalid_filter",
        +  "invalid_select",
        +  "invalid_orderby",
        +  "invalid_odata_syntax"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no results were found."New value: +"Guidance on an empty page — filter advice when nothing matches, or the total and last valid offset when offset is at or past the end."
    • Changedfema_search_disasters7 fields changed
      • addedInput schema / properties / date_from / anyOf
        Added value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Calendar date, YYYY-MM-DD.",
        +    "format": "date",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / date_from / description
        Previous value: -"Start of declaration date range in ISO 8601 format (e.g., 2024-01-01). Inclusive."New value: +"Start of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-01-01). Inclusive."
      • removedInput schema / properties / date_from / type
        Removed value: -"string"
      • addedInput schema / properties / date_to / anyOf
        Added value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Calendar date, YYYY-MM-DD.",
        +    "format": "date",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / date_to / description
        Previous value: -"End of declaration date range in ISO 8601 format (e.g., 2024-12-31). Inclusive."New value: +"End of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-12-31). Inclusive."
      • removedInput schema / properties / date_to / type
        Removed value: -"string"
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no results were found."New value: +"Paging guidance when offset is at or past the end of the matching declarations — names the total and the last valid offset."
  5. 3 tool updates
    • Changedfema_dataframe_describe1 field changed
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"^[A-Za-z0-9_-]{10}$"
    • Changedfema_dataframe_query3 fields changed
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"^[A-Za-z0-9_-]{10}$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `canvas_unavailable`: DataCanvas is disabled on this deployment (CANVAS_PROVIDER_TYPE is not set to duckdb). `invalid_query`: The SQL statement is not a valid SELECT, references a non-existent table or column, or uses blocked operations. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `sql_execution_error`: A SELECT fails while converting or calculating values in the staged data. `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `canvas_unavailable`: DataCanvas is disabled on this deployment (CANVAS_PROVIDER_TYPE is not set to duckdb). `invalid_query`: The SQL statement is not a valid SELECT, references a non-existent table or column, or uses blocked operations. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "canvas_not_found",
        -  "canvas_unavailable",
        -  "invalid_query"
        -]New value: +[
        +  "sql_execution_error",
        +  "canvas_not_found",
        +  "canvas_unavailable",
        +  "invalid_query"
        +]
    • Changedfema_search_nfip1 field changed
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"^[A-Za-z0-9_-]{10}$"
  6. 8 tool updates
    • Changedfema_dataframe_describe6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "tables",
        +      "canvas_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `canvas_unavailable`: DataCanvas is disabled on this deployment (CANVAS_PROVIDER_TYPE is not set to duckdb). Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_not_found",
        +            "canvas_unavailable"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "tables",
        -  "canvas_id"
        -]
    • Changedfema_dataframe_query6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "rows",
        +      "row_count",
        +      "canvas_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `canvas_unavailable`: DataCanvas is disabled on this deployment (CANVAS_PROVIDER_TYPE is not set to duckdb). `invalid_query`: The SQL statement is not a valid SELECT, references a non-existent table or column, or uses blocked operations. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_not_found",
        +            "canvas_unavailable",
        +            "invalid_query"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "rows",
        -  "row_count",
        -  "canvas_id"
        -]
    • Changedfema_get_disaster6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "disaster_number",
        +      "title",
        +      "state",
        +      "incident_type",
        +      "declaration_type",
        +      "declaration_date",
        +      "ia_declared",
        +      "pa_declared",
        +      "hm_declared",
        +      "designated_areas",
        +      "designated_area_count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: No declaration found with the given disaster number. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "disaster_number",
        -  "title",
        -  "state",
        -  "incident_type",
        -  "declaration_type",
        -  "declaration_date",
        -  "ia_declared",
        -  "pa_declared",
        -  "hm_declared",
        -  "designated_areas",
        -  "designated_area_count"
        -]
    • Changedfema_get_housing_assistance6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "owners",
        +      "renters",
        +      "owners_count",
        +      "renters_count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `no_results`: No IA housing records found for this disaster. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_state",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "owners",
        -  "renters",
        -  "owners_count",
        -  "renters_count"
        -]
    • Changedfema_get_public_assistance6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "projects",
        +      "total_count",
        +      "returned_count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `missing_filter`: Neither disaster_number nor state was provided. `no_results`: No PA project records found for the given filters. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_state",
        +            "missing_filter",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "projects",
        -  "total_count",
        -  "returned_count"
        -]
    • Changedfema_query_dataset6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "dataset",
        +      "rows",
        +      "total_count",
        +      "returned_count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `unknown_dataset`: Dataset name not recognized by the OpenFEMA API. `invalid_filter`: OData filter expression could not be parsed by the API. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "unknown_dataset",
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "dataset",
        -  "rows",
        -  "total_count",
        -  "returned_count"
        -]
    • Changedfema_search_disasters6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "declarations",
        +      "total_declarations",
        +      "total_area_rows",
        +      "returned_count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `no_results`: Query returned zero disaster declarations. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_state",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "declarations",
        -  "total_declarations",
        -  "total_area_rows",
        -  "returned_count"
        -]
    • Changedfema_search_nfip6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "claims",
        +      "total_count",
        +      "returned_count",
        +      "spilled"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `no_results`: Query returned zero matching NFIP claims. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_state",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "claims",
        -  "total_count",
        -  "returned_count",
        -  "spilled"
        -]
  7. 1 tool update
    • Changedfema_dataframe_query6 fields changed
      • changedInput schema / properties / query / description
        Previous value: -"SQL SELECT statement to run against the staged table. Use the table name from fema_dataframe_describe. Example: \"SELECT year_of_loss, COUNT(*) AS claims, SUM(amount_paid_building) AS total_building_paid FROM df_nfip_abc123 GROUP BY year_of_loss ORDER BY year_of_loss\""New value: +"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, or aggregate (GROUP BY, COUNT, SUM) to summarize the full set in one query. Example: \"SELECT year_of_loss, COUNT(*) AS claims, SUM(amount_paid_building) AS total_building_paid FROM df_nfip_abc123 GROUP BY year_of_loss ORDER BY year_of_loss\""
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The canvas row limit that was applied when the result was capped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Continuation guidance when capped — how to page the remainder with LIMIT/OFFSET.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / rows / description
        Previous value: -"All rows returned by the query."New value: +"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)."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of rows returned in this (capped) response.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the result was capped at the canvas row limit — more rows match than were returned.",
        +  "type": "boolean"
        +}
  8. 1 tool update
    • Changedfema_search_disasters3 fields changed
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total matching designated-area rows from the API — exceeds the returned declaration count when results were capped at the overfetch limit."New value: +"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."
      • addedOutput schema / properties / total_declarations
        Added value: +{
        +  "description": "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 the exact total when total_area_rows hits the 10,000-row overfetch cap.",
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "declarations",
        -  "total_area_rows",
        -  "returned_count"
        -]New value: +[
        +  "declarations",
        +  "total_declarations",
        +  "total_area_rows",
        +  "returned_count"
        +]
  9. 1 tool update
    • Changedfema_search_nfip2 fields changed
      • changedInput schema / properties / zip_code / description
        Previous value: -"ZIP code to narrow results to a specific area."New value: +"ZIP code to narrow results to a specific area (5-digit, e.g., 77002)."
      • addedInput schema / properties / zip_code / pattern
        Added value: +"^\\d{5}$"
  10. 4 tool updates
    • Changedfema_get_housing_assistance1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total owner + renter records available before the per-dataset limit — exceeds the returned count when either dataset was capped.",
        +  "type": "number"
        +}
    • Changedfema_get_public_assistance1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total matching projects before pagination — exceeds returned_count when results were capped at the limit.",
        +  "type": "number"
        +}
    • Changedfema_query_dataset1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total matching records before pagination — exceeds returned_count when results were capped at the limit.",
        +  "type": "number"
        +}
    • Changedfema_search_disasters1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total matching designated-area rows from the API — exceeds the returned declaration count when results were capped at the overfetch limit.",
        +  "type": "number"
        +}
  11. 1 tool update
    • Changedfema_search_nfip5 fields changed
      • changedInput schema / properties / county_code / description
        Previous value: -"County code to narrow results within the state (e.g., 201 for Harris County TX). Use with state."New value: +"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 server prepends the state FIPS automatically."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum rows to fetch (1–10000, default 1000)."New value: +"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."
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"Canvas ID for the staged full result set. Pass to fema_dataframe_query and fema_dataframe_describe. Present when canvas is enabled."New value: +"Canvas ID for the staged full result set. Pass to fema_dataframe_query and fema_dataframe_describe. Present only when spilled=true."
      • changedOutput schema / properties / claims / items / properties / county_code / description
        Previous value: -"County code (e.g., 201 for Harris County TX). Absent when not recorded."New value: +"5-digit state+county FIPS code (e.g., 48201 for Harris County TX). Absent when not recorded."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the canvas row cap (50,000) was reached before all matching rows were staged. Apply tighter filters (county_code, zip_code, year range) for a complete set."New value: +"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 complete set."
  12. 2 tool updates
    • Changedfema_get_disaster1 field changed
      • changedOutput schema / properties / ia_declared / description
        Previous value: -"True when Individual Assistance (housing/personal grants) was declared."New value: +"True when the Individuals and Households Program (IHP) was declared — indicates IA housing/personal grants are available."
    • Changedfema_search_disasters4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of declarations to return (1–1000, default 50)."New value: +"Maximum number of unique disaster declarations to return (1–1000, default 50)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default 0). Use with limit for paging through results."New value: +"Pagination offset in declarations (default 0). Use with limit to page through results."
      • changedOutput schema / properties / declarations / items / properties / ia_declared / description
        Previous value: -"True when Individual Assistance (housing/personal grants) was declared."New value: +"True when the Individuals and Households Program (IHP) was declared — indicates IA housing/personal grants are available."
      • changedOutput schema / properties / total_area_rows / description
        Previous value: -"Total matching designated-area rows from the API before pagination. DisasterDeclarationsSummaries returns one row per designated area per disaster — this count is higher than the number of unique declarations in `declarations`."New value: +"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 of unique declarations. When total_area_rows exceeds 10 000, results are truncated to the most recent 10 000 rows — apply tighter filters to stay within this window."
  13. 8 tool updates
    • First observedfema_dataframe_describe
    • First observedfema_dataframe_query
    • First observedfema_get_disaster
    • First observedfema_get_housing_assistance
    • First observedfema_get_public_assistance
    • First observedfema_query_dataset
    • First observedfema_search_disasters
    • First observedfema_search_nfip

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables keyless, read-only querying of FEMA open data on NFIP paid flood claims by state and county, damage ratios by interior water depth, and county profiles covering disaster declarations, FEMA inspections, and community status. Reported amounts are what NFIP paid on claims, not repair-cost estimates.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables location-aware emergency preparedness planning by providing FEMA hazard risk profiles, disaster declaration history, and combined community context.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    An MCP server that exposes real US flood insurance claims data from FEMA's OpenFEMA API, providing tools for claim lookup, filtered search, aggregate stats, and flood event summaries.
    4
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.