@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,177 @@
1
+ /**
2
+ * Input validation utilities for API parameters
3
+ * Provides runtime type checking and sanitization
4
+ */
5
+ import { FormatConstants } from '../config/displayThresholds.js';
6
+ /**
7
+ * Validate that latitude is a valid number within range
8
+ * @param lat - Latitude value to validate
9
+ * @throws {Error} If latitude is invalid
10
+ */
11
+ export function validateLatitude(lat) {
12
+ if (typeof lat !== 'number' || !Number.isFinite(lat)) {
13
+ throw new Error(`Invalid latitude: must be a finite number, received ${typeof lat}`);
14
+ }
15
+ if (lat < -90 || lat > 90) {
16
+ throw new Error(`Invalid latitude: ${lat}. Must be between -90 and 90.`);
17
+ }
18
+ }
19
+ /**
20
+ * Validate that longitude is a valid number within range
21
+ * @param lon - Longitude value to validate
22
+ * @throws {Error} If longitude is invalid
23
+ */
24
+ export function validateLongitude(lon) {
25
+ if (typeof lon !== 'number' || !Number.isFinite(lon)) {
26
+ throw new Error(`Invalid longitude: must be a finite number, received ${typeof lon}`);
27
+ }
28
+ if (lon < -180 || lon > 180) {
29
+ throw new Error(`Invalid longitude: ${lon}. Must be between -180 and 180.`);
30
+ }
31
+ }
32
+ /**
33
+ * Validate coordinate pair
34
+ * @param args - Arguments object potentially containing coordinates
35
+ * @returns Validated coordinates
36
+ * @throws {Error} If coordinates are invalid
37
+ */
38
+ export function validateCoordinates(args) {
39
+ if (typeof args !== 'object' || args === null) {
40
+ throw new Error('Invalid arguments: expected object with latitude and longitude');
41
+ }
42
+ const { latitude, longitude } = args;
43
+ validateLatitude(latitude);
44
+ validateLongitude(longitude);
45
+ return { latitude, longitude };
46
+ }
47
+ /**
48
+ * Validate a positive integer within optional range
49
+ * @param value - Value to validate
50
+ * @param name - Parameter name for error messages
51
+ * @param min - Minimum allowed value (inclusive)
52
+ * @param max - Maximum allowed value (inclusive)
53
+ * @returns Validated number
54
+ * @throws {Error} If value is invalid
55
+ */
56
+ export function validatePositiveInteger(value, name, min = 1, max = Number.MAX_SAFE_INTEGER) {
57
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
58
+ throw new Error(`Invalid ${name}: must be a finite number, received ${typeof value}`);
59
+ }
60
+ if (!Number.isInteger(value)) {
61
+ throw new Error(`Invalid ${name}: must be an integer, received ${value}`);
62
+ }
63
+ if (value < min || value > max) {
64
+ throw new Error(`Invalid ${name}: ${value}. Must be between ${min} and ${max}.`);
65
+ }
66
+ return value;
67
+ }
68
+ /**
69
+ * Validate a boolean value
70
+ * @param value - Value to validate
71
+ * @param name - Parameter name for error messages
72
+ * @returns Validated boolean
73
+ * @throws {Error} If value is invalid
74
+ */
75
+ export function validateBoolean(value, name) {
76
+ if (typeof value !== 'boolean') {
77
+ throw new Error(`Invalid ${name}: must be a boolean, received ${typeof value}`);
78
+ }
79
+ return value;
80
+ }
81
+ /**
82
+ * Validate a date string in ISO format
83
+ * @param value - Value to validate
84
+ * @param name - Parameter name for error messages
85
+ * @returns Validated date string
86
+ * @throws {Error} If value is invalid
87
+ */
88
+ export function validateDateString(value, name) {
89
+ if (typeof value !== 'string') {
90
+ throw new Error(`Invalid ${name}: must be a string, received ${typeof value}`);
91
+ }
92
+ // Check if it's a valid date format (YYYY-MM-DD or ISO 8601)
93
+ const date = new Date(value);
94
+ if (isNaN(date.getTime())) {
95
+ throw new Error(`Invalid ${name}: "${value}" is not a valid date format`);
96
+ }
97
+ return value;
98
+ }
99
+ /**
100
+ * Validate forecast days parameter
101
+ * @param args - Arguments object potentially containing days parameter
102
+ * @returns Validated days value (defaults to 7 if not provided)
103
+ * @throws {Error} If days parameter is invalid
104
+ */
105
+ export function validateForecastDays(args) {
106
+ if (typeof args !== 'object' || args === null) {
107
+ return FormatConstants.defaultForecastDays;
108
+ }
109
+ const { days } = args;
110
+ if (days === undefined) {
111
+ return FormatConstants.defaultForecastDays;
112
+ }
113
+ return validatePositiveInteger(days, 'days', 1, FormatConstants.maxForecastDays);
114
+ }
115
+ /**
116
+ * Validate granularity parameter
117
+ * @param value - Value to validate
118
+ * @returns Validated granularity ('daily' or 'hourly')
119
+ * @throws {Error} If value is invalid
120
+ */
121
+ export function validateGranularity(value) {
122
+ if (value === undefined) {
123
+ return 'daily'; // default
124
+ }
125
+ if (typeof value !== 'string') {
126
+ throw new Error(`Invalid granularity: must be a string, received ${typeof value}`);
127
+ }
128
+ if (value !== 'daily' && value !== 'hourly') {
129
+ throw new Error(`Invalid granularity: "${value}". Must be either "daily" or "hourly".`);
130
+ }
131
+ return value;
132
+ }
133
+ /**
134
+ * Validate optional boolean with default
135
+ * @param value - Value to validate
136
+ * @param name - Parameter name for error messages
137
+ * @param defaultValue - Default value if undefined
138
+ * @returns Validated boolean
139
+ * @throws {Error} If value is invalid
140
+ */
141
+ export function validateOptionalBoolean(value, name, defaultValue) {
142
+ if (value === undefined) {
143
+ return defaultValue;
144
+ }
145
+ return validateBoolean(value, name);
146
+ }
147
+ /**
148
+ * Validate historical weather parameters
149
+ * @param args - Arguments object
150
+ * @returns Validated parameters
151
+ * @throws {Error} If parameters are invalid
152
+ */
153
+ export function validateHistoricalWeatherParams(args) {
154
+ if (typeof args !== 'object' || args === null) {
155
+ throw new Error('Invalid arguments: expected object with coordinates and date range');
156
+ }
157
+ const { latitude, longitude, start_date, end_date, limit } = args;
158
+ validateLatitude(latitude);
159
+ validateLongitude(longitude);
160
+ const validatedStartDate = validateDateString(start_date, 'start_date');
161
+ const validatedEndDate = validateDateString(end_date, 'end_date');
162
+ // Ensure start_date is before end_date
163
+ if (new Date(validatedStartDate) > new Date(validatedEndDate)) {
164
+ throw new Error('Invalid date range: start_date must be before or equal to end_date');
165
+ }
166
+ const result = {
167
+ latitude,
168
+ longitude,
169
+ start_date: validatedStartDate,
170
+ end_date: validatedEndDate,
171
+ };
172
+ if (limit !== undefined) {
173
+ result.limit = validatePositiveInteger(limit, 'limit', 1, FormatConstants.maxHistoricalLimit);
174
+ }
175
+ return result;
176
+ }
177
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Version utility - Single source of truth for application version
3
+ *
4
+ * Reads version from package.json to ensure consistency across all services
5
+ */
6
+ /**
7
+ * Application version from package.json
8
+ */
9
+ export declare const VERSION: string;
10
+ /**
11
+ * Get User-Agent string for HTTP requests
12
+ * @returns User-Agent string in format "weather-mcp/VERSION"
13
+ */
14
+ export declare function getUserAgent(): string;
15
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH;;GAEG;AACH,eAAO,MAAM,OAAO,EAA0B,MAAM,CAAC;AAErD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Version utility - Single source of truth for application version
3
+ *
4
+ * Reads version from package.json to ensure consistency across all services
5
+ */
6
+ import { readFileSync } from 'fs';
7
+ import { fileURLToPath } from 'url';
8
+ import { dirname, join } from 'path';
9
+ // Read version from package.json once at module load time
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ const packageJson = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));
13
+ /**
14
+ * Application version from package.json
15
+ */
16
+ export const VERSION = packageJson.version;
17
+ /**
18
+ * Get User-Agent string for HTTP requests
19
+ * @returns User-Agent string in format "weather-mcp/VERSION"
20
+ */
21
+ export function getUserAgent() {
22
+ return `weather-mcp/${VERSION}`;
23
+ }
24
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,0DAA0D;AAC1D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAC7D,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAC,OAAiB,CAAC;AAErD;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,eAAe,OAAO,EAAE,CAAC;AAClC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@jablum/weather-mcp",
3
+ "version": "1.7.0",
4
+ "description": "MCP (Model Context Protocol) server providing weather data from NOAA and Open-Meteo APIs. Supports forecasts, current conditions, and historical weather data (1940-present) with no API keys required.",
5
+ "mcpName": "io.github.jablum/weather-mcp",
6
+ "main": "dist/index.js",
7
+ "type": "module",
8
+ "bin": {
9
+ "weather-mcp": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "engines": {
17
+ "node": ">=18.0.0"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "dev": "tsx src/index.ts",
22
+ "start": "node dist/index.js",
23
+ "prepublishOnly": "npm run build",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "test:coverage": "vitest run --coverage",
27
+ "test:ui": "vitest --ui",
28
+ "audit": "npm audit --audit-level=moderate",
29
+ "audit:fix": "npm audit fix"
30
+ },
31
+ "keywords": [
32
+ "mcp",
33
+ "mcp-server",
34
+ "model-context-protocol",
35
+ "weather",
36
+ "weather-api",
37
+ "noaa",
38
+ "open-meteo",
39
+ "forecast",
40
+ "climate",
41
+ "historical-weather",
42
+ "claude",
43
+ "claude-code",
44
+ "ai",
45
+ "llm"
46
+ ],
47
+ "author": "Dan Gahagan",
48
+ "license": "MIT",
49
+ "homepage": "https://github.com/jablum/weather-mcp/weather-mcp#readme",
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "git+https://github.com/jablum/weather-mcp/weather-mcp.git"
53
+ },
54
+ "bugs": {
55
+ "url": "https://github.com/weather-mcp/weather-mcp/issues"
56
+ },
57
+ "dependencies": {
58
+ "@modelcontextprotocol/sdk": "^1.21.1",
59
+ "axios": "^1.13.1",
60
+ "dotenv": "^17.2.3",
61
+ "luxon": "^3.7.2",
62
+ "mqtt": "^5.14.1",
63
+ "ngeohash": "^0.6.3"
64
+ },
65
+ "devDependencies": {
66
+ "@types/luxon": "^3.7.1",
67
+ "@types/ngeohash": "^0.6.8",
68
+ "@types/node": "^24.10.0",
69
+ "@vitest/coverage-v8": "^4.0.8",
70
+ "tsx": "^4.20.6",
71
+ "typescript": "^5.9.3",
72
+ "vitest": "^4.0.8"
73
+ }
74
+ }