@jablum/weather-mcp 1.7.0

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 (235) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1319 -0
  3. package/dist/analytics/anonymizer.d.ts +37 -0
  4. package/dist/analytics/anonymizer.d.ts.map +1 -0
  5. package/dist/analytics/anonymizer.js +112 -0
  6. package/dist/analytics/anonymizer.js.map +1 -0
  7. package/dist/analytics/collector.d.ts +72 -0
  8. package/dist/analytics/collector.d.ts.map +1 -0
  9. package/dist/analytics/collector.js +282 -0
  10. package/dist/analytics/collector.js.map +1 -0
  11. package/dist/analytics/config.d.ts +15 -0
  12. package/dist/analytics/config.d.ts.map +1 -0
  13. package/dist/analytics/config.js +172 -0
  14. package/dist/analytics/config.js.map +1 -0
  15. package/dist/analytics/index.d.ts +8 -0
  16. package/dist/analytics/index.d.ts.map +1 -0
  17. package/dist/analytics/index.js +7 -0
  18. package/dist/analytics/index.js.map +1 -0
  19. package/dist/analytics/middleware.d.ts +33 -0
  20. package/dist/analytics/middleware.d.ts.map +1 -0
  21. package/dist/analytics/middleware.js +99 -0
  22. package/dist/analytics/middleware.js.map +1 -0
  23. package/dist/analytics/transport.d.ts +11 -0
  24. package/dist/analytics/transport.d.ts.map +1 -0
  25. package/dist/analytics/transport.js +92 -0
  26. package/dist/analytics/transport.js.map +1 -0
  27. package/dist/analytics/types.d.ts +74 -0
  28. package/dist/analytics/types.d.ts.map +1 -0
  29. package/dist/analytics/types.js +6 -0
  30. package/dist/analytics/types.js.map +1 -0
  31. package/dist/config/api.d.ts +30 -0
  32. package/dist/config/api.d.ts.map +1 -0
  33. package/dist/config/api.js +32 -0
  34. package/dist/config/api.js.map +1 -0
  35. package/dist/config/cache.d.ts +31 -0
  36. package/dist/config/cache.d.ts.map +1 -0
  37. package/dist/config/cache.js +108 -0
  38. package/dist/config/cache.js.map +1 -0
  39. package/dist/config/displayThresholds.d.ts +83 -0
  40. package/dist/config/displayThresholds.d.ts.map +1 -0
  41. package/dist/config/displayThresholds.js +83 -0
  42. package/dist/config/displayThresholds.js.map +1 -0
  43. package/dist/config/tools.d.ts +44 -0
  44. package/dist/config/tools.d.ts.map +1 -0
  45. package/dist/config/tools.js +269 -0
  46. package/dist/config/tools.js.map +1 -0
  47. package/dist/errors/ApiError.d.ts +62 -0
  48. package/dist/errors/ApiError.d.ts.map +1 -0
  49. package/dist/errors/ApiError.js +171 -0
  50. package/dist/errors/ApiError.js.map +1 -0
  51. package/dist/handlers/airQualityHandler.d.ts +11 -0
  52. package/dist/handlers/airQualityHandler.d.ts.map +1 -0
  53. package/dist/handlers/airQualityHandler.js +154 -0
  54. package/dist/handlers/airQualityHandler.js.map +1 -0
  55. package/dist/handlers/alertsHandler.d.ts +11 -0
  56. package/dist/handlers/alertsHandler.d.ts.map +1 -0
  57. package/dist/handlers/alertsHandler.js +98 -0
  58. package/dist/handlers/alertsHandler.js.map +1 -0
  59. package/dist/handlers/currentConditionsHandler.d.ts +13 -0
  60. package/dist/handlers/currentConditionsHandler.d.ts.map +1 -0
  61. package/dist/handlers/currentConditionsHandler.js +296 -0
  62. package/dist/handlers/currentConditionsHandler.js.map +1 -0
  63. package/dist/handlers/forecastHandler.d.ts +16 -0
  64. package/dist/handlers/forecastHandler.d.ts.map +1 -0
  65. package/dist/handlers/forecastHandler.js +454 -0
  66. package/dist/handlers/forecastHandler.js.map +1 -0
  67. package/dist/handlers/historicalWeatherHandler.d.ts +12 -0
  68. package/dist/handlers/historicalWeatherHandler.d.ts.map +1 -0
  69. package/dist/handlers/historicalWeatherHandler.js +188 -0
  70. package/dist/handlers/historicalWeatherHandler.js.map +1 -0
  71. package/dist/handlers/lightningHandler.d.ts +14 -0
  72. package/dist/handlers/lightningHandler.d.ts.map +1 -0
  73. package/dist/handlers/lightningHandler.js +258 -0
  74. package/dist/handlers/lightningHandler.js.map +1 -0
  75. package/dist/handlers/locationHandler.d.ts +12 -0
  76. package/dist/handlers/locationHandler.d.ts.map +1 -0
  77. package/dist/handlers/locationHandler.js +149 -0
  78. package/dist/handlers/locationHandler.js.map +1 -0
  79. package/dist/handlers/marineConditionsHandler.d.ts +13 -0
  80. package/dist/handlers/marineConditionsHandler.d.ts.map +1 -0
  81. package/dist/handlers/marineConditionsHandler.js +270 -0
  82. package/dist/handlers/marineConditionsHandler.js.map +1 -0
  83. package/dist/handlers/riverConditionsHandler.d.ts +11 -0
  84. package/dist/handlers/riverConditionsHandler.d.ts.map +1 -0
  85. package/dist/handlers/riverConditionsHandler.js +176 -0
  86. package/dist/handlers/riverConditionsHandler.js.map +1 -0
  87. package/dist/handlers/savedLocationsHandler.d.ts +50 -0
  88. package/dist/handlers/savedLocationsHandler.d.ts.map +1 -0
  89. package/dist/handlers/savedLocationsHandler.js +397 -0
  90. package/dist/handlers/savedLocationsHandler.js.map +1 -0
  91. package/dist/handlers/statusHandler.d.ts +12 -0
  92. package/dist/handlers/statusHandler.d.ts.map +1 -0
  93. package/dist/handlers/statusHandler.js +115 -0
  94. package/dist/handlers/statusHandler.js.map +1 -0
  95. package/dist/handlers/weatherImageryHandler.d.ts +14 -0
  96. package/dist/handlers/weatherImageryHandler.d.ts.map +1 -0
  97. package/dist/handlers/weatherImageryHandler.js +143 -0
  98. package/dist/handlers/weatherImageryHandler.js.map +1 -0
  99. package/dist/handlers/wildfireHandler.d.ts +11 -0
  100. package/dist/handlers/wildfireHandler.d.ts.map +1 -0
  101. package/dist/handlers/wildfireHandler.js +186 -0
  102. package/dist/handlers/wildfireHandler.js.map +1 -0
  103. package/dist/index.d.ts +7 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +735 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/services/blitzortung.d.ts +67 -0
  108. package/dist/services/blitzortung.d.ts.map +1 -0
  109. package/dist/services/blitzortung.js +475 -0
  110. package/dist/services/blitzortung.js.map +1 -0
  111. package/dist/services/geocoding.d.ts +57 -0
  112. package/dist/services/geocoding.d.ts.map +1 -0
  113. package/dist/services/geocoding.js +393 -0
  114. package/dist/services/geocoding.js.map +1 -0
  115. package/dist/services/locationStore.d.ts +62 -0
  116. package/dist/services/locationStore.d.ts.map +1 -0
  117. package/dist/services/locationStore.js +201 -0
  118. package/dist/services/locationStore.js.map +1 -0
  119. package/dist/services/ncei.d.ts +61 -0
  120. package/dist/services/ncei.d.ts.map +1 -0
  121. package/dist/services/ncei.js +126 -0
  122. package/dist/services/ncei.js.map +1 -0
  123. package/dist/services/nifc.d.ts +44 -0
  124. package/dist/services/nifc.d.ts.map +1 -0
  125. package/dist/services/nifc.js +159 -0
  126. package/dist/services/nifc.js.map +1 -0
  127. package/dist/services/noaa.d.ts +161 -0
  128. package/dist/services/noaa.d.ts.map +1 -0
  129. package/dist/services/noaa.js +681 -0
  130. package/dist/services/noaa.js.map +1 -0
  131. package/dist/services/nominatim.d.ts +62 -0
  132. package/dist/services/nominatim.d.ts.map +1 -0
  133. package/dist/services/nominatim.js +254 -0
  134. package/dist/services/nominatim.js.map +1 -0
  135. package/dist/services/openmeteo.d.ts +189 -0
  136. package/dist/services/openmeteo.d.ts.map +1 -0
  137. package/dist/services/openmeteo.js +936 -0
  138. package/dist/services/openmeteo.js.map +1 -0
  139. package/dist/services/rainviewer.d.ts +37 -0
  140. package/dist/services/rainviewer.d.ts.map +1 -0
  141. package/dist/services/rainviewer.js +115 -0
  142. package/dist/services/rainviewer.js.map +1 -0
  143. package/dist/types/imagery.d.ts +82 -0
  144. package/dist/types/imagery.d.ts.map +1 -0
  145. package/dist/types/imagery.js +6 -0
  146. package/dist/types/imagery.js.map +1 -0
  147. package/dist/types/lightning.d.ts +89 -0
  148. package/dist/types/lightning.d.ts.map +1 -0
  149. package/dist/types/lightning.js +6 -0
  150. package/dist/types/lightning.js.map +1 -0
  151. package/dist/types/noaa.d.ts +535 -0
  152. package/dist/types/noaa.d.ts.map +1 -0
  153. package/dist/types/noaa.js +5 -0
  154. package/dist/types/noaa.js.map +1 -0
  155. package/dist/types/nominatim.d.ts +72 -0
  156. package/dist/types/nominatim.d.ts.map +1 -0
  157. package/dist/types/nominatim.js +6 -0
  158. package/dist/types/nominatim.js.map +1 -0
  159. package/dist/types/openmeteo.d.ts +583 -0
  160. package/dist/types/openmeteo.d.ts.map +1 -0
  161. package/dist/types/openmeteo.js +6 -0
  162. package/dist/types/openmeteo.js.map +1 -0
  163. package/dist/types/savedLocations.d.ts +58 -0
  164. package/dist/types/savedLocations.d.ts.map +1 -0
  165. package/dist/types/savedLocations.js +5 -0
  166. package/dist/types/savedLocations.js.map +1 -0
  167. package/dist/types/wildfire.d.ts +83 -0
  168. package/dist/types/wildfire.d.ts.map +1 -0
  169. package/dist/types/wildfire.js +5 -0
  170. package/dist/types/wildfire.js.map +1 -0
  171. package/dist/utils/airQuality.d.ts +54 -0
  172. package/dist/utils/airQuality.d.ts.map +1 -0
  173. package/dist/utils/airQuality.js +251 -0
  174. package/dist/utils/airQuality.js.map +1 -0
  175. package/dist/utils/cache.d.ts +69 -0
  176. package/dist/utils/cache.d.ts.map +1 -0
  177. package/dist/utils/cache.js +164 -0
  178. package/dist/utils/cache.js.map +1 -0
  179. package/dist/utils/distance.d.ts +25 -0
  180. package/dist/utils/distance.d.ts.map +1 -0
  181. package/dist/utils/distance.js +40 -0
  182. package/dist/utils/distance.js.map +1 -0
  183. package/dist/utils/fireWeather.d.ts +76 -0
  184. package/dist/utils/fireWeather.d.ts.map +1 -0
  185. package/dist/utils/fireWeather.js +243 -0
  186. package/dist/utils/fireWeather.js.map +1 -0
  187. package/dist/utils/geography.d.ts +79 -0
  188. package/dist/utils/geography.d.ts.map +1 -0
  189. package/dist/utils/geography.js +266 -0
  190. package/dist/utils/geography.js.map +1 -0
  191. package/dist/utils/geohash.d.ts +62 -0
  192. package/dist/utils/geohash.d.ts.map +1 -0
  193. package/dist/utils/geohash.js +146 -0
  194. package/dist/utils/geohash.js.map +1 -0
  195. package/dist/utils/locationResolver.d.ts +34 -0
  196. package/dist/utils/locationResolver.d.ts.map +1 -0
  197. package/dist/utils/locationResolver.js +120 -0
  198. package/dist/utils/locationResolver.js.map +1 -0
  199. package/dist/utils/logger.d.ts +75 -0
  200. package/dist/utils/logger.d.ts.map +1 -0
  201. package/dist/utils/logger.js +153 -0
  202. package/dist/utils/logger.js.map +1 -0
  203. package/dist/utils/marine.d.ts +59 -0
  204. package/dist/utils/marine.d.ts.map +1 -0
  205. package/dist/utils/marine.js +215 -0
  206. package/dist/utils/marine.js.map +1 -0
  207. package/dist/utils/normals.d.ts +86 -0
  208. package/dist/utils/normals.d.ts.map +1 -0
  209. package/dist/utils/normals.js +223 -0
  210. package/dist/utils/normals.js.map +1 -0
  211. package/dist/utils/snow.d.ts +45 -0
  212. package/dist/utils/snow.d.ts.map +1 -0
  213. package/dist/utils/snow.js +144 -0
  214. package/dist/utils/snow.js.map +1 -0
  215. package/dist/utils/temperatureConversion.d.ts +12 -0
  216. package/dist/utils/temperatureConversion.d.ts.map +1 -0
  217. package/dist/utils/temperatureConversion.js +17 -0
  218. package/dist/utils/temperatureConversion.js.map +1 -0
  219. package/dist/utils/timezone.d.ts +56 -0
  220. package/dist/utils/timezone.d.ts.map +1 -0
  221. package/dist/utils/timezone.js +167 -0
  222. package/dist/utils/timezone.js.map +1 -0
  223. package/dist/utils/units.d.ts +69 -0
  224. package/dist/utils/units.d.ts.map +1 -0
  225. package/dist/utils/units.js +158 -0
  226. package/dist/utils/units.js.map +1 -0
  227. package/dist/utils/validation.d.ts +89 -0
  228. package/dist/utils/validation.d.ts.map +1 -0
  229. package/dist/utils/validation.js +177 -0
  230. package/dist/utils/validation.js.map +1 -0
  231. package/dist/utils/version.d.ts +15 -0
  232. package/dist/utils/version.d.ts.map +1 -0
  233. package/dist/utils/version.js +24 -0
  234. package/dist/utils/version.js.map +1 -0
  235. package/package.json +74 -0
@@ -0,0 +1,454 @@
1
+ /**
2
+ * Handler for get_forecast tool
3
+ * Supports both NOAA (US) and Open-Meteo (global) forecast sources
4
+ */
5
+ import { DateTime } from 'luxon';
6
+ import { validateForecastDays, validateGranularity, validateOptionalBoolean, } from '../utils/validation.js';
7
+ import { resolveLocationAsync } from '../utils/locationResolver.js';
8
+ import { logger } from '../utils/logger.js';
9
+ import { extractSnowfallForecast, extractIceAccumulation, formatSnowData, hasWinterWeather } from '../utils/snow.js';
10
+ import { formatInTimezone, guessTimezoneFromCoords } from '../utils/timezone.js';
11
+ import { getClimateNormals, formatNormals, getDateComponents } from '../utils/normals.js';
12
+ function formatLocationLine(latitude, longitude, resolved) {
13
+ const coords = `${latitude.toFixed(4)}, ${longitude.toFixed(4)}`;
14
+ if (resolved.source === 'geocoded' && resolved.display_name) {
15
+ return `**Location:** ${resolved.display_name} (${coords})\n`;
16
+ }
17
+ if (resolved.source === 'saved_location' && resolved.location_name) {
18
+ return `**Location:** ${resolved.location_name} (${coords})\n`;
19
+ }
20
+ return `**Location:** ${coords}\n`;
21
+ }
22
+ /**
23
+ * Determine if coordinates are within the United States (including Alaska, Hawaii, and territories)
24
+ * Uses bounding box approach for simplicity
25
+ */
26
+ function isInUS(latitude, longitude) {
27
+ // Continental US, Alaska, Hawaii, Puerto Rico, and territories
28
+ const inContinentalUS = latitude >= 24.5 && latitude <= 49.4 && longitude >= -125 && longitude <= -66.9;
29
+ const inAlaska = latitude >= 51 && latitude <= 71.4 && longitude >= -180 && longitude <= -129.9;
30
+ const inHawaii = latitude >= 18.9 && latitude <= 28.5 && longitude >= -178.4 && longitude <= -154.8;
31
+ const inPuertoRico = latitude >= 17.9 && latitude <= 18.5 && longitude >= -67.3 && longitude <= -65.2;
32
+ return inContinentalUS || inAlaska || inHawaii || inPuertoRico;
33
+ }
34
+ /**
35
+ * Extract maximum value from gridpoint data series for the next 24-48 hours
36
+ * @param series - The gridpoint data series to process
37
+ * @param hours - Number of hours to look ahead (default: 48)
38
+ * @param maxEntries - Maximum number of entries to process for defense-in-depth (default: 500 ~ 1 week hourly data)
39
+ */
40
+ function getMaxProbabilityFromSeries(series, hours = 48, maxEntries = 500) {
41
+ if (!series || !series.values || series.values.length === 0) {
42
+ return 0;
43
+ }
44
+ // Defense-in-depth: Add bounds checking to prevent resource exhaustion
45
+ // IMPORTANT: Work on a local copy to avoid mutating cached data
46
+ let valuesToProcess = series.values;
47
+ if (series.values.length > maxEntries) {
48
+ logger.warn('Gridpoint series exceeds max entries', {
49
+ length: series.values.length,
50
+ maxEntries,
51
+ securityEvent: true
52
+ });
53
+ // Create a local copy with limited entries - do not mutate the original
54
+ valuesToProcess = series.values.slice(0, maxEntries);
55
+ }
56
+ const now = new Date();
57
+ const futureTime = new Date(now.getTime() + hours * 60 * 60 * 1000);
58
+ let maxValue = 0;
59
+ for (const entry of valuesToProcess) {
60
+ // Parse ISO 8601 interval (e.g., "2025-11-06T15:00:00+00:00/PT1H")
61
+ const validTimeStart = new Date(entry.validTime.split('/')[0]);
62
+ if (validTimeStart >= now && validTimeStart <= futureTime && entry.value !== null) {
63
+ maxValue = Math.max(maxValue, entry.value);
64
+ }
65
+ }
66
+ return maxValue;
67
+ }
68
+ /**
69
+ * Format severe weather probabilities for display
70
+ */
71
+ function formatSevereWeather(properties) {
72
+ let output = '';
73
+ let hasData = false;
74
+ output += `\n## ⚠️ Severe Weather Probabilities (Next 48 Hours)\n\n`;
75
+ // Thunder probability
76
+ const thunderProb = getMaxProbabilityFromSeries(properties.probabilityOfThunder);
77
+ if (thunderProb > 0) {
78
+ hasData = true;
79
+ const emoji = thunderProb > 50 ? '🌩️' : thunderProb > 20 ? '⚡' : '🌤️';
80
+ output += `${emoji} **Thunderstorms:** ${thunderProb}% chance\n`;
81
+ }
82
+ // Wind gust probabilities (show highest risk category)
83
+ const windGust60 = getMaxProbabilityFromSeries(properties.potentialOf60mphWindGusts);
84
+ const windGust50 = getMaxProbabilityFromSeries(properties.potentialOf50mphWindGusts);
85
+ const windGust40 = getMaxProbabilityFromSeries(properties.potentialOf40mphWindGusts);
86
+ const windGust30 = getMaxProbabilityFromSeries(properties.potentialOf30mphWindGusts);
87
+ if (windGust60 > 0) {
88
+ hasData = true;
89
+ output += `💨 **Very High Wind Gusts (60+ mph):** ${windGust60}% chance\n`;
90
+ }
91
+ else if (windGust50 > 0) {
92
+ hasData = true;
93
+ output += `💨 **High Wind Gusts (50+ mph):** ${windGust50}% chance\n`;
94
+ }
95
+ else if (windGust40 > 0) {
96
+ hasData = true;
97
+ output += `💨 **Strong Wind Gusts (40+ mph):** ${windGust40}% chance\n`;
98
+ }
99
+ else if (windGust30 > 20) {
100
+ // Only show moderate gusts if probability is significant
101
+ hasData = true;
102
+ output += `💨 **Moderate Wind Gusts (30+ mph):** ${windGust30}% chance\n`;
103
+ }
104
+ // Tropical storm/hurricane winds (if present)
105
+ const tropicalStormProb = getMaxProbabilityFromSeries(properties.probabilityOfTropicalStormWinds);
106
+ const hurricaneProb = getMaxProbabilityFromSeries(properties.probabilityOfHurricaneWinds);
107
+ if (hurricaneProb > 0) {
108
+ hasData = true;
109
+ output += `🌀 **Hurricane-Force Winds (74+ mph):** ${hurricaneProb}% chance\n`;
110
+ }
111
+ else if (tropicalStormProb > 0) {
112
+ hasData = true;
113
+ output += `🌀 **Tropical Storm Winds (39-73 mph):** ${tropicalStormProb}% chance\n`;
114
+ }
115
+ // Lightning activity
116
+ if (properties.lightningActivityLevel && properties.lightningActivityLevel.values && properties.lightningActivityLevel.values.length > 0) {
117
+ const lightningLevels = properties.lightningActivityLevel.values.filter(v => v.value !== null && v.value > 0);
118
+ if (lightningLevels.length > 0) {
119
+ hasData = true;
120
+ const maxLevel = Math.max(...lightningLevels.map(v => v.value || 0));
121
+ const levelDesc = maxLevel >= 4 ? 'Very High' : maxLevel >= 3 ? 'High' : maxLevel >= 2 ? 'Moderate' : 'Low';
122
+ output += `⚡ **Lightning Activity:** ${levelDesc} (Level ${maxLevel})\n`;
123
+ }
124
+ }
125
+ if (!hasData) {
126
+ return null; // No severe weather data to display
127
+ }
128
+ output += `\n*Note: These are probabilistic forecasts and may change. Always monitor local weather alerts for official warnings.*\n`;
129
+ return output;
130
+ }
131
+ export async function handleGetForecast(args, noaaService, openMeteoService, locationStore, geocodingService, nceiService) {
132
+ const resolved = await resolveLocationAsync(args, locationStore, geocodingService);
133
+ const { latitude, longitude } = resolved;
134
+ const days = validateForecastDays(args);
135
+ const granularity = validateGranularity(args?.granularity);
136
+ const include_precipitation_probability = validateOptionalBoolean(args?.include_precipitation_probability, 'include_precipitation_probability', true);
137
+ const include_severe_weather = validateOptionalBoolean(args?.include_severe_weather, 'include_severe_weather', false);
138
+ const include_normals = validateOptionalBoolean(args?.include_normals, 'include_normals', false);
139
+ // Get source preference or auto-detect
140
+ const requestedSource = args?.source || 'auto';
141
+ let useNOAA;
142
+ if (requestedSource === 'auto') {
143
+ // Auto-detect based on location (US = NOAA, elsewhere = Open-Meteo)
144
+ useNOAA = isInUS(latitude, longitude);
145
+ }
146
+ else {
147
+ useNOAA = requestedSource === 'noaa';
148
+ }
149
+ // Use NOAA for US locations or if explicitly requested
150
+ if (useNOAA) {
151
+ return await formatNOAAForecast(noaaService, openMeteoService, nceiService, resolved, days, granularity, include_precipitation_probability, include_severe_weather, include_normals);
152
+ }
153
+ else {
154
+ // Use Open-Meteo for international locations
155
+ return await formatOpenMeteoForecast(openMeteoService, nceiService, resolved, days, granularity, include_precipitation_probability, include_normals);
156
+ }
157
+ }
158
+ /**
159
+ * Format NOAA forecast data for display
160
+ */
161
+ async function formatNOAAForecast(noaaService, openMeteoService, nceiService, resolved, days, granularity, include_precipitation_probability, include_severe_weather, include_normals) {
162
+ const { latitude, longitude } = resolved;
163
+ // Get timezone for proper time formatting
164
+ let timezone = guessTimezoneFromCoords(latitude, longitude);
165
+ try {
166
+ const points = await noaaService.getPointData(latitude, longitude);
167
+ if (points.properties.timeZone) {
168
+ timezone = points.properties.timeZone;
169
+ }
170
+ }
171
+ catch (error) {
172
+ // Use fallback timezone
173
+ }
174
+ // Get forecast data based on granularity
175
+ const forecast = granularity === 'hourly'
176
+ ? await noaaService.getHourlyForecastByCoordinates(latitude, longitude)
177
+ : await noaaService.getForecastByCoordinates(latitude, longitude);
178
+ // Determine how many periods to show
179
+ let periods;
180
+ if (granularity === 'hourly') {
181
+ // For hourly, show up to days * 24 hours
182
+ periods = forecast.properties.periods.slice(0, days * 24);
183
+ }
184
+ else {
185
+ // For daily, show up to days * 2 (day/night periods)
186
+ periods = forecast.properties.periods.slice(0, days * 2);
187
+ }
188
+ // Format the forecast for display
189
+ let output = `# Weather Forecast (${granularity === 'hourly' ? 'Hourly' : 'Daily'})\n\n`;
190
+ output += formatLocationLine(latitude, longitude, resolved);
191
+ output += `**Elevation:** ${forecast.properties.elevation.value}m\n`;
192
+ if (forecast.properties.updated) {
193
+ output += `**Updated:** ${formatInTimezone(forecast.properties.updated, timezone)}\n`;
194
+ }
195
+ output += `**Showing:** ${periods.length} ${granularity === 'hourly' ? 'hours' : 'periods'}\n\n`;
196
+ for (const period of periods) {
197
+ // For hourly forecasts, use the start time as the header since period names are empty
198
+ const periodHeader = granularity === 'hourly' && !period.name
199
+ ? formatInTimezone(period.startTime, timezone, 'short')
200
+ : period.name;
201
+ output += `## ${periodHeader}\n`;
202
+ output += `**Temperature:** ${period.temperature}°${period.temperatureUnit}`;
203
+ // Add temperature trend if available
204
+ if (period.temperatureTrend && period.temperatureTrend.trim()) {
205
+ output += ` (${period.temperatureTrend})`;
206
+ }
207
+ output += `\n`;
208
+ // Add precipitation probability if requested and available
209
+ if (include_precipitation_probability && period.probabilityOfPrecipitation?.value !== null && period.probabilityOfPrecipitation?.value !== undefined) {
210
+ output += `**Precipitation Chance:** ${period.probabilityOfPrecipitation.value}%\n`;
211
+ }
212
+ output += `**Wind:** ${period.windSpeed} ${period.windDirection}\n`;
213
+ // Add humidity if available (more common in hourly forecasts)
214
+ if (period.relativeHumidity?.value !== null && period.relativeHumidity?.value !== undefined) {
215
+ output += `**Humidity:** ${period.relativeHumidity.value}%\n`;
216
+ }
217
+ output += `**Forecast:** ${period.shortForecast}\n\n`;
218
+ // For daily forecasts, include detailed forecast
219
+ if (granularity === 'daily' && period.detailedForecast) {
220
+ output += `${period.detailedForecast}\n\n`;
221
+ }
222
+ }
223
+ output += `---\n`;
224
+ output += `*Data source: NOAA National Weather Service (US)*\n`;
225
+ // Fetch gridpoint data once for both severe weather and winter weather
226
+ let gridpointData = null;
227
+ // Add severe weather probabilities if requested
228
+ if (include_severe_weather) {
229
+ try {
230
+ gridpointData = await noaaService.getGridpointDataByCoordinates(latitude, longitude);
231
+ const severeWeatherSection = formatSevereWeather(gridpointData.properties);
232
+ if (severeWeatherSection) {
233
+ output += `\n${severeWeatherSection}`;
234
+ }
235
+ }
236
+ catch (error) {
237
+ // If severe weather data is unavailable, just note it without failing the whole request
238
+ output += `\n*Note: Severe weather probability data is not available for this location.*\n`;
239
+ }
240
+ }
241
+ // Add winter weather (snowfall/ice) if available
242
+ try {
243
+ // Fetch gridpoint data if we haven't already
244
+ if (!gridpointData) {
245
+ gridpointData = await noaaService.getGridpointDataByCoordinates(latitude, longitude);
246
+ }
247
+ // Calculate time range for forecast period
248
+ const now = new Date();
249
+ const endTime = new Date(now.getTime() + days * 24 * 60 * 60 * 1000);
250
+ // Extract snowfall and ice accumulation
251
+ const snowfall = extractSnowfallForecast(gridpointData.properties, now, endTime);
252
+ const ice = extractIceAccumulation(gridpointData.properties, now, endTime);
253
+ const winterData = {
254
+ snowfallAmount: snowfall,
255
+ iceAccumulation: ice
256
+ };
257
+ if (hasWinterWeather(winterData)) {
258
+ output += formatSnowData(winterData);
259
+ }
260
+ }
261
+ catch (error) {
262
+ // Winter weather data is optional, silently skip if unavailable
263
+ }
264
+ // Add climate normals if requested and for daily forecasts only
265
+ if (include_normals && granularity === 'daily') {
266
+ try {
267
+ // Get the first forecast day to determine the date
268
+ const firstPeriod = periods[0];
269
+ if (firstPeriod && firstPeriod.startTime) {
270
+ const { month, day } = getDateComponents(firstPeriod.startTime);
271
+ // Fetch climate normals using hybrid strategy
272
+ const normals = await getClimateNormals(openMeteoService, nceiService, latitude, longitude, month, day);
273
+ // Get forecasted high/low for comparison (first day)
274
+ let forecastHigh;
275
+ let forecastLow;
276
+ // NOAA gives day/night periods, so we need to find high (day) and low (night)
277
+ for (const period of periods.slice(0, 2)) { // Check first 2 periods (day + night)
278
+ if (period.isDaytime && period.temperature !== undefined) {
279
+ forecastHigh = period.temperature;
280
+ }
281
+ else if (!period.isDaytime && period.temperature !== undefined) {
282
+ forecastLow = period.temperature;
283
+ }
284
+ }
285
+ const currentTemps = {
286
+ high: forecastHigh,
287
+ low: forecastLow
288
+ };
289
+ output += formatNormals(normals, currentTemps);
290
+ }
291
+ }
292
+ catch (error) {
293
+ // If normals fetch fails, just skip it (don't error the whole request)
294
+ output += `\n## Climate Normals\n\n`;
295
+ output += `⚠️ Climate normals data not available for this location.\n`;
296
+ }
297
+ }
298
+ return {
299
+ content: [
300
+ {
301
+ type: 'text',
302
+ text: output
303
+ }
304
+ ]
305
+ };
306
+ }
307
+ /**
308
+ * Format Open-Meteo forecast data for display
309
+ */
310
+ async function formatOpenMeteoForecast(openMeteoService, nceiService, resolved, days, granularity, include_precipitation_probability, include_normals) {
311
+ const { latitude, longitude } = resolved;
312
+ // Get forecast data from Open-Meteo
313
+ const forecast = await openMeteoService.getForecast(latitude, longitude, days, granularity === 'hourly');
314
+ let output = `# Weather Forecast (${granularity === 'hourly' ? 'Hourly' : 'Daily'})\n\n`;
315
+ output += formatLocationLine(latitude, longitude, resolved);
316
+ output += `**Elevation:** ${forecast.elevation}m\n`;
317
+ output += `**Timezone:** ${forecast.timezone}\n`;
318
+ output += `**Forecast Days:** ${days}\n\n`;
319
+ if (granularity === 'hourly' && forecast.hourly) {
320
+ // Format hourly data
321
+ const hourly = forecast.hourly;
322
+ const numHours = Math.min(hourly.time.length, days * 24);
323
+ for (let i = 0; i < numHours; i++) {
324
+ output += `## ${formatInTimezone(hourly.time[i], forecast.timezone, 'short')}\n`;
325
+ if (hourly.temperature_2m?.[i] !== undefined) {
326
+ output += `**Temperature:** ${Math.round(hourly.temperature_2m[i])}°F`;
327
+ if (hourly.apparent_temperature?.[i] !== undefined) {
328
+ output += ` (feels like ${Math.round(hourly.apparent_temperature[i])}°F)`;
329
+ }
330
+ output += `\n`;
331
+ }
332
+ if (include_precipitation_probability && hourly.precipitation_probability?.[i] !== undefined) {
333
+ output += `**Precipitation Chance:** ${hourly.precipitation_probability[i]}%\n`;
334
+ }
335
+ if (hourly.precipitation?.[i] !== undefined && hourly.precipitation[i] > 0) {
336
+ output += `**Precipitation:** ${hourly.precipitation[i].toFixed(2)} in\n`;
337
+ }
338
+ if (hourly.wind_speed_10m?.[i] !== undefined) {
339
+ const windDir = hourly.wind_direction_10m?.[i] !== undefined
340
+ ? ` ${getWindDirection(hourly.wind_direction_10m[i])}`
341
+ : '';
342
+ output += `**Wind:** ${Math.round(hourly.wind_speed_10m[i])} mph${windDir}\n`;
343
+ if (hourly.wind_gusts_10m?.[i] !== undefined && hourly.wind_gusts_10m[i] > hourly.wind_speed_10m[i] * 1.2) {
344
+ output += `**Wind Gusts:** ${Math.round(hourly.wind_gusts_10m[i])} mph\n`;
345
+ }
346
+ }
347
+ if (hourly.relative_humidity_2m?.[i] !== undefined) {
348
+ output += `**Humidity:** ${hourly.relative_humidity_2m[i]}%\n`;
349
+ }
350
+ if (hourly.weather_code?.[i] !== undefined) {
351
+ output += `**Conditions:** ${openMeteoService.getWeatherDescription(hourly.weather_code[i])}\n`;
352
+ }
353
+ output += `\n`;
354
+ }
355
+ }
356
+ else if (forecast.daily) {
357
+ // Format daily data with sunrise/sunset
358
+ const daily = forecast.daily;
359
+ const numDays = Math.min(daily.time.length, days);
360
+ for (let i = 0; i < numDays; i++) {
361
+ // Use timezone-aware date formatting
362
+ const dt = DateTime.fromISO(daily.time[i], { setZone: false }).setZone(forecast.timezone);
363
+ output += `## ${dt.toLocaleString({ weekday: 'long', month: 'long', day: 'numeric' })}\n`;
364
+ if (daily.temperature_2m_max?.[i] !== undefined && daily.temperature_2m_min?.[i] !== undefined) {
365
+ output += `**Temperature:** High ${Math.round(daily.temperature_2m_max[i])}°F / Low ${Math.round(daily.temperature_2m_min[i])}°F\n`;
366
+ }
367
+ if (daily.apparent_temperature_max?.[i] !== undefined && daily.apparent_temperature_min?.[i] !== undefined) {
368
+ output += `**Feels Like:** High ${Math.round(daily.apparent_temperature_max[i])}°F / Low ${Math.round(daily.apparent_temperature_min[i])}°F\n`;
369
+ }
370
+ // Include sunrise/sunset data with timezone
371
+ if (daily.sunrise?.[i]) {
372
+ const sunrise = DateTime.fromISO(daily.sunrise[i], { setZone: false }).setZone(forecast.timezone);
373
+ output += `**Sunrise:** ${sunrise.toLocaleString(DateTime.TIME_SIMPLE)}\n`;
374
+ }
375
+ if (daily.sunset?.[i]) {
376
+ const sunset = DateTime.fromISO(daily.sunset[i], { setZone: false }).setZone(forecast.timezone);
377
+ output += `**Sunset:** ${sunset.toLocaleString(DateTime.TIME_SIMPLE)}\n`;
378
+ }
379
+ if (daily.daylight_duration?.[i] !== undefined) {
380
+ const hours = Math.floor(daily.daylight_duration[i] / 3600);
381
+ const minutes = Math.floor((daily.daylight_duration[i] % 3600) / 60);
382
+ output += `**Daylight Duration:** ${hours}h ${minutes}m\n`;
383
+ }
384
+ if (include_precipitation_probability && daily.precipitation_probability_max?.[i] !== undefined) {
385
+ output += `**Precipitation Chance:** ${daily.precipitation_probability_max[i]}%\n`;
386
+ }
387
+ if (daily.precipitation_sum?.[i] !== undefined && daily.precipitation_sum[i] > 0) {
388
+ output += `**Precipitation:** ${daily.precipitation_sum[i].toFixed(2)} in\n`;
389
+ }
390
+ if (daily.wind_speed_10m_max?.[i] !== undefined) {
391
+ const windDir = daily.wind_direction_10m_dominant?.[i] !== undefined
392
+ ? ` ${getWindDirection(daily.wind_direction_10m_dominant[i])}`
393
+ : '';
394
+ output += `**Wind:** ${Math.round(daily.wind_speed_10m_max[i])} mph${windDir}\n`;
395
+ if (daily.wind_gusts_10m_max?.[i] !== undefined && daily.wind_gusts_10m_max[i] > daily.wind_speed_10m_max[i] * 1.2) {
396
+ output += `**Wind Gusts:** ${Math.round(daily.wind_gusts_10m_max[i])} mph\n`;
397
+ }
398
+ }
399
+ if (daily.weather_code?.[i] !== undefined) {
400
+ output += `**Conditions:** ${openMeteoService.getWeatherDescription(daily.weather_code[i])}\n`;
401
+ }
402
+ if (daily.uv_index_max?.[i] !== undefined) {
403
+ output += `**UV Index:** ${daily.uv_index_max[i].toFixed(1)}\n`;
404
+ }
405
+ output += `\n`;
406
+ }
407
+ }
408
+ output += `---\n`;
409
+ output += `*Data source: Open-Meteo (Global)*\n`;
410
+ // Add climate normals if requested and for daily forecasts only
411
+ if (include_normals && granularity === 'daily' && forecast.daily) {
412
+ try {
413
+ // Get the first forecast day
414
+ const firstDay = forecast.daily.time[0];
415
+ if (firstDay) {
416
+ const { month, day } = getDateComponents(firstDay);
417
+ // Fetch climate normals using hybrid strategy
418
+ const normals = await getClimateNormals(openMeteoService, nceiService, latitude, longitude, month, day);
419
+ // Get forecasted high/low for comparison (first day)
420
+ const currentTemps = {
421
+ high: forecast.daily.temperature_2m_max?.[0] !== undefined
422
+ ? Math.round(forecast.daily.temperature_2m_max[0])
423
+ : undefined,
424
+ low: forecast.daily.temperature_2m_min?.[0] !== undefined
425
+ ? Math.round(forecast.daily.temperature_2m_min[0])
426
+ : undefined
427
+ };
428
+ output += formatNormals(normals, currentTemps);
429
+ }
430
+ }
431
+ catch (error) {
432
+ // If normals fetch fails, just skip it (don't error the whole request)
433
+ output += `\n## Climate Normals\n\n`;
434
+ output += `⚠️ Climate normals data not available for this location.\n`;
435
+ }
436
+ }
437
+ return {
438
+ content: [
439
+ {
440
+ type: 'text',
441
+ text: output
442
+ }
443
+ ]
444
+ };
445
+ }
446
+ /**
447
+ * Convert wind direction degrees to cardinal direction
448
+ */
449
+ function getWindDirection(degrees) {
450
+ const directions = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'];
451
+ const index = Math.round(degrees / 22.5) % 16;
452
+ return directions[index];
453
+ }
454
+ //# sourceMappingURL=forecastHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forecastHandler.js","sourceRoot":"","sources":["../../src/handlers/forecastHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Handler for get_historical_weather tool
3
+ */
4
+ import { NOAAService } from '../services/noaa.js';
5
+ import { OpenMeteoService } from '../services/openmeteo.js';
6
+ export declare function handleGetHistoricalWeather(args: unknown, noaaService: NOAAService, openMeteoService: OpenMeteoService): Promise<{
7
+ content: Array<{
8
+ type: string;
9
+ text: string;
10
+ }>;
11
+ }>;
12
+ //# sourceMappingURL=historicalWeatherHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historicalWeatherHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/historicalWeatherHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAK5D,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA+N7D"}