fema-mcp-server
Server Details
Query FEMA disaster declarations, public assistance grants, housing aid, and NFIP claims.
- Status
- Healthy
- Uptime
- 99.9% over 56 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
Scored across 8 tools
Tools have mostly distinct purposes: disaster search vs. disaster details vs. assistance retrieval vs. NFIP search vs. generic OData query. Some overlap exists between fema_search_nfip and fema_dataframe_query (both handle NFIP data), but descriptions clearly separate search from post-hoc analysis, and fema_query_dataset is explicitly an escape hatch.
All tools share the 'fema_' prefix, but verb usage is mixed: 'get', 'search', 'query', and 'dataframe_'. While consistent in prefix, the action verbs are not uniform (e.g., fema_get_disaster vs. fema_search_disasters vs. fema_query_dataset). The pattern is still readable and predictable, but not perfectly consistent.
8 tools is well within the ideal range. The set covers disaster declarations, public and housing assistance, NFIP claims, and includes a generic OData query for any other dataset. Each tool serves a clear purpose, and the count feels appropriate for a FEMA data access server.
The tool surface covers major FEMA data workflows: searching and retrieving disasters, PA and IA data, NFIP claims, and a generic dataset query for anything else. Minor gaps exist—e.g., no dedicated tools for specific datasets like NfipPolicies—but the generic query mitigates this. The addition of dataframe staging for NFIP analysis adds completeness for advanced analytics.
Available Tools
8 toolsfema_dataframe_describeDescribe FEMA DataCanvas TablesARead-onlyIdempotentInspect
List tables and column schemas on a DataCanvas staged by fema_search_nfip. Call this before fema_dataframe_query to discover the exact table name, column names, and DuckDB data types needed to write valid SQL. Row count reflects what was actually staged — check truncated in the fema_search_nfip response to know whether the canvas holds the full matching set.
| Name | Required | Description | Default |
|---|---|---|---|
| canvas_id | Yes | Canvas ID from the fema_search_nfip response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| tables | No | All tables and views available on this canvas. |
| canvas_id | No | Canvas ID that was described — pass to fema_dataframe_query. |
TDQS
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.
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.
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.
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.
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.
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 TableARead-onlyIdempotentInspect
Run a read-only SQL SELECT against a DataCanvas table staged by fema_search_nfip. Enables aggregation, GROUP BY, SUM/COUNT, time-series, and filtered analysis over the full NFIP claims result without re-fetching from the API. Call fema_dataframe_describe first to get the exact table name and column names needed for valid SQL. Only SELECT statements are allowed — DDL, DML, COPY, and file-reading functions are blocked.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | SQL SELECT statement to run against the staged table. Use the table name from fema_dataframe_describe. Results are capped at the canvas row limit; append LIMIT/OFFSET to page through additional rows, 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_id | Yes | Canvas ID from the fema_search_nfip response (the canvas_id field). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The canvas row limit that was applied when the result was capped. |
| rows | No | 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). |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of rows returned in this (capped) response. |
| notice | No | Continuation guidance when capped — how to page the remainder with LIMIT/OFFSET. |
| canvas_id | No | Canvas ID that was queried — reuse for follow-up queries. |
| row_count | No | Number of rows in this response (may be capped at the canvas row limit). |
| truncated | No | True when the result was capped at the canvas row limit — more rows match than were returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description's note about only SELECT is consistent and adds value by specifying blocked operations. Also discloses row capping and suggests LIMIT/OFFSET or aggregation to handle full data, which is beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise yet comprehensive. The description is front-loaded with purpose, followed by usage prerequisite and safety constraints. No redundant information—every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and schema covers parameters, the description is complete: it identifies the source table, explains how to get column names, demonstrates example usage, and warns about blocking. An agent has all needed to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so description doesn't need to add much. It provides examples and explains how to use query (e.g., table name from describe, aggregation patterns), but largely reinforces schema descriptions. Slight value add with example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb (Run), resource (DataCanvas table), and scope (read-only SQL SELECT, aggregation, etc.). Distinguishes from siblings by explicitly referencing the staging process and naming fema_dataframe_describe as a prerequisite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when to use (for analysis on NFIP claims without API re-fetch), and provides a concrete alternative/sequential tool (fema_dataframe_describe) to get table/column names. Also states what is blocked (DDL, DML, COPY, file-reading), guiding safe usage.
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 DetailsARead-onlyInspect
Fetch all designated-area rows for a specific FEMA disaster by disaster number (e.g., 4781). Returns every county/municipality designated under the declaration along with programs activated, incident period, and state info. Use fema_search_disasters to find disaster numbers. The returned disaster_number chains to fema_get_public_assistance and fema_get_housing_assistance.
| Name | Required | Description | Default |
|---|---|---|---|
| disaster_number | Yes | FEMA disaster number (e.g., 4781). Obtain from fema_search_disasters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| state | No | Two-letter state/territory code. |
| title | No | Official declaration title (e.g., "SEVERE STORMS AND FLOODING"). |
| hm_declared | No | True when Hazard Mitigation grants were declared. |
| ia_declared | No | True when the Individuals and Households Program (IHP) was declared — indicates IA housing/personal grants are available. |
| pa_declared | No | True when Public Assistance (infrastructure recovery grants) was declared. |
| incident_type | No | Type of incident (e.g., Flood, Hurricane, Severe Storm). |
| disaster_number | No | FEMA disaster number — use as the chain key for PA and housing assistance tools. |
| declaration_date | No | ISO 8601 date the declaration was signed. |
| declaration_type | No | Declaration type: DR (major disaster), EM (emergency), or FM (fire management). |
| designated_areas | No | All counties/municipalities designated for assistance under this declaration. |
| incident_end_date | No | ISO 8601 end date of the incident. Absent for ongoing or unrecorded incidents. |
| incident_begin_date | No | ISO 8601 start date of the incident. Absent when not recorded. |
| designated_area_count | No | Total number of designated areas in this declaration. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false. The description reinforces and expands on these by stating that it returns 'every county/municipality designated under the declaration' – aligning with the openWorldHint (complete results) – and lists the specific data returned (programs activated, incident period, state info). It adds meaningful behavioral context beyond the annotations, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first states the action and parameter, the second describes the return content, and the third provides routing guidance. The most critical information (what it fetches) is front-loaded. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description does not need to detail return formats, but it still summarizes the key return elements. It explains how to obtain the required parameter and how the result chains to other tools. For a read-only single-parameter fetch with annotations covering safety and completeness, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema fully documents the single parameter, including its type, example, and source. The description repeats the example and the source ('Use fema_search_disasters to find disaster numbers') without adding any new semantic meaning for the input parameter itself. The chaining mention relates to the output, not the input. Thus the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch'), a resource ('designated-area rows'), and a specific identifier ('disaster number'), making the purpose unambiguous. It clearly differentiates from siblings like fema_search_disasters (search vs. fetch) and the assistance tools (general details vs. specific assistance programs). No other tool does exactly this.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent to use fema_search_disasters to find disaster numbers, providing a clear path for obtaining the required input. It also indicates that this tool is the entry point for further chaining to fema_get_public_assistance and fema_get_housing_assistance, which helps the agent choose the right tool for follow-up queries. This is explicit when-to-use guidance.
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 DataARead-onlyInspect
Retrieve Individual Assistance (IA) housing data for a disaster by disaster number. Returns owner and/or renter breakdowns by county and ZIP code — valid registrations, total approved IHP amounts, repair/rental amounts, and inspection data. Use type to select owners, renters, or both (default). Use disaster_number from fema_search_disasters.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Which housing assistance dataset to query: owners, renters, or both (default). | both |
| limit | No | Maximum records per dataset to return (default 100). | |
| state | No | Two-letter state code to narrow results when a disaster spans multiple states. | |
| offset | No | Pagination offset (default 0). | |
| disaster_number | Yes | FEMA disaster number. Obtain from fema_search_disasters. Numbers above 32767 match no declaration. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Paging guidance when offset is at or past the end of a queried dataset — names its total and last valid offset. |
| owners | No | Homeowner (HousingAssistanceOwners) records. Empty when type is "renters" or no owner data exists. |
| renters | No | Renter (HousingAssistanceRenters) records. Empty when type is "owners" or no renter data exists. |
| totalCount | No | Total owner + renter records available before the per-dataset limit — exceeds the returned count when either dataset was capped. |
| owners_count | No | Total owner records available before the per-dataset limit. |
| renters_count | No | Total renter records available before the per-dataset limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, and the description adds useful behavioral context: data is grouped by county/ZIP, includes specific fields like valid registrations and IHP amounts, and supports owner/renter/both selection. There is no hint of side effects or hidden mutations, and nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: purpose, output shape, then key parameter guidance. Every sentence earns its place, and the most important facts are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All five parameters are fully documented in the schema and an output schema exists, so the description does not need to restate return values. It covers purpose, output scope, type behavior, and ID provenance; the only minor gap is the lack of explicit routing between similar retrieval tools, which is not required for a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents type, limit, offset, state, and disaster_number. The description only reinforces the type default and points to fema_search_disasters for the disaster number, adding little meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Retrieve Individual Assistance (IA) housing data... by disaster number') and enumerates the returned data types, making the tool's purpose clear and distinct from public-assistance and disaster-search siblings. It does not explicitly name an alternative tool, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use the tool (when IA housing data for a disaster is needed) and tells the caller to source disaster_number from fema_search_disasters. However, it does not explicitly state when to prefer this tool over fema_get_public_assistance, fema_get_disaster, or fema_query_dataset, nor does it give exclusions.
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 ProjectsARead-onlyInspect
Retrieve Public Assistance (PA) funded project records for a disaster or state — shows where federal recovery money was obligated. Returns applicant, damage category, project size and status, federal share obligated, and total obligated amounts. Either disaster_number or state must be provided. Use disaster_number (from fema_search_disasters) to scope to a single declaration, or state to browse all PA projects for a state. PA projects are created only when the PA program is declared (pa_declared: true on the disaster).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of projects to return (1–1000, default 100). | |
| state | No | Two-letter state code to browse all PA projects for a state. | |
| county | No | Filter by county name substring. | |
| offset | No | Pagination offset (default 0). | |
| disaster_number | No | FEMA disaster number to scope results to a single declaration. Numbers above 32767 match no declaration. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Paging guidance when offset is at or past the end of the matching projects — names the total and the last valid offset. |
| projects | No | Public assistance funded project records. |
| totalCount | No | Total matching projects before pagination — exceeds returned_count when results were capped at the limit. |
| total_count | No | Total matching projects before pagination. |
| returned_count | No | Number of projects in this response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and open-world. The description adds useful behavioral context beyond that: PA projects only exist when the PA program was declared, and there is a mandatory but not schema-enforced one-of constraint. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long and front-loads the core action, then lists return contents, then gives usage rules. Every sentence earns its place, and there is no filler or redundancy with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations cover read-only/open-world behavior, the description supplies the missing selection context: filters, prerequisites, and how to scope queries. An agent has enough information to invoke this tool correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all five parameters with 100% coverage, so the baseline is 3. The description adds value by clarifying the mutual-exclusion relationship between disaster_number and state, and by telling the agent where to get disaster_number from, which is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves Public Assistance funded project records for a disaster or state, and enumerates the key data returned. It is distinct from sibling tools like fema_get_housing_assistance and fema_search_disasters, and the title is expanded with meaningful detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the either/or requirement: disaster_number or state must be provided, and explains when to prefer each. It also references fema_search_disasters as the source for disaster_number and notes the pa_declared prerequisite, giving concrete selection guidance.
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 DatasetARead-onlyInspect
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 returns dataset_not_served.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum records to return (1–10000, default 100). | |
| filter | No | OData $filter expression (e.g., "state eq 'TX' and declarationDate ge '2024-01-01T00:00:00.000Z'"). String values in single quotes. | |
| offset | No | Pagination offset (default 0). | |
| select | No | Comma-separated field names to return (e.g., "disasterNumber,state,declarationDate"). | |
| dataset | Yes | OpenFEMA dataset entity name (case-sensitive, e.g., NfipPolicies, FemaWebDeclarationAreas, PublicAssistanceApplicants). | |
| orderby | No | OData $orderby expression (e.g., "declarationDate desc"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | Records returned from the dataset. Field names depend on the queried dataset. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | 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. |
| dataset | No | The dataset that was queried. |
| totalCount | No | Total matching records before pagination — exceeds returned_count when results were capped at the limit. |
| total_count | No | Total matching records before pagination. |
| returned_count | No | Number of records in this response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=true and openWorldHint=true, so the description isn't required to repeat read-only semantics. It adds valuable behavioral context: timeout risks ('always include a ZIP filter to avoid timeout'), error responses for invalid or unsupported datasets, and the case-sensitive nature of dataset names. These details go beyond what annotations convey, helping the agent anticipate edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized. It opens with the core purpose and 'escape hatch' framing, then lists example datasets, followed by specific OData usage tips, dataset-specific notes, and error behavior. Each sentence contributes unique information, and the most critical usage guidance appears early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's generic nature, the description covers the essential knowledge an agent needs: how to specify the dataset, how to use OData parameters, special-case field mappings, and error handling. The output schema exists, so return format is not the description's responsibility. No critical gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description enriches parameter semantics beyond the schema. It clarifies the dataset parameter must match the exact OpenFEMA entity name (case-sensitive), gives example filter expressions, and explains field-name quirks (propertyState vs state, reportedZipCode, absence of countyCode). This is crucial guidance that the schema alone does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Generic OData query against any dataset in the OpenFEMA dataset catalog'. It identifies the specific verb (query) and resource (any dataset). It also frames itself as an 'escape hatch' for datasets the convenience tools do not cover, explicitly listing examples, which distinguishes it from sibling convenience tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool: 'for datasets the convenience tools do not cover'. It provides dataset-specific guidance (e.g., NfipPolicies field names, ZIP filter requirement to avoid timeout) and explains error conditions (unknown_dataset, dataset_not_served). It even gives a rule about dataset name casing, making the usage conditions unambiguous.
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 DeclarationsARead-onlyInspect
Search federal disaster declarations by state, incident type, declaration type, date range, and county. Returns deduplicated declaration-level summaries — each disaster number appears once with a designatedAreaCount showing how many counties/municipalities were designated. The disaster number is the chain key for fema_get_disaster, fema_get_public_assistance, and fema_get_housing_assistance. Use declaration_type to filter: DR (major disaster, most common), EM (emergency), FM (fire management). Date filters apply to the declaration date. Use fema_get_disaster to retrieve all designated-area rows for a specific declaration. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of unique disaster declarations to return (1–1000, default 50). | |
| state | No | Two-letter US state/territory code (e.g., TX, CA, FL, PR). Filters by state. | |
| county | No | Filter by designated area / county name substring (e.g., Harris, Los Angeles). Case-insensitive. | |
| offset | No | Pagination offset in declarations (default 0). Use with limit to page through results. | |
| date_to | No | End of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-12-31). Inclusive. | |
| date_from | No | Start of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-01-01). Inclusive. | |
| incident_type | No | Incident type filter (e.g., Flood, Hurricane, Tornado, Fire, Earthquake, Severe Storm). Case-insensitive substring match. | |
| declaration_type | No | Declaration type: DR (major disaster declaration), EM (emergency declaration), FM (fire management assistance declaration). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | 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. |
| truncated | No | 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. |
| totalCount | No | 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. |
| declarations | No | Disaster declarations matching the search, one entry per unique disaster number. |
| returned_count | No | Number of unique deduplicated declarations in this response. |
| total_area_rows | No | 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. |
| total_declarations | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses crucial behaviors: results are deduplicated by disaster number, each includes designatedAreaCount, truncated is set when the underlying 10,000-row window is exceeded, and the notice names a date_to that continues with older declarations. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place, covering purpose, output shape, filtering semantics, sibling differentiation, and the truncation edge case. It is front-loaded with the core search capability before diving into behavioral details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 8 optional parametersestr, and given the output schema exists, the description provides all needed operational context: what is returned, how deduplication works, how pagination ties into the 10,000-row window, and how this tool chains with three sibling tools via the disaster number. No critical calling guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers all parameter descriptions at 100%, so the baseline is 3. The description adds semantic value by expanding declaration_type into its meanings ('DR (major disaster, most common), EM (emergency), FM (fire management)') and by noting that date filters apply to the declaration date—context not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Search federal disaster declarations by state, incident type, declaration type, date range, and county.' It also distinguishes itself from the sibling fema_get_disaster by clarifying that this tool returns deduplicated declaration-level summaries while the sibling returns all designated-area rows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool versus fema_get_disaster: 'Use fema_get_disaster to retrieve all designated-area rows for a specific declaration.' It also explains how declaration_type filters should be used with enum meanings (DR, EM, FM) and clarifies that date filters apply to the declaration date.
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 ClaimsARead-onlyInspect
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. When DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 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. | |
| state | Yes | Two-letter US state code (required). NFIP dataset is 2.7M rows — state filter is mandatory. | |
| offset | No | 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. | |
| year_to | No | End year of loss, inclusive (e.g., 2023). | |
| zip_code | No | ZIP code to narrow results to a specific area (5-digit, e.g., 77002). | |
| canvas_id | No | 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. | |
| year_from | No | Start year of loss, inclusive (e.g., 2020). | |
| county_code | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| claims | No | 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. |
| notice | No | 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. |
| spilled | No | 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. |
| canvas_id | No | Canvas ID for the staged match. Pass to fema_dataframe_describe and fema_dataframe_query. Present only when spilled=true. |
| truncated | No | 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. |
| total_count | No | Claims matching the filters, as counted by OpenFEMA — before offset, limit, and the canvas row cap. |
| canvas_table | No | 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. |
| staged_count | No | Claims staged on canvas_table: the whole match, or its first 50,000 when truncated=true. Present only when spilled=true. |
| returned_count | No | Number of claim records in claims. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and openWorldHint, and the description adds substantial behavioral detail beyond that: the 2.7M-row scale, the 100,000-character inline page limit, the staging behavior for offset 0 with up to 50,000 claims, and the requirement that state must be supplied. It also discloses an operational constraint ('unfiltered access is prohibited') that an agent needs to know 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core search behavior and return contents come first, followed by the mandatory-state constraint, then pagination, then the conditional DataCanvas workflow. Every sentence carries operational value, and the structure lets an agent quickly decide whether and how to invoke the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters, one required parameter, an output schema, and integration with sibling tools, the description is complete: it covers mandatory input, output contents, ordering, pagination limits, overflow staging, and the exact sibling tools to use afterward. Even without the output schema, an agent would understand what to expect and how to proceed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds important interaction semantics not present in the schema: how limit/offset page through inline results, the character-based page bound, and that only a call at offset 0 stages a match on a canvas when DataCanvas is enabled. This enriches the meaning of limit, offset, and canvas_id beyond their individual descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — 'Search National Flood Insurance Program (NFIP) claims data' — and enumerates the exact filters and returned fields ('claim count and claim records — amounts paid on building and contents, damage estimates, flood zones, cause and occupancy codes, and loss dates'), plus ordering ('newest loss first'). It is clearly distinct from siblings and even names the downstream dataframe tools it coordinates with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage context: 'state is required', 'unfiltered access is prohibited', and it explains when to switch to fema_dataframe_describe/fema_dataframe_query for staged matches beyond the inline budget. It does not explicitly contrast with fema_query_dataset or fema_search_disasters, but the dataset-specific purpose makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
- Changed
fema_get_housing_assistance13 fields changed- changed
Output schema / properties / owners / items / properties / approved_for_fema_assistance / descriptionPrevious 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." - changed
Output schema / properties / owners / items / properties / other_needs_amount / descriptionPrevious 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." - changed
Output schema / properties / owners / items / properties / rental_amount / descriptionPrevious 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." - changed
Output schema / properties / owners / items / properties / repair_replace_amount / descriptionPrevious 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." - changed
Output schema / properties / owners / items / properties / total_approved_ihp_amount / descriptionPrevious 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." - changed
Output schema / properties / owners / items / properties / valid_registrations / descriptionPrevious 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." - changed
Output schema / properties / owners / items / properties / zip_code / descriptionPrevious 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." - changed
Output schema / properties / renters / items / properties / approved_for_fema_assistance / descriptionPrevious 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." - changed
Output schema / properties / renters / items / properties / other_needs_amount / descriptionPrevious 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." - changed
Output schema / properties / renters / items / properties / rental_amount / descriptionPrevious 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." - changed
Output schema / properties / renters / items / properties / total_approved_ihp_amount / descriptionPrevious 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." - changed
Output schema / properties / renters / items / properties / valid_registrations / descriptionPrevious 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." - changed
Output schema / properties / renters / items / properties / zip_code / descriptionPrevious 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."
- Changed
fema_get_public_assistance2 fields changed- changed
Output schema / properties / projects / items / properties / federal_share_obligated / descriptionPrevious 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." - changed
Output schema / properties / projects / items / properties / total_obligated / descriptionPrevious 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."
- Changed
fema_query_dataset2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious 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" +]
- Changed
fema_search_disasters5 fields changed- changed
Output schema / properties / notice / descriptionPrevious 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." - changed
Output schema / properties / totalCount / descriptionPrevious 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." - changed
Output schema / properties / total_area_rows / descriptionPrevious 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." - changed
Output schema / properties / total_declarations / descriptionPrevious 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." - added
Output schema / properties / truncatedAdded 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" +}
- Changed
fema_search_nfip16 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious 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." - changed
Input schema / properties / limit / descriptionPrevious 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." - added
Input schema / properties / offsetAdded 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" +} - changed
Output schema / properties / canvas_id / descriptionPrevious 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." - changed
Output schema / properties / canvas_table / descriptionPrevious 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." - changed
Output schema / properties / claims / descriptionPrevious 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." - changed
Output schema / properties / claims / items / properties / amount_paid_building / descriptionPrevious 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." - changed
Output schema / properties / claims / items / properties / amount_paid_contents / descriptionPrevious 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." - changed
Output schema / properties / claims / items / properties / cause_of_damage / descriptionPrevious 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." - changed
Output schema / properties / claims / items / properties / occupancy_type / descriptionPrevious 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." - changed
Output schema / properties / notice / descriptionPrevious 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." - changed
Output schema / properties / returned_count / descriptionPrevious value: -"Number of claim records in the inline preview."New value: +"Number of claim records in claims." - changed
Output schema / properties / spilled / descriptionPrevious 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." - added
Output schema / properties / staged_countAdded 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" +} - changed
Output schema / properties / total_count / descriptionPrevious 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." - changed
Output schema / properties / truncated / descriptionPrevious 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 tool updates
- Changed
fema_get_housing_assistance4 fields changed- changed
Input schema / properties / disaster_number / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_state", - "no_results" -]New value: +[ + "invalid_state", + "not_found", + "no_results" +] - changed
Output schema / properties / notice / descriptionPrevious 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."
- Changed
fema_get_public_assistance4 fields changed- changed
Input schema / properties / disaster_number / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_state", - "missing_filter", - "no_results" -]New value: +[ + "invalid_state", + "missing_filter", + "not_found", + "no_results" +] - changed
Output schema / properties / notice / descriptionPrevious 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."
- Changed
fema_query_dataset4 fields changed- changed
Input schema / properties / dataset / descriptionPrevious 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)." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_dataset", - "invalid_filter" -]New value: +[ + "unknown_dataset", + "catalog_unavailable", + "invalid_filter", + "invalid_select", + "invalid_orderby", + "invalid_odata_syntax" +] - changed
Output schema / properties / notice / descriptionPrevious 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."
- Changed
fema_search_disasters7 fields changed- added
Input schema / properties / date_from / anyOfAdded 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" + } +] - changed
Input schema / properties / date_from / descriptionPrevious 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." - removed
Input schema / properties / date_from / typeRemoved value: -"string" - added
Input schema / properties / date_to / anyOfAdded 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" + } +] - changed
Input schema / properties / date_to / descriptionPrevious 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." - removed
Input schema / properties / date_to / typeRemoved value: -"string" - changed
Output schema / properties / notice / descriptionPrevious 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."
3 tool updates
- Changed
fema_dataframe_describe1 field changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$"
- Changed
fema_dataframe_query3 fields changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "canvas_not_found", - "canvas_unavailable", - "invalid_query" -]New value: +[ + "sql_execution_error", + "canvas_not_found", + "canvas_unavailable", + "invalid_query" +]
- Changed
fema_search_nfip1 field changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$"
8 tool updates
- Changed
fema_dataframe_describe6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "tables", + "canvas_id" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "tables", - "canvas_id" -]
- Changed
fema_dataframe_query6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "rows", + "row_count", + "canvas_id" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "rows", - "row_count", - "canvas_id" -]
- Changed
fema_get_disaster6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded 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" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "disaster_number", - "title", - "state", - "incident_type", - "declaration_type", - "declaration_date", - "ia_declared", - "pa_declared", - "hm_declared", - "designated_areas", - "designated_area_count" -]
- Changed
fema_get_housing_assistance6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "owners", + "renters", + "owners_count", + "renters_count" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "owners", - "renters", - "owners_count", - "renters_count" -]
- Changed
fema_get_public_assistance6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "projects", + "total_count", + "returned_count" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "projects", - "total_count", - "returned_count" -]
- Changed
fema_query_dataset6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "dataset", + "rows", + "total_count", + "returned_count" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "dataset", - "rows", - "total_count", - "returned_count" -]
- Changed
fema_search_disasters6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "declarations", + "total_declarations", + "total_area_rows", + "returned_count" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "declarations", - "total_declarations", - "total_area_rows", - "returned_count" -]
- Changed
fema_search_nfip6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "claims", + "total_count", + "returned_count", + "spilled" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "claims", - "total_count", - "returned_count", - "spilled" -]
1 tool update
- Changed
fema_dataframe_query6 fields changed- changed
Input schema / properties / query / descriptionPrevious 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\"" - added
Output schema / properties / capAdded value: +{ + "description": "The canvas row limit that was applied when the result was capped.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Continuation guidance when capped — how to page the remainder with LIMIT/OFFSET.", + "type": "string" +} - changed
Output schema / properties / rows / descriptionPrevious 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)." - added
Output schema / properties / shownAdded value: +{ + "description": "Number of rows returned in this (capped) response.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the result was capped at the canvas row limit — more rows match than were returned.", + "type": "boolean" +}
1 tool update
- Changed
fema_search_disasters3 fields changed- changed
Output schema / properties / totalCount / descriptionPrevious 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." - added
Output schema / properties / total_declarationsAdded 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" +} - changed
Output schema / requiredPrevious value: -[ - "declarations", - "total_area_rows", - "returned_count" -]New value: +[ + "declarations", + "total_declarations", + "total_area_rows", + "returned_count" +]
1 tool update
- Changed
fema_search_nfip2 fields changed- changed
Input schema / properties / zip_code / descriptionPrevious 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)." - added
Input schema / properties / zip_code / patternAdded value: +"^\\d{5}$"
4 tool updates
- Changed
fema_get_housing_assistance1 field changed- added
Output schema / properties / totalCountAdded value: +{ + "description": "Total owner + renter records available before the per-dataset limit — exceeds the returned count when either dataset was capped.", + "type": "number" +}
- Changed
fema_get_public_assistance1 field changed- added
Output schema / properties / totalCountAdded value: +{ + "description": "Total matching projects before pagination — exceeds returned_count when results were capped at the limit.", + "type": "number" +}
- Changed
fema_query_dataset1 field changed- added
Output schema / properties / totalCountAdded value: +{ + "description": "Total matching records before pagination — exceeds returned_count when results were capped at the limit.", + "type": "number" +}
- Changed
fema_search_disasters1 field changed- added
Output schema / properties / totalCountAdded 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" +}
1 tool update
- Changed
fema_search_nfip5 fields changed- changed
Input schema / properties / county_code / descriptionPrevious 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." - changed
Input schema / properties / limit / descriptionPrevious 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." - changed
Output schema / properties / canvas_id / descriptionPrevious 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." - changed
Output schema / properties / claims / items / properties / county_code / descriptionPrevious 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." - changed
Output schema / properties / truncated / descriptionPrevious 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."
2 tool updates
- Changed
fema_get_disaster1 field changed- changed
Output schema / properties / ia_declared / descriptionPrevious 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."
- Changed
fema_search_disasters4 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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)." - changed
Input schema / properties / offset / descriptionPrevious 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." - changed
Output schema / properties / declarations / items / properties / ia_declared / descriptionPrevious 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." - changed
Output schema / properties / total_area_rows / descriptionPrevious 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."
8 tool updates
- First observed
fema_dataframe_describe - First observed
fema_dataframe_query - First observed
fema_get_disaster - First observed
fema_get_housing_assistance - First observed
fema_get_public_assistance - First observed
fema_query_dataset - First observed
fema_search_disasters - First observed
fema_search_nfip
Related MCP Connectors
Federal disaster declarations, emergencies, and assistance data
FEMA disasters, NOAA weather alerts, USGS earthquakes. 4 tools.
Query US Census Bureau data: demographics, economics, and housing statistics.
OpenFEMA MCP — US Federal Emergency Management Agency open data.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables querying US FEMA open data through natural language, as part of the Pipeworx MCP gateway.48 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables location-aware emergency preparedness planning by providing FEMA hazard risk profiles, disaster declaration history, and combined community context.MIT
- AlicenseAqualityCmaintenanceAn 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.4MIT
- AlicenseNot gradedqualityCmaintenanceEnables querying FEMA's National Flood Hazard Layer for flood hazard zones, base flood elevations, floodways, and other regulatory flood map information via MCP tools.16 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.