@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,62 @@
1
+ /**
2
+ * Custom error classes for better error handling and logging
3
+ */
4
+ /**
5
+ * Base error class for API-related errors
6
+ */
7
+ export declare class ApiError extends Error {
8
+ readonly statusCode: number;
9
+ readonly service: 'NOAA' | 'OpenMeteo' | 'NCEI' | 'RainViewer' | 'Nominatim';
10
+ readonly userMessage: string;
11
+ readonly helpLinks: string[];
12
+ readonly isRetryable: boolean;
13
+ constructor(message: string, statusCode: number, service: 'NOAA' | 'OpenMeteo' | 'NCEI' | 'RainViewer' | 'Nominatim', userMessage: string, helpLinks?: string[], isRetryable?: boolean);
14
+ /**
15
+ * Format error for display to user
16
+ */
17
+ toUserMessage(): string;
18
+ }
19
+ /**
20
+ * Rate limit error - too many requests
21
+ */
22
+ export declare class RateLimitError extends ApiError {
23
+ readonly retryAfter?: number;
24
+ constructor(service: 'NOAA' | 'OpenMeteo' | 'NCEI' | 'RainViewer' | 'Nominatim', messageOrRetryAfter?: string | number, retryAfter?: number);
25
+ }
26
+ /**
27
+ * Service unavailable error - API is down or timing out
28
+ */
29
+ export declare class ServiceUnavailableError extends ApiError {
30
+ constructor(service: 'NOAA' | 'OpenMeteo' | 'NCEI' | 'RainViewer' | 'Nominatim', messageOrError?: string | Error, originalError?: Error);
31
+ }
32
+ /**
33
+ * Invalid location error - coordinates not supported or out of range
34
+ */
35
+ export declare class InvalidLocationError extends ApiError {
36
+ readonly latitude?: number;
37
+ readonly longitude?: number;
38
+ constructor(service: 'NOAA' | 'OpenMeteo' | 'NCEI' | 'RainViewer' | 'Nominatim', message: string, latitude?: number, longitude?: number);
39
+ }
40
+ /**
41
+ * Data not found error - requested data doesn't exist
42
+ */
43
+ export declare class DataNotFoundError extends ApiError {
44
+ constructor(service: 'NOAA' | 'OpenMeteo' | 'NCEI' | 'RainViewer' | 'Nominatim', message: string);
45
+ }
46
+ /**
47
+ * Validation error - invalid input parameters
48
+ */
49
+ export declare class ValidationError extends Error {
50
+ readonly field?: string;
51
+ readonly value?: any;
52
+ constructor(message: string, field?: string, value?: any);
53
+ }
54
+ /**
55
+ * Check if an error is retryable
56
+ */
57
+ export declare function isRetryableError(error: Error): boolean;
58
+ /**
59
+ * Format error for user display
60
+ */
61
+ export declare function formatErrorForUser(error: Error): string;
62
+ //# sourceMappingURL=ApiError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiError.d.ts","sourceRoot":"","sources":["../../src/errors/ApiError.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,CAAC;IACpF,SAAgB,WAAW,EAAE,MAAM,CAAC;IACpC,SAAgB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpC,SAAgB,WAAW,EAAE,OAAO,CAAC;gBAGnC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,EACnE,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAM,EAAO,EACxB,WAAW,GAAE,OAAe;IAgB9B;;OAEG;IACH,aAAa,IAAI,MAAM;CAYxB;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;gBAExB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAiC5I;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,QAAQ;gBACvC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,aAAa,CAAC,EAAE,KAAK;CAkCxI;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,QAAQ;IAChD,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClC,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;gBAGjC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,EACnE,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM;CAerB;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,QAAQ;gBACjC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,EAAE,OAAO,EAAE,MAAM;CAYjG;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,KAAK,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAgB,KAAK,CAAC,EAAE,GAAG,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG;CAUzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAetD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAgBvD"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Custom error classes for better error handling and logging
3
+ */
4
+ /**
5
+ * Base error class for API-related errors
6
+ */
7
+ export class ApiError extends Error {
8
+ statusCode;
9
+ service;
10
+ userMessage;
11
+ helpLinks;
12
+ isRetryable;
13
+ constructor(message, statusCode, service, userMessage, helpLinks = [], isRetryable = false) {
14
+ super(message);
15
+ this.name = 'ApiError';
16
+ this.statusCode = statusCode;
17
+ this.service = service;
18
+ this.userMessage = userMessage;
19
+ this.helpLinks = helpLinks;
20
+ this.isRetryable = isRetryable;
21
+ // Maintains proper stack trace for where our error was thrown (only available on V8)
22
+ if (Error.captureStackTrace) {
23
+ Error.captureStackTrace(this, this.constructor);
24
+ }
25
+ }
26
+ /**
27
+ * Format error for display to user
28
+ */
29
+ toUserMessage() {
30
+ let message = `${this.service} API Error: ${this.userMessage}`;
31
+ if (this.helpLinks.length > 0) {
32
+ message += '\n\nFor more information:\n';
33
+ this.helpLinks.forEach(link => {
34
+ message += `- ${link}\n`;
35
+ });
36
+ }
37
+ return message;
38
+ }
39
+ }
40
+ /**
41
+ * Rate limit error - too many requests
42
+ */
43
+ export class RateLimitError extends ApiError {
44
+ retryAfter;
45
+ constructor(service, messageOrRetryAfter, retryAfter) {
46
+ // Handle backwards compatibility: if second param is number, treat it as retryAfter
47
+ let message;
48
+ let retry;
49
+ if (typeof messageOrRetryAfter === 'number') {
50
+ message = undefined;
51
+ retry = messageOrRetryAfter;
52
+ }
53
+ else if (typeof messageOrRetryAfter === 'string') {
54
+ message = messageOrRetryAfter;
55
+ retry = retryAfter;
56
+ }
57
+ const userMessage = message || (retry
58
+ ? `Rate limit exceeded. Please retry after ${retry} seconds.`
59
+ : 'Rate limit exceeded. Please retry in a few seconds.');
60
+ super(`Rate limit exceeded for ${service}`, 429, service, userMessage, [
61
+ 'https://weather.gov/documentation/services-web-api',
62
+ 'https://open-meteo.com/en/features#api-documentation',
63
+ 'https://www.ncdc.noaa.gov/cdo-web/webservices'
64
+ ], true // Retryable after waiting
65
+ );
66
+ this.name = 'RateLimitError';
67
+ this.retryAfter = retry;
68
+ }
69
+ }
70
+ /**
71
+ * Service unavailable error - API is down or timing out
72
+ */
73
+ export class ServiceUnavailableError extends ApiError {
74
+ constructor(service, messageOrError, originalError) {
75
+ // Handle backwards compatibility: if second param is Error, treat it as originalError
76
+ let message;
77
+ let error;
78
+ if (typeof messageOrError === 'string') {
79
+ message = messageOrError;
80
+ error = originalError;
81
+ }
82
+ else if (messageOrError instanceof Error) {
83
+ message = undefined;
84
+ error = messageOrError;
85
+ }
86
+ const userMessage = message || `The ${service} weather service is temporarily unavailable. Please try again in a few minutes.`;
87
+ const helpLink = service === 'NOAA' ? 'https://www.weather.gov/'
88
+ : service === 'NCEI' ? 'https://www.ncei.noaa.gov/'
89
+ : service === 'RainViewer' ? 'https://www.rainviewer.com/'
90
+ : 'https://open-meteo.com/';
91
+ super(`${service} API is currently unavailable`, 503, service, userMessage, [helpLink], true // Retryable
92
+ );
93
+ this.name = 'ServiceUnavailableError';
94
+ if (error && error.stack) {
95
+ this.stack = `${this.stack}\nCaused by: ${error.stack}`;
96
+ }
97
+ }
98
+ }
99
+ /**
100
+ * Invalid location error - coordinates not supported or out of range
101
+ */
102
+ export class InvalidLocationError extends ApiError {
103
+ latitude;
104
+ longitude;
105
+ constructor(service, message, latitude, longitude) {
106
+ super(message, 400, service, message, [], false // Not retryable
107
+ );
108
+ this.name = 'InvalidLocationError';
109
+ this.latitude = latitude;
110
+ this.longitude = longitude;
111
+ }
112
+ }
113
+ /**
114
+ * Data not found error - requested data doesn't exist
115
+ */
116
+ export class DataNotFoundError extends ApiError {
117
+ constructor(service, message) {
118
+ super(message, 404, service, message, [], false // Not retryable
119
+ );
120
+ this.name = 'DataNotFoundError';
121
+ }
122
+ }
123
+ /**
124
+ * Validation error - invalid input parameters
125
+ */
126
+ export class ValidationError extends Error {
127
+ field;
128
+ value;
129
+ constructor(message, field, value) {
130
+ super(message);
131
+ this.name = 'ValidationError';
132
+ this.field = field;
133
+ this.value = value;
134
+ if (Error.captureStackTrace) {
135
+ Error.captureStackTrace(this, this.constructor);
136
+ }
137
+ }
138
+ }
139
+ /**
140
+ * Check if an error is retryable
141
+ */
142
+ export function isRetryableError(error) {
143
+ if (error instanceof ApiError) {
144
+ return error.isRetryable;
145
+ }
146
+ // Network errors are generally retryable
147
+ if (error.message.includes('ECONNREFUSED') ||
148
+ error.message.includes('ETIMEDOUT') ||
149
+ error.message.includes('ENOTFOUND')) {
150
+ return true;
151
+ }
152
+ return false;
153
+ }
154
+ /**
155
+ * Format error for user display
156
+ */
157
+ export function formatErrorForUser(error) {
158
+ if (error instanceof ApiError) {
159
+ return error.toUserMessage();
160
+ }
161
+ if (error instanceof ValidationError) {
162
+ return `Validation Error: ${error.message}`;
163
+ }
164
+ // Sanitize generic errors to avoid leaking sensitive information
165
+ const sanitizedMessage = error.message
166
+ .replace(/ECONNREFUSED/, 'Connection refused')
167
+ .replace(/ETIMEDOUT/, 'Connection timed out')
168
+ .replace(/ENOTFOUND/, 'Service not found');
169
+ return `Error: ${sanitizedMessage}`;
170
+ }
171
+ //# sourceMappingURL=ApiError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiError.js","sourceRoot":"","sources":["../../src/errors/ApiError.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Handler for get_air_quality tool
3
+ */
4
+ import { OpenMeteoService } from '../services/openmeteo.js';
5
+ export declare function handleGetAirQuality(args: unknown, openMeteoService: OpenMeteoService): Promise<{
6
+ content: Array<{
7
+ type: string;
8
+ text: string;
9
+ }>;
10
+ }>;
11
+ //# sourceMappingURL=airQualityHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"airQualityHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/airQualityHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAkB5D,wBAAsB,mBAAmB,CACvC,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,CA4B7D"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Handler for get_air_quality tool
3
+ */
4
+ import { validateCoordinates, validateOptionalBoolean } from '../utils/validation.js';
5
+ import { getUSAQICategory, getEuropeanAQICategory, getUVIndexCategory, getPollutantInfo, formatPollutantConcentration, shouldUseUSAQI } from '../utils/airQuality.js';
6
+ export async function handleGetAirQuality(args, openMeteoService) {
7
+ // Validate input parameters with runtime checks
8
+ const { latitude, longitude } = validateCoordinates(args);
9
+ const forecast = validateOptionalBoolean(args?.forecast, 'forecast', false);
10
+ // Get air quality data
11
+ const airQualityData = await openMeteoService.getAirQuality(latitude, longitude, forecast, 5 // Default 5-day forecast
12
+ );
13
+ // Format the air quality data for display
14
+ const output = formatAirQuality(airQualityData, latitude, longitude, forecast);
15
+ return {
16
+ content: [
17
+ {
18
+ type: 'text',
19
+ text: output
20
+ }
21
+ ]
22
+ };
23
+ }
24
+ /**
25
+ * Format air quality data as markdown
26
+ */
27
+ function formatAirQuality(data, latitude, longitude, includeForecast) {
28
+ let output = `# Air Quality Report\n\n`;
29
+ output += `**Location:** ${latitude.toFixed(4)}, ${longitude.toFixed(4)}\n`;
30
+ output += `**Timezone:** ${data.timezone}\n`;
31
+ output += `**Elevation:** ${Math.round(data.elevation)}m\n`;
32
+ output += `\n`;
33
+ // Determine which AQI to show primarily based on location
34
+ const useUSAQI = shouldUseUSAQI(latitude, longitude);
35
+ if (!data.current) {
36
+ output += `⚠️ **No current air quality data available for this location.**\n`;
37
+ return output;
38
+ }
39
+ const current = data.current;
40
+ const currentTime = new Date(current.time);
41
+ output += `**Observation Time:** ${currentTime.toLocaleString()}\n\n`;
42
+ // Display primary AQI with health information
43
+ if (useUSAQI && current.us_aqi !== undefined) {
44
+ const category = getUSAQICategory(current.us_aqi);
45
+ const emoji = category.level === 'Good' ? '🟢' :
46
+ category.level === 'Moderate' ? '🟡' :
47
+ category.level === 'Unhealthy for Sensitive Groups' ? '🟠' :
48
+ category.level === 'Unhealthy' ? '🔴' :
49
+ category.level === 'Very Unhealthy' ? '🟣' : '🟤';
50
+ output += `## ${emoji} US Air Quality Index: ${Math.round(current.us_aqi)}\n\n`;
51
+ output += `**Category:** ${category.level} (${category.color})\n`;
52
+ output += `**Description:** ${category.description}\n\n`;
53
+ output += `**Health Implications:**\n${category.healthImplications}\n\n`;
54
+ if (category.cautionaryStatement !== 'None') {
55
+ output += `⚠️ **Caution:** ${category.cautionaryStatement}\n\n`;
56
+ }
57
+ }
58
+ else if (current.european_aqi !== undefined) {
59
+ const category = getEuropeanAQICategory(current.european_aqi);
60
+ const emoji = category.level === 'Good' ? '🟢' :
61
+ category.level === 'Fair' ? '🟢' :
62
+ category.level === 'Moderate' ? '🟡' :
63
+ category.level === 'Poor' ? '🟠' :
64
+ category.level === 'Very Poor' ? '🔴' : '🟣';
65
+ output += `## ${emoji} European Air Quality Index: ${Math.round(current.european_aqi)}\n\n`;
66
+ output += `**Category:** ${category.level} (${category.color})\n`;
67
+ output += `**Description:** ${category.description}\n\n`;
68
+ output += `**Health Implications:**\n${category.healthImplications}\n\n`;
69
+ if (category.cautionaryStatement !== 'None') {
70
+ output += `⚠️ **Caution:** ${category.cautionaryStatement}\n\n`;
71
+ }
72
+ }
73
+ // UV Index
74
+ if (current.uv_index !== undefined) {
75
+ const uvCategory = getUVIndexCategory(current.uv_index);
76
+ const uvEmoji = uvCategory.level === 'Low' ? '🟢' :
77
+ uvCategory.level === 'Moderate' ? '🟡' :
78
+ uvCategory.level === 'High' ? '🟠' :
79
+ uvCategory.level === 'Very High' ? '🔴' : '🟣';
80
+ output += `## ${uvEmoji} UV Index: ${current.uv_index.toFixed(1)}\n\n`;
81
+ output += `**Level:** ${uvCategory.level}\n`;
82
+ output += `**Description:** ${uvCategory.description}\n`;
83
+ output += `**Recommendation:** ${uvCategory.recommendation}\n\n`;
84
+ if (current.uv_index_clear_sky !== undefined && Math.abs(current.uv_index_clear_sky - current.uv_index) > 1) {
85
+ output += `*Note: UV index under clear sky would be ${current.uv_index_clear_sky.toFixed(1)}*\n\n`;
86
+ }
87
+ }
88
+ // Pollutant Concentrations
89
+ output += `## Pollutant Concentrations\n\n`;
90
+ const pollutants = [
91
+ { key: 'pm2_5', value: current.pm2_5, units: data.current_units?.pm2_5 },
92
+ { key: 'pm10', value: current.pm10, units: data.current_units?.pm10 },
93
+ { key: 'ozone', value: current.ozone, units: data.current_units?.ozone },
94
+ { key: 'nitrogen_dioxide', value: current.nitrogen_dioxide, units: data.current_units?.nitrogen_dioxide },
95
+ { key: 'sulphur_dioxide', value: current.sulphur_dioxide, units: data.current_units?.sulphur_dioxide },
96
+ { key: 'carbon_monoxide', value: current.carbon_monoxide, units: data.current_units?.carbon_monoxide }
97
+ ];
98
+ for (const pollutant of pollutants) {
99
+ if (pollutant.value !== undefined) {
100
+ const info = getPollutantInfo(pollutant.key);
101
+ const concentration = formatPollutantConcentration(pollutant.value, pollutant.units);
102
+ output += `**${info.name}:** ${concentration}\n`;
103
+ }
104
+ }
105
+ if (current.ammonia !== undefined && data.current_units?.ammonia) {
106
+ const info = getPollutantInfo('ammonia');
107
+ const concentration = formatPollutantConcentration(current.ammonia, data.current_units.ammonia);
108
+ output += `**${info.name}:** ${concentration}\n`;
109
+ }
110
+ if (current.aerosol_optical_depth !== undefined) {
111
+ output += `**Aerosol Optical Depth:** ${current.aerosol_optical_depth.toFixed(3)} (atmospheric haze indicator)\n`;
112
+ }
113
+ output += `\n`;
114
+ // Show secondary AQI for reference
115
+ if (useUSAQI && current.european_aqi !== undefined) {
116
+ output += `*European AQI: ${Math.round(current.european_aqi)} (${getEuropeanAQICategory(current.european_aqi).level})*\n\n`;
117
+ }
118
+ else if (!useUSAQI && current.us_aqi !== undefined) {
119
+ output += `*US AQI: ${Math.round(current.us_aqi)} (${getUSAQICategory(current.us_aqi).level})*\n\n`;
120
+ }
121
+ // Add forecast summary if requested
122
+ if (includeForecast && data.hourly && data.hourly.time && data.hourly.time.length > 0) {
123
+ output += `---\n\n`;
124
+ output += `## Air Quality Forecast\n\n`;
125
+ // Show next 24 hours
126
+ const hoursToShow = Math.min(24, data.hourly.time.length);
127
+ output += `**Next ${hoursToShow} hours:**\n\n`;
128
+ // Group by 6-hour periods for readability
129
+ const periods = Math.ceil(hoursToShow / 6);
130
+ for (let i = 0; i < periods; i++) {
131
+ const startIdx = i * 6;
132
+ const endIdx = Math.min(startIdx + 6, hoursToShow);
133
+ const startTime = new Date(data.hourly.time[startIdx]);
134
+ const endTime = new Date(data.hourly.time[endIdx - 1]);
135
+ // Get AQI range for this period
136
+ let minAQI = Infinity;
137
+ let maxAQI = -Infinity;
138
+ for (let j = startIdx; j < endIdx; j++) {
139
+ const aqiValue = useUSAQI ? data.hourly.us_aqi?.[j] : data.hourly.european_aqi?.[j];
140
+ if (aqiValue !== undefined) {
141
+ minAQI = Math.min(minAQI, aqiValue);
142
+ maxAQI = Math.max(maxAQI, aqiValue);
143
+ }
144
+ }
145
+ const avgAQI = (minAQI + maxAQI) / 2;
146
+ const aqiCategory = useUSAQI ? getUSAQICategory(avgAQI) : getEuropeanAQICategory(avgAQI);
147
+ output += `**${startTime.toLocaleTimeString()} - ${endTime.toLocaleTimeString()}:** `;
148
+ output += `${useUSAQI ? 'US' : 'EU'} AQI ${Math.round(minAQI)}-${Math.round(maxAQI)} (${aqiCategory.level})\n`;
149
+ }
150
+ output += `\n*Forecast includes ${data.hourly.time.length} hours of data*\n`;
151
+ }
152
+ return output;
153
+ }
154
+ //# sourceMappingURL=airQualityHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"airQualityHandler.js","sourceRoot":"","sources":["../../src/handlers/airQualityHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Handler for get_alerts tool
3
+ */
4
+ import { NOAAService } from '../services/noaa.js';
5
+ export declare function handleGetAlerts(args: unknown, noaaService: NOAAService): Promise<{
6
+ content: Array<{
7
+ type: string;
8
+ text: string;
9
+ }>;
10
+ }>;
11
+ //# sourceMappingURL=alertsHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alertsHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/alertsHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAUlD,wBAAsB,eAAe,CACnC,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAkH7D"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Handler for get_alerts tool
3
+ */
4
+ import { validateCoordinates, validateOptionalBoolean } from '../utils/validation.js';
5
+ import { formatInTimezone, guessTimezoneFromCoords } from '../utils/timezone.js';
6
+ export async function handleGetAlerts(args, noaaService) {
7
+ // Validate input parameters with runtime checks
8
+ const { latitude, longitude } = validateCoordinates(args);
9
+ const active_only = validateOptionalBoolean(args?.active_only, 'active_only', true);
10
+ // Get timezone for proper time formatting
11
+ let timezone = guessTimezoneFromCoords(latitude, longitude); // fallback
12
+ try {
13
+ // Try to get timezone from station (preferred)
14
+ const stations = await noaaService.getStations(latitude, longitude);
15
+ if (stations.features && stations.features.length > 0) {
16
+ const stationTimezone = stations.features[0].properties.timeZone;
17
+ if (stationTimezone) {
18
+ timezone = stationTimezone;
19
+ }
20
+ }
21
+ }
22
+ catch (error) {
23
+ // Use fallback timezone
24
+ }
25
+ // Get alerts data
26
+ const alertsData = await noaaService.getAlerts(latitude, longitude, active_only);
27
+ const alerts = alertsData.features;
28
+ // Format the alerts for display
29
+ let output = `# Weather Alerts\n\n`;
30
+ output += `**Location:** ${latitude.toFixed(4)}, ${longitude.toFixed(4)}\n`;
31
+ output += `**Status:** ${active_only ? 'Active alerts only' : 'All alerts'}\n`;
32
+ if (alertsData.updated) {
33
+ output += `**Updated:** ${formatInTimezone(alertsData.updated, timezone)}\n`;
34
+ }
35
+ output += `\n`;
36
+ if (alerts.length === 0) {
37
+ output += `✅ **No active weather alerts for this location.**\n\n`;
38
+ output += `The area is currently clear of weather warnings, watches, and advisories.\n`;
39
+ }
40
+ else {
41
+ output += `⚠️ **${alerts.length} active alert${alerts.length > 1 ? 's' : ''} found**\n\n`;
42
+ const severityOrder = {
43
+ 'Extreme': 0,
44
+ 'Severe': 1,
45
+ 'Moderate': 2,
46
+ 'Minor': 3,
47
+ 'Unknown': 4
48
+ };
49
+ // Cache severity values to avoid repeated lookups during sort
50
+ const alertsWithSeverity = alerts.map(alert => ({
51
+ alert,
52
+ severityValue: severityOrder[alert.properties.severity] ?? 4
53
+ }));
54
+ const sortedAlerts = alertsWithSeverity
55
+ .sort((a, b) => a.severityValue - b.severityValue)
56
+ .map(item => item.alert);
57
+ for (const alert of sortedAlerts) {
58
+ const props = alert.properties;
59
+ // Severity emoji
60
+ const severityEmoji = props.severity === 'Extreme' ? '🔴' :
61
+ props.severity === 'Severe' ? '🟠' :
62
+ props.severity === 'Moderate' ? '🟡' :
63
+ props.severity === 'Minor' ? '🔵' : '⚪';
64
+ output += `${severityEmoji} **${props.event}**\n`;
65
+ output += `---\n`;
66
+ if (props.headline) {
67
+ output += `**${props.headline}**\n\n`;
68
+ }
69
+ output += `**Severity:** ${props.severity} | **Urgency:** ${props.urgency} | **Certainty:** ${props.certainty}\n`;
70
+ output += `**Area:** ${props.areaDesc}\n`;
71
+ output += `**Effective:** ${formatInTimezone(props.effective, timezone)}\n`;
72
+ output += `**Expires:** ${formatInTimezone(props.expires, timezone)}\n`;
73
+ if (props.onset && props.onset !== props.effective) {
74
+ output += `**Onset:** ${formatInTimezone(props.onset, timezone)}\n`;
75
+ }
76
+ if (props.ends) {
77
+ output += `**Ends:** ${formatInTimezone(props.ends, timezone)}\n`;
78
+ }
79
+ output += `\n**Description:**\n${props.description}\n`;
80
+ if (props.instruction) {
81
+ output += `\n**Instructions:**\n${props.instruction}\n`;
82
+ }
83
+ output += `\n**Recommended Response:** ${props.response}\n`;
84
+ output += `**Sender:** ${props.senderName}\n\n`;
85
+ }
86
+ }
87
+ output += `---\n`;
88
+ output += `*Data source: NOAA National Weather Service*\n`;
89
+ return {
90
+ content: [
91
+ {
92
+ type: 'text',
93
+ text: output
94
+ }
95
+ ]
96
+ };
97
+ }
98
+ //# sourceMappingURL=alertsHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alertsHandler.js","sourceRoot":"","sources":["../../src/handlers/alertsHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Handler for get_current_conditions tool
3
+ */
4
+ import { NOAAService } from '../services/noaa.js';
5
+ import { OpenMeteoService } from '../services/openmeteo.js';
6
+ import { NCEIService } from '../services/ncei.js';
7
+ export declare function handleGetCurrentConditions(args: unknown, noaaService: NOAAService, openMeteoService: OpenMeteoService, nceiService: NCEIService): Promise<{
8
+ content: Array<{
9
+ type: string;
10
+ text: string;
11
+ }>;
12
+ }>;
13
+ //# sourceMappingURL=currentConditionsHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currentConditionsHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/currentConditionsHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAwBlD,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAsV7D"}