@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.
Files changed (65) hide show
  1. package/AGENTS.md +360 -0
  2. package/CLAUDE.md +360 -0
  3. package/Dockerfile +100 -0
  4. package/LICENSE +201 -0
  5. package/README.md +340 -0
  6. package/changelog/0.1.x/0.1.1.md +41 -0
  7. package/changelog/template.md +127 -0
  8. package/dist/config/server-config.d.ts +9 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +22 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +45 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/resources/definitions/fema-disaster.resource.d.ts +9 -0
  17. package/dist/mcp-server/resources/definitions/fema-disaster.resource.d.ts.map +1 -0
  18. package/dist/mcp-server/resources/definitions/fema-disaster.resource.js +59 -0
  19. package/dist/mcp-server/resources/definitions/fema-disaster.resource.js.map +1 -0
  20. package/dist/mcp-server/tools/definitions/fema-dataframe-describe.tool.d.ts +27 -0
  21. package/dist/mcp-server/tools/definitions/fema-dataframe-describe.tool.d.ts.map +1 -0
  22. package/dist/mcp-server/tools/definitions/fema-dataframe-describe.tool.js +99 -0
  23. package/dist/mcp-server/tools/definitions/fema-dataframe-describe.tool.js.map +1 -0
  24. package/dist/mcp-server/tools/definitions/fema-dataframe-query.tool.d.ts +25 -0
  25. package/dist/mcp-server/tools/definitions/fema-dataframe-query.tool.d.ts.map +1 -0
  26. package/dist/mcp-server/tools/definitions/fema-dataframe-query.tool.js +87 -0
  27. package/dist/mcp-server/tools/definitions/fema-dataframe-query.tool.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/fema-get-disaster.tool.d.ts +33 -0
  29. package/dist/mcp-server/tools/definitions/fema-get-disaster.tool.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/fema-get-disaster.tool.js +142 -0
  31. package/dist/mcp-server/tools/definitions/fema-get-disaster.tool.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/fema-get-housing-assistance.tool.d.ts +53 -0
  33. package/dist/mcp-server/tools/definitions/fema-get-housing-assistance.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/fema-get-housing-assistance.tool.js +246 -0
  35. package/dist/mcp-server/tools/definitions/fema-get-housing-assistance.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/fema-get-public-assistance.tool.d.ts +45 -0
  37. package/dist/mcp-server/tools/definitions/fema-get-public-assistance.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/fema-get-public-assistance.tool.js +210 -0
  39. package/dist/mcp-server/tools/definitions/fema-get-public-assistance.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/fema-query-dataset.tool.d.ts +32 -0
  41. package/dist/mcp-server/tools/definitions/fema-query-dataset.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/fema-query-dataset.tool.js +128 -0
  43. package/dist/mcp-server/tools/definitions/fema-query-dataset.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/fema-search-disasters.tool.d.ts +50 -0
  45. package/dist/mcp-server/tools/definitions/fema-search-disasters.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/fema-search-disasters.tool.js +281 -0
  47. package/dist/mcp-server/tools/definitions/fema-search-disasters.tool.js.map +1 -0
  48. package/dist/mcp-server/tools/definitions/fema-search-nfip.tool.d.ts +38 -0
  49. package/dist/mcp-server/tools/definitions/fema-search-nfip.tool.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/definitions/fema-search-nfip.tool.js +307 -0
  51. package/dist/mcp-server/tools/definitions/fema-search-nfip.tool.js.map +1 -0
  52. package/dist/services/canvas/canvas-accessor.d.ts +9 -0
  53. package/dist/services/canvas/canvas-accessor.d.ts.map +1 -0
  54. package/dist/services/canvas/canvas-accessor.js +11 -0
  55. package/dist/services/canvas/canvas-accessor.js.map +1 -0
  56. package/dist/services/openfema/openfema-service.d.ts +52 -0
  57. package/dist/services/openfema/openfema-service.d.ts.map +1 -0
  58. package/dist/services/openfema/openfema-service.js +157 -0
  59. package/dist/services/openfema/openfema-service.js.map +1 -0
  60. package/dist/services/openfema/types.d.ts +139 -0
  61. package/dist/services/openfema/types.d.ts.map +1 -0
  62. package/dist/services/openfema/types.js +6 -0
  63. package/dist/services/openfema/types.js.map +1 -0
  64. package/package.json +105 -0
  65. package/server.json +99 -0
@@ -0,0 +1,246 @@
1
+ /**
2
+ * @fileoverview Tool: fema_get_housing_assistance — IA housing assistance data for a disaster.
3
+ * @module mcp-server/tools/definitions/fema-get-housing-assistance
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 femaGetHousingAssistance = tool('fema_get_housing_assistance', {
9
+ title: 'Get FEMA Housing Assistance Data',
10
+ description: 'Retrieve Individual Assistance (IA) housing data for a disaster by disaster number. ' +
11
+ 'Returns owner and/or renter breakdowns by county and ZIP code — valid registrations, ' +
12
+ 'total approved IHP amounts, repair/rental amounts, and inspection data. ' +
13
+ 'Use type to select owners, renters, or both (default). ' +
14
+ 'IA housing data is only available when ia_declared: true on the disaster (check via fema_get_disaster). ' +
15
+ 'Use disaster_number from fema_search_disasters.',
16
+ annotations: { readOnlyHint: true, openWorldHint: true },
17
+ input: z.object({
18
+ disaster_number: z
19
+ .number()
20
+ .int()
21
+ .positive()
22
+ .describe('FEMA disaster number. Obtain from fema_search_disasters.'),
23
+ state: z
24
+ .string()
25
+ .length(2)
26
+ .toUpperCase()
27
+ .optional()
28
+ .describe('Two-letter state code to narrow results when a disaster spans multiple states.'),
29
+ type: z
30
+ .enum(['owners', 'renters', 'both'])
31
+ .default('both')
32
+ .describe('Which housing assistance dataset to query: owners, renters, or both (default).'),
33
+ limit: z
34
+ .number()
35
+ .int()
36
+ .min(1)
37
+ .max(1000)
38
+ .default(100)
39
+ .describe('Maximum records per dataset to return (default 100).'),
40
+ offset: z.number().int().min(0).default(0).describe('Pagination offset (default 0).'),
41
+ }),
42
+ output: z.object({
43
+ owners: z
44
+ .array(z
45
+ .object({
46
+ disaster_number: z.number().describe('FEMA disaster number this record belongs to.'),
47
+ state: z
48
+ .string()
49
+ .optional()
50
+ .describe('Two-letter state code. Absent when not recorded.'),
51
+ county: z.string().optional().describe('County name. Absent when not recorded.'),
52
+ city: z.string().optional().describe('City name. Absent when not recorded.'),
53
+ zip_code: z.string().optional().describe('5-digit ZIP code. Absent when not recorded.'),
54
+ valid_registrations: z
55
+ .number()
56
+ .optional()
57
+ .describe('Number of valid IA registrations from homeowners in this area. Absent when zero or not reported.'),
58
+ approved_for_fema_assistance: z
59
+ .number()
60
+ .optional()
61
+ .describe('Number of homeowner registrations approved for any FEMA assistance. Absent when zero or not reported.'),
62
+ total_approved_ihp_amount: z
63
+ .number()
64
+ .optional()
65
+ .describe('Total Individuals and Households Program (IHP) assistance approved in USD. Absent when zero or not reported.'),
66
+ repair_replace_amount: z
67
+ .number()
68
+ .optional()
69
+ .describe('Home repair and replacement assistance in USD. Absent when zero or not reported.'),
70
+ rental_amount: z
71
+ .number()
72
+ .optional()
73
+ .describe('Rental assistance granted in USD. Absent when zero or not reported.'),
74
+ other_needs_amount: z
75
+ .number()
76
+ .optional()
77
+ .describe('Other needs assistance (personal property, transportation, etc.) in USD. Absent when zero or not reported.'),
78
+ })
79
+ .describe('Homeowner housing assistance aggregated by county and ZIP for one disaster.'))
80
+ .describe('Homeowner (HousingAssistanceOwners) records. Empty when type is "renters" or no owner data exists.'),
81
+ renters: z
82
+ .array(z
83
+ .object({
84
+ disaster_number: z.number().describe('FEMA disaster number this record belongs to.'),
85
+ state: z
86
+ .string()
87
+ .optional()
88
+ .describe('Two-letter state code. Absent when not recorded.'),
89
+ county: z.string().optional().describe('County name. Absent when not recorded.'),
90
+ city: z.string().optional().describe('City name. Absent when not recorded.'),
91
+ zip_code: z.string().optional().describe('5-digit ZIP code. Absent when not recorded.'),
92
+ valid_registrations: z
93
+ .number()
94
+ .optional()
95
+ .describe('Number of valid IA registrations from renters in this area. Absent when zero or not reported.'),
96
+ approved_for_fema_assistance: z
97
+ .number()
98
+ .optional()
99
+ .describe('Number of renter registrations approved for any FEMA assistance. Absent when zero or not reported.'),
100
+ total_approved_ihp_amount: z
101
+ .number()
102
+ .optional()
103
+ .describe('Total IHP assistance approved for renters in USD. Absent when zero or not reported.'),
104
+ rental_amount: z
105
+ .number()
106
+ .optional()
107
+ .describe('Rental assistance granted in USD. Absent when zero or not reported.'),
108
+ other_needs_amount: z
109
+ .number()
110
+ .optional()
111
+ .describe('Other needs assistance in USD. Absent when zero or not reported.'),
112
+ })
113
+ .describe('Renter housing assistance aggregated by county and ZIP for one disaster.'))
114
+ .describe('Renter (HousingAssistanceRenters) records. Empty when type is "owners" or no renter data exists.'),
115
+ owners_count: z
116
+ .number()
117
+ .describe('Total owner records available before the per-dataset limit.'),
118
+ renters_count: z
119
+ .number()
120
+ .describe('Total renter records available before the per-dataset limit.'),
121
+ }),
122
+ enrichment: {
123
+ notice: z.string().optional().describe('Guidance when no results were found.'),
124
+ },
125
+ errors: [
126
+ {
127
+ reason: 'no_results',
128
+ code: JsonRpcErrorCode.NotFound,
129
+ when: 'No IA housing records found for this disaster.',
130
+ recovery: 'Check that ia_declared is true for this disaster using fema_get_disaster. IA housing data may take weeks to appear after a declaration.',
131
+ },
132
+ ],
133
+ async handler(input, ctx) {
134
+ const svc = getOpenFemaService();
135
+ const baseFilter = [`disasterNumber eq ${input.disaster_number}`];
136
+ if (input.state?.trim()) {
137
+ baseFilter.push(`state eq '${input.state}'`);
138
+ }
139
+ const filter = baseFilter.join(' and ');
140
+ const queryOpts = {
141
+ filter,
142
+ orderby: 'totalApprovedIhpAmount desc',
143
+ top: input.limit,
144
+ skip: input.offset,
145
+ };
146
+ const fetchOwners = input.type === 'owners' || input.type === 'both';
147
+ const fetchRenters = input.type === 'renters' || input.type === 'both';
148
+ const [ownersResult, rentersResult] = await Promise.all([
149
+ fetchOwners ? svc.fetchHousingAssistance('HousingAssistanceOwners', queryOpts, ctx) : null,
150
+ fetchRenters ? svc.fetchHousingAssistance('HousingAssistanceRenters', queryOpts, ctx) : null,
151
+ ]);
152
+ const ownersData = ownersResult?.rows ?? [];
153
+ const rentersData = rentersResult?.rows ?? [];
154
+ const ownersCount = ownersResult?.count ?? 0;
155
+ const rentersCount = rentersResult?.count ?? 0;
156
+ if (ownersData.length === 0 && rentersData.length === 0) {
157
+ ctx.enrich.notice(`No housing assistance records found for DR-${input.disaster_number}. Verify IA was declared via fema_get_disaster.`);
158
+ throw ctx.fail('no_results', `No IA housing records for disaster ${input.disaster_number}.`, {
159
+ disasterNumber: input.disaster_number,
160
+ ...ctx.recoveryFor('no_results'),
161
+ });
162
+ }
163
+ const mapRow = (r) => ({
164
+ disaster_number: r.disasterNumber ?? input.disaster_number,
165
+ ...(r.state ? { state: r.state } : {}),
166
+ ...(r.county ? { county: r.county } : {}),
167
+ ...(r.city ? { city: r.city } : {}),
168
+ ...(r.zipCode ? { zip_code: r.zipCode } : {}),
169
+ ...(r.validRegistrations != null ? { valid_registrations: r.validRegistrations } : {}),
170
+ ...(r.approvedForFemaAssistance != null
171
+ ? { approved_for_fema_assistance: r.approvedForFemaAssistance }
172
+ : {}),
173
+ ...(r.totalApprovedIhpAmount != null
174
+ ? { total_approved_ihp_amount: r.totalApprovedIhpAmount }
175
+ : {}),
176
+ ...(r.repairReplaceAmount != null ? { repair_replace_amount: r.repairReplaceAmount } : {}),
177
+ ...(r.rentalAmount != null ? { rental_amount: r.rentalAmount } : {}),
178
+ ...(r.otherNeedsAmount != null ? { other_needs_amount: r.otherNeedsAmount } : {}),
179
+ });
180
+ ctx.log.info('Housing assistance fetch complete', {
181
+ disasterNumber: input.disaster_number,
182
+ owners: ownersData.length,
183
+ renters: rentersData.length,
184
+ });
185
+ return {
186
+ owners: ownersData.map(mapRow),
187
+ renters: rentersData.map(mapRow),
188
+ owners_count: ownersCount,
189
+ renters_count: rentersCount,
190
+ };
191
+ },
192
+ format: (result) => {
193
+ const lines = [];
194
+ if (result.owners.length > 0) {
195
+ lines.push(`## Owner Assistance (${result.owners.length} of ${result.owners_count} records)`);
196
+ for (const o of result.owners) {
197
+ const loc = [o.county, o.city, o.zip_code].filter(Boolean).join(', ');
198
+ const locLabel = loc || `DR-${o.disaster_number}`;
199
+ lines.push(`### ${locLabel}`);
200
+ if (o.state)
201
+ lines.push(`**State:** ${o.state} | **Disaster:** DR-${o.disaster_number}`);
202
+ if (o.valid_registrations != null)
203
+ lines.push(`**Registrations:** ${o.valid_registrations}`);
204
+ if (o.approved_for_fema_assistance != null)
205
+ lines.push(`**Approved for FEMA Assistance:** ${o.approved_for_fema_assistance}`);
206
+ if (o.total_approved_ihp_amount != null)
207
+ lines.push(`**Total Approved IHP:** $${o.total_approved_ihp_amount.toLocaleString()}`);
208
+ if (o.repair_replace_amount != null)
209
+ lines.push(`**Repair/Replacement:** $${o.repair_replace_amount.toLocaleString()}`);
210
+ if (o.rental_amount != null)
211
+ lines.push(`**Rental Assistance:** $${o.rental_amount.toLocaleString()}`);
212
+ if (o.other_needs_amount != null)
213
+ lines.push(`**Other Needs:** $${o.other_needs_amount.toLocaleString()}`);
214
+ lines.push('');
215
+ }
216
+ }
217
+ if (result.renters.length > 0) {
218
+ lines.push(`## Renter Assistance (${result.renters.length} of ${result.renters_count} records)`);
219
+ for (const r of result.renters) {
220
+ const loc = [r.county, r.city, r.zip_code].filter(Boolean).join(', ');
221
+ const locLabel = loc || `DR-${r.disaster_number}`;
222
+ lines.push(`### ${locLabel}`);
223
+ if (r.state)
224
+ lines.push(`**State:** ${r.state} | **Disaster:** DR-${r.disaster_number}`);
225
+ if (r.valid_registrations != null)
226
+ lines.push(`**Registrations:** ${r.valid_registrations}`);
227
+ if (r.approved_for_fema_assistance != null)
228
+ lines.push(`**Approved for FEMA Assistance:** ${r.approved_for_fema_assistance}`);
229
+ if (r.total_approved_ihp_amount != null)
230
+ lines.push(`**Total Approved IHP:** $${r.total_approved_ihp_amount.toLocaleString()}`);
231
+ if (r.rental_amount != null)
232
+ lines.push(`**Rental Assistance:** $${r.rental_amount.toLocaleString()}`);
233
+ if (r.other_needs_amount != null)
234
+ lines.push(`**Other Needs:** $${r.other_needs_amount.toLocaleString()}`);
235
+ lines.push('');
236
+ }
237
+ }
238
+ if (lines.length === 0) {
239
+ lines.push('No housing assistance records available.');
240
+ lines.push(`owners_count: ${result.owners_count}`);
241
+ lines.push(`renters_count: ${result.renters_count}`);
242
+ }
243
+ return [{ type: 'text', text: lines.join('\n') }];
244
+ },
245
+ });
246
+ //# sourceMappingURL=fema-get-housing-assistance.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fema-get-housing-assistance.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/fema-get-housing-assistance.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @fileoverview Tool: fema_get_public_assistance — PA funded project details for a disaster or state.
3
+ * @module mcp-server/tools/definitions/fema-get-public-assistance
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ export declare const femaGetPublicAssistance: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
8
+ disaster_number: z.ZodOptional<z.ZodNumber>;
9
+ state: z.ZodOptional<z.ZodString>;
10
+ county: z.ZodOptional<z.ZodString>;
11
+ limit: z.ZodDefault<z.ZodNumber>;
12
+ offset: z.ZodDefault<z.ZodNumber>;
13
+ }, z.core.$strip>, z.ZodObject<{
14
+ projects: z.ZodArray<z.ZodObject<{
15
+ disaster_number: z.ZodNumber;
16
+ pw_number: z.ZodOptional<z.ZodNumber>;
17
+ applicant_id: z.ZodOptional<z.ZodString>;
18
+ application_title: z.ZodOptional<z.ZodString>;
19
+ damage_category_code: z.ZodOptional<z.ZodString>;
20
+ damage_category_description: z.ZodOptional<z.ZodString>;
21
+ project_amount: z.ZodOptional<z.ZodNumber>;
22
+ federal_share_obligated: z.ZodOptional<z.ZodNumber>;
23
+ total_obligated: z.ZodOptional<z.ZodNumber>;
24
+ county: z.ZodOptional<z.ZodString>;
25
+ state: z.ZodOptional<z.ZodString>;
26
+ project_status: z.ZodOptional<z.ZodString>;
27
+ project_size: z.ZodOptional<z.ZodString>;
28
+ first_obligation_date: z.ZodOptional<z.ZodString>;
29
+ }, z.core.$strip>>;
30
+ total_count: z.ZodNumber;
31
+ returned_count: z.ZodNumber;
32
+ }, z.core.$strip>, readonly [{
33
+ readonly reason: "missing_filter";
34
+ readonly code: JsonRpcErrorCode.InvalidParams;
35
+ readonly when: "Neither disaster_number nor state was provided.";
36
+ readonly recovery: "Provide at least one of disaster_number (from fema_search_disasters) or state (2-letter code) to scope the query.";
37
+ }, {
38
+ readonly reason: "no_results";
39
+ readonly code: JsonRpcErrorCode.NotFound;
40
+ readonly when: "No PA project records found for the given filters.";
41
+ readonly recovery: "Verify the disaster has PA declared (pa_declared: true via fema_get_disaster) or check the state code. Recent disasters may have incomplete records.";
42
+ }], {
43
+ readonly notice: z.ZodOptional<z.ZodString>;
44
+ }>;
45
+ //# sourceMappingURL=fema-get-public-assistance.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fema-get-public-assistance.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/fema-get-public-assistance.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoOlC,CAAC"}
@@ -0,0 +1,210 @@
1
+ /**
2
+ * @fileoverview Tool: fema_get_public_assistance — PA funded project details for a disaster or state.
3
+ * @module mcp-server/tools/definitions/fema-get-public-assistance
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
+ export const femaGetPublicAssistance = tool('fema_get_public_assistance', {
9
+ title: 'Get FEMA Public Assistance Projects',
10
+ description: 'Retrieve Public Assistance (PA) funded project records for a disaster or state — shows where federal recovery money was obligated. ' +
11
+ 'Returns applicant, damage category, project size and status, federal share obligated, and total obligated amounts. ' +
12
+ 'Either disaster_number or state must be provided. ' +
13
+ 'Use disaster_number (from fema_search_disasters) to scope to a single declaration, or state to browse all PA projects for a state. ' +
14
+ 'PA projects are created only when the PA program is declared (pa_declared: true on the disaster).',
15
+ annotations: { readOnlyHint: true, openWorldHint: true },
16
+ input: z.object({
17
+ disaster_number: z
18
+ .number()
19
+ .int()
20
+ .positive()
21
+ .optional()
22
+ .describe('FEMA disaster number to scope results to a single declaration.'),
23
+ state: z
24
+ .string()
25
+ .length(2)
26
+ .toUpperCase()
27
+ .optional()
28
+ .describe('Two-letter state code to browse all PA projects for a state.'),
29
+ county: z.string().optional().describe('Filter by county name substring.'),
30
+ limit: z
31
+ .number()
32
+ .int()
33
+ .min(1)
34
+ .max(1000)
35
+ .default(100)
36
+ .describe('Maximum number of projects to return (1–1000, default 100).'),
37
+ offset: z.number().int().min(0).default(0).describe('Pagination offset (default 0).'),
38
+ }),
39
+ output: z.object({
40
+ projects: z
41
+ .array(z
42
+ .object({
43
+ disaster_number: z.number().describe('FEMA disaster number this project belongs to.'),
44
+ pw_number: z
45
+ .number()
46
+ .optional()
47
+ .describe('Project Worksheet number assigned by FEMA. Absent when not yet assigned.'),
48
+ applicant_id: z
49
+ .string()
50
+ .optional()
51
+ .describe('FEMA applicant identifier for the recipient organization. Absent when not recorded.'),
52
+ application_title: z
53
+ .string()
54
+ .optional()
55
+ .describe('Name of the applicant organization or project. Absent when not recorded.'),
56
+ damage_category_code: z
57
+ .string()
58
+ .optional()
59
+ .describe('FEMA damage category code (e.g., A=Debris Removal, B=Emergency Protective Measures, C=Roads and Bridges). Absent when unclassified.'),
60
+ damage_category_description: z
61
+ .string()
62
+ .optional()
63
+ .describe('Human-readable name for the damage category code. Absent when unclassified.'),
64
+ project_amount: z
65
+ .number()
66
+ .optional()
67
+ .describe('Total estimated project cost in USD. Absent when not yet determined.'),
68
+ federal_share_obligated: z
69
+ .number()
70
+ .optional()
71
+ .describe('Federal dollars obligated for this project in USD. Absent before obligation.'),
72
+ total_obligated: z
73
+ .number()
74
+ .optional()
75
+ .describe('Total obligated amount across all funding sources in USD. Absent before obligation.'),
76
+ county: z
77
+ .string()
78
+ .optional()
79
+ .describe('County where the project is located. Absent when not recorded.'),
80
+ state: z
81
+ .string()
82
+ .optional()
83
+ .describe('Two-letter state abbreviation. Absent when not recorded.'),
84
+ project_status: z
85
+ .string()
86
+ .optional()
87
+ .describe('Current project status (e.g., Obligated, Closed, In Progress). Absent when not set.'),
88
+ project_size: z
89
+ .string()
90
+ .optional()
91
+ .describe('Project size classification: "small" (≤$1M) or "large" (>$1M). Absent when unclassified.'),
92
+ first_obligation_date: z
93
+ .string()
94
+ .optional()
95
+ .describe('ISO 8601 date the first federal obligation was recorded. Absent before obligation.'),
96
+ })
97
+ .describe('A single Public Assistance funded project record.'))
98
+ .describe('Public assistance funded project records.'),
99
+ total_count: z.number().describe('Total matching projects before pagination.'),
100
+ returned_count: z.number().describe('Number of projects in this response.'),
101
+ }),
102
+ enrichment: {
103
+ notice: z.string().optional().describe('Guidance when no results were found.'),
104
+ },
105
+ errors: [
106
+ {
107
+ reason: 'missing_filter',
108
+ code: JsonRpcErrorCode.InvalidParams,
109
+ when: 'Neither disaster_number nor state was provided.',
110
+ recovery: 'Provide at least one of disaster_number (from fema_search_disasters) or state (2-letter code) to scope the query.',
111
+ },
112
+ {
113
+ reason: 'no_results',
114
+ code: JsonRpcErrorCode.NotFound,
115
+ when: 'No PA project records found for the given filters.',
116
+ recovery: 'Verify the disaster has PA declared (pa_declared: true via fema_get_disaster) or check the state code. Recent disasters may have incomplete records.',
117
+ },
118
+ ],
119
+ async handler(input, ctx) {
120
+ if (!input.disaster_number && !input.state?.trim()) {
121
+ throw ctx.fail('missing_filter', 'Either disaster_number or state must be provided.', {
122
+ ...ctx.recoveryFor('missing_filter'),
123
+ });
124
+ }
125
+ const filterParts = [];
126
+ if (input.disaster_number) {
127
+ filterParts.push(`disasterNumber eq ${input.disaster_number}`);
128
+ }
129
+ if (input.state?.trim()) {
130
+ filterParts.push(`stateAbbreviation eq '${input.state}'`);
131
+ }
132
+ if (input.county?.trim()) {
133
+ filterParts.push(`substringof('${escapeODataString(input.county)}', county)`);
134
+ }
135
+ const svc = getOpenFemaService();
136
+ const { rows, count } = await svc.fetchPaProjects({
137
+ filter: filterParts.join(' and '),
138
+ orderby: 'totalObligated desc',
139
+ top: input.limit,
140
+ skip: input.offset,
141
+ }, ctx);
142
+ if (rows.length === 0) {
143
+ ctx.enrich.notice(`No Public Assistance projects found for the given filters. Verify the disaster has PA declared via fema_get_disaster.`);
144
+ throw ctx.fail('no_results', 'No PA project records found.', {
145
+ ...ctx.recoveryFor('no_results'),
146
+ });
147
+ }
148
+ const projects = rows.map((r) => ({
149
+ disaster_number: r.disasterNumber ?? 0,
150
+ ...(r.pwNumber ? { pw_number: r.pwNumber } : {}),
151
+ ...(r.applicantId ? { applicant_id: r.applicantId } : {}),
152
+ ...(r.applicationTitle ? { application_title: r.applicationTitle } : {}),
153
+ ...(r.damageCategoryCode ? { damage_category_code: r.damageCategoryCode } : {}),
154
+ ...(r.damageCategoryDescrip ? { damage_category_description: r.damageCategoryDescrip } : {}),
155
+ ...(r.projectAmount != null ? { project_amount: r.projectAmount } : {}),
156
+ ...(r.federalShareObligated != null
157
+ ? { federal_share_obligated: r.federalShareObligated }
158
+ : {}),
159
+ ...(r.totalObligated != null ? { total_obligated: r.totalObligated } : {}),
160
+ ...(r.county ? { county: r.county } : {}),
161
+ ...(r.stateAbbreviation ? { state: r.stateAbbreviation } : {}),
162
+ ...(r.projectStatus ? { project_status: r.projectStatus } : {}),
163
+ ...(r.projectSize ? { project_size: r.projectSize } : {}),
164
+ ...(r.firstObligationDate ? { first_obligation_date: r.firstObligationDate } : {}),
165
+ }));
166
+ ctx.log.info('PA projects fetch complete', { count, returned: projects.length });
167
+ return { projects, total_count: count, returned_count: projects.length };
168
+ },
169
+ format: (result) => {
170
+ const lines = [];
171
+ lines.push(`**${result.returned_count} of ${result.total_count} PA projects**\n`);
172
+ for (const p of result.projects) {
173
+ const title = p.application_title ?? `PW-${p.pw_number ?? 'unknown'}`;
174
+ lines.push(`## ${title}`);
175
+ lines.push(`**Disaster:** DR-${p.disaster_number}`);
176
+ if (p.applicant_id)
177
+ lines.push(`**Applicant ID:** ${p.applicant_id}`);
178
+ if (p.damage_category_code) {
179
+ lines.push(`**Damage Category:** ${p.damage_category_code}${p.damage_category_description ? ` — ${p.damage_category_description}` : ''}`);
180
+ }
181
+ if (p.total_obligated != null) {
182
+ lines.push(`**Total Obligated:** $${p.total_obligated.toLocaleString()}`);
183
+ }
184
+ if (p.federal_share_obligated != null) {
185
+ lines.push(`**Federal Share Obligated:** $${p.federal_share_obligated.toLocaleString()}`);
186
+ }
187
+ if (p.project_amount != null) {
188
+ lines.push(`**Project Amount:** $${p.project_amount.toLocaleString()}`);
189
+ }
190
+ const meta = [];
191
+ if (p.project_status)
192
+ meta.push(`Status: ${p.project_status}`);
193
+ if (p.project_size)
194
+ meta.push(`Size: ${p.project_size}`);
195
+ if (p.county)
196
+ meta.push(`County: ${p.county}`);
197
+ if (p.state)
198
+ meta.push(`State: ${p.state}`);
199
+ if (p.pw_number)
200
+ meta.push(`PW: ${p.pw_number}`);
201
+ if (meta.length > 0)
202
+ lines.push(meta.join(' | '));
203
+ if (p.first_obligation_date)
204
+ lines.push(`**First Obligated:** ${p.first_obligation_date}`);
205
+ lines.push('');
206
+ }
207
+ return [{ type: 'text', text: lines.join('\n') }];
208
+ },
209
+ });
210
+ //# sourceMappingURL=fema-get-public-assistance.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fema-get-public-assistance.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/fema-get-public-assistance.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
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 { z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ export declare const femaQueryDataset: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
8
+ dataset: z.ZodString;
9
+ filter: z.ZodOptional<z.ZodString>;
10
+ select: z.ZodOptional<z.ZodString>;
11
+ orderby: z.ZodOptional<z.ZodString>;
12
+ limit: z.ZodDefault<z.ZodNumber>;
13
+ offset: z.ZodDefault<z.ZodNumber>;
14
+ }, z.core.$strip>, z.ZodObject<{
15
+ dataset: z.ZodString;
16
+ rows: z.ZodArray<z.ZodObject<{}, z.core.$loose>>;
17
+ total_count: z.ZodNumber;
18
+ returned_count: z.ZodNumber;
19
+ }, z.core.$strip>, readonly [{
20
+ readonly reason: "unknown_dataset";
21
+ readonly code: JsonRpcErrorCode.NotFound;
22
+ readonly when: "Dataset name not recognized — API returned HTML 404 instead of JSON.";
23
+ readonly 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).";
24
+ }, {
25
+ readonly reason: "invalid_filter";
26
+ readonly code: JsonRpcErrorCode.InvalidParams;
27
+ readonly when: "OData filter expression could not be parsed by the API.";
28
+ readonly recovery: "Fix the OData $filter syntax. String values must use single quotes. Check field names against the dataset schema at the FEMA OpenFEMA portal.";
29
+ }], {
30
+ readonly notice: z.ZodOptional<z.ZodString>;
31
+ }>;
32
+ //# sourceMappingURL=fema-query-dataset.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fema-query-dataset.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/fema-query-dataset.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;EAgJ3B,CAAC"}