@cyanheads/nws-weather-mcp-server 0.3.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 (58) hide show
  1. package/CLAUDE.md +309 -0
  2. package/Dockerfile +99 -0
  3. package/LICENSE +190 -0
  4. package/README.md +249 -0
  5. package/dist/config/server-config.d.ts +12 -0
  6. package/dist/config/server-config.d.ts.map +1 -0
  7. package/dist/config/server-config.js +19 -0
  8. package/dist/config/server-config.js.map +1 -0
  9. package/dist/index.d.ts +7 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +23 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/mcp-server/resources/definitions/alert-types.resource.d.ts +7 -0
  14. package/dist/mcp-server/resources/definitions/alert-types.resource.d.ts.map +1 -0
  15. package/dist/mcp-server/resources/definitions/alert-types.resource.js +27 -0
  16. package/dist/mcp-server/resources/definitions/alert-types.resource.js.map +1 -0
  17. package/dist/mcp-server/resources/definitions/index.d.ts +6 -0
  18. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
  19. package/dist/mcp-server/resources/definitions/index.js +6 -0
  20. package/dist/mcp-server/resources/definitions/index.js.map +1 -0
  21. package/dist/mcp-server/tools/definitions/find-stations.tool.d.ts +22 -0
  22. package/dist/mcp-server/tools/definitions/find-stations.tool.d.ts.map +1 -0
  23. package/dist/mcp-server/tools/definitions/find-stations.tool.js +60 -0
  24. package/dist/mcp-server/tools/definitions/find-stations.tool.js.map +1 -0
  25. package/dist/mcp-server/tools/definitions/get-forecast.tool.d.ts +33 -0
  26. package/dist/mcp-server/tools/definitions/get-forecast.tool.d.ts.map +1 -0
  27. package/dist/mcp-server/tools/definitions/get-forecast.tool.js +125 -0
  28. package/dist/mcp-server/tools/definitions/get-forecast.tool.js.map +1 -0
  29. package/dist/mcp-server/tools/definitions/get-observations.tool.d.ts +30 -0
  30. package/dist/mcp-server/tools/definitions/get-observations.tool.d.ts.map +1 -0
  31. package/dist/mcp-server/tools/definitions/get-observations.tool.js +177 -0
  32. package/dist/mcp-server/tools/definitions/get-observations.tool.js.map +1 -0
  33. package/dist/mcp-server/tools/definitions/index.d.ts +10 -0
  34. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  35. package/dist/mcp-server/tools/definitions/index.js +10 -0
  36. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  37. package/dist/mcp-server/tools/definitions/list-alert-types.tool.d.ts +10 -0
  38. package/dist/mcp-server/tools/definitions/list-alert-types.tool.d.ts.map +1 -0
  39. package/dist/mcp-server/tools/definitions/list-alert-types.tool.js +28 -0
  40. package/dist/mcp-server/tools/definitions/list-alert-types.tool.js.map +1 -0
  41. package/dist/mcp-server/tools/definitions/search-alerts.tool.d.ts +51 -0
  42. package/dist/mcp-server/tools/definitions/search-alerts.tool.d.ts.map +1 -0
  43. package/dist/mcp-server/tools/definitions/search-alerts.tool.js +242 -0
  44. package/dist/mcp-server/tools/definitions/search-alerts.tool.js.map +1 -0
  45. package/dist/mcp-server/tools/format-utils.d.ts +11 -0
  46. package/dist/mcp-server/tools/format-utils.d.ts.map +1 -0
  47. package/dist/mcp-server/tools/format-utils.js +27 -0
  48. package/dist/mcp-server/tools/format-utils.js.map +1 -0
  49. package/dist/services/nws/nws-service.d.ts +62 -0
  50. package/dist/services/nws/nws-service.d.ts.map +1 -0
  51. package/dist/services/nws/nws-service.js +372 -0
  52. package/dist/services/nws/nws-service.js.map +1 -0
  53. package/dist/services/nws/types.d.ts +96 -0
  54. package/dist/services/nws/types.d.ts.map +1 -0
  55. package/dist/services/nws/types.js +6 -0
  56. package/dist/services/nws/types.js.map +1 -0
  57. package/package.json +82 -0
  58. package/server.json +101 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-forecast.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-forecast.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @fileoverview Tool: nws_get_observations — retrieves current weather observations.
3
+ * @module mcp-server/tools/definitions/get-observations
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ export declare const getObservationsTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
7
+ latitude: z.ZodOptional<z.ZodNumber>;
8
+ longitude: z.ZodOptional<z.ZodNumber>;
9
+ station_id: z.ZodOptional<z.ZodString>;
10
+ }, z.core.$strip>, z.ZodObject<{
11
+ stationId: z.ZodString;
12
+ stationName: z.ZodString;
13
+ timestamp: z.ZodString;
14
+ textDescription: z.ZodString;
15
+ temperature: z.ZodNullable<z.ZodNumber>;
16
+ dewpoint: z.ZodNullable<z.ZodNumber>;
17
+ windSpeed: z.ZodNullable<z.ZodNumber>;
18
+ windDirection: z.ZodNullable<z.ZodNumber>;
19
+ windGust: z.ZodNullable<z.ZodNumber>;
20
+ barometricPressure: z.ZodNullable<z.ZodNumber>;
21
+ visibility: z.ZodNullable<z.ZodNumber>;
22
+ relativeHumidity: z.ZodNullable<z.ZodNumber>;
23
+ heatIndex: z.ZodNullable<z.ZodNumber>;
24
+ windChill: z.ZodNullable<z.ZodNumber>;
25
+ cloudLayers: z.ZodArray<z.ZodObject<{
26
+ amount: z.ZodString;
27
+ base: z.ZodNullable<z.ZodNumber>;
28
+ }, z.core.$strip>>;
29
+ }, z.core.$strip>>;
30
+ //# sourceMappingURL=get-observations.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-observations.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-observations.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAiDjD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;kBA2J9B,CAAC"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * @fileoverview Tool: nws_get_observations — retrieves current weather observations.
3
+ * @module mcp-server/tools/definitions/get-observations
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { getNwsService } from '../../../services/nws/nws-service.js';
7
+ import { cToF, formatTimestamp } from '../format-utils.js';
8
+ /** Convert km/h to mph. */
9
+ function kmhToMph(kmh) {
10
+ return Math.round(kmh * 0.621371);
11
+ }
12
+ /** Convert Pascals to inHg. */
13
+ function paToInHg(pa) {
14
+ return Math.round(pa * 0.0002953 * 100) / 100;
15
+ }
16
+ /** Convert meters to miles. */
17
+ function mToMi(m) {
18
+ return Math.round(m * 0.000621371 * 10) / 10;
19
+ }
20
+ /** Convert meters to km. */
21
+ function mToKm(m) {
22
+ return Math.round(m / 100) / 10;
23
+ }
24
+ /** Convert meters to feet. */
25
+ function mToFt(m) {
26
+ return Math.round(m * 3.28084);
27
+ }
28
+ /** Format temperature with both F and C. */
29
+ function formatTemp(value) {
30
+ if (value == null)
31
+ return null;
32
+ const c = Math.round(value);
33
+ return `${cToF(value)}°F (${c}°C)`;
34
+ }
35
+ /** Format wind speed with both mph and km/h. */
36
+ function formatWind(speed, direction, gust) {
37
+ if (speed == null)
38
+ return 'Calm';
39
+ const mph = kmhToMph(speed);
40
+ const kmh = Math.round(speed);
41
+ const dir = direction != null ? `${Math.round(direction)}°` : '';
42
+ let result = `${dir} ${mph} mph (${kmh} km/h)`.trim();
43
+ if (gust != null) {
44
+ result += `, gusts ${kmhToMph(gust)} mph`;
45
+ }
46
+ return result;
47
+ }
48
+ export const getObservationsTool = tool('nws_get_observations', {
49
+ description: 'Get current weather observations (actual measured conditions). Accepts coordinates (resolves nearest station automatically) or a station ID directly (e.g., "KSEA").',
50
+ annotations: { readOnlyHint: true },
51
+ input: z.object({
52
+ latitude: z
53
+ .number()
54
+ .min(-90)
55
+ .max(90)
56
+ .optional()
57
+ .describe('Latitude for automatic station resolution. Use with longitude. Ignored if station_id is provided.'),
58
+ longitude: z
59
+ .number()
60
+ .min(-180)
61
+ .max(180)
62
+ .optional()
63
+ .describe('Longitude for automatic station resolution. Use with latitude. Ignored if station_id is provided.'),
64
+ station_id: z
65
+ .string()
66
+ .optional()
67
+ .describe('Station identifier directly (e.g., "KSEA", "KORD"). Use nws_find_stations to discover station IDs.'),
68
+ }),
69
+ output: z.object({
70
+ stationId: z.string().describe('Observation station ID'),
71
+ stationName: z.string().describe('Station name'),
72
+ timestamp: z.string().describe('Observation time (ISO 8601)'),
73
+ textDescription: z.string().describe('Conditions summary (e.g., "Mostly Cloudy")'),
74
+ temperature: z.number().nullable().describe('Temperature in Celsius'),
75
+ dewpoint: z.number().nullable().describe('Dewpoint in Celsius'),
76
+ windSpeed: z.number().nullable().describe('Wind speed in km/h'),
77
+ windDirection: z.number().nullable().describe('Wind direction in degrees'),
78
+ windGust: z.number().nullable().describe('Wind gust in km/h'),
79
+ barometricPressure: z.number().nullable().describe('Barometric pressure in Pascals'),
80
+ visibility: z.number().nullable().describe('Visibility in meters'),
81
+ relativeHumidity: z.number().nullable().describe('Relative humidity (%)'),
82
+ heatIndex: z.number().nullable().describe('Heat index in Celsius'),
83
+ windChill: z.number().nullable().describe('Wind chill in Celsius'),
84
+ cloudLayers: z
85
+ .array(z.object({
86
+ amount: z.string().describe('Cloud cover (e.g., "FEW", "SCT", "BKN", "OVC")'),
87
+ base: z.number().nullable().describe('Cloud base height in meters'),
88
+ }))
89
+ .describe('Cloud layer information'),
90
+ }),
91
+ async handler(input, ctx) {
92
+ if (!input.station_id && (input.latitude == null || input.longitude == null)) {
93
+ throw new Error('Provide either station_id or both latitude and longitude.');
94
+ }
95
+ const result = await getNwsService().getObservation({
96
+ latitude: input.latitude,
97
+ longitude: input.longitude,
98
+ stationId: input.station_id,
99
+ }, ctx);
100
+ const obs = result.observation;
101
+ return {
102
+ stationId: obs.stationId,
103
+ stationName: obs.stationName,
104
+ timestamp: obs.timestamp,
105
+ textDescription: obs.textDescription,
106
+ temperature: obs.temperature.value,
107
+ dewpoint: obs.dewpoint.value,
108
+ windSpeed: obs.windSpeed.value,
109
+ windDirection: obs.windDirection.value,
110
+ windGust: obs.windGust.value,
111
+ barometricPressure: obs.barometricPressure.value,
112
+ visibility: obs.visibility.value,
113
+ relativeHumidity: obs.relativeHumidity.value,
114
+ heatIndex: obs.heatIndex.value,
115
+ windChill: obs.windChill.value,
116
+ cloudLayers: obs.cloudLayers.map((l) => ({
117
+ amount: l.amount,
118
+ base: l.base.value,
119
+ })),
120
+ };
121
+ },
122
+ format: (result) => {
123
+ const lines = [
124
+ `## Current Conditions — ${result.stationName} (${result.stationId})`,
125
+ `**${result.textDescription}** | Observed: ${formatTimestamp(result.timestamp)}`,
126
+ '',
127
+ ];
128
+ const temp = formatTemp(result.temperature);
129
+ if (temp)
130
+ lines.push(`**Temperature:** ${temp}`);
131
+ const dew = formatTemp(result.dewpoint);
132
+ if (dew)
133
+ lines.push(`**Dewpoint:** ${dew}`);
134
+ if (result.relativeHumidity != null) {
135
+ lines.push(`**Humidity:** ${Math.round(result.relativeHumidity)}%`);
136
+ }
137
+ lines.push(`**Wind:** ${formatWind(result.windSpeed, result.windDirection, result.windGust)}`);
138
+ if (result.barometricPressure != null) {
139
+ const pressure = `${paToInHg(result.barometricPressure)} inHg (${Math.round(result.barometricPressure / 100)} hPa)`;
140
+ lines.push(`**Pressure:** ${pressure}`);
141
+ }
142
+ if (result.visibility != null) {
143
+ lines.push(`**Visibility:** ${mToMi(result.visibility)} mi (${mToKm(result.visibility)} km)`);
144
+ }
145
+ const heat = formatTemp(result.heatIndex);
146
+ if (heat)
147
+ lines.push(`**Heat Index:** ${heat}`);
148
+ const chill = formatTemp(result.windChill);
149
+ if (chill)
150
+ lines.push(`**Wind Chill:** ${chill}`);
151
+ if (result.cloudLayers.length > 0) {
152
+ const clouds = result.cloudLayers
153
+ .map((l) => {
154
+ const base = l.base != null ? ` at ${Math.round(l.base)}m (${mToFt(l.base)} ft)` : '';
155
+ return `${l.amount}${base}`;
156
+ })
157
+ .join(', ');
158
+ lines.push(`**Clouds:** ${clouds}`);
159
+ }
160
+ // Flag when most measurements are missing
161
+ const measurable = [
162
+ result.temperature,
163
+ result.dewpoint,
164
+ result.windSpeed,
165
+ result.barometricPressure,
166
+ result.visibility,
167
+ result.relativeHumidity,
168
+ ];
169
+ const nullCount = measurable.filter((v) => v == null).length;
170
+ if (nullCount >= 4) {
171
+ lines.push('');
172
+ lines.push('_Limited data — most measurements unavailable from this station. Try a different station using nws_find_stations._');
173
+ }
174
+ return [{ type: 'text', text: lines.join('\n') }];
175
+ },
176
+ });
177
+ //# sourceMappingURL=get-observations.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-observations.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-observations.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @fileoverview Barrel export for all tool definitions.
3
+ * @module mcp-server/tools/definitions
4
+ */
5
+ export { findStationsTool } from './find-stations.tool.js';
6
+ export { getForecastTool } from './get-forecast.tool.js';
7
+ export { getObservationsTool } from './get-observations.tool.js';
8
+ export { listAlertTypesTool } from './list-alert-types.tool.js';
9
+ export { searchAlertsTool } from './search-alerts.tool.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @fileoverview Barrel export for all tool definitions.
3
+ * @module mcp-server/tools/definitions
4
+ */
5
+ export { findStationsTool } from './find-stations.tool.js';
6
+ export { getForecastTool } from './get-forecast.tool.js';
7
+ export { getObservationsTool } from './get-observations.tool.js';
8
+ export { listAlertTypesTool } from './list-alert-types.tool.js';
9
+ export { searchAlertsTool } from './search-alerts.tool.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @fileoverview Tool: nws_list_alert_types — lists all valid NWS alert event type names.
3
+ * @module mcp-server/tools/definitions/list-alert-types
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ export declare const listAlertTypesTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
7
+ count: z.ZodNumber;
8
+ eventTypes: z.ZodArray<z.ZodString>;
9
+ }, z.core.$strip>>;
10
+ //# sourceMappingURL=list-alert-types.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-alert-types.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/list-alert-types.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAGjD,eAAO,MAAM,kBAAkB;;;kBAyB7B,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @fileoverview Tool: nws_list_alert_types — lists all valid NWS alert event type names.
3
+ * @module mcp-server/tools/definitions/list-alert-types
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { getNwsService } from '../../../services/nws/nws-service.js';
7
+ export const listAlertTypesTool = tool('nws_list_alert_types', {
8
+ description: 'List all valid NWS alert event type names. Use to discover valid values for the event filter in nws_search_alerts, or to browse alert categories. No parameters required.',
9
+ annotations: { readOnlyHint: true },
10
+ input: z.object({}),
11
+ output: z.object({
12
+ count: z.number().describe('Number of event types'),
13
+ eventTypes: z.array(z.string()).describe('Alert event type names sorted alphabetically'),
14
+ }),
15
+ async handler(_input, ctx) {
16
+ const types = await getNwsService().listAlertTypes(ctx);
17
+ ctx.log.info('Listed alert types', { count: types.length });
18
+ return {
19
+ count: types.length,
20
+ eventTypes: [...types].sort(),
21
+ };
22
+ },
23
+ format: (result) => {
24
+ const lines = [`## ${result.count} NWS Alert Event Types\n`, result.eventTypes.join(', ')];
25
+ return [{ type: 'text', text: lines.join('\n') }];
26
+ },
27
+ });
28
+ //# sourceMappingURL=list-alert-types.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-alert-types.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/list-alert-types.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,EAAE;IAC7D,WAAW,EACT,2KAA2K;IAC7K,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;IAEnC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IAEnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACnD,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KACzF,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACxD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,UAAU,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE;SAC9B,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,0BAA0B,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @fileoverview Tool: nws_search_alerts — searches active weather alerts across the US.
3
+ * @module mcp-server/tools/definitions/search-alerts
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ export declare const searchAlertsTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
7
+ area: z.ZodOptional<z.ZodString>;
8
+ point: z.ZodOptional<z.ZodString>;
9
+ zone: z.ZodOptional<z.ZodString>;
10
+ event: z.ZodOptional<z.ZodArray<z.ZodString>>;
11
+ severity: z.ZodOptional<z.ZodArray<z.ZodEnum<{
12
+ Extreme: "Extreme";
13
+ Severe: "Severe";
14
+ Moderate: "Moderate";
15
+ Minor: "Minor";
16
+ Unknown: "Unknown";
17
+ }>>>;
18
+ urgency: z.ZodOptional<z.ZodArray<z.ZodEnum<{
19
+ Immediate: "Immediate";
20
+ Expected: "Expected";
21
+ Future: "Future";
22
+ Past: "Past";
23
+ }>>>;
24
+ certainty: z.ZodOptional<z.ZodArray<z.ZodEnum<{
25
+ Unknown: "Unknown";
26
+ Observed: "Observed";
27
+ Likely: "Likely";
28
+ Possible: "Possible";
29
+ Unlikely: "Unlikely";
30
+ }>>>;
31
+ }, z.core.$strip>, z.ZodObject<{
32
+ count: z.ZodNumber;
33
+ shown: z.ZodNumber;
34
+ filters: z.ZodString;
35
+ alerts: z.ZodArray<z.ZodObject<{
36
+ id: z.ZodString;
37
+ event: z.ZodString;
38
+ headline: z.ZodNullable<z.ZodString>;
39
+ description: z.ZodString;
40
+ instruction: z.ZodNullable<z.ZodString>;
41
+ severity: z.ZodString;
42
+ urgency: z.ZodString;
43
+ certainty: z.ZodString;
44
+ areaDesc: z.ZodString;
45
+ onset: z.ZodNullable<z.ZodString>;
46
+ expires: z.ZodNullable<z.ZodString>;
47
+ senderName: z.ZodString;
48
+ affectedZones: z.ZodArray<z.ZodString>;
49
+ }, z.core.$strip>>;
50
+ }, z.core.$strip>>;
51
+ //# sourceMappingURL=search-alerts.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-alerts.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-alerts.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAwGjD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAkK3B,CAAC"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * @fileoverview Tool: nws_search_alerts — searches active weather alerts across the US.
3
+ * @module mcp-server/tools/definitions/search-alerts
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { getNwsService } from '../../../services/nws/nws-service.js';
7
+ import { formatTimestamp } from '../format-utils.js';
8
+ const MAX_ALERTS = 25;
9
+ /** Valid area codes: US states, DC, territories, and marine areas. */
10
+ const VALID_AREA_CODES = new Set([
11
+ // States + DC
12
+ 'AL',
13
+ 'AK',
14
+ 'AZ',
15
+ 'AR',
16
+ 'CA',
17
+ 'CO',
18
+ 'CT',
19
+ 'DE',
20
+ 'DC',
21
+ 'FL',
22
+ 'GA',
23
+ 'HI',
24
+ 'ID',
25
+ 'IL',
26
+ 'IN',
27
+ 'IA',
28
+ 'KS',
29
+ 'KY',
30
+ 'LA',
31
+ 'ME',
32
+ 'MD',
33
+ 'MA',
34
+ 'MI',
35
+ 'MN',
36
+ 'MS',
37
+ 'MO',
38
+ 'MT',
39
+ 'NE',
40
+ 'NV',
41
+ 'NH',
42
+ 'NJ',
43
+ 'NM',
44
+ 'NY',
45
+ 'NC',
46
+ 'ND',
47
+ 'OH',
48
+ 'OK',
49
+ 'OR',
50
+ 'PA',
51
+ 'RI',
52
+ 'SC',
53
+ 'SD',
54
+ 'TN',
55
+ 'TX',
56
+ 'UT',
57
+ 'VT',
58
+ 'VA',
59
+ 'WA',
60
+ 'WV',
61
+ 'WI',
62
+ 'WY',
63
+ // Territories & freely associated states
64
+ 'AS',
65
+ 'FM',
66
+ 'GU',
67
+ 'MH',
68
+ 'MP',
69
+ 'PR',
70
+ 'PW',
71
+ 'VI',
72
+ // Marine areas
73
+ 'AM',
74
+ 'AN',
75
+ 'GM',
76
+ 'LC',
77
+ 'LE',
78
+ 'LH',
79
+ 'LM',
80
+ 'LO',
81
+ 'LS',
82
+ 'PH',
83
+ 'PK',
84
+ 'PM',
85
+ 'PS',
86
+ 'PZ',
87
+ 'SL',
88
+ ]);
89
+ /** Build a human-readable summary of the applied search filters. */
90
+ function describeFilters(input) {
91
+ const parts = [];
92
+ if (input.area)
93
+ parts.push(`area=${input.area}`);
94
+ if (input.point)
95
+ parts.push(`point=${input.point}`);
96
+ if (input.zone)
97
+ parts.push(`zone=${input.zone}`);
98
+ if (Array.isArray(input.event) && input.event.length)
99
+ parts.push(`event=${input.event.join(', ')}`);
100
+ if (Array.isArray(input.severity) && input.severity.length)
101
+ parts.push(`severity=${input.severity.join(', ')}`);
102
+ if (Array.isArray(input.urgency) && input.urgency.length)
103
+ parts.push(`urgency=${input.urgency.join(', ')}`);
104
+ if (Array.isArray(input.certainty) && input.certainty.length)
105
+ parts.push(`certainty=${input.certainty.join(', ')}`);
106
+ return parts.length > 0 ? parts.join(', ') : 'national (no filters)';
107
+ }
108
+ export const searchAlertsTool = tool('nws_search_alerts', {
109
+ description: 'Search active weather alerts (watches, warnings, advisories) across the US. Filter by state, coordinates, zone, event type, severity, urgency, or certainty. Omit all filters for a national search.',
110
+ annotations: { readOnlyHint: true },
111
+ input: z.object({
112
+ area: z
113
+ .string()
114
+ .optional()
115
+ .describe('US state/territory code (e.g., "WA", "OK", "PR") or marine area code (e.g., "GM").'),
116
+ point: z
117
+ .string()
118
+ .optional()
119
+ .describe('Coordinates as "lat,lon" (e.g., "47.6,-122.3"). Returns alerts whose geometry contains this point.'),
120
+ zone: z
121
+ .string()
122
+ .optional()
123
+ .describe('NWS forecast zone (e.g., "WAZ558") or county zone (e.g., "WAC033").'),
124
+ event: z
125
+ .array(z.string())
126
+ .optional()
127
+ .describe('Filter to specific event types (e.g., ["Tornado Warning"]). Exact match (case-insensitive). Use nws_list_alert_types to discover valid names.'),
128
+ severity: z
129
+ .array(z.enum(['Extreme', 'Severe', 'Moderate', 'Minor', 'Unknown']))
130
+ .optional()
131
+ .describe('Filter by severity level.'),
132
+ urgency: z
133
+ .array(z.enum(['Immediate', 'Expected', 'Future', 'Past']))
134
+ .optional()
135
+ .describe('Filter by urgency level.'),
136
+ certainty: z
137
+ .array(z.enum(['Observed', 'Likely', 'Possible', 'Unlikely', 'Unknown']))
138
+ .optional()
139
+ .describe('Filter by certainty level.'),
140
+ }),
141
+ output: z.object({
142
+ count: z.number().describe('Total number of matching alerts'),
143
+ shown: z.number().describe('Number of alerts included in this response'),
144
+ filters: z.string().describe('Summary of applied search filters'),
145
+ alerts: z
146
+ .array(z.object({
147
+ id: z.string().describe('Alert ID'),
148
+ event: z.string().describe('Event type (e.g., "Tornado Warning")'),
149
+ headline: z.string().nullable().describe('Alert headline'),
150
+ description: z.string().describe('Full alert description'),
151
+ instruction: z.string().nullable().describe('Recommended actions'),
152
+ severity: z.string().describe('Severity level'),
153
+ urgency: z.string().describe('Urgency level'),
154
+ certainty: z.string().describe('Certainty level'),
155
+ areaDesc: z.string().describe('Affected area description'),
156
+ onset: z.string().nullable().describe('Expected onset (ISO 8601)'),
157
+ expires: z.string().nullable().describe('Expiration time (ISO 8601)'),
158
+ senderName: z.string().describe('Issuing office'),
159
+ affectedZones: z.array(z.string()).describe('Affected zone codes'),
160
+ }))
161
+ .describe('Matching alerts (capped at 25)'),
162
+ }),
163
+ async handler(input, ctx) {
164
+ // Normalize and validate area code — the NWS API is case-sensitive (lowercase → 400)
165
+ if (input.area) {
166
+ input.area = input.area.toUpperCase();
167
+ if (!VALID_AREA_CODES.has(input.area)) {
168
+ throw new Error(`Invalid area code "${input.area}". Use a 2-letter US state/territory code (e.g., "WA", "OK", "PR") or marine area code (e.g., "GM").`);
169
+ }
170
+ }
171
+ // Validate point format before hitting the API
172
+ if (input.point) {
173
+ const [lat, lon, ...rest] = input.point.split(',').map(Number);
174
+ if (rest.length > 0 ||
175
+ lat == null ||
176
+ lon == null ||
177
+ Number.isNaN(lat) ||
178
+ Number.isNaN(lon) ||
179
+ lat < -90 ||
180
+ lat > 90 ||
181
+ lon < -180 ||
182
+ lon > 180) {
183
+ throw new Error(`Invalid point "${input.point}". Provide "lat,lon" with latitude -90 to 90 and longitude -180 to 180 (e.g., "47.6,-122.3").`);
184
+ }
185
+ }
186
+ const result = await getNwsService().searchAlerts(input, ctx);
187
+ const total = result.alerts.length;
188
+ const capped = result.alerts.slice(0, MAX_ALERTS);
189
+ const filters = describeFilters(input);
190
+ ctx.log.info('Alerts search completed', { total, shown: capped.length, filters });
191
+ return {
192
+ count: total,
193
+ shown: capped.length,
194
+ filters,
195
+ alerts: capped.map((a) => ({ ...a, affectedZones: [...a.affectedZones] })),
196
+ };
197
+ },
198
+ format: (result) => {
199
+ if (result.count === 0) {
200
+ const lines = [
201
+ `No active alerts found for: ${result.filters}.`,
202
+ '',
203
+ 'To broaden your search, try:',
204
+ '- Use **area** (e.g., "WA") for state-wide alerts',
205
+ '- Remove severity/event filters',
206
+ '- Use nws_list_alert_types to verify event names',
207
+ ];
208
+ return [{ type: 'text', text: lines.join('\n') }];
209
+ }
210
+ const truncated = result.shown < result.count;
211
+ const heading = truncated
212
+ ? `## Showing ${result.shown} of ${result.count} Active Alerts`
213
+ : `## ${result.count} Active Alert${result.count > 1 ? 's' : ''}`;
214
+ const lines = [`${heading}\n**Filters:** ${result.filters}\n`];
215
+ for (const a of result.alerts) {
216
+ lines.push(`### ${a.event}`);
217
+ if (a.headline)
218
+ lines.push(`**${a.headline}**`);
219
+ lines.push(`**Severity:** ${a.severity} | **Urgency:** ${a.urgency} | **Certainty:** ${a.certainty}`);
220
+ lines.push(`**Area:** ${a.areaDesc}`);
221
+ if (a.onset)
222
+ lines.push(`**Onset:** ${formatTimestamp(a.onset)}`);
223
+ if (a.expires)
224
+ lines.push(`**Expires:** ${formatTimestamp(a.expires)}`);
225
+ lines.push(`**From:** ${a.senderName}`);
226
+ lines.push('');
227
+ lines.push(a.description);
228
+ if (a.instruction) {
229
+ lines.push('');
230
+ lines.push(`**Recommended Actions:** ${a.instruction}`);
231
+ }
232
+ lines.push('');
233
+ lines.push('---');
234
+ lines.push('');
235
+ }
236
+ if (truncated) {
237
+ lines.push(`_${result.count - result.shown} more alerts not shown. Narrow with area, severity, or event filters to see specific alerts._`);
238
+ }
239
+ return [{ type: 'text', text: lines.join('\n') }];
240
+ },
241
+ });
242
+ //# sourceMappingURL=search-alerts.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-alerts.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-alerts.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @fileoverview Shared formatting utilities for tool format() functions.
3
+ * @module mcp-server/tools/format-utils
4
+ */
5
+ /** Convert Celsius to Fahrenheit. */
6
+ export declare function cToF(c: number): number;
7
+ /** Convert Fahrenheit to Celsius. */
8
+ export declare function fToC(f: number): number;
9
+ /** Format an ISO 8601 timestamp as a short human-readable string. */
10
+ export declare function formatTimestamp(iso: string): string;
11
+ //# sourceMappingURL=format-utils.d.ts.map