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 with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
cyanheads/fema-mcp-server
GitHub Stars
1
Server Listing
fema-mcp-server
Tool DescriptionsA

Average 4.5/5 across 8 of 8 tools scored.

Server CoherenceA
Disambiguation5/5

Each tool has a distinct purpose: search vs get, specific NFIP vs generic OData, and staging/query helpers. Descriptions clarify boundaries, minimizing confusion.

Naming Consistency5/5

All tools follow a consistent 'fema_<verb>_<target>' snake_case pattern (e.g., fema_search_disasters, fema_get_disaster). No mixed conventions or vague verbs.

Tool Count5/5

With 8 tools covering search, retrieval, NFIP claims, generic OData, and data staging, the count is well-scoped for the FEMA data domain without excess or insufficiency.

Completeness4/5

The set covers core workflows (disaster search/details, housing/PA assistance, NFIP search, generic query). Minor gap: detailed NFIP claim records require the generic query with timeout risks, but overall coverage is strong.

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.
Behavior5/5

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

Annotations already declare readOnlyHint and idempotentHint, but the description adds valuable context beyond those: it clarifies that the row count reflects what was actually staged and instructs checking truncated in the prior response to know if the canvas holds the full set. This is meaningful behavioral disclosure that helps the agent interpret results correctly, going beyond the boolean hints.

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?

Each sentence serves a distinct purpose: what the tool does, when to use it, and an important caveat about row counts. The information is front-loaded and compact, with zero filler. It's an optimal length for quick agent comprehension.

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 discovery tool that feeds a query tool, the description covers the essential context: the source of canvas_id, the need for prior staging via fema_search_nfip, the purpose of discovering schemas, and a pitfall (truncation). Since an output schema exists, the description doesn't need to detail return values. 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?

The only parameter canvas_id is fully described in the input schema ('Canvas ID from the fema_search_nfip response'), and schema description coverage is 100%. The description does not add extra semantic detail beyond what the schema provides, so 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 the primary action ('List tables and column schemas'), identifies the resource (DataCanvas staged by fema_search_nfip), and explicitly differentiates from the sibling fema_dataframe_query by positioning itself as a prerequisite. This goes beyond a generic 'describe table' and gives the agent an actionable purpose.

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 provides explicit when-to-use guidance: 'Call this before fema_dataframe_query to discover the exact table name, column names, and DuckDB data types needed to write valid SQL.' It also advises checking the 'truncated' field in the fema_search_nfip response, giving the agent a clear decision point. This is strong usage direction that directly influences tool selection order.

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.
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true; the description aligns with and reinforces those, adding no contradiction. It contributes beyond the annotations by spelling out exactly which statements are blocked ('DDL, DML, COPY, and file-reading functions'), which is genuinely useful operational context an agent wouldn't otherwise know. The row-cap behavior is mentioned but lives in the schema's query param rather than the description.

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 tight sentences with no filler: purpose, capabilities, prerequisite, and restrictions. The core operation is front-loaded in the first clause, and every remaining sentence earns its place by adding non-obvious information (the describe-first prerequisite and the blocked-statement list).

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?

For a moderate-complexity SQL tool, the description covers purpose, usage context, the mandatory prerequisite, and safety restrictions. Return format is handled by the output schema and row-limit semantics are in the query param doc. It is complete enough that an agent can call it correctly; a small gap is not stating pagination/limit behavior in the description itself, though the schema covers it.

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 both the query and canvas_id params carry thorough inline descriptions (including an SQL example and row-limit guidance), so the schema does the heavy lifting. The description adds marginal value by steering agents to obtain table/column names from fema_dataframe_describe before writing valid SQL, but this is a light bonus on top of an already-complete schema — baseline 3.

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?

States a specific verb+resource ('Run a read-only SQL SELECT against a DataCanvas table') plus its capabilities (aggregation, GROUP BY, SUM/COUNT, time-series). It names the staging tool (fema_search_nfip) and the prerequisite (fema_dataframe_describe). It implies a distinction from fema_query_dataset via 'without re-fetching from the API', but never explicitly differentiates itself from that closest sibling, which is the main gap.

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?

Clearly defines the use case: local analytical queries over the full NFIP result set without re-fetching, and mandates a call sequence ('Call fema_dataframe_describe first'). What's missing is an explicit when-NOT-to-use statement or named alternative — for instance, when to prefer fema_query_dataset over querying the staged local table is left to inference.

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

fema_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.
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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no results were found.
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.
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, covering safety and external data variability. The description adds behavioral context about the returned data structure (county/ZIP breakdowns, specific data points) without contradicting annotations, so it earns a solid score.

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 two sentences, front-loads the primary purpose, then adds return details and usage hints. Every clause carries weight with no redundancy or filler, making it efficient and easy to parse.

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?

Given the presence of an output schema and 100% parameter schema coverage, the description covers key inputs and usage hints well. It omits explicit pagination behavior (limit/offset), but these are defined in the schema, so the description is adequately complete for calling the tool.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description goes beyond schema by explaining how to use type (select owners/renters/both) and where to get disaster_number, adding meaningful guidance that helps the agent call correctly. This justifies a 4.

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 Individual Assistance (IA) housing data by disaster number, and enumerates the returned data (owner/renter breakdowns, IHP amounts, repair/rental amounts, inspection data). This specific verb+resource distinguishes it from siblings like fema_get_public_assistance, which focuses on a different assistance type.

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 explicitly tells the agent to source disaster_number from fema_search_disasters and to use type for selecting owner/renter scope. However, it does not mention alternatives or when not to use this tool (e.g., public assistance vs housing), leaving some inference to the agent.

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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no results were found.
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.
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds meaningful contextual behavior: it explains that PA projects exist only when the PA program is declared, which is a non-obvious condition that affects result availability. It also clarifies the output's focus on obligated amounts. This goes beyond the annotations without contradicting them.

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 total: the first states purpose and return fields, the second gives selection guidance, the third adds a scoping condition. Every sentence earns its place, no fluff, front-loaded with the core action.

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 all parameters documented, the description fills the remaining gaps: when to use this tool vs alternatives, the mutual exclusivity constraint, and the PA declaration prerequisite. 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.

Parameters5/5

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

Schema coverage is 100% with per-parameter descriptions, yet the description adds the critical constraint that exactly one of disaster_number or state must be provided (a mutual exclusivity not encoded in the schema) and explains the intent of each selector. This is substantial added meaning 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?

The description states a specific verb ('Retrieve'), a resource ('Public Assistance funded project records'), and its scope ('for a disaster or state'). It lists the returned fields and clearly differentiates from siblings by naming fema_search_disasters and explaining the PA program condition. This is unambiguous.

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

Usage Guidelines5/5

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

The description explicitly says 'Either disaster_number or state must be provided' and gives when-to-use guidance for each parameter: disaster_number to scope to a single declaration, state to browse all projects. It also notes the prerequisite that PA must be declared (pa_declared: true), which is a key usage constraint.

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 OpenFEMA v2 dataset — the escape hatch for datasets the convenience tools do not cover (e.g., FimaNfipPolicies, IndividualAssistanceHousingRegistrantsLargeDisasters, FemaWebDeclarationAreas, PublicAssistanceApplicants). Accepts raw OData filter, select, orderby, and pagination parameters. For NFIP Policies, use propertyState (not state) as the state field — always include a county or ZIP filter to avoid timeout. The dataset name must match the exact OpenFEMA v2 entity name (case-sensitive, e.g., FimaNfipClaims). Unknown dataset names return an unknown_dataset error.

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 v2 dataset entity name (case-sensitive, e.g., FimaNfipPolicies, 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 when no results were found.
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.
Behavior5/5

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

Annotations already provide readOnlyHint and openWorldHint, but the description adds valuable behavioral disclosures: the exact error returned for unknown dataset names, the timeout risk with NFIP queries, and the need for case-sensitive entity names. This goes beyond what annotations convey, giving agents critical operational knowledge.

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

Conciseness4/5

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

The description is moderately long but every sentence carries actionable information: purpose, examples, specific tips, and error behavior. It is front-loaded with the primary purpose and then provides necessary caveats. Slightly longer than ideal, but no fluff.

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 all critical operational aspects: what it does, when to use it, dataset-specific gotchas, error behavior, and performance warnings. The output schema exists, so return values are documented. Nothing essential is missing 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 all six parameters with clear descriptions and examples. The description adds minor context like the propertyState nuance for filters, but this is more about data model quirks than the parameters themselves. No significant new meaning is added 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?

The description states a specific verb (query), resource (any OpenFEMA v2 dataset), and clearly positions it as the 'escape hatch' for datasets not covered by convenience tools. It lists concrete dataset examples and distinguishes it from the specialized siblings by framing it as the generic fallback.

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

Usage Guidelines5/5

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

Explicitly tells when to use this tool ('datasets the convenience tools do not cover') and provides dataset-specific guidance, such as using propertyState for NFIP Policies and always including a county or ZIP filter to avoid timeouts. It also warns about case-sensitive dataset names and the unknown_dataset error.

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.

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 declaration date range in ISO 8601 format (e.g., 2024-12-31). Inclusive.
date_fromNoStart of declaration date range in ISO 8601 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.
noticeNoGuidance when no results were found.
totalCountNoTotal unique disaster declarations matching the query — the unit declaration-level pagination pages over. Exceeds returned_count when the matches span more than one page.
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 total_area_rows exceeds 10 000, results are truncated to the most recent 10 000 rows — apply tighter filters to stay within this window.
total_declarationsNoTotal 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.
Behavior5/5

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

Annotations already mark the tool as readOnlyHint and openWorldHint. The description adds behavioral context: deduplication of disaster numbers with designatedAreaCount, and that date filters apply to declaration date. This goes beyond the annotations and clearly sets expectations for return shape and filter behavior.

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 efficient, about 110 words, with every sentence contributing. It front-loads the main purpose and filters, then explains deduplication, chaining, and alternative usage. No filler or unnecessary detail.

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 has 8 parameters, a comprehensive schema, annotations, and an output schema, the description covers all necessary aspects: purpose, filters, deduplication, chaining, and alternative usage. It does not need to restate return values since an output schema exists, but it still mentions designatedAreaCount as a useful detail.

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 fully documents each parameter. The description adds value by clarifying the declaration_type meanings (DR, EM, FM) and describing the deduplication behavior, though some parameter descriptions are repeated from the schema. Overall it enriches understanding without redundancy.

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 clear verb ('Search') and resource ('federal disaster declarations') with specific filter dimensions (state, incident type, declaration type, date range, county). It distinguishes itself from fema_get_disaster by noting this returns summaries and that fema_get_disaster retrieves all designated-area rows for a specific declaration.

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?

Provides explicit when-to-use and when-not-to: says to use fema_get_disaster for full designated-area rows, explains the chain key usage for related tools, and clarifies declaration_type values (DR, EM, FM). Also notes date filters apply to declaration date, guiding appropriate filter semantics.

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 claim counts, amounts paid on building and contents, flood zones, and loss years. state is required — the full NFIP dataset is 2.7 million rows; unfiltered access is prohibited. When DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb) and results exceed the inline preview, the full result set is staged on a canvas for SQL aggregation via fema_dataframe_query. Use fema_dataframe_describe to inspect the staged table schema before writing SQL. Without canvas, results are returned inline up to the limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum 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.
stateYesTwo-letter US state code (required). NFIP dataset is 2.7M rows — state filter is mandatory.
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. Omit to create a fresh canvas. The response returns the canvas_id to pass to fema_dataframe_query.
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.
claimsNoInline preview of claim records (first N rows). Full dataset available via canvas_id when spilled=true.
noticeNoGuidance on canvas usage or result scope.
spilledNoTrue when the full result set was staged on DataCanvas; use canvas_id + fema_dataframe_query for SQL analysis. False when all results fit inline.
canvas_idNoCanvas ID for the staged full result set. Pass to fema_dataframe_query and fema_dataframe_describe. Present only when spilled=true.
truncatedNoTrue 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.
total_countNoTotal matching claims in the filtered dataset before the limit.
canvas_tableNoDuckDB table name on the canvas holding all fetched rows. Reference in SQL FROM clauses. Present when spilled=true.
returned_countNoNumber of claim records in the inline preview.
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint. The description adds important behavior beyond annotations: the staging of full results on a canvas when DataCanvas is enabled, the inline preview limit behavior, and the prohibition of unfiltered access. This gives the agent a clear mental model of result delivery and constraints without contradicting 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.

Conciseness4/5

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

The description is 3 sentences, well-structured: first states purpose, second imposes constraint, third explains canvas behavior and alternatives. Every sentence earns its place; it is concise without omitting critical workflow details. Slight length is justified by the complexity of the canvas integration.

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?

The description covers the essential workflow: required filters, output fields, canvas staging for large results, and how to interact with staged data. Given the output schema exists and annotations cover safety (readOnly), there is no major missing context. It does not explain pagination or error handling, but these are typically implicit and not critical for a search tool.

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% with detailed descriptions for every parameter (limit, state, year_to, zip_code, canvas_id, year_from, county_code). The description reinforces the mandatory state requirement and explains the rationale (2.7M rows), but does not add new parameter semantics beyond what the schema already provides. Baseline 3 is appropriate since schema does the heavy lifting.

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 searches NFIP claims data with specific filters (state, county, ZIP, year range) and lists the output fields (claim counts, amounts paid, flood zones, loss years). It is distinct from sibling tools by focusing specifically on NFIP claims, and the required state filter is highlighted.

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?

Provides clear context on when to use the canvas workflow (when DataCanvas is enabled and results exceed inline preview), explicitly directing the agent to fema_dataframe_query for aggregation and fema_dataframe_describe for schema inspection. It states the mandatory state filter due to dataset size, but does not explicitly compare with other FEMA dataset tools, though the NFIP focus is implicitly exclusive.

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

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Servers

  • A
    license
    Not graded
    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.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP server that queries FEMA's National Flood Hazard Layer (NFHL) for flood zone information, including flood zone codes, Base Flood Elevation, FIRM panel numbers, and identifies LOMRs/LOMAs from provided coordinates, enabling automated flood risk lookups.
  • F
    license
    Not graded
    quality
    C
    maintenance
    Remote MCP server exposing US Census (ACS 5-year) and FEMA flood data. Works as a connector in both Claude and ChatGPT.

View all MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.