@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,188 @@
1
+ /**
2
+ * Handler for get_historical_weather tool
3
+ */
4
+ import { validateHistoricalWeatherParams } from '../utils/validation.js';
5
+ import { convertToFahrenheit } from '../utils/temperatureConversion.js';
6
+ import { ApiConstants, FormatConstants } from '../config/displayThresholds.js';
7
+ export async function handleGetHistoricalWeather(args, noaaService, openMeteoService) {
8
+ // Validate input parameters with runtime checks
9
+ const { latitude, longitude, start_date, end_date, limit = FormatConstants.defaultHistoricalLimit } = validateHistoricalWeatherParams(args);
10
+ // Parse dates
11
+ const startTime = new Date(start_date);
12
+ const endTime = new Date(end_date);
13
+ // Validate dates are not in the future
14
+ const now = new Date();
15
+ if (startTime > now) {
16
+ throw new Error(`Start date (${start_date}) cannot be in the future. Current date is ${now.toISOString().split('T')[0]}.`);
17
+ }
18
+ if (endTime > now) {
19
+ throw new Error(`End date (${end_date}) cannot be in the future. Current date is ${now.toISOString().split('T')[0]}.`);
20
+ }
21
+ // Determine which API to use based on date range
22
+ // If start date is older than threshold, use archival API
23
+ const thresholdDate = new Date(now.getTime() - ApiConstants.historicalDataThresholdDays * 24 * 60 * 60 * 1000);
24
+ const useArchivalData = startTime < thresholdDate;
25
+ if (useArchivalData) {
26
+ // Use Open-Meteo API for historical/archival data
27
+ try {
28
+ // Determine whether to use hourly or daily data based on date range
29
+ const daysDiff = Math.ceil((endTime.getTime() - startTime.getTime()) / (1000 * 60 * 60 * 24));
30
+ const useHourly = daysDiff <= ApiConstants.maxHourlyHistoricalDays;
31
+ const weatherData = await openMeteoService.getHistoricalWeather(latitude, longitude, start_date.split('T')[0], // Ensure YYYY-MM-DD format
32
+ end_date.split('T')[0], useHourly);
33
+ // Format the response based on data granularity
34
+ if (useHourly && weatherData.hourly) {
35
+ // Format hourly observations
36
+ let output = `# Historical Weather Observations (Hourly)\n\n`;
37
+ output += `**Period:** ${startTime.toLocaleDateString()} to ${endTime.toLocaleDateString()}\n`;
38
+ output += `**Location:** ${weatherData.latitude.toFixed(4)}°N, ${Math.abs(weatherData.longitude).toFixed(4)}°${weatherData.longitude >= 0 ? 'E' : 'W'} (${weatherData.elevation}m elevation)\n`;
39
+ output += `**Number of observations:** ${weatherData.hourly.time.length}\n`;
40
+ output += `**Data source:** Open-Meteo Historical Weather API (Reanalysis)\n\n`;
41
+ const maxObservations = Math.min(limit, weatherData.hourly.time.length);
42
+ for (let i = 0; i < maxObservations; i++) {
43
+ const time = new Date(weatherData.hourly.time[i]);
44
+ output += `## ${time.toLocaleString()}\n`;
45
+ if (weatherData.hourly.temperature_2m?.[i] !== null && weatherData.hourly.temperature_2m?.[i] !== undefined) {
46
+ output += `- **Temperature:** ${Math.round(weatherData.hourly.temperature_2m[i])}°F\n`;
47
+ }
48
+ if (weatherData.hourly.apparent_temperature?.[i] !== null && weatherData.hourly.apparent_temperature?.[i] !== undefined) {
49
+ output += `- **Feels Like:** ${Math.round(weatherData.hourly.apparent_temperature[i])}°F\n`;
50
+ }
51
+ if (weatherData.hourly.weather_code?.[i] !== null && weatherData.hourly.weather_code?.[i] !== undefined) {
52
+ output += `- **Conditions:** ${openMeteoService.getWeatherDescription(weatherData.hourly.weather_code[i])}\n`;
53
+ }
54
+ if (weatherData.hourly.precipitation?.[i] !== null && weatherData.hourly.precipitation?.[i] !== undefined && weatherData.hourly.precipitation[i] > 0) {
55
+ output += `- **Precipitation:** ${weatherData.hourly.precipitation[i].toFixed(2)} in\n`;
56
+ }
57
+ if (weatherData.hourly.snowfall?.[i] !== null && weatherData.hourly.snowfall?.[i] !== undefined && weatherData.hourly.snowfall[i] > 0) {
58
+ output += `- **Snowfall:** ${weatherData.hourly.snowfall[i].toFixed(1)} in\n`;
59
+ }
60
+ if (weatherData.hourly.wind_speed_10m?.[i] !== null && weatherData.hourly.wind_speed_10m?.[i] !== undefined) {
61
+ output += `- **Wind:** ${Math.round(weatherData.hourly.wind_speed_10m[i])} mph`;
62
+ if (weatherData.hourly.wind_direction_10m?.[i] !== null && weatherData.hourly.wind_direction_10m?.[i] !== undefined) {
63
+ output += ` from ${Math.round(weatherData.hourly.wind_direction_10m[i])}°`;
64
+ }
65
+ output += `\n`;
66
+ }
67
+ if (weatherData.hourly.relative_humidity_2m?.[i] !== null && weatherData.hourly.relative_humidity_2m?.[i] !== undefined) {
68
+ output += `- **Humidity:** ${Math.round(weatherData.hourly.relative_humidity_2m[i])}%\n`;
69
+ }
70
+ if (weatherData.hourly.pressure_msl?.[i] !== null && weatherData.hourly.pressure_msl?.[i] !== undefined) {
71
+ const pressureInHg = weatherData.hourly.pressure_msl[i] * 0.02953;
72
+ output += `- **Pressure:** ${pressureInHg.toFixed(2)} inHg\n`;
73
+ }
74
+ if (weatherData.hourly.cloud_cover?.[i] !== null && weatherData.hourly.cloud_cover?.[i] !== undefined) {
75
+ output += `- **Cloud Cover:** ${weatherData.hourly.cloud_cover[i]}%\n`;
76
+ }
77
+ output += `\n`;
78
+ }
79
+ return {
80
+ content: [
81
+ {
82
+ type: 'text',
83
+ text: output
84
+ }
85
+ ]
86
+ };
87
+ }
88
+ else if (weatherData.daily) {
89
+ // Format daily summaries
90
+ let output = `# Historical Weather Data (Daily Summaries)\n\n`;
91
+ output += `**Period:** ${startTime.toLocaleDateString()} to ${endTime.toLocaleDateString()}\n`;
92
+ output += `**Location:** ${weatherData.latitude.toFixed(4)}°N, ${Math.abs(weatherData.longitude).toFixed(4)}°${weatherData.longitude >= 0 ? 'E' : 'W'} (${weatherData.elevation}m elevation)\n`;
93
+ output += `**Number of days:** ${weatherData.daily.time.length}\n`;
94
+ output += `**Data source:** Open-Meteo Historical Weather API (Reanalysis)\n\n`;
95
+ for (let i = 0; i < weatherData.daily.time.length; i++) {
96
+ const date = new Date(weatherData.daily.time[i]);
97
+ output += `## ${date.toLocaleDateString()}\n`;
98
+ if (weatherData.daily.temperature_2m_max?.[i] !== null && weatherData.daily.temperature_2m_max?.[i] !== undefined) {
99
+ output += `- **High Temperature:** ${Math.round(weatherData.daily.temperature_2m_max[i])}°F\n`;
100
+ }
101
+ if (weatherData.daily.temperature_2m_min?.[i] !== null && weatherData.daily.temperature_2m_min?.[i] !== undefined) {
102
+ output += `- **Low Temperature:** ${Math.round(weatherData.daily.temperature_2m_min[i])}°F\n`;
103
+ }
104
+ if (weatherData.daily.temperature_2m_mean?.[i] !== null && weatherData.daily.temperature_2m_mean?.[i] !== undefined) {
105
+ output += `- **Average Temperature:** ${Math.round(weatherData.daily.temperature_2m_mean[i])}°F\n`;
106
+ }
107
+ if (weatherData.daily.weather_code?.[i] !== null && weatherData.daily.weather_code?.[i] !== undefined) {
108
+ output += `- **Conditions:** ${openMeteoService.getWeatherDescription(weatherData.daily.weather_code[i])}\n`;
109
+ }
110
+ if (weatherData.daily.precipitation_sum?.[i] !== null && weatherData.daily.precipitation_sum?.[i] !== undefined) {
111
+ output += `- **Precipitation:** ${weatherData.daily.precipitation_sum[i].toFixed(2)} in\n`;
112
+ }
113
+ if (weatherData.daily.snowfall_sum?.[i] !== null && weatherData.daily.snowfall_sum?.[i] !== undefined && weatherData.daily.snowfall_sum[i] > 0) {
114
+ output += `- **Snowfall:** ${weatherData.daily.snowfall_sum[i].toFixed(1)} in\n`;
115
+ }
116
+ if (weatherData.daily.wind_speed_10m_max?.[i] !== null && weatherData.daily.wind_speed_10m_max?.[i] !== undefined) {
117
+ output += `- **Max Wind Speed:** ${Math.round(weatherData.daily.wind_speed_10m_max[i])} mph\n`;
118
+ }
119
+ output += `\n`;
120
+ }
121
+ return {
122
+ content: [
123
+ {
124
+ type: 'text',
125
+ text: output
126
+ }
127
+ ]
128
+ };
129
+ }
130
+ else {
131
+ throw new Error('No weather data available in response');
132
+ }
133
+ }
134
+ catch (error) {
135
+ // If Open-Meteo API fails, provide helpful error message
136
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
137
+ throw new Error(`Unable to retrieve historical data: ${errorMessage}`);
138
+ }
139
+ }
140
+ else {
141
+ // Use real-time NOAA API for recent data (last 7 days)
142
+ const observations = await noaaService.getHistoricalObservations(latitude, longitude, startTime, endTime, limit);
143
+ if (!observations.features || observations.features.length === 0) {
144
+ return {
145
+ content: [
146
+ {
147
+ type: 'text',
148
+ text: `No historical observations found for the specified date range (${start_date} to ${end_date}).\n\nThis may occur because:\n- The dates are outside the station's available data range\n- There are gaps in the observation records for this location\n- The weather station near this location may not have archived data for these dates\n\nNote: Historical weather data availability varies by location and weather station. Some stations have limited historical records.`
149
+ }
150
+ ]
151
+ };
152
+ }
153
+ // Format the observations
154
+ let output = `# Historical Weather Observations\n\n`;
155
+ output += `**Period:** ${startTime.toLocaleDateString()} to ${endTime.toLocaleDateString()}\n`;
156
+ output += `**Number of observations:** ${observations.features.length}\n`;
157
+ output += `**Data source:** NOAA Real-time API\n\n`;
158
+ for (const obs of observations.features) {
159
+ const props = obs.properties;
160
+ output += `## ${new Date(props.timestamp).toLocaleString()}\n`;
161
+ if (props.temperature.value !== null) {
162
+ const tempF = convertToFahrenheit(props.temperature.value, props.temperature.unitCode);
163
+ if (tempF !== null) {
164
+ output += `- **Temperature:** ${Math.round(tempF)}°F\n`;
165
+ }
166
+ }
167
+ if (props.textDescription) {
168
+ output += `- **Conditions:** ${props.textDescription}\n`;
169
+ }
170
+ if (props.windSpeed.value !== null) {
171
+ const windMph = props.windSpeed.unitCode.includes('km_h')
172
+ ? props.windSpeed.value * 0.621371
173
+ : props.windSpeed.value * 2.23694;
174
+ output += `- **Wind:** ${Math.round(windMph)} mph\n`;
175
+ }
176
+ output += `\n`;
177
+ }
178
+ return {
179
+ content: [
180
+ {
181
+ type: 'text',
182
+ text: output
183
+ }
184
+ ]
185
+ };
186
+ }
187
+ }
188
+ //# sourceMappingURL=historicalWeatherHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historicalWeatherHandler.js","sourceRoot":"","sources":["../../src/handlers/historicalWeatherHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Handler for get_lightning_activity tool
3
+ * Provides real-time lightning strike monitoring and safety assessment
4
+ */
5
+ import { LightningActivityParams, LightningActivityResponse } from '../types/lightning.js';
6
+ /**
7
+ * Get lightning activity for a location
8
+ */
9
+ export declare function getLightningActivity(params: LightningActivityParams): Promise<LightningActivityResponse>;
10
+ /**
11
+ * Format lightning activity response for display
12
+ */
13
+ export declare function formatLightningActivityResponse(response: LightningActivityResponse): string;
14
+ //# sourceMappingURL=lightningHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightningHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/lightningHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EAK1B,MAAM,uBAAuB,CAAC;AAyJ/B;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CA+C9G;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,yBAAyB,GAAG,MAAM,CA2F3F"}
@@ -0,0 +1,258 @@
1
+ /**
2
+ * Handler for get_lightning_activity tool
3
+ * Provides real-time lightning strike monitoring and safety assessment
4
+ */
5
+ import { blitzortungService } from '../services/blitzortung.js';
6
+ import { validateLatitude, validateLongitude } from '../utils/validation.js';
7
+ import { logger, redactCoordinatesForLogging } from '../utils/logger.js';
8
+ import { ValidationError } from '../errors/ApiError.js';
9
+ /**
10
+ * Validate lightning activity request parameters
11
+ */
12
+ function validateLightningParams(params) {
13
+ // Validate coordinates
14
+ validateLatitude(params.latitude);
15
+ validateLongitude(params.longitude);
16
+ // Validate radius
17
+ if (params.radius !== undefined) {
18
+ if (typeof params.radius !== 'number' || params.radius < 1 || params.radius > 500) {
19
+ throw new ValidationError('radius must be a number between 1 and 500 km', 'radius', params.radius);
20
+ }
21
+ }
22
+ // Validate time window
23
+ if (params.timeWindow !== undefined) {
24
+ if (typeof params.timeWindow !== 'number' || params.timeWindow < 5 || params.timeWindow > 120) {
25
+ throw new ValidationError('timeWindow must be a number between 5 and 120 minutes', 'timeWindow', params.timeWindow);
26
+ }
27
+ }
28
+ }
29
+ /**
30
+ * Calculate lightning activity statistics
31
+ */
32
+ function calculateStatistics(strikes, radiusKm, timeWindowMinutes) {
33
+ if (strikes.length === 0) {
34
+ return {
35
+ totalStrikes: 0,
36
+ cloudToGroundStrikes: 0,
37
+ intraCloudStrikes: 0,
38
+ averageDistance: 0,
39
+ nearestDistance: 0,
40
+ strikesPerMinute: 0,
41
+ densityPerSqKm: 0
42
+ };
43
+ }
44
+ // Count cloud-to-ground vs intra-cloud (based on polarity and amplitude)
45
+ // Typically, stronger amplitude indicates cloud-to-ground
46
+ const cloudToGround = strikes.filter(s => Math.abs(s.amplitude) > 20).length;
47
+ const intraCloud = strikes.length - cloudToGround;
48
+ // Calculate average distance
49
+ const totalDistance = strikes.reduce((sum, s) => sum + (s.distance || 0), 0);
50
+ const averageDistance = totalDistance / strikes.length;
51
+ // Nearest distance
52
+ const nearestDistance = strikes[0]?.distance || 0;
53
+ // Strikes per minute
54
+ const strikesPerMinute = strikes.length / timeWindowMinutes;
55
+ // Density per square km (area of search circle)
56
+ const searchArea = Math.PI * radiusKm * radiusKm;
57
+ const densityPerSqKm = strikes.length / searchArea;
58
+ return {
59
+ totalStrikes: strikes.length,
60
+ cloudToGroundStrikes: cloudToGround,
61
+ intraCloudStrikes: intraCloud,
62
+ averageDistance,
63
+ nearestDistance,
64
+ strikesPerMinute,
65
+ densityPerSqKm
66
+ };
67
+ }
68
+ /**
69
+ * Assess safety level based on lightning activity
70
+ */
71
+ function assessSafety(strikes, statistics) {
72
+ const nearestStrike = strikes[0] || null;
73
+ const nearestDistance = nearestStrike?.distance || null;
74
+ const nearestTime = nearestStrike?.timestamp || null;
75
+ // Determine if there's active thunderstorm activity
76
+ // Active if: strikes in last 10 minutes OR high strike rate
77
+ const recentStrikes = strikes.filter(s => {
78
+ const ageMinutes = (Date.now() - s.timestamp.getTime()) / (1000 * 60);
79
+ return ageMinutes <= 10;
80
+ });
81
+ const isActiveThunderstorm = recentStrikes.length > 0 || statistics.strikesPerMinute > 0.5;
82
+ let level;
83
+ let message;
84
+ const recommendations = [];
85
+ // Safety assessment based on nearest strike distance
86
+ if (nearestDistance === null || nearestDistance > 50) {
87
+ level = 'safe';
88
+ message = 'No significant lightning activity detected in the area.';
89
+ recommendations.push('Continue to monitor weather conditions.');
90
+ recommendations.push('Lightning can strike from distant storms, so stay alert to changing conditions.');
91
+ }
92
+ else if (nearestDistance > 16) {
93
+ level = 'elevated';
94
+ message = `Lightning detected ${nearestDistance.toFixed(1)} km away. Thunderstorm in the vicinity.`;
95
+ recommendations.push('Move activities indoors if possible.');
96
+ recommendations.push('Avoid open areas, tall objects, and bodies of water.');
97
+ recommendations.push('If outdoors, seek shelter in a substantial building or hard-topped vehicle.');
98
+ recommendations.push('Monitor conditions closely - storms can move quickly.');
99
+ }
100
+ else if (nearestDistance > 8) {
101
+ level = 'high';
102
+ message = `Lightning strike detected ${nearestDistance.toFixed(1)} km away. High risk - seek shelter immediately.`;
103
+ recommendations.push('SEEK SHELTER IMMEDIATELY in a substantial building or hard-topped vehicle.');
104
+ recommendations.push('Do NOT shelter under trees or in open-sided structures.');
105
+ recommendations.push('Stay away from windows, doors, and electrical equipment.');
106
+ recommendations.push('If caught outside, crouch low with feet together and hands on knees.');
107
+ recommendations.push('Wait 30 minutes after the last thunder before resuming outdoor activities.');
108
+ }
109
+ else {
110
+ level = 'extreme';
111
+ message = `EXTREME DANGER: Lightning strike within ${nearestDistance?.toFixed(1)} km. You are in immediate danger.`;
112
+ recommendations.push('⚠️ TAKE IMMEDIATE SHELTER - Lightning is striking nearby!');
113
+ recommendations.push('Get inside a substantial building or hard-topped vehicle NOW.');
114
+ recommendations.push('If no shelter available, crouch low immediately with feet together.');
115
+ recommendations.push('Do NOT lie flat - minimize contact with ground.');
116
+ recommendations.push('Stay away from tall objects, water, and metal objects.');
117
+ recommendations.push('Remain in shelter for 30 minutes after the last thunder.');
118
+ }
119
+ // Add activity-specific recommendations
120
+ if (isActiveThunderstorm) {
121
+ if (level === 'safe') {
122
+ recommendations.unshift('Active thunderstorm detected in the region. Conditions may change rapidly.');
123
+ }
124
+ recommendations.push('Thunderstorm is active - expect continued lightning activity.');
125
+ }
126
+ return {
127
+ level,
128
+ message,
129
+ recommendations,
130
+ nearestStrikeDistance: nearestDistance,
131
+ nearestStrikeTime: nearestTime,
132
+ isActiveThunderstorm
133
+ };
134
+ }
135
+ /**
136
+ * Get lightning activity for a location
137
+ */
138
+ export async function getLightningActivity(params) {
139
+ // Validate parameters
140
+ validateLightningParams(params);
141
+ const { latitude, longitude, radius = 100, timeWindow = 60 } = params;
142
+ // Redact coordinates for logging to protect user privacy
143
+ const redacted = redactCoordinatesForLogging(latitude, longitude);
144
+ logger.info('Lightning activity requested', {
145
+ latitude: redacted.lat,
146
+ longitude: redacted.lon,
147
+ radius,
148
+ timeWindow
149
+ });
150
+ // Fetch lightning strikes
151
+ const strikes = await blitzortungService.getLightningStrikes(latitude, longitude, radius, timeWindow);
152
+ // Calculate statistics
153
+ const statistics = calculateStatistics(strikes, radius, timeWindow);
154
+ // Assess safety
155
+ const safety = assessSafety(strikes, statistics);
156
+ const now = new Date();
157
+ const searchStart = new Date(now.getTime() - timeWindow * 60 * 1000);
158
+ return {
159
+ location: { latitude, longitude },
160
+ searchRadius: radius,
161
+ timeWindow,
162
+ searchPeriod: {
163
+ start: searchStart,
164
+ end: now
165
+ },
166
+ strikes,
167
+ statistics,
168
+ safety,
169
+ source: 'Blitzortung.org',
170
+ generatedAt: now,
171
+ disclaimer: 'Lightning data from Blitzortung.org community network. Data may have 5-15 minute delay. For life-safety decisions, consult official weather services and local emergency management. When thunder roars, go indoors!'
172
+ };
173
+ }
174
+ /**
175
+ * Format lightning activity response for display
176
+ */
177
+ export function formatLightningActivityResponse(response) {
178
+ const lines = [];
179
+ lines.push('# ⚡ Lightning Activity Report');
180
+ lines.push('');
181
+ lines.push(`**Location:** ${response.location.latitude.toFixed(4)}, ${response.location.longitude.toFixed(4)}`);
182
+ lines.push(`**Search Radius:** ${response.searchRadius} km`);
183
+ lines.push(`**Time Window:** ${response.timeWindow} minutes (${response.searchPeriod.start.toISOString()} to ${response.searchPeriod.end.toISOString()})`);
184
+ lines.push('');
185
+ // Safety assessment
186
+ const safetyIcon = {
187
+ safe: '🟢',
188
+ elevated: '🟡',
189
+ high: '🟠',
190
+ extreme: '🔴'
191
+ }[response.safety.level];
192
+ lines.push(`## ${safetyIcon} Safety Status: ${response.safety.level.toUpperCase()}`);
193
+ lines.push('');
194
+ lines.push(response.safety.message);
195
+ lines.push('');
196
+ // Recommendations
197
+ if (response.safety.recommendations.length > 0) {
198
+ lines.push('### Safety Recommendations');
199
+ lines.push('');
200
+ response.safety.recommendations.forEach(rec => {
201
+ lines.push(`- ${rec}`);
202
+ });
203
+ lines.push('');
204
+ }
205
+ // Statistics
206
+ lines.push('## 📊 Lightning Statistics');
207
+ lines.push('');
208
+ lines.push(`**Total Strikes:** ${response.statistics.totalStrikes}`);
209
+ if (response.statistics.totalStrikes > 0) {
210
+ lines.push(`**Cloud-to-Ground:** ${response.statistics.cloudToGroundStrikes}`);
211
+ lines.push(`**Intra-Cloud:** ${response.statistics.intraCloudStrikes}`);
212
+ lines.push(`**Nearest Strike:** ${response.statistics.nearestDistance.toFixed(1)} km away`);
213
+ lines.push(`**Average Distance:** ${response.statistics.averageDistance.toFixed(1)} km`);
214
+ lines.push(`**Strike Rate:** ${response.statistics.strikesPerMinute.toFixed(2)} strikes/minute`);
215
+ lines.push(`**Density:** ${response.statistics.densityPerSqKm.toFixed(4)} strikes/km²`);
216
+ lines.push(`**Active Thunderstorm:** ${response.safety.isActiveThunderstorm ? 'Yes' : 'No'}`);
217
+ lines.push('');
218
+ // Recent strikes (show up to 10 nearest)
219
+ lines.push('## 🌩️ Recent Strikes');
220
+ lines.push('');
221
+ const strikesToShow = response.strikes.slice(0, 10);
222
+ strikesToShow.forEach((strike, index) => {
223
+ const ageMinutes = (response.generatedAt.getTime() - strike.timestamp.getTime()) / (1000 * 60);
224
+ const polaritySymbol = strike.polarity > 0 ? '+' : '−';
225
+ lines.push(`### Strike ${index + 1}`);
226
+ lines.push(`- **Distance:** ${strike.distance?.toFixed(1)} km`);
227
+ lines.push(`- **Time:** ${strike.timestamp.toISOString()} (${ageMinutes.toFixed(1)} minutes ago)`);
228
+ lines.push(`- **Location:** ${strike.latitude.toFixed(4)}, ${strike.longitude.toFixed(4)}`);
229
+ lines.push(`- **Polarity:** ${polaritySymbol} (${strike.polarity > 0 ? 'Positive' : 'Negative'})`);
230
+ lines.push(`- **Amplitude:** ${strike.amplitude.toFixed(1)} kA`);
231
+ if (strike.stationCount) {
232
+ lines.push(`- **Detected by:** ${strike.stationCount} stations`);
233
+ }
234
+ lines.push('');
235
+ });
236
+ if (response.strikes.length > 10) {
237
+ lines.push(`*Showing 10 of ${response.strikes.length} strikes detected*`);
238
+ lines.push('');
239
+ }
240
+ }
241
+ else {
242
+ lines.push('');
243
+ lines.push('No lightning strikes detected in the search area during the time window.');
244
+ lines.push('');
245
+ }
246
+ // Disclaimer
247
+ if (response.disclaimer) {
248
+ lines.push('---');
249
+ lines.push('');
250
+ lines.push(`⚠️ **DISCLAIMER:** ${response.disclaimer}`);
251
+ lines.push('');
252
+ }
253
+ lines.push('---');
254
+ lines.push(`*Generated: ${response.generatedAt.toISOString()}*`);
255
+ lines.push(`*Data source: ${response.source}*`);
256
+ return lines.join('\n');
257
+ }
258
+ //# sourceMappingURL=lightningHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightningHandler.js","sourceRoot":"","sources":["../../src/handlers/lightningHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Handler for search_location tool
3
+ * Now uses multi-service geocoding with automatic fallback
4
+ */
5
+ import { GeocodingService } from '../services/geocoding.js';
6
+ export declare function handleSearchLocation(args: unknown, geocodingService: GeocodingService): Promise<{
7
+ content: Array<{
8
+ type: string;
9
+ text: string;
10
+ }>;
11
+ }>;
12
+ //# sourceMappingURL=locationHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locationHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/locationHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAiC5D,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,OAAO,EACb,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,CAuF7D"}