Skip to main content
Glama

Server Details

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

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.9% over 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

A4.3/5.0

Scored across 8 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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 tools
fema_dataframe_describeDescribe FEMA DataCanvas TablesA
Read-onlyIdempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
canvas_idYesCanvas ID from the fema_search_nfip response.

Output Schema

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

TDQS

A4.3/5.0
Behavior4/5

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

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

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

Conciseness5/5

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

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

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

Completeness5/5

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

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

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

Parameters3/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines4/5

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

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

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

fema_dataframe_queryQuery FEMA DataCanvas TableA
Read-onlyIdempotent
Inspect

Run a read-only SQL SELECT against a DataCanvas table staged by fema_search_nfip. Enables aggregation, GROUP BY, SUM/COUNT, time-series, and filtered analysis over the full NFIP claims result without re-fetching from the API. Call fema_dataframe_describe first to get the exact table name and column names needed for valid SQL. Only SELECT statements are allowed — DDL, DML, COPY, and file-reading functions are blocked.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSQL SELECT statement to run against the staged table. Use the table name from fema_dataframe_describe. Results are capped at the canvas row limit; 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_idYesCanvas ID from the fema_search_nfip response (the canvas_id field).

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe canvas row limit that was applied when the result was capped.
rowsNoResult 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).
errorNoPresent when the call failed. Absent on success.
shownNoNumber of rows returned in this (capped) response.
noticeNoContinuation guidance when capped — how to page the remainder with LIMIT/OFFSET.
canvas_idNoCanvas ID that was queried — reuse for follow-up queries.
row_countNoNumber of rows in this response (may be capped at the canvas row limit).
truncatedNoTrue when the result was capped at the canvas row limit — more rows match than were returned.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DetailsA
Read-only
Inspect

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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
stateNoTwo-letter state/territory code.
titleNoOfficial declaration title (e.g., "SEVERE STORMS AND FLOODING").
hm_declaredNoTrue when Hazard Mitigation grants were declared.
ia_declaredNoTrue when the Individuals and Households Program (IHP) was declared — indicates IA housing/personal grants are available.
pa_declaredNoTrue when Public Assistance (infrastructure recovery grants) was declared.
incident_typeNoType of incident (e.g., Flood, Hurricane, Severe Storm).
disaster_numberNoFEMA disaster number — use as the chain key for PA and housing assistance tools.
declaration_dateNoISO 8601 date the declaration was signed.
declaration_typeNoDeclaration type: DR (major disaster), EM (emergency), or FM (fire management).
designated_areasNoAll counties/municipalities designated for assistance under this declaration.
incident_end_dateNoISO 8601 end date of the incident. Absent for ongoing or unrecorded incidents.
incident_begin_dateNoISO 8601 start date of the incident. Absent when not recorded.
designated_area_countNoTotal number of designated areas in this declaration.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DataA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoWhich housing assistance dataset to query: owners, renters, or both (default).both
limitNoMaximum records per dataset to return (default 100).
stateNoTwo-letter state code to narrow results when a disaster spans multiple states.
offsetNoPagination offset (default 0).
disaster_numberYesFEMA disaster number. Obtain from fema_search_disasters. Numbers above 32767 match no declaration.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoPaging guidance when offset is at or past the end of a queried dataset — names its total and last valid offset.
ownersNoHomeowner (HousingAssistanceOwners) records. Empty when type is "renters" or no owner data exists.
rentersNoRenter (HousingAssistanceRenters) records. Empty when type is "owners" or no renter data exists.
totalCountNoTotal owner + renter records available before the per-dataset limit — exceeds the returned count when either dataset was capped.
owners_countNoTotal owner records available before the per-dataset limit.
renters_countNoTotal renter records available before the per-dataset limit.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 ProjectsA
Read-only
Inspect

Retrieve Public Assistance (PA) funded project records for a disaster or state — shows where federal recovery money was obligated. Returns applicant, damage category, project size and status, federal share obligated, and total obligated amounts. Either disaster_number or state must be provided. Use disaster_number (from fema_search_disasters) to scope to a single declaration, or state to browse all PA projects for a state. PA projects are created only when the PA program is declared (pa_declared: true on the disaster).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of projects to return (1–1000, default 100).
stateNoTwo-letter state code to browse all PA projects for a state.
countyNoFilter by county name substring.
offsetNoPagination offset (default 0).
disaster_numberNoFEMA disaster number to scope results to a single declaration. Numbers above 32767 match no declaration.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoPaging guidance when offset is at or past the end of the matching projects — names the total and the last valid offset.
projectsNoPublic assistance funded project records.
totalCountNoTotal matching projects before pagination — exceeds returned_count when results were capped at the limit.
total_countNoTotal matching projects before pagination.
returned_countNoNumber of projects in this response.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DatasetA
Read-only
Inspect

Generic OData query against any dataset in the OpenFEMA dataset catalog — the escape hatch for datasets the convenience tools do not cover (e.g., NfipPolicies, IndividualAssistanceHousingRegistrantsLargeDisasters, FemaWebDeclarationAreas, PublicAssistanceApplicants). Accepts raw OData filter, select, orderby, and pagination parameters. For NfipPolicies, use propertyState (not state) for the state and reportedZipCode for the ZIP code — it has no countyCode; always include a ZIP filter to avoid timeout. The dataset name must match the exact OpenFEMA entity name (case-sensitive, e.g., NfipClaims). Names missing from the catalog return an unknown_dataset error; a listed dataset OpenFEMA does not serve through the API returns dataset_not_served.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum records to return (1–10000, default 100).
filterNoOData $filter expression (e.g., "state eq 'TX' and declarationDate ge '2024-01-01T00:00:00.000Z'"). String values in single quotes.
offsetNoPagination offset (default 0).
selectNoComma-separated field names to return (e.g., "disasterNumber,state,declarationDate").
datasetYesOpenFEMA dataset entity name (case-sensitive, e.g., NfipPolicies, FemaWebDeclarationAreas, PublicAssistanceApplicants).
orderbyNoOData $orderby expression (e.g., "declarationDate desc").

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsNoRecords returned from the dataset. Field names depend on the queried dataset.
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance on an empty page — filter advice when nothing matches, or the total and last valid offset when offset is at or past the end.
datasetNoThe dataset that was queried.
totalCountNoTotal matching records before pagination — exceeds returned_count when results were capped at the limit.
total_countNoTotal matching records before pagination.
returned_countNoNumber of records in this response.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DeclarationsA
Read-only
Inspect

Search federal disaster declarations by state, incident type, declaration type, date range, and county. Returns deduplicated declaration-level summaries — each disaster number appears once with a 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of unique disaster declarations to return (1–1000, default 50).
stateNoTwo-letter US state/territory code (e.g., TX, CA, FL, PR). Filters by state.
countyNoFilter by designated area / county name substring (e.g., Harris, Los Angeles). Case-insensitive.
offsetNoPagination offset in declarations (default 0). Use with limit to page through results.
date_toNoEnd of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-12-31). Inclusive.
date_fromNoStart of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-01-01). Inclusive.
incident_typeNoIncident type filter (e.g., Flood, Hurricane, Tornado, Fire, Earthquake, Severe Storm). Case-insensitive substring match.
declaration_typeNoDeclaration type: DR (major disaster declaration), EM (emergency declaration), FM (fire management assistance declaration).

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoPaging 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.
truncatedNoTrue when more than 10,000 designated-area rows match: the search covers only the declarations dated after the day its 10,000-row window ends. Each returned declaration is complete, the totals are lower bounds, and the notice names the date_to that continues with older declarations. Absent otherwise.
totalCountNoUnique disaster declarations matching the query — the unit declaration-level pagination pages over. Exceeds returned_count when the matches span more than one page. A lower bound when truncated is true.
declarationsNoDisaster declarations matching the search, one entry per unique disaster number.
returned_countNoNumber of unique deduplicated declarations in this response.
total_area_rowsNoTotal matching designated-area rows from the API (raw row count, not declaration count). DisasterDeclarationsSummaries returns one row per designated area per disaster, so this is always ≥ the number of unique declarations. When it exceeds 10,000, the search reads the most recent 10,000 rows and drops the declarations dated on the oldest day among them, so every returned declaration is complete; the notice names the date_to that continues with older declarations.
total_declarationsNoUnique disaster declarations matching the query, before offset/limit paging — the bound for declaration-level pagination (limit/offset apply to declarations, not area rows). A lower bound when truncated is true: it counts only the declarations dated after the day the 10,000-row window ends.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ClaimsA
Read-only
Inspect

Search National Flood Insurance Program (NFIP) claims data by state, county, ZIP code, and year range. Returns the matching claim count and claim records — amounts paid on building and contents, damage estimates, flood zones, cause and occupancy codes, and loss dates — newest loss first. state is required — the full NFIP dataset is 2.7 million rows; unfiltered access is prohibited. Page the inline claims with limit and offset; a page holds at most 100,000 characters of claims. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum claims to return inline (1–10000, default 1000). A page also stops at 100,000 characters of claims (roughly 330 claims); when either bound leaves matching claims out, 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.
stateYesTwo-letter US state code (required). NFIP dataset is 2.7M rows — state filter is mandatory.
offsetNoPagination offset into the matching claims, ordered newest date of loss first (default 0). 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_toNoEnd year of loss, inclusive (e.g., 2023).
zip_codeNoZIP code to narrow results to a specific area (5-digit, e.g., 77002).
canvas_idNoOptional canvas ID from a prior call, to stage this match as another table on that canvas. Used only when the match is staged; omit it to stage on a fresh canvas. Pass the returned canvas_id to fema_dataframe_describe for the table columns, then to fema_dataframe_query for SQL.
year_fromNoStart year of loss, inclusive (e.g., 2020).
county_codeNoCounty 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

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
claimsNoClaims from offset onward, newest date of loss first, bounded by limit and 100,000 characters of claims. When spilled=true, canvas_table holds the staged match.
noticeNoPaging 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.
spilledNoTrue when the match exceeded the inline budget and was staged on DataCanvas: call fema_dataframe_describe, then fema_dataframe_query, with canvas_id. False when nothing was staged.
canvas_idNoCanvas ID for the staged match. Pass to fema_dataframe_describe and fema_dataframe_query. Present only when spilled=true.
truncatedNoTrue when the 50,000-row canvas cap was reached: canvas_table holds staged_count of the total_count matching claims. Apply tighter filters (county_code, zip_code, year range) to stage the complete set.
total_countNoClaims matching the filters, as counted by OpenFEMA — before offset, limit, and the canvas row cap.
canvas_tableNoDuckDB table on the canvas holding the staged claims. List its columns with fema_dataframe_describe, then reference it in fema_dataframe_query FROM clauses. Present only when spilled=true.
staged_countNoClaims staged on canvas_table: the whole match, or its first 50,000 when truncated=true. Present only when spilled=true.
returned_countNoNumber of claim records in claims.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updates
    • Changedfema_get_housing_assistance13 fields changed
      • changedOutput schema / properties / owners / items / properties / approved_for_fema_assistance / description
        Previous value: -"Number of homeowner registrations approved for any FEMA assistance. Absent when zero or not reported."New value: +"Number of homeowner registrations approved for any FEMA assistance; 0 when none were. Absent when not reported."
      • changedOutput schema / properties / owners / items / properties / other_needs_amount / description
        Previous value: -"Other needs assistance (personal property, transportation, etc.) in USD. Absent when zero or not reported."New value: +"Other needs assistance (personal property, transportation, etc.) in USD; 0 when none was approved. Absent when not reported."
      • changedOutput schema / properties / owners / items / properties / rental_amount / description
        Previous value: -"Rental assistance granted in USD. Absent when zero or not reported."New value: +"Rental assistance granted in USD; 0 when none was. Absent when not reported."
      • changedOutput schema / properties / owners / items / properties / repair_replace_amount / description
        Previous value: -"Home repair and replacement assistance in USD. Absent when zero or not reported."New value: +"Home repair and replacement assistance in USD; 0 when none was approved. Absent when not reported."
      • changedOutput schema / properties / owners / items / properties / total_approved_ihp_amount / description
        Previous value: -"Total Individuals and Households Program (IHP) assistance approved in USD. Absent when zero or not reported."New value: +"Total Individuals and Households Program (IHP) assistance approved in USD; 0 when none was. Absent when not reported."
      • changedOutput schema / properties / owners / items / properties / valid_registrations / description
        Previous value: -"Number of valid IA registrations from homeowners in this area. Absent when zero or not reported."New value: +"Number of valid IA registrations from homeowners in this area. Absent when not reported."
      • changedOutput schema / properties / owners / items / properties / zip_code / description
        Previous value: -"5-digit ZIP code. Absent when not recorded."New value: +"5-digit ZIP code; 00000 when OpenFEMA files the records under no ZIP code. Absent when not recorded."
      • changedOutput schema / properties / renters / items / properties / approved_for_fema_assistance / description
        Previous value: -"Number of renter registrations approved for any FEMA assistance. Absent when zero or not reported."New value: +"Number of renter registrations approved for any FEMA assistance; 0 when none were. Absent when not reported."
      • changedOutput schema / properties / renters / items / properties / other_needs_amount / description
        Previous value: -"Other needs assistance in USD. Absent when zero or not reported."New value: +"Other needs assistance in USD; 0 when none was approved. Absent when not reported."
      • changedOutput schema / properties / renters / items / properties / rental_amount / description
        Previous value: -"Rental assistance granted in USD. Absent when zero or not reported."New value: +"Rental assistance granted in USD; 0 when none was. Absent when not reported."
      • changedOutput schema / properties / renters / items / properties / total_approved_ihp_amount / description
        Previous value: -"Total IHP assistance approved for renters in USD. Absent when zero or not reported."New value: +"Total IHP assistance approved for renters in USD; 0 when none was. Absent when not reported."
      • changedOutput schema / properties / renters / items / properties / valid_registrations / description
        Previous value: -"Number of valid IA registrations from renters in this area. Absent when zero or not reported."New value: +"Number of valid IA registrations from renters in this area. Absent when not reported."
      • changedOutput schema / properties / renters / items / properties / zip_code / description
        Previous value: -"5-digit ZIP code. Absent when not recorded."New value: +"5-digit ZIP code; 00000 when OpenFEMA files the records under no ZIP code. Absent when not recorded."
    • Changedfema_get_public_assistance2 fields changed
      • changedOutput schema / properties / projects / items / properties / federal_share_obligated / description
        Previous value: -"Federal dollars obligated for this project in USD. Absent before obligation."New value: +"Federal dollars obligated for this project in USD; 0 when nothing is obligated."
      • changedOutput schema / properties / projects / items / properties / total_obligated / description
        Previous value: -"Total obligated amount across all funding sources in USD. Absent before obligation."New value: +"Total obligated amount across all funding sources in USD; 0 when nothing is obligated."
    • Changedfema_query_dataset2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `unknown_dataset`: The dataset name is not in the OpenFEMA dataset catalog, or OpenFEMA has no endpoint for it. `catalog_unavailable`: The OpenFEMA dataset catalog could not be read, so the dataset API version is unknown. `invalid_filter`: OpenFEMA rejected the filter expression — an unknown field, a value of the wrong type or range, or unparseable syntax. `invalid_select`: OpenFEMA rejected the select list — an unknown field or unparseable syntax. `invalid_orderby`: OpenFEMA rejected the orderby expression — an unknown field or unparseable syntax. `invalid_odata_syntax`: OpenFEMA could not parse the request and did not say whether filter, select, or orderby was at fault. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_dataset`: The dataset name is not in the OpenFEMA dataset catalog. `dataset_not_served`: The OpenFEMA dataset catalog lists the dataset, but OpenFEMA answers its API endpoint with a 404 page. `catalog_unavailable`: The OpenFEMA dataset catalog could not be read, so the dataset API version is unknown. `invalid_filter`: OpenFEMA rejected the filter expression — an unknown field, a value of the wrong type or range, or unparseable syntax. `invalid_select`: OpenFEMA rejected the select list — an unknown field or unparseable syntax. `invalid_orderby`: OpenFEMA rejected the orderby expression — an unknown field or unparseable syntax. `invalid_odata_syntax`: OpenFEMA could not parse the request and did not say whether filter, select, or orderby was at fault. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "unknown_dataset",
        -  "catalog_unavailable",
        -  "invalid_filter",
        -  "invalid_select",
        -  "invalid_orderby",
        -  "invalid_odata_syntax"
        -]New value: +[
        +  "unknown_dataset",
        +  "dataset_not_served",
        +  "catalog_unavailable",
        +  "invalid_filter",
        +  "invalid_select",
        +  "invalid_orderby",
        +  "invalid_odata_syntax"
        +]
    • Changedfema_search_disasters5 fields changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Paging guidance when offset is at or past the end of the matching declarations — names the total and the last valid offset."New value: +"Paging guidance: when offset is at or past the end of the matching declarations, the total and the last valid offset; when truncated is true, that the totals are lower bounds and the date_to (YYYY-MM-DD) to search next for older declarations."
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total unique disaster declarations matching the query — the unit declaration-level pagination pages over. Exceeds returned_count when the matches span more than one page."New value: +"Unique disaster declarations matching the query — the unit declaration-level pagination pages over. Exceeds returned_count when the matches span more than one page. A lower bound when truncated is true."
      • changedOutput schema / properties / total_area_rows / description
        Previous value: -"Total matching designated-area rows from the API (raw row count, not declaration count). DisasterDeclarationsSummaries returns one row per designated area per disaster, so this is always ≥ the number of unique declarations. When total_area_rows exceeds 10 000, results are truncated to the most recent 10 000 rows — apply tighter filters to stay within this window."New value: +"Total matching designated-area rows from the API (raw row count, not declaration count). DisasterDeclarationsSummaries returns one row per designated area per disaster, so this is always ≥ the number of unique declarations. When it exceeds 10,000, the search reads the most recent 10,000 rows and drops the declarations dated on the oldest day among them, so every returned declaration is complete; the notice names the date_to that continues with older declarations."
      • changedOutput schema / properties / total_declarations / description
        Previous value: -"Total unique disaster declarations matching the query, before offset/limit paging — the bound for declaration-level pagination (limit/offset apply to declarations, not area rows). A floor rather than the exact total when total_area_rows hits the 10,000-row overfetch cap."New value: +"Unique disaster declarations matching the query, before offset/limit paging — the bound for declaration-level pagination (limit/offset apply to declarations, not area rows). A lower bound when truncated is true: it counts only the declarations dated after the day the 10,000-row window ends."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when more than 10,000 designated-area rows match: the search covers only the declarations dated after the day its 10,000-row window ends. Each returned declaration is complete, the totals are lower bounds, and the notice names the date_to that continues with older declarations. Absent otherwise.",
        +  "type": "boolean"
        +}
    • Changedfema_search_nfip16 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"Optional canvas ID from a prior call. Omit to create a fresh canvas. The response returns the canvas_id to pass to fema_dataframe_query."New value: +"Optional canvas ID from a prior call, to stage this match as another table on that canvas. Used only when the match is staged; omit it to stage on a fresh canvas. Pass the returned canvas_id to fema_dataframe_describe for the table columns, then to fema_dataframe_query for SQL."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum claim rows to return in the inline preview (1–10000, default 1000). When DataCanvas is enabled, the canvas stages the full matching result set regardless of this value."New value: +"Maximum claims to return inline (1–10000, default 1000). A page also stops at 100,000 characters of claims (roughly 330 claims); when either bound leaves matching claims out, the notice names the offset to continue from. When DataCanvas is enabled and the match exceeds that character budget, a call at offset 0 stages the match on a canvas regardless of this value."
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Pagination offset into the matching claims, ordered newest date of loss first (default 0). Use with limit to page through a match. Only a call at offset 0 stages a match on a canvas; a later offset returns just its inline page. After a spill (spilled=true), read rows past the inline claims from the canvas table with fema_dataframe_query.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"Canvas ID for the staged full result set. Pass to fema_dataframe_query and fema_dataframe_describe. Present only when spilled=true."New value: +"Canvas ID for the staged match. Pass to fema_dataframe_describe and fema_dataframe_query. Present only when spilled=true."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"DuckDB table name on the canvas holding all fetched rows. Reference in SQL FROM clauses. Present when spilled=true."New value: +"DuckDB table on the canvas holding the staged claims. List its columns with fema_dataframe_describe, then reference it in fema_dataframe_query FROM clauses. Present only when spilled=true."
      • changedOutput schema / properties / claims / description
        Previous value: -"Inline preview of claim records (first N rows). Full dataset available via canvas_id when spilled=true."New value: +"Claims from offset onward, newest date of loss first, bounded by limit and 100,000 characters of claims. When spilled=true, canvas_table holds the staged match."
      • changedOutput schema / properties / claims / items / properties / amount_paid_building / description
        Previous value: -"NFIP claim payment for the building structure in USD. Absent when zero or not recorded."New value: +"NFIP claim payment for the building structure in USD; 0 when the claim paid nothing on the building. Absent when not recorded."
      • changedOutput schema / properties / claims / items / properties / amount_paid_contents / description
        Previous value: -"NFIP claim payment for contents (personal property) in USD. Absent when zero or not recorded."New value: +"NFIP claim payment for contents (personal property) in USD; 0 when the claim paid nothing on contents. Absent when not recorded."
      • changedOutput schema / properties / claims / items / properties / cause_of_damage / description
        Previous value: -"Primary cause of the flood damage (e.g., \"Flooding\", \"Tidal Overflow\"). Absent when not recorded."New value: +"OpenFEMA cause-of-damage code, as published: 0 other causes; 1 tidal water overflow; 2 stream, river, or lake overflow; 3 alluvial fan overflow; 4 accumulation of rainfall or snowmelt; 7 erosion-demolition; 8 erosion-removal; 9 earth movement, landslide, land subsidence, sinkholes, etc.; A closed basin lake; B expedited claim handling without site inspection; C expedited claim handling follow-up site inspection; D expedited claim handling by the Adjusting Process Pilot Program (remote adjustment). Other values pass through unchanged. Absent when not recorded."
      • changedOutput schema / properties / claims / items / properties / occupancy_type / description
        Previous value: -"NFIP occupancy type code (e.g., 1=Single Family, 2=2-4 Family, 6=Non-Residential). Absent when not recorded."New value: +"NFIP occupancy type code, as published. Legacy codes: 1 single-family residence; 2 residential building with 2 to 4 units; 3 residential building with more than 4 units; 4 non-residential building; 6 non-residential business. Risk Rating 2.0 codes: 11 single-family residential building (except a mobile home or a single unit within a multi-unit building); 12 residential non-condo building with 2 to 4 units, insuring all units; 13 residential non-condo building with 5 or more units, insuring all units; 14 residential mobile or manufactured home; 15 residential condo association building; 16 single residential unit within a multi-unit building; 17 non-residential mobile or manufactured home; 18 non-residential building; 19 non-residential unit within a multi-unit building. Other values pass through unchanged. Absent when not recorded."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance on canvas usage or result scope."New value: +"Paging and canvas guidance: the offset to continue from when claims were left out, the last valid offset when offset is past the end, or the canvas table and dataframe tools after a spill."
      • changedOutput schema / properties / returned_count / description
        Previous value: -"Number of claim records in the inline preview."New value: +"Number of claim records in claims."
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when the full result set was staged on DataCanvas; use canvas_id + fema_dataframe_query for SQL analysis. False when all results fit inline."New value: +"True when the match exceeded the inline budget and was staged on DataCanvas: call fema_dataframe_describe, then fema_dataframe_query, with canvas_id. False when nothing was staged."
      • addedOutput schema / properties / staged_count
        Added value: +{
        +  "description": "Claims staged on canvas_table: the whole match, or its first 50,000 when truncated=true. Present only when spilled=true.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / total_count / description
        Previous value: -"Total matching claims in the filtered dataset before the limit."New value: +"Claims matching the filters, as counted by OpenFEMA — before offset, limit, and the canvas row cap."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the canvas row cap (50,000) was reached before the full matching set was staged — the canvas holds a partial result. Apply tighter filters (county_code, zip_code, year range) to stage the complete set."New value: +"True when the 50,000-row canvas cap was reached: canvas_table holds staged_count of the total_count matching claims. Apply tighter filters (county_code, zip_code, year range) to stage the complete set."
  2. 4 tool updates
    • Changedfema_get_housing_assistance4 fields changed
      • changedInput schema / properties / disaster_number / description
        Previous value: -"FEMA disaster number. Obtain from fema_search_disasters."New value: +"FEMA disaster number. Obtain from fema_search_disasters. Numbers above 32767 match no declaration."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `no_results`: No IA housing records found for this disaster. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `not_found`: The disaster number is above 32767, the highest number OpenFEMA holds, so no declaration exists. `no_results`: No IA housing records found for this disaster. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_state",
        -  "no_results"
        -]New value: +[
        +  "invalid_state",
        +  "not_found",
        +  "no_results"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no results were found."New value: +"Paging guidance when offset is at or past the end of a queried dataset — names its total and last valid offset."
    • Changedfema_get_public_assistance4 fields changed
      • changedInput schema / properties / disaster_number / description
        Previous value: -"FEMA disaster number to scope results to a single declaration."New value: +"FEMA disaster number to scope results to a single declaration. Numbers above 32767 match no declaration."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `missing_filter`: Neither disaster_number nor state was provided. `no_results`: No PA project records found for the given filters. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `missing_filter`: Neither disaster_number nor state was provided. `not_found`: The disaster number is above 32767, the highest number OpenFEMA holds, so no declaration exists. `no_results`: No PA project records found for the given filters. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_state",
        -  "missing_filter",
        -  "no_results"
        -]New value: +[
        +  "invalid_state",
        +  "missing_filter",
        +  "not_found",
        +  "no_results"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no results were found."New value: +"Paging guidance when offset is at or past the end of the matching projects — names the total and the last valid offset."
    • Changedfema_query_dataset4 fields changed
      • changedInput schema / properties / dataset / description
        Previous value: -"OpenFEMA v2 dataset entity name (case-sensitive, e.g., FimaNfipPolicies, FemaWebDeclarationAreas, PublicAssistanceApplicants)."New value: +"OpenFEMA dataset entity name (case-sensitive, e.g., NfipPolicies, FemaWebDeclarationAreas, PublicAssistanceApplicants)."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `unknown_dataset`: Dataset name not recognized by the OpenFEMA API. `invalid_filter`: OData filter expression could not be parsed by the API. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_dataset`: The dataset name is not in the OpenFEMA dataset catalog, or OpenFEMA has no endpoint for it. `catalog_unavailable`: The OpenFEMA dataset catalog could not be read, so the dataset API version is unknown. `invalid_filter`: OpenFEMA rejected the filter expression — an unknown field, a value of the wrong type or range, or unparseable syntax. `invalid_select`: OpenFEMA rejected the select list — an unknown field or unparseable syntax. `invalid_orderby`: OpenFEMA rejected the orderby expression — an unknown field or unparseable syntax. `invalid_odata_syntax`: OpenFEMA could not parse the request and did not say whether filter, select, or orderby was at fault. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "unknown_dataset",
        -  "invalid_filter"
        -]New value: +[
        +  "unknown_dataset",
        +  "catalog_unavailable",
        +  "invalid_filter",
        +  "invalid_select",
        +  "invalid_orderby",
        +  "invalid_odata_syntax"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no results were found."New value: +"Guidance on an empty page — filter advice when nothing matches, or the total and last valid offset when offset is at or past the end."
    • Changedfema_search_disasters7 fields changed
      • addedInput schema / properties / date_from / anyOf
        Added value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Calendar date, YYYY-MM-DD.",
        +    "format": "date",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / date_from / description
        Previous value: -"Start of declaration date range in ISO 8601 format (e.g., 2024-01-01). Inclusive."New value: +"Start of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-01-01). Inclusive."
      • removedInput schema / properties / date_from / type
        Removed value: -"string"
      • addedInput schema / properties / date_to / anyOf
        Added value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Calendar date, YYYY-MM-DD.",
        +    "format": "date",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / date_to / description
        Previous value: -"End of declaration date range in ISO 8601 format (e.g., 2024-12-31). Inclusive."New value: +"End of the declaration date range as a calendar date in YYYY-MM-DD format (e.g., 2024-12-31). Inclusive."
      • removedInput schema / properties / date_to / type
        Removed value: -"string"
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no results were found."New value: +"Paging guidance when offset is at or past the end of the matching declarations — names the total and the last valid offset."
  3. 3 tool updates
    • Changedfema_dataframe_describe1 field changed
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"^[A-Za-z0-9_-]{10}$"
    • Changedfema_dataframe_query3 fields changed
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"^[A-Za-z0-9_-]{10}$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `canvas_unavailable`: DataCanvas is disabled on this deployment (CANVAS_PROVIDER_TYPE is not set to duckdb). `invalid_query`: The SQL statement is not a valid SELECT, references a non-existent table or column, or uses blocked operations. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `sql_execution_error`: A SELECT fails while converting or calculating values in the staged data. `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `canvas_unavailable`: DataCanvas is disabled on this deployment (CANVAS_PROVIDER_TYPE is not set to duckdb). `invalid_query`: The SQL statement is not a valid SELECT, references a non-existent table or column, or uses blocked operations. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "canvas_not_found",
        -  "canvas_unavailable",
        -  "invalid_query"
        -]New value: +[
        +  "sql_execution_error",
        +  "canvas_not_found",
        +  "canvas_unavailable",
        +  "invalid_query"
        +]
    • Changedfema_search_nfip1 field changed
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"^[A-Za-z0-9_-]{10}$"
  4. 8 tool updates
    • Changedfema_dataframe_describe6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "tables",
        +      "canvas_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `canvas_unavailable`: DataCanvas is disabled on this deployment (CANVAS_PROVIDER_TYPE is not set to duckdb). Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_not_found",
        +            "canvas_unavailable"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "tables",
        -  "canvas_id"
        -]
    • Changedfema_dataframe_query6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "rows",
        +      "row_count",
        +      "canvas_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `canvas_unavailable`: DataCanvas is disabled on this deployment (CANVAS_PROVIDER_TYPE is not set to duckdb). `invalid_query`: The SQL statement is not a valid SELECT, references a non-existent table or column, or uses blocked operations. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_not_found",
        +            "canvas_unavailable",
        +            "invalid_query"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "rows",
        -  "row_count",
        -  "canvas_id"
        -]
    • Changedfema_get_disaster6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "disaster_number",
        +      "title",
        +      "state",
        +      "incident_type",
        +      "declaration_type",
        +      "declaration_date",
        +      "ia_declared",
        +      "pa_declared",
        +      "hm_declared",
        +      "designated_areas",
        +      "designated_area_count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: No declaration found with the given disaster number. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "disaster_number",
        -  "title",
        -  "state",
        -  "incident_type",
        -  "declaration_type",
        -  "declaration_date",
        -  "ia_declared",
        -  "pa_declared",
        -  "hm_declared",
        -  "designated_areas",
        -  "designated_area_count"
        -]
    • Changedfema_get_housing_assistance6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "owners",
        +      "renters",
        +      "owners_count",
        +      "renters_count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `no_results`: No IA housing records found for this disaster. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_state",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "owners",
        -  "renters",
        -  "owners_count",
        -  "renters_count"
        -]
    • Changedfema_get_public_assistance6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "projects",
        +      "total_count",
        +      "returned_count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `missing_filter`: Neither disaster_number nor state was provided. `no_results`: No PA project records found for the given filters. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_state",
        +            "missing_filter",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "projects",
        -  "total_count",
        -  "returned_count"
        -]
    • Changedfema_query_dataset6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "dataset",
        +      "rows",
        +      "total_count",
        +      "returned_count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `unknown_dataset`: Dataset name not recognized by the OpenFEMA API. `invalid_filter`: OData filter expression could not be parsed by the API. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "unknown_dataset",
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "dataset",
        -  "rows",
        -  "total_count",
        -  "returned_count"
        -]
    • Changedfema_search_disasters6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "declarations",
        +      "total_declarations",
        +      "total_area_rows",
        +      "returned_count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `no_results`: Query returned zero disaster declarations. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_state",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "declarations",
        -  "total_declarations",
        -  "total_area_rows",
        -  "returned_count"
        -]
    • Changedfema_search_nfip6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "claims",
        +      "total_count",
        +      "returned_count",
        +      "spilled"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_state`: The state parameter is not a valid 2-letter US state/territory code. `no_results`: Query returned zero matching NFIP claims. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_state",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "claims",
        -  "total_count",
        -  "returned_count",
        -  "spilled"
        -]
  5. 1 tool update
    • Changedfema_dataframe_query6 fields changed
      • changedInput schema / properties / query / description
        Previous value: -"SQL SELECT statement to run against the staged table. Use the table name from fema_dataframe_describe. Example: \"SELECT year_of_loss, COUNT(*) AS claims, SUM(amount_paid_building) AS total_building_paid FROM df_nfip_abc123 GROUP BY year_of_loss ORDER BY year_of_loss\""New value: +"SQL SELECT statement to run against the staged table. Use the table name from fema_dataframe_describe. Results are capped at the canvas row limit; append LIMIT/OFFSET to page through additional rows, or aggregate (GROUP BY, COUNT, SUM) to summarize the full set in one query. Example: \"SELECT year_of_loss, COUNT(*) AS claims, SUM(amount_paid_building) AS total_building_paid FROM df_nfip_abc123 GROUP BY year_of_loss ORDER BY year_of_loss\""
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The canvas row limit that was applied when the result was capped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Continuation guidance when capped — how to page the remainder with LIMIT/OFFSET.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / rows / description
        Previous value: -"All rows returned by the query."New value: +"Result rows from the query. May be capped at the canvas row limit — when the truncated enrichment field is set, page the remainder with LIMIT/OFFSET (see the notice guidance)."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of rows returned in this (capped) response.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the result was capped at the canvas row limit — more rows match than were returned.",
        +  "type": "boolean"
        +}
  6. 1 tool update
    • Changedfema_search_disasters3 fields changed
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total matching designated-area rows from the API — exceeds the returned declaration count when results were capped at the overfetch limit."New value: +"Total unique disaster declarations matching the query — the unit declaration-level pagination pages over. Exceeds returned_count when the matches span more than one page."
      • addedOutput schema / properties / total_declarations
        Added value: +{
        +  "description": "Total unique disaster declarations matching the query, before offset/limit paging — the bound for declaration-level pagination (limit/offset apply to declarations, not area rows). A floor rather than the exact total when total_area_rows hits the 10,000-row overfetch cap.",
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "declarations",
        -  "total_area_rows",
        -  "returned_count"
        -]New value: +[
        +  "declarations",
        +  "total_declarations",
        +  "total_area_rows",
        +  "returned_count"
        +]
  7. 1 tool update
    • Changedfema_search_nfip2 fields changed
      • changedInput schema / properties / zip_code / description
        Previous value: -"ZIP code to narrow results to a specific area."New value: +"ZIP code to narrow results to a specific area (5-digit, e.g., 77002)."
      • addedInput schema / properties / zip_code / pattern
        Added value: +"^\\d{5}$"
  8. 4 tool updates
    • Changedfema_get_housing_assistance1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total owner + renter records available before the per-dataset limit — exceeds the returned count when either dataset was capped.",
        +  "type": "number"
        +}
    • Changedfema_get_public_assistance1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total matching projects before pagination — exceeds returned_count when results were capped at the limit.",
        +  "type": "number"
        +}
    • Changedfema_query_dataset1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total matching records before pagination — exceeds returned_count when results were capped at the limit.",
        +  "type": "number"
        +}
    • Changedfema_search_disasters1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total matching designated-area rows from the API — exceeds the returned declaration count when results were capped at the overfetch limit.",
        +  "type": "number"
        +}
  9. 1 tool update
    • Changedfema_search_nfip5 fields changed
      • changedInput schema / properties / county_code / description
        Previous value: -"County code to narrow results within the state (e.g., 201 for Harris County TX). Use with state."New value: +"County code to narrow results within the state. Accepts the full 5-digit state+county FIPS (e.g., 48201 for Harris County TX) or the 3-digit county portion (e.g., 201) when state is provided — the server prepends the state FIPS automatically."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum rows to fetch (1–10000, default 1000)."New value: +"Maximum claim rows to return in the inline preview (1–10000, default 1000). When DataCanvas is enabled, the canvas stages the full matching result set regardless of this value."
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"Canvas ID for the staged full result set. Pass to fema_dataframe_query and fema_dataframe_describe. Present when canvas is enabled."New value: +"Canvas ID for the staged full result set. Pass to fema_dataframe_query and fema_dataframe_describe. Present only when spilled=true."
      • changedOutput schema / properties / claims / items / properties / county_code / description
        Previous value: -"County code (e.g., 201 for Harris County TX). Absent when not recorded."New value: +"5-digit state+county FIPS code (e.g., 48201 for Harris County TX). Absent when not recorded."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the canvas row cap (50,000) was reached before all matching rows were staged. Apply tighter filters (county_code, zip_code, year range) for a complete set."New value: +"True when the canvas row cap (50,000) was reached before the full matching set was staged — the canvas holds a partial result. Apply tighter filters (county_code, zip_code, year range) to stage the complete set."
  10. 2 tool updates
    • Changedfema_get_disaster1 field changed
      • changedOutput schema / properties / ia_declared / description
        Previous value: -"True when Individual Assistance (housing/personal grants) was declared."New value: +"True when the Individuals and Households Program (IHP) was declared — indicates IA housing/personal grants are available."
    • Changedfema_search_disasters4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of declarations to return (1–1000, default 50)."New value: +"Maximum number of unique disaster declarations to return (1–1000, default 50)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default 0). Use with limit for paging through results."New value: +"Pagination offset in declarations (default 0). Use with limit to page through results."
      • changedOutput schema / properties / declarations / items / properties / ia_declared / description
        Previous value: -"True when Individual Assistance (housing/personal grants) was declared."New value: +"True when the Individuals and Households Program (IHP) was declared — indicates IA housing/personal grants are available."
      • changedOutput schema / properties / total_area_rows / description
        Previous value: -"Total matching designated-area rows from the API before pagination. DisasterDeclarationsSummaries returns one row per designated area per disaster — this count is higher than the number of unique declarations in `declarations`."New value: +"Total matching designated-area rows from the API (raw row count, not declaration count). DisasterDeclarationsSummaries returns one row per designated area per disaster, so this is always ≥ the number of unique declarations. When total_area_rows exceeds 10 000, results are truncated to the most recent 10 000 rows — apply tighter filters to stay within this window."
  11. 8 tool updates
    • First observedfema_dataframe_describe
    • First observedfema_dataframe_query
    • First observedfema_get_disaster
    • First observedfema_get_housing_assistance
    • First observedfema_get_public_assistance
    • First observedfema_query_dataset
    • First observedfema_search_disasters
    • First observedfema_search_nfip

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables location-aware emergency preparedness planning by providing FEMA hazard risk profiles, disaster declaration history, and combined community context.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    An MCP server that exposes real US flood insurance claims data from FEMA's OpenFEMA API, providing tools for claim lookup, filtered search, aggregate stats, and flood event summaries.
    4
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.