@cyanheads/fema-mcp-server 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +360 -0
- package/CLAUDE.md +360 -0
- package/Dockerfile +100 -0
- package/LICENSE +201 -0
- package/README.md +340 -0
- package/changelog/0.1.x/0.1.1.md +41 -0
- package/changelog/template.md +127 -0
- package/dist/config/server-config.d.ts +9 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +22 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/fema-disaster.resource.d.ts +9 -0
- package/dist/mcp-server/resources/definitions/fema-disaster.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/fema-disaster.resource.js +59 -0
- package/dist/mcp-server/resources/definitions/fema-disaster.resource.js.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-dataframe-describe.tool.d.ts +27 -0
- package/dist/mcp-server/tools/definitions/fema-dataframe-describe.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-dataframe-describe.tool.js +99 -0
- package/dist/mcp-server/tools/definitions/fema-dataframe-describe.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-dataframe-query.tool.d.ts +25 -0
- package/dist/mcp-server/tools/definitions/fema-dataframe-query.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-dataframe-query.tool.js +87 -0
- package/dist/mcp-server/tools/definitions/fema-dataframe-query.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-get-disaster.tool.d.ts +33 -0
- package/dist/mcp-server/tools/definitions/fema-get-disaster.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-get-disaster.tool.js +142 -0
- package/dist/mcp-server/tools/definitions/fema-get-disaster.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-get-housing-assistance.tool.d.ts +53 -0
- package/dist/mcp-server/tools/definitions/fema-get-housing-assistance.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-get-housing-assistance.tool.js +246 -0
- package/dist/mcp-server/tools/definitions/fema-get-housing-assistance.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-get-public-assistance.tool.d.ts +45 -0
- package/dist/mcp-server/tools/definitions/fema-get-public-assistance.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-get-public-assistance.tool.js +210 -0
- package/dist/mcp-server/tools/definitions/fema-get-public-assistance.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-query-dataset.tool.d.ts +32 -0
- package/dist/mcp-server/tools/definitions/fema-query-dataset.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-query-dataset.tool.js +128 -0
- package/dist/mcp-server/tools/definitions/fema-query-dataset.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-search-disasters.tool.d.ts +50 -0
- package/dist/mcp-server/tools/definitions/fema-search-disasters.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-search-disasters.tool.js +281 -0
- package/dist/mcp-server/tools/definitions/fema-search-disasters.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-search-nfip.tool.d.ts +38 -0
- package/dist/mcp-server/tools/definitions/fema-search-nfip.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/fema-search-nfip.tool.js +307 -0
- package/dist/mcp-server/tools/definitions/fema-search-nfip.tool.js.map +1 -0
- package/dist/services/canvas/canvas-accessor.d.ts +9 -0
- package/dist/services/canvas/canvas-accessor.d.ts.map +1 -0
- package/dist/services/canvas/canvas-accessor.js +11 -0
- package/dist/services/canvas/canvas-accessor.js.map +1 -0
- package/dist/services/openfema/openfema-service.d.ts +52 -0
- package/dist/services/openfema/openfema-service.d.ts.map +1 -0
- package/dist/services/openfema/openfema-service.js +157 -0
- package/dist/services/openfema/openfema-service.js.map +1 -0
- package/dist/services/openfema/types.d.ts +139 -0
- package/dist/services/openfema/types.d.ts.map +1 -0
- package/dist/services/openfema/types.js +6 -0
- package/dist/services/openfema/types.js.map +1 -0
- package/package.json +105 -0
- package/server.json +99 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool: fema_query_dataset — generic OData query against any OpenFEMA v2 dataset.
|
|
3
|
+
* @module mcp-server/tools/definitions/fema-query-dataset
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { getOpenFemaService } from '../../../services/openfema/openfema-service.js';
|
|
8
|
+
export const femaQueryDataset = tool('fema_query_dataset', {
|
|
9
|
+
title: 'Query Any OpenFEMA Dataset',
|
|
10
|
+
description: 'Generic OData query against any OpenFEMA v2 dataset — the escape hatch for datasets the ' +
|
|
11
|
+
'convenience tools do not cover (e.g., FimaNfipPolicies, IndividualAssistanceHousingRegistrantsLargeDisasters, ' +
|
|
12
|
+
'FemaWebDeclarationAreas, PublicAssistanceApplicants). ' +
|
|
13
|
+
'Accepts raw OData filter, select, orderby, and pagination parameters. ' +
|
|
14
|
+
'For NFIP Policies, use propertyState (not state) as the state field — always include a county or ZIP filter ' +
|
|
15
|
+
'to avoid timeout. ' +
|
|
16
|
+
'The dataset name must match the exact OpenFEMA v2 entity name (case-sensitive, e.g., FimaNfipClaims). ' +
|
|
17
|
+
'Unknown dataset names return an unknown_dataset error.',
|
|
18
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
19
|
+
input: z.object({
|
|
20
|
+
dataset: z
|
|
21
|
+
.string()
|
|
22
|
+
.min(1)
|
|
23
|
+
.describe('OpenFEMA v2 dataset entity name (case-sensitive, e.g., FimaNfipPolicies, FemaWebDeclarationAreas, PublicAssistanceApplicants).'),
|
|
24
|
+
filter: z
|
|
25
|
+
.string()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("OData $filter expression (e.g., \"state eq 'TX' and declarationDate ge '2024-01-01T00:00:00.000Z'\"). String values in single quotes."),
|
|
28
|
+
select: z
|
|
29
|
+
.string()
|
|
30
|
+
.optional()
|
|
31
|
+
.describe('Comma-separated field names to return (e.g., "disasterNumber,state,declarationDate").'),
|
|
32
|
+
orderby: z
|
|
33
|
+
.string()
|
|
34
|
+
.optional()
|
|
35
|
+
.describe('OData $orderby expression (e.g., "declarationDate desc").'),
|
|
36
|
+
limit: z
|
|
37
|
+
.number()
|
|
38
|
+
.int()
|
|
39
|
+
.min(1)
|
|
40
|
+
.max(10000)
|
|
41
|
+
.default(100)
|
|
42
|
+
.describe('Maximum records to return (1–10000, default 100).'),
|
|
43
|
+
offset: z.number().int().min(0).default(0).describe('Pagination offset (default 0).'),
|
|
44
|
+
}),
|
|
45
|
+
output: z.object({
|
|
46
|
+
dataset: z.string().describe('The dataset that was queried.'),
|
|
47
|
+
rows: z
|
|
48
|
+
.array(z
|
|
49
|
+
.object({})
|
|
50
|
+
.passthrough()
|
|
51
|
+
.describe('A single record from the queried dataset. Field names and types vary by dataset.'))
|
|
52
|
+
.describe('Records returned from the dataset. Field names depend on the queried dataset.'),
|
|
53
|
+
total_count: z.number().describe('Total matching records before pagination.'),
|
|
54
|
+
returned_count: z.number().describe('Number of records in this response.'),
|
|
55
|
+
}),
|
|
56
|
+
enrichment: {
|
|
57
|
+
notice: z.string().optional().describe('Guidance when no results were found.'),
|
|
58
|
+
},
|
|
59
|
+
errors: [
|
|
60
|
+
{
|
|
61
|
+
reason: 'unknown_dataset',
|
|
62
|
+
code: JsonRpcErrorCode.NotFound,
|
|
63
|
+
when: 'Dataset name not recognized — API returned HTML 404 instead of JSON.',
|
|
64
|
+
recovery: 'Check the exact dataset entity name at https://www.fema.gov/about/openfema/data-sets. Names are case-sensitive (e.g., FimaNfipClaims not fimaNfipClaims).',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
reason: 'invalid_filter',
|
|
68
|
+
code: JsonRpcErrorCode.InvalidParams,
|
|
69
|
+
when: 'OData filter expression could not be parsed by the API.',
|
|
70
|
+
recovery: 'Fix the OData $filter syntax. String values must use single quotes. Check field names against the dataset schema at the FEMA OpenFEMA portal.',
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
async handler(input, ctx) {
|
|
74
|
+
const svc = getOpenFemaService();
|
|
75
|
+
// The service's fetchDataset will throw with reason 'unknown_dataset' or 'invalid_filter'
|
|
76
|
+
// when the API returns the appropriate error shapes — those bubble unchanged.
|
|
77
|
+
const { rows, count } = await svc.fetchDataset(input.dataset, {
|
|
78
|
+
...(input.filter ? { filter: input.filter } : {}),
|
|
79
|
+
...(input.select ? { select: input.select } : {}),
|
|
80
|
+
...(input.orderby ? { orderby: input.orderby } : {}),
|
|
81
|
+
top: input.limit,
|
|
82
|
+
skip: input.offset,
|
|
83
|
+
}, ctx);
|
|
84
|
+
if (rows.length === 0) {
|
|
85
|
+
ctx.enrich.notice(`No records found in dataset "${input.dataset}" with the given filters. Check field names and filter syntax.`);
|
|
86
|
+
}
|
|
87
|
+
ctx.log.info('Generic dataset query complete', {
|
|
88
|
+
dataset: input.dataset,
|
|
89
|
+
count,
|
|
90
|
+
returned: rows.length,
|
|
91
|
+
});
|
|
92
|
+
return {
|
|
93
|
+
dataset: input.dataset,
|
|
94
|
+
rows,
|
|
95
|
+
total_count: count,
|
|
96
|
+
returned_count: rows.length,
|
|
97
|
+
};
|
|
98
|
+
},
|
|
99
|
+
format: (result) => {
|
|
100
|
+
const lines = [];
|
|
101
|
+
lines.push(`**${result.returned_count} of ${result.total_count} records** from \`${result.dataset}\`\n`);
|
|
102
|
+
if (result.rows.length === 0) {
|
|
103
|
+
lines.push('_No records returned._');
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
const headers = Object.keys(result.rows[0] ?? {});
|
|
107
|
+
if (headers.length > 0 && result.rows.length <= 50) {
|
|
108
|
+
lines.push(`| ${headers.join(' | ')} |`);
|
|
109
|
+
lines.push(`| ${headers.map(() => '---').join(' | ')} |`);
|
|
110
|
+
for (const row of result.rows) {
|
|
111
|
+
const cells = headers.map((h) => String(row[h] ?? ''));
|
|
112
|
+
lines.push(`| ${cells.join(' | ')} |`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
for (const row of result.rows) {
|
|
117
|
+
const parts = Object.entries(row)
|
|
118
|
+
.slice(0, 6)
|
|
119
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
120
|
+
.join(' | ');
|
|
121
|
+
lines.push(parts);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=fema-query-dataset.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fema-query-dataset.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/fema-query-dataset.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool: fema_search_disasters — search federal disaster declarations.
|
|
3
|
+
* @module mcp-server/tools/definitions/fema-search-disasters
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
export declare const femaSearchDisasters: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
|
+
state: z.ZodOptional<z.ZodString>;
|
|
9
|
+
incident_type: z.ZodOptional<z.ZodString>;
|
|
10
|
+
declaration_type: z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
FM: "FM";
|
|
12
|
+
DR: "DR";
|
|
13
|
+
EM: "EM";
|
|
14
|
+
}>>;
|
|
15
|
+
date_from: z.ZodOptional<z.ZodString>;
|
|
16
|
+
date_to: z.ZodOptional<z.ZodString>;
|
|
17
|
+
county: z.ZodOptional<z.ZodString>;
|
|
18
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
19
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
20
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
21
|
+
declarations: z.ZodArray<z.ZodObject<{
|
|
22
|
+
disaster_number: z.ZodNumber;
|
|
23
|
+
title: z.ZodString;
|
|
24
|
+
state: z.ZodString;
|
|
25
|
+
incident_type: z.ZodString;
|
|
26
|
+
declaration_type: z.ZodString;
|
|
27
|
+
declaration_date: z.ZodString;
|
|
28
|
+
incident_begin_date: z.ZodOptional<z.ZodString>;
|
|
29
|
+
incident_end_date: z.ZodOptional<z.ZodString>;
|
|
30
|
+
ia_declared: z.ZodBoolean;
|
|
31
|
+
pa_declared: z.ZodBoolean;
|
|
32
|
+
hm_declared: z.ZodBoolean;
|
|
33
|
+
designated_area_count: z.ZodNumber;
|
|
34
|
+
}, z.core.$strip>>;
|
|
35
|
+
total_area_rows: z.ZodNumber;
|
|
36
|
+
returned_count: z.ZodNumber;
|
|
37
|
+
}, z.core.$strip>, readonly [{
|
|
38
|
+
readonly reason: "invalid_state";
|
|
39
|
+
readonly code: JsonRpcErrorCode.InvalidParams;
|
|
40
|
+
readonly when: "The state parameter is not a valid 2-letter US state/territory code.";
|
|
41
|
+
readonly recovery: "Provide a valid 2-letter US state code such as TX, CA, FL, or PR. Check the full list at FEMA.gov.";
|
|
42
|
+
}, {
|
|
43
|
+
readonly reason: "no_results";
|
|
44
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
45
|
+
readonly when: "Query returned zero disaster declarations.";
|
|
46
|
+
readonly recovery: "Broaden the search by removing filters, expanding the date range, or trying a different state or incident type.";
|
|
47
|
+
}], {
|
|
48
|
+
readonly notice: z.ZodOptional<z.ZodString>;
|
|
49
|
+
}>;
|
|
50
|
+
//# sourceMappingURL=fema-search-disasters.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fema-search-disasters.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/fema-search-disasters.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAkEjE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwQ9B,CAAC"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool: fema_search_disasters — search federal disaster declarations.
|
|
3
|
+
* @module mcp-server/tools/definitions/fema-search-disasters
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { escapeODataString, getOpenFemaService } from '../../../services/openfema/openfema-service.js';
|
|
8
|
+
/** Valid US state/territory abbreviations accepted by OpenFEMA. */
|
|
9
|
+
const US_STATES = new Set([
|
|
10
|
+
'AL',
|
|
11
|
+
'AK',
|
|
12
|
+
'AZ',
|
|
13
|
+
'AR',
|
|
14
|
+
'CA',
|
|
15
|
+
'CO',
|
|
16
|
+
'CT',
|
|
17
|
+
'DE',
|
|
18
|
+
'FL',
|
|
19
|
+
'GA',
|
|
20
|
+
'HI',
|
|
21
|
+
'ID',
|
|
22
|
+
'IL',
|
|
23
|
+
'IN',
|
|
24
|
+
'IA',
|
|
25
|
+
'KS',
|
|
26
|
+
'KY',
|
|
27
|
+
'LA',
|
|
28
|
+
'ME',
|
|
29
|
+
'MD',
|
|
30
|
+
'MA',
|
|
31
|
+
'MI',
|
|
32
|
+
'MN',
|
|
33
|
+
'MS',
|
|
34
|
+
'MO',
|
|
35
|
+
'MT',
|
|
36
|
+
'NE',
|
|
37
|
+
'NV',
|
|
38
|
+
'NH',
|
|
39
|
+
'NJ',
|
|
40
|
+
'NM',
|
|
41
|
+
'NY',
|
|
42
|
+
'NC',
|
|
43
|
+
'ND',
|
|
44
|
+
'OH',
|
|
45
|
+
'OK',
|
|
46
|
+
'OR',
|
|
47
|
+
'PA',
|
|
48
|
+
'RI',
|
|
49
|
+
'SC',
|
|
50
|
+
'SD',
|
|
51
|
+
'TN',
|
|
52
|
+
'TX',
|
|
53
|
+
'UT',
|
|
54
|
+
'VT',
|
|
55
|
+
'VA',
|
|
56
|
+
'WA',
|
|
57
|
+
'WV',
|
|
58
|
+
'WI',
|
|
59
|
+
'WY',
|
|
60
|
+
'DC',
|
|
61
|
+
'PR',
|
|
62
|
+
'VI',
|
|
63
|
+
'GU',
|
|
64
|
+
'AS',
|
|
65
|
+
'MP',
|
|
66
|
+
'FM',
|
|
67
|
+
'MH',
|
|
68
|
+
'PW',
|
|
69
|
+
]);
|
|
70
|
+
export const femaSearchDisasters = tool('fema_search_disasters', {
|
|
71
|
+
title: 'Search FEMA Disaster Declarations',
|
|
72
|
+
description: 'Search federal disaster declarations by state, incident type, declaration type, date range, and county. ' +
|
|
73
|
+
'Returns deduplicated declaration-level summaries — each disaster number appears once with a ' +
|
|
74
|
+
'designatedAreaCount showing how many counties/municipalities were designated. ' +
|
|
75
|
+
'The disaster number is the chain key for fema_get_disaster, fema_get_public_assistance, and fema_get_housing_assistance. ' +
|
|
76
|
+
'Use declaration_type to filter: DR (major disaster, most common), EM (emergency), FM (fire management). ' +
|
|
77
|
+
'Date filters apply to the declaration date. Use fema_get_disaster to retrieve all designated-area rows for a specific declaration.',
|
|
78
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
79
|
+
input: z.object({
|
|
80
|
+
state: z
|
|
81
|
+
.string()
|
|
82
|
+
.length(2)
|
|
83
|
+
.toUpperCase()
|
|
84
|
+
.optional()
|
|
85
|
+
.describe('Two-letter US state/territory code (e.g., TX, CA, FL, PR). Filters by state.'),
|
|
86
|
+
incident_type: z
|
|
87
|
+
.string()
|
|
88
|
+
.optional()
|
|
89
|
+
.describe('Incident type filter (e.g., Flood, Hurricane, Tornado, Fire, Earthquake, Severe Storm). Case-insensitive substring match.'),
|
|
90
|
+
declaration_type: z
|
|
91
|
+
.enum(['DR', 'EM', 'FM'])
|
|
92
|
+
.optional()
|
|
93
|
+
.describe('Declaration type: DR (major disaster declaration), EM (emergency declaration), FM (fire management assistance declaration).'),
|
|
94
|
+
date_from: z
|
|
95
|
+
.string()
|
|
96
|
+
.optional()
|
|
97
|
+
.describe('Start of declaration date range in ISO 8601 format (e.g., 2024-01-01). Inclusive.'),
|
|
98
|
+
date_to: z
|
|
99
|
+
.string()
|
|
100
|
+
.optional()
|
|
101
|
+
.describe('End of declaration date range in ISO 8601 format (e.g., 2024-12-31). Inclusive.'),
|
|
102
|
+
county: z
|
|
103
|
+
.string()
|
|
104
|
+
.optional()
|
|
105
|
+
.describe('Filter by designated area / county name substring (e.g., Harris, Los Angeles). Case-insensitive.'),
|
|
106
|
+
limit: z
|
|
107
|
+
.number()
|
|
108
|
+
.int()
|
|
109
|
+
.min(1)
|
|
110
|
+
.max(1000)
|
|
111
|
+
.default(50)
|
|
112
|
+
.describe('Maximum number of declarations to return (1–1000, default 50).'),
|
|
113
|
+
offset: z
|
|
114
|
+
.number()
|
|
115
|
+
.int()
|
|
116
|
+
.min(0)
|
|
117
|
+
.default(0)
|
|
118
|
+
.describe('Pagination offset (default 0). Use with limit for paging through results.'),
|
|
119
|
+
}),
|
|
120
|
+
output: z.object({
|
|
121
|
+
declarations: z
|
|
122
|
+
.array(z
|
|
123
|
+
.object({
|
|
124
|
+
disaster_number: z
|
|
125
|
+
.number()
|
|
126
|
+
.describe('Unique FEMA disaster number — pass to fema_get_disaster, fema_get_public_assistance, or fema_get_housing_assistance.'),
|
|
127
|
+
title: z
|
|
128
|
+
.string()
|
|
129
|
+
.describe('Official declaration title (e.g., "SEVERE STORMS AND FLOODING").'),
|
|
130
|
+
state: z.string().describe('Two-letter state/territory code.'),
|
|
131
|
+
incident_type: z
|
|
132
|
+
.string()
|
|
133
|
+
.describe('Type of incident (e.g., Flood, Hurricane, Tornado, Severe Storm).'),
|
|
134
|
+
declaration_type: z
|
|
135
|
+
.string()
|
|
136
|
+
.describe('Declaration type: DR (major disaster), EM (emergency), or FM (fire management).'),
|
|
137
|
+
declaration_date: z.string().describe('ISO 8601 date the declaration was signed.'),
|
|
138
|
+
incident_begin_date: z
|
|
139
|
+
.string()
|
|
140
|
+
.optional()
|
|
141
|
+
.describe('ISO 8601 incident start date. Absent when not recorded.'),
|
|
142
|
+
incident_end_date: z
|
|
143
|
+
.string()
|
|
144
|
+
.optional()
|
|
145
|
+
.describe('ISO 8601 incident end date. Absent for ongoing or unrecorded incidents.'),
|
|
146
|
+
ia_declared: z
|
|
147
|
+
.boolean()
|
|
148
|
+
.describe('True when Individual Assistance (housing/personal grants) was declared.'),
|
|
149
|
+
pa_declared: z
|
|
150
|
+
.boolean()
|
|
151
|
+
.describe('True when Public Assistance (infrastructure recovery grants) was declared.'),
|
|
152
|
+
hm_declared: z.boolean().describe('True when Hazard Mitigation grants were declared.'),
|
|
153
|
+
designated_area_count: z
|
|
154
|
+
.number()
|
|
155
|
+
.describe('Number of counties/municipalities designated — use fema_get_disaster for the full area list.'),
|
|
156
|
+
})
|
|
157
|
+
.describe('Deduplicated summary for one disaster declaration.'))
|
|
158
|
+
.describe('Disaster declarations matching the search, one entry per unique disaster number.'),
|
|
159
|
+
total_area_rows: z
|
|
160
|
+
.number()
|
|
161
|
+
.describe('Total matching designated-area rows from the API before pagination. ' +
|
|
162
|
+
'DisasterDeclarationsSummaries returns one row per designated area per disaster — ' +
|
|
163
|
+
'this count is higher than the number of unique declarations in `declarations`.'),
|
|
164
|
+
returned_count: z
|
|
165
|
+
.number()
|
|
166
|
+
.describe('Number of unique deduplicated declarations in this response.'),
|
|
167
|
+
}),
|
|
168
|
+
enrichment: {
|
|
169
|
+
notice: z.string().optional().describe('Guidance when no results were found.'),
|
|
170
|
+
},
|
|
171
|
+
errors: [
|
|
172
|
+
{
|
|
173
|
+
reason: 'invalid_state',
|
|
174
|
+
code: JsonRpcErrorCode.InvalidParams,
|
|
175
|
+
when: 'The state parameter is not a valid 2-letter US state/territory code.',
|
|
176
|
+
recovery: 'Provide a valid 2-letter US state code such as TX, CA, FL, or PR. Check the full list at FEMA.gov.',
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
reason: 'no_results',
|
|
180
|
+
code: JsonRpcErrorCode.NotFound,
|
|
181
|
+
when: 'Query returned zero disaster declarations.',
|
|
182
|
+
recovery: 'Broaden the search by removing filters, expanding the date range, or trying a different state or incident type.',
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
async handler(input, ctx) {
|
|
186
|
+
if (input.state && !US_STATES.has(input.state)) {
|
|
187
|
+
throw ctx.fail('invalid_state', `"${input.state}" is not a valid US state/territory code.`, {
|
|
188
|
+
...ctx.recoveryFor('invalid_state'),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
const filterParts = [];
|
|
192
|
+
if (input.state)
|
|
193
|
+
filterParts.push(`state eq '${input.state}'`);
|
|
194
|
+
if (input.incident_type) {
|
|
195
|
+
filterParts.push(`substringof('${escapeODataString(input.incident_type)}', incidentType)`);
|
|
196
|
+
}
|
|
197
|
+
if (input.declaration_type)
|
|
198
|
+
filterParts.push(`declarationType eq '${input.declaration_type}'`);
|
|
199
|
+
if (input.date_from) {
|
|
200
|
+
filterParts.push(`declarationDate ge '${escapeODataString(input.date_from)}T00:00:00.000Z'`);
|
|
201
|
+
}
|
|
202
|
+
if (input.date_to) {
|
|
203
|
+
filterParts.push(`declarationDate le '${escapeODataString(input.date_to)}T23:59:59.999Z'`);
|
|
204
|
+
}
|
|
205
|
+
if (input.county?.trim()) {
|
|
206
|
+
filterParts.push(`substringof('${escapeODataString(input.county)}', designatedArea)`);
|
|
207
|
+
}
|
|
208
|
+
const svc = getOpenFemaService();
|
|
209
|
+
const { rows, count } = await svc.fetchDisasters({
|
|
210
|
+
...(filterParts.length > 0 ? { filter: filterParts.join(' and ') } : {}),
|
|
211
|
+
select: 'disasterNumber,declarationTitle,state,incidentType,declarationType,' +
|
|
212
|
+
'declarationDate,incidentBeginDate,incidentEndDate,' +
|
|
213
|
+
'iaProgramDeclared,paProgramDeclared,hmProgramDeclared',
|
|
214
|
+
orderby: 'declarationDate desc',
|
|
215
|
+
top: input.limit,
|
|
216
|
+
skip: input.offset,
|
|
217
|
+
}, ctx);
|
|
218
|
+
// Deduplicate: group rows by disasterNumber, tracking designatedAreaCount
|
|
219
|
+
const disasterMap = new Map();
|
|
220
|
+
for (const row of rows) {
|
|
221
|
+
const num = row.disasterNumber ?? 0;
|
|
222
|
+
const existing = disasterMap.get(num);
|
|
223
|
+
if (existing) {
|
|
224
|
+
existing.designated_area_count += 1;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
disasterMap.set(num, {
|
|
228
|
+
disaster_number: num,
|
|
229
|
+
title: row.declarationTitle ?? 'Unknown',
|
|
230
|
+
state: row.state ?? '',
|
|
231
|
+
incident_type: row.incidentType ?? '',
|
|
232
|
+
declaration_type: row.declarationType ?? '',
|
|
233
|
+
declaration_date: row.declarationDate ?? '',
|
|
234
|
+
...(row.incidentBeginDate ? { incident_begin_date: row.incidentBeginDate } : {}),
|
|
235
|
+
...(row.incidentEndDate ? { incident_end_date: row.incidentEndDate } : {}),
|
|
236
|
+
ia_declared: row.iaProgramDeclared ?? false,
|
|
237
|
+
pa_declared: row.paProgramDeclared ?? false,
|
|
238
|
+
hm_declared: row.hmProgramDeclared ?? false,
|
|
239
|
+
designated_area_count: 1,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const declarations = Array.from(disasterMap.values());
|
|
244
|
+
if (declarations.length === 0) {
|
|
245
|
+
ctx.enrich.notice(`No disaster declarations matched the search criteria. Try broadening the date range, removing filters, or checking the state code.`);
|
|
246
|
+
throw ctx.fail('no_results', 'No disaster declarations matched the query.', {
|
|
247
|
+
...ctx.recoveryFor('no_results'),
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
ctx.log.info('Disaster search complete', { count, returned: declarations.length });
|
|
251
|
+
return {
|
|
252
|
+
declarations,
|
|
253
|
+
total_area_rows: count,
|
|
254
|
+
returned_count: declarations.length,
|
|
255
|
+
};
|
|
256
|
+
},
|
|
257
|
+
format: (result) => {
|
|
258
|
+
const lines = [];
|
|
259
|
+
lines.push(`**${result.returned_count} unique declaration(s)** (from ${result.total_area_rows} designated-area rows)\n`);
|
|
260
|
+
for (const d of result.declarations) {
|
|
261
|
+
lines.push(`## DR-${d.disaster_number} — ${d.title}`);
|
|
262
|
+
lines.push(`**State:** ${d.state} | **Type:** ${d.declaration_type} | **Incident:** ${d.incident_type}`);
|
|
263
|
+
lines.push(`**Declared:** ${d.declaration_date}`);
|
|
264
|
+
if (d.incident_begin_date) {
|
|
265
|
+
lines.push(`**Period:** ${d.incident_begin_date}${d.incident_end_date ? ` → ${d.incident_end_date}` : ' (ongoing)'}`);
|
|
266
|
+
}
|
|
267
|
+
const programs = [];
|
|
268
|
+
if (d.ia_declared)
|
|
269
|
+
programs.push('IA');
|
|
270
|
+
if (d.pa_declared)
|
|
271
|
+
programs.push('PA');
|
|
272
|
+
if (d.hm_declared)
|
|
273
|
+
programs.push('HM');
|
|
274
|
+
lines.push(`**Programs:** ${programs.length > 0 ? programs.join(', ') : 'None declared'}`);
|
|
275
|
+
lines.push(`**Designated Areas:** ${d.designated_area_count}`);
|
|
276
|
+
lines.push('');
|
|
277
|
+
}
|
|
278
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
//# sourceMappingURL=fema-search-disasters.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fema-search-disasters.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/fema-search-disasters.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool: fema_search_nfip — NFIP flood insurance claims with DataCanvas spillover.
|
|
3
|
+
* @module mcp-server/tools/definitions/fema-search-nfip
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
export declare const femaSearchNfip: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
7
|
+
state: z.ZodString;
|
|
8
|
+
county_code: z.ZodOptional<z.ZodString>;
|
|
9
|
+
zip_code: z.ZodOptional<z.ZodString>;
|
|
10
|
+
year_from: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
year_to: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
13
|
+
canvas_id: z.ZodOptional<z.ZodString>;
|
|
14
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
15
|
+
claims: z.ZodArray<z.ZodObject<{
|
|
16
|
+
state: z.ZodOptional<z.ZodString>;
|
|
17
|
+
county_code: z.ZodOptional<z.ZodString>;
|
|
18
|
+
zip_code: z.ZodOptional<z.ZodString>;
|
|
19
|
+
date_of_loss: z.ZodOptional<z.ZodString>;
|
|
20
|
+
year_of_loss: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
amount_paid_building: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
amount_paid_contents: z.ZodOptional<z.ZodNumber>;
|
|
23
|
+
building_damage_amount: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
contents_damage_amount: z.ZodOptional<z.ZodNumber>;
|
|
25
|
+
rated_flood_zone: z.ZodOptional<z.ZodString>;
|
|
26
|
+
cause_of_damage: z.ZodOptional<z.ZodString>;
|
|
27
|
+
occupancy_type: z.ZodOptional<z.ZodNumber>;
|
|
28
|
+
}, z.core.$strip>>;
|
|
29
|
+
total_count: z.ZodNumber;
|
|
30
|
+
returned_count: z.ZodNumber;
|
|
31
|
+
canvas_id: z.ZodOptional<z.ZodString>;
|
|
32
|
+
canvas_table: z.ZodOptional<z.ZodString>;
|
|
33
|
+
spilled: z.ZodBoolean;
|
|
34
|
+
truncated: z.ZodOptional<z.ZodBoolean>;
|
|
35
|
+
}, z.core.$strip>, undefined, {
|
|
36
|
+
readonly notice: z.ZodOptional<z.ZodString>;
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=fema-search-nfip.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fema-search-nfip.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/fema-search-nfip.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAgCjD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgVzB,CAAC"}
|