@dangahagan/weather-mcp 0.2.0 → 0.4.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.
- package/README.md +252 -53
- package/dist/config/cache.d.ts +1 -0
- package/dist/config/cache.d.ts.map +1 -1
- package/dist/config/cache.js +45 -2
- package/dist/config/cache.js.map +1 -1
- package/dist/config/displayThresholds.d.ts +83 -0
- package/dist/config/displayThresholds.d.ts.map +1 -0
- package/dist/config/displayThresholds.js +83 -0
- package/dist/config/displayThresholds.js.map +1 -0
- package/dist/errors/ApiError.d.ts +62 -0
- package/dist/errors/ApiError.d.ts.map +1 -0
- package/dist/errors/ApiError.js +147 -0
- package/dist/errors/ApiError.js.map +1 -0
- package/dist/handlers/alertsHandler.d.ts +11 -0
- package/dist/handlers/alertsHandler.d.ts.map +1 -0
- package/dist/handlers/alertsHandler.js +79 -0
- package/dist/handlers/alertsHandler.js.map +1 -0
- package/dist/handlers/currentConditionsHandler.d.ts +11 -0
- package/dist/handlers/currentConditionsHandler.d.ts.map +1 -0
- package/dist/handlers/currentConditionsHandler.js +168 -0
- package/dist/handlers/currentConditionsHandler.js.map +1 -0
- package/dist/handlers/forecastHandler.d.ts +13 -0
- package/dist/handlers/forecastHandler.d.ts.map +1 -0
- package/dist/handlers/forecastHandler.js +226 -0
- package/dist/handlers/forecastHandler.js.map +1 -0
- package/dist/handlers/historicalWeatherHandler.d.ts +12 -0
- package/dist/handlers/historicalWeatherHandler.d.ts.map +1 -0
- package/dist/handlers/historicalWeatherHandler.js +188 -0
- package/dist/handlers/historicalWeatherHandler.js.map +1 -0
- package/dist/handlers/locationHandler.d.ts +11 -0
- package/dist/handlers/locationHandler.d.ts.map +1 -0
- package/dist/handlers/locationHandler.js +113 -0
- package/dist/handlers/locationHandler.js.map +1 -0
- package/dist/handlers/statusHandler.d.ts +12 -0
- package/dist/handlers/statusHandler.d.ts.map +1 -0
- package/dist/handlers/statusHandler.js +106 -0
- package/dist/handlers/statusHandler.js.map +1 -0
- package/dist/index.js +148 -376
- package/dist/index.js.map +1 -1
- package/dist/services/noaa.d.ts +14 -1
- package/dist/services/noaa.d.ts.map +1 -1
- package/dist/services/noaa.js +74 -42
- package/dist/services/noaa.js.map +1 -1
- package/dist/services/openmeteo.d.ts +54 -3
- package/dist/services/openmeteo.d.ts.map +1 -1
- package/dist/services/openmeteo.js +256 -112
- package/dist/services/openmeteo.js.map +1 -1
- package/dist/types/noaa.d.ts +64 -12
- package/dist/types/noaa.d.ts.map +1 -1
- package/dist/types/openmeteo.d.ts +156 -0
- package/dist/types/openmeteo.d.ts.map +1 -1
- package/dist/utils/cache.d.ts +11 -4
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +33 -4
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/logger.d.ts +59 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +128 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/temperatureConversion.d.ts +12 -0
- package/dist/utils/temperatureConversion.d.ts.map +1 -0
- package/dist/utils/temperatureConversion.js +17 -0
- package/dist/utils/temperatureConversion.js.map +1 -0
- package/dist/utils/validation.d.ts +89 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +177 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +10 -3
|
@@ -114,4 +114,160 @@ export interface OpenMeteoErrorResponse {
|
|
|
114
114
|
error: boolean;
|
|
115
115
|
reason: string;
|
|
116
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Location result from Open-Meteo Geocoding API
|
|
119
|
+
*/
|
|
120
|
+
export interface GeocodingLocation {
|
|
121
|
+
id: number;
|
|
122
|
+
name: string;
|
|
123
|
+
latitude: number;
|
|
124
|
+
longitude: number;
|
|
125
|
+
elevation?: number;
|
|
126
|
+
feature_code?: string;
|
|
127
|
+
country_code?: string;
|
|
128
|
+
country?: string;
|
|
129
|
+
country_id?: number;
|
|
130
|
+
timezone?: string;
|
|
131
|
+
population?: number;
|
|
132
|
+
postcodes?: string[];
|
|
133
|
+
admin1?: string;
|
|
134
|
+
admin2?: string;
|
|
135
|
+
admin3?: string;
|
|
136
|
+
admin4?: string;
|
|
137
|
+
admin1_id?: number;
|
|
138
|
+
admin2_id?: number;
|
|
139
|
+
admin3_id?: number;
|
|
140
|
+
admin4_id?: number;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Response from Open-Meteo Geocoding API
|
|
144
|
+
*/
|
|
145
|
+
export interface GeocodingResponse {
|
|
146
|
+
results?: GeocodingLocation[];
|
|
147
|
+
generationtime_ms?: number;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Hourly forecast data from Open-Meteo Forecast API
|
|
151
|
+
*/
|
|
152
|
+
export interface OpenMeteoForecastHourlyData {
|
|
153
|
+
time: string[];
|
|
154
|
+
temperature_2m?: number[];
|
|
155
|
+
relative_humidity_2m?: number[];
|
|
156
|
+
dewpoint_2m?: number[];
|
|
157
|
+
apparent_temperature?: number[];
|
|
158
|
+
precipitation_probability?: number[];
|
|
159
|
+
precipitation?: number[];
|
|
160
|
+
rain?: number[];
|
|
161
|
+
showers?: number[];
|
|
162
|
+
snowfall?: number[];
|
|
163
|
+
snow_depth?: number[];
|
|
164
|
+
weather_code?: number[];
|
|
165
|
+
pressure_msl?: number[];
|
|
166
|
+
surface_pressure?: number[];
|
|
167
|
+
cloud_cover?: number[];
|
|
168
|
+
cloud_cover_low?: number[];
|
|
169
|
+
cloud_cover_mid?: number[];
|
|
170
|
+
cloud_cover_high?: number[];
|
|
171
|
+
visibility?: number[];
|
|
172
|
+
wind_speed_10m?: number[];
|
|
173
|
+
wind_direction_10m?: number[];
|
|
174
|
+
wind_gusts_10m?: number[];
|
|
175
|
+
uv_index?: number[];
|
|
176
|
+
is_day?: number[];
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Daily forecast data from Open-Meteo Forecast API
|
|
180
|
+
*/
|
|
181
|
+
export interface OpenMeteoForecastDailyData {
|
|
182
|
+
time: string[];
|
|
183
|
+
weather_code?: number[];
|
|
184
|
+
temperature_2m_max?: number[];
|
|
185
|
+
temperature_2m_min?: number[];
|
|
186
|
+
apparent_temperature_max?: number[];
|
|
187
|
+
apparent_temperature_min?: number[];
|
|
188
|
+
sunrise?: string[];
|
|
189
|
+
sunset?: string[];
|
|
190
|
+
daylight_duration?: number[];
|
|
191
|
+
sunshine_duration?: number[];
|
|
192
|
+
uv_index_max?: number[];
|
|
193
|
+
precipitation_sum?: number[];
|
|
194
|
+
rain_sum?: number[];
|
|
195
|
+
showers_sum?: number[];
|
|
196
|
+
snowfall_sum?: number[];
|
|
197
|
+
precipitation_hours?: number[];
|
|
198
|
+
precipitation_probability_max?: number[];
|
|
199
|
+
wind_speed_10m_max?: number[];
|
|
200
|
+
wind_gusts_10m_max?: number[];
|
|
201
|
+
wind_direction_10m_dominant?: number[];
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Units for forecast hourly data
|
|
205
|
+
*/
|
|
206
|
+
export interface OpenMeteoForecastHourlyUnits {
|
|
207
|
+
time?: string;
|
|
208
|
+
temperature_2m?: string;
|
|
209
|
+
relative_humidity_2m?: string;
|
|
210
|
+
dewpoint_2m?: string;
|
|
211
|
+
apparent_temperature?: string;
|
|
212
|
+
precipitation_probability?: string;
|
|
213
|
+
precipitation?: string;
|
|
214
|
+
rain?: string;
|
|
215
|
+
showers?: string;
|
|
216
|
+
snowfall?: string;
|
|
217
|
+
snow_depth?: string;
|
|
218
|
+
weather_code?: string;
|
|
219
|
+
pressure_msl?: string;
|
|
220
|
+
surface_pressure?: string;
|
|
221
|
+
cloud_cover?: string;
|
|
222
|
+
cloud_cover_low?: string;
|
|
223
|
+
cloud_cover_mid?: string;
|
|
224
|
+
cloud_cover_high?: string;
|
|
225
|
+
visibility?: string;
|
|
226
|
+
wind_speed_10m?: string;
|
|
227
|
+
wind_direction_10m?: string;
|
|
228
|
+
wind_gusts_10m?: string;
|
|
229
|
+
uv_index?: string;
|
|
230
|
+
is_day?: string;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Units for forecast daily data
|
|
234
|
+
*/
|
|
235
|
+
export interface OpenMeteoForecastDailyUnits {
|
|
236
|
+
time?: string;
|
|
237
|
+
weather_code?: string;
|
|
238
|
+
temperature_2m_max?: string;
|
|
239
|
+
temperature_2m_min?: string;
|
|
240
|
+
apparent_temperature_max?: string;
|
|
241
|
+
apparent_temperature_min?: string;
|
|
242
|
+
sunrise?: string;
|
|
243
|
+
sunset?: string;
|
|
244
|
+
daylight_duration?: string;
|
|
245
|
+
sunshine_duration?: string;
|
|
246
|
+
uv_index_max?: string;
|
|
247
|
+
precipitation_sum?: string;
|
|
248
|
+
rain_sum?: string;
|
|
249
|
+
showers_sum?: string;
|
|
250
|
+
snowfall_sum?: string;
|
|
251
|
+
precipitation_hours?: string;
|
|
252
|
+
precipitation_probability_max?: string;
|
|
253
|
+
wind_speed_10m_max?: string;
|
|
254
|
+
wind_gusts_10m_max?: string;
|
|
255
|
+
wind_direction_10m_dominant?: string;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Complete API response from Open-Meteo Forecast API
|
|
259
|
+
*/
|
|
260
|
+
export interface OpenMeteoForecastResponse {
|
|
261
|
+
latitude: number;
|
|
262
|
+
longitude: number;
|
|
263
|
+
generationtime_ms: number;
|
|
264
|
+
utc_offset_seconds: number;
|
|
265
|
+
timezone: string;
|
|
266
|
+
timezone_abbreviation: string;
|
|
267
|
+
elevation: number;
|
|
268
|
+
hourly_units?: OpenMeteoForecastHourlyUnits;
|
|
269
|
+
hourly?: OpenMeteoForecastHourlyData;
|
|
270
|
+
daily_units?: OpenMeteoForecastDailyUnits;
|
|
271
|
+
daily?: OpenMeteoForecastDailyData;
|
|
272
|
+
}
|
|
117
273
|
//# sourceMappingURL=openmeteo.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openmeteo.d.ts","sourceRoot":"","sources":["../../src/types/openmeteo.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"openmeteo.d.ts","sourceRoot":"","sources":["../../src/types/openmeteo.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/cache.d.ts
CHANGED
|
@@ -18,7 +18,8 @@ export declare class Cache<T = any> {
|
|
|
18
18
|
private cache;
|
|
19
19
|
private stats;
|
|
20
20
|
private maxSize;
|
|
21
|
-
|
|
21
|
+
private cleanupInterval;
|
|
22
|
+
constructor(maxSize?: number, cleanupIntervalMs?: number);
|
|
22
23
|
/**
|
|
23
24
|
* Get a value from the cache
|
|
24
25
|
* @param key Cache key
|
|
@@ -40,6 +41,11 @@ export declare class Cache<T = any> {
|
|
|
40
41
|
* Clear all entries from the cache
|
|
41
42
|
*/
|
|
42
43
|
clear(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Destroy the cache and clean up resources
|
|
46
|
+
* Call this when the cache is no longer needed to prevent memory leaks
|
|
47
|
+
*/
|
|
48
|
+
destroy(): void;
|
|
43
49
|
/**
|
|
44
50
|
* Get cache statistics
|
|
45
51
|
*/
|
|
@@ -50,10 +56,11 @@ export declare class Cache<T = any> {
|
|
|
50
56
|
private cleanupExpired;
|
|
51
57
|
/**
|
|
52
58
|
* Generate a cache key from components
|
|
53
|
-
* @param components Parts to combine into a cache key
|
|
54
|
-
* @returns
|
|
59
|
+
* @param components Parts to combine into a cache key (only primitives allowed)
|
|
60
|
+
* @returns Cache key string
|
|
61
|
+
* @throws {Error} If components contain objects or invalid types
|
|
55
62
|
*/
|
|
56
|
-
static generateKey(...components:
|
|
63
|
+
static generateKey(...components: (string | number | boolean | null | undefined)[]): string;
|
|
57
64
|
/**
|
|
58
65
|
* Calculate hit rate percentage
|
|
59
66
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,KAAK,CAAC,CAAC,GAAG,GAAG;IACxB,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,OAAO,CAAS;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,KAAK,CAAC,CAAC,GAAG,GAAG;IACxB,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAA+B;gBAE1C,OAAO,GAAE,MAAa,EAAE,iBAAiB,GAAE,MAAsB;IAgB7E;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAuB/B;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAkB/C;;OAEG;IACH,OAAO,CAAC,QAAQ;IAiBhB;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;IACH,QAAQ,IAAI,UAAU;IAUtB;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,GAAG,UAAU,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM;IAiB3F;;OAEG;IACH,UAAU,IAAI,MAAM;CAKrB"}
|
package/dist/utils/cache.js
CHANGED
|
@@ -11,7 +11,8 @@ export class Cache {
|
|
|
11
11
|
cache = new Map();
|
|
12
12
|
stats;
|
|
13
13
|
maxSize;
|
|
14
|
-
|
|
14
|
+
cleanupInterval = null;
|
|
15
|
+
constructor(maxSize = 1000, cleanupIntervalMs = 5 * 60 * 1000) {
|
|
15
16
|
this.maxSize = maxSize;
|
|
16
17
|
this.stats = {
|
|
17
18
|
hits: 0,
|
|
@@ -20,6 +21,10 @@ export class Cache {
|
|
|
20
21
|
size: 0,
|
|
21
22
|
maxSize: maxSize,
|
|
22
23
|
};
|
|
24
|
+
// Automatic cleanup of expired entries every 5 minutes by default
|
|
25
|
+
this.cleanupInterval = setInterval(() => {
|
|
26
|
+
this.cleanupExpired();
|
|
27
|
+
}, cleanupIntervalMs);
|
|
23
28
|
}
|
|
24
29
|
/**
|
|
25
30
|
* Get a value from the cache
|
|
@@ -89,6 +94,17 @@ export class Cache {
|
|
|
89
94
|
this.cache.clear();
|
|
90
95
|
this.stats.size = 0;
|
|
91
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Destroy the cache and clean up resources
|
|
99
|
+
* Call this when the cache is no longer needed to prevent memory leaks
|
|
100
|
+
*/
|
|
101
|
+
destroy() {
|
|
102
|
+
if (this.cleanupInterval) {
|
|
103
|
+
clearInterval(this.cleanupInterval);
|
|
104
|
+
this.cleanupInterval = null;
|
|
105
|
+
}
|
|
106
|
+
this.clear();
|
|
107
|
+
}
|
|
92
108
|
/**
|
|
93
109
|
* Get cache statistics
|
|
94
110
|
*/
|
|
@@ -116,11 +132,24 @@ export class Cache {
|
|
|
116
132
|
}
|
|
117
133
|
/**
|
|
118
134
|
* Generate a cache key from components
|
|
119
|
-
* @param components Parts to combine into a cache key
|
|
120
|
-
* @returns
|
|
135
|
+
* @param components Parts to combine into a cache key (only primitives allowed)
|
|
136
|
+
* @returns Cache key string
|
|
137
|
+
* @throws {Error} If components contain objects or invalid types
|
|
121
138
|
*/
|
|
122
139
|
static generateKey(...components) {
|
|
123
|
-
|
|
140
|
+
// Validate and sanitize inputs to prevent cache poisoning
|
|
141
|
+
const sanitized = components.map((c, index) => {
|
|
142
|
+
if (c === null || c === undefined) {
|
|
143
|
+
return 'null';
|
|
144
|
+
}
|
|
145
|
+
if (typeof c === 'object') {
|
|
146
|
+
throw new Error(`Cache key generation error: Object not allowed at position ${index}. Only primitives (string, number, boolean) are supported.`);
|
|
147
|
+
}
|
|
148
|
+
// Convert to string safely
|
|
149
|
+
return String(c);
|
|
150
|
+
});
|
|
151
|
+
// Use colon separator instead of JSON.stringify to avoid circular reference issues
|
|
152
|
+
return sanitized.join(':');
|
|
124
153
|
}
|
|
125
154
|
/**
|
|
126
155
|
* Calculate hit rate percentage
|
package/dist/utils/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,MAAM,OAAO,KAAK;IACR,KAAK,GAA+B,IAAI,GAAG,EAAE,CAAC;IAC9C,KAAK,CAAa;IAClB,OAAO,CAAS;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logging utility for MCP server
|
|
3
|
+
*
|
|
4
|
+
* IMPORTANT: MCP servers use stdio for communication, so all logging MUST go to stderr
|
|
5
|
+
* (console.error) to avoid interfering with the MCP protocol on stdout.
|
|
6
|
+
*/
|
|
7
|
+
export declare enum LogLevel {
|
|
8
|
+
DEBUG = 0,
|
|
9
|
+
INFO = 1,
|
|
10
|
+
WARN = 2,
|
|
11
|
+
ERROR = 3
|
|
12
|
+
}
|
|
13
|
+
export declare class Logger {
|
|
14
|
+
private level;
|
|
15
|
+
private context?;
|
|
16
|
+
constructor(level?: LogLevel, context?: string);
|
|
17
|
+
/**
|
|
18
|
+
* Create a child logger with a specific context
|
|
19
|
+
*/
|
|
20
|
+
child(context: string): Logger;
|
|
21
|
+
/**
|
|
22
|
+
* Set the logging level
|
|
23
|
+
*/
|
|
24
|
+
setLevel(level: LogLevel): void;
|
|
25
|
+
/**
|
|
26
|
+
* Internal logging method
|
|
27
|
+
*/
|
|
28
|
+
private log;
|
|
29
|
+
/**
|
|
30
|
+
* Log debug message (detailed information for diagnosing problems)
|
|
31
|
+
*/
|
|
32
|
+
debug(message: string, metadata?: Record<string, any>): void;
|
|
33
|
+
/**
|
|
34
|
+
* Log info message (general informational messages)
|
|
35
|
+
*/
|
|
36
|
+
info(message: string, metadata?: Record<string, any>): void;
|
|
37
|
+
/**
|
|
38
|
+
* Log warning message (warning messages for potentially harmful situations)
|
|
39
|
+
*/
|
|
40
|
+
warn(message: string, metadata?: Record<string, any>): void;
|
|
41
|
+
/**
|
|
42
|
+
* Log error message (error events that might still allow the application to continue)
|
|
43
|
+
*/
|
|
44
|
+
error(message: string, error?: Error, metadata?: Record<string, any>): void;
|
|
45
|
+
/**
|
|
46
|
+
* Log API request
|
|
47
|
+
*/
|
|
48
|
+
logApiRequest(service: string, endpoint: string, metadata?: Record<string, any>): void;
|
|
49
|
+
/**
|
|
50
|
+
* Log API response
|
|
51
|
+
*/
|
|
52
|
+
logApiResponse(service: string, endpoint: string, success: boolean, duration?: number): void;
|
|
53
|
+
/**
|
|
54
|
+
* Log cache operation
|
|
55
|
+
*/
|
|
56
|
+
logCacheOperation(operation: 'hit' | 'miss' | 'set' | 'evict', key: string): void;
|
|
57
|
+
}
|
|
58
|
+
export declare const logger: Logger;
|
|
59
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAeD,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,KAAK,GAAE,QAAwB,EAAE,OAAO,CAAC,EAAE,MAAM;IAK7D;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI9B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B;;OAEG;IACH,OAAO,CAAC,GAAG;IA8BX;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAI5D;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAI3D;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAI3D;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAI3E;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAQtF;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAU5F;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;CAGlF;AAkBD,eAAO,MAAM,MAAM,QAAwB,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logging utility for MCP server
|
|
3
|
+
*
|
|
4
|
+
* IMPORTANT: MCP servers use stdio for communication, so all logging MUST go to stderr
|
|
5
|
+
* (console.error) to avoid interfering with the MCP protocol on stdout.
|
|
6
|
+
*/
|
|
7
|
+
export var LogLevel;
|
|
8
|
+
(function (LogLevel) {
|
|
9
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
10
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
11
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
12
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
13
|
+
})(LogLevel || (LogLevel = {}));
|
|
14
|
+
export class Logger {
|
|
15
|
+
level;
|
|
16
|
+
context;
|
|
17
|
+
constructor(level = LogLevel.INFO, context) {
|
|
18
|
+
this.level = level;
|
|
19
|
+
this.context = context;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a child logger with a specific context
|
|
23
|
+
*/
|
|
24
|
+
child(context) {
|
|
25
|
+
return new Logger(this.level, context);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Set the logging level
|
|
29
|
+
*/
|
|
30
|
+
setLevel(level) {
|
|
31
|
+
this.level = level;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Internal logging method
|
|
35
|
+
*/
|
|
36
|
+
log(level, message, metadata, error) {
|
|
37
|
+
// Skip if below current log level
|
|
38
|
+
if (level < this.level)
|
|
39
|
+
return;
|
|
40
|
+
const entry = {
|
|
41
|
+
timestamp: new Date().toISOString(),
|
|
42
|
+
level: LogLevel[level],
|
|
43
|
+
message,
|
|
44
|
+
};
|
|
45
|
+
if (this.context) {
|
|
46
|
+
entry.context = this.context;
|
|
47
|
+
}
|
|
48
|
+
if (error) {
|
|
49
|
+
entry.error = {
|
|
50
|
+
message: error.message,
|
|
51
|
+
stack: error.stack,
|
|
52
|
+
code: error.code,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (metadata) {
|
|
56
|
+
entry.metadata = metadata;
|
|
57
|
+
}
|
|
58
|
+
// Output to stderr for MCP compatibility
|
|
59
|
+
console.error(JSON.stringify(entry));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Log debug message (detailed information for diagnosing problems)
|
|
63
|
+
*/
|
|
64
|
+
debug(message, metadata) {
|
|
65
|
+
this.log(LogLevel.DEBUG, message, metadata);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Log info message (general informational messages)
|
|
69
|
+
*/
|
|
70
|
+
info(message, metadata) {
|
|
71
|
+
this.log(LogLevel.INFO, message, metadata);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Log warning message (warning messages for potentially harmful situations)
|
|
75
|
+
*/
|
|
76
|
+
warn(message, metadata) {
|
|
77
|
+
this.log(LogLevel.WARN, message, metadata);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Log error message (error events that might still allow the application to continue)
|
|
81
|
+
*/
|
|
82
|
+
error(message, error, metadata) {
|
|
83
|
+
this.log(LogLevel.ERROR, message, metadata, error);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Log API request
|
|
87
|
+
*/
|
|
88
|
+
logApiRequest(service, endpoint, metadata) {
|
|
89
|
+
this.debug(`API request to ${service}`, {
|
|
90
|
+
service,
|
|
91
|
+
endpoint,
|
|
92
|
+
...metadata,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Log API response
|
|
97
|
+
*/
|
|
98
|
+
logApiResponse(service, endpoint, success, duration) {
|
|
99
|
+
const level = success ? LogLevel.DEBUG : LogLevel.WARN;
|
|
100
|
+
this.log(level, `API response from ${service}`, {
|
|
101
|
+
service,
|
|
102
|
+
endpoint,
|
|
103
|
+
success,
|
|
104
|
+
duration,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Log cache operation
|
|
109
|
+
*/
|
|
110
|
+
logCacheOperation(operation, key) {
|
|
111
|
+
this.debug(`Cache ${operation}`, { operation, key });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Create the default logger instance
|
|
116
|
+
* Level is controlled by LOG_LEVEL environment variable
|
|
117
|
+
*/
|
|
118
|
+
function createDefaultLogger() {
|
|
119
|
+
const levelStr = process.env.LOG_LEVEL?.toUpperCase();
|
|
120
|
+
let level = LogLevel.INFO; // Default to INFO
|
|
121
|
+
if (levelStr && levelStr in LogLevel) {
|
|
122
|
+
level = LogLevel[levelStr];
|
|
123
|
+
}
|
|
124
|
+
return new Logger(level);
|
|
125
|
+
}
|
|
126
|
+
// Export singleton instance
|
|
127
|
+
export const logger = createDefaultLogger();
|
|
128
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temperature conversion utilities
|
|
3
|
+
* Centralized to avoid duplication across handlers
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert temperature value to Fahrenheit based on unit code
|
|
7
|
+
* @param value - Temperature value (can be null)
|
|
8
|
+
* @param unitCode - Unit code from NOAA API (e.g., "wmoUnit:degC", "wmoUnit:degF")
|
|
9
|
+
* @returns Temperature in Fahrenheit, or null if value is null
|
|
10
|
+
*/
|
|
11
|
+
export declare function convertToFahrenheit(value: number | null, unitCode: string): number | null;
|
|
12
|
+
//# sourceMappingURL=temperatureConversion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temperatureConversion.d.ts","sourceRoot":"","sources":["../../src/utils/temperatureConversion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGzF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temperature conversion utilities
|
|
3
|
+
* Centralized to avoid duplication across handlers
|
|
4
|
+
*/
|
|
5
|
+
import { celsiusToFahrenheit } from './units.js';
|
|
6
|
+
/**
|
|
7
|
+
* Convert temperature value to Fahrenheit based on unit code
|
|
8
|
+
* @param value - Temperature value (can be null)
|
|
9
|
+
* @param unitCode - Unit code from NOAA API (e.g., "wmoUnit:degC", "wmoUnit:degF")
|
|
10
|
+
* @returns Temperature in Fahrenheit, or null if value is null
|
|
11
|
+
*/
|
|
12
|
+
export function convertToFahrenheit(value, unitCode) {
|
|
13
|
+
if (value === null)
|
|
14
|
+
return null;
|
|
15
|
+
return unitCode.includes('degC') ? celsiusToFahrenheit(value) : value;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=temperatureConversion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temperatureConversion.js","sourceRoot":"","sources":["../../src/utils/temperatureConversion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAoB,EAAE,QAAgB;IACxE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities for API parameters
|
|
3
|
+
* Provides runtime type checking and sanitization
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Validate that latitude is a valid number within range
|
|
7
|
+
* @param lat - Latitude value to validate
|
|
8
|
+
* @throws {Error} If latitude is invalid
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateLatitude(lat: unknown): asserts lat is number;
|
|
11
|
+
/**
|
|
12
|
+
* Validate that longitude is a valid number within range
|
|
13
|
+
* @param lon - Longitude value to validate
|
|
14
|
+
* @throws {Error} If longitude is invalid
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateLongitude(lon: unknown): asserts lon is number;
|
|
17
|
+
/**
|
|
18
|
+
* Validate coordinate pair
|
|
19
|
+
* @param args - Arguments object potentially containing coordinates
|
|
20
|
+
* @returns Validated coordinates
|
|
21
|
+
* @throws {Error} If coordinates are invalid
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateCoordinates(args: unknown): {
|
|
24
|
+
latitude: number;
|
|
25
|
+
longitude: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Validate a positive integer within optional range
|
|
29
|
+
* @param value - Value to validate
|
|
30
|
+
* @param name - Parameter name for error messages
|
|
31
|
+
* @param min - Minimum allowed value (inclusive)
|
|
32
|
+
* @param max - Maximum allowed value (inclusive)
|
|
33
|
+
* @returns Validated number
|
|
34
|
+
* @throws {Error} If value is invalid
|
|
35
|
+
*/
|
|
36
|
+
export declare function validatePositiveInteger(value: unknown, name: string, min?: number, max?: number): number;
|
|
37
|
+
/**
|
|
38
|
+
* Validate a boolean value
|
|
39
|
+
* @param value - Value to validate
|
|
40
|
+
* @param name - Parameter name for error messages
|
|
41
|
+
* @returns Validated boolean
|
|
42
|
+
* @throws {Error} If value is invalid
|
|
43
|
+
*/
|
|
44
|
+
export declare function validateBoolean(value: unknown, name: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Validate a date string in ISO format
|
|
47
|
+
* @param value - Value to validate
|
|
48
|
+
* @param name - Parameter name for error messages
|
|
49
|
+
* @returns Validated date string
|
|
50
|
+
* @throws {Error} If value is invalid
|
|
51
|
+
*/
|
|
52
|
+
export declare function validateDateString(value: unknown, name: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Validate forecast days parameter
|
|
55
|
+
* @param args - Arguments object potentially containing days parameter
|
|
56
|
+
* @returns Validated days value (defaults to 7 if not provided)
|
|
57
|
+
* @throws {Error} If days parameter is invalid
|
|
58
|
+
*/
|
|
59
|
+
export declare function validateForecastDays(args: unknown): number;
|
|
60
|
+
/**
|
|
61
|
+
* Validate granularity parameter
|
|
62
|
+
* @param value - Value to validate
|
|
63
|
+
* @returns Validated granularity ('daily' or 'hourly')
|
|
64
|
+
* @throws {Error} If value is invalid
|
|
65
|
+
*/
|
|
66
|
+
export declare function validateGranularity(value: unknown): 'daily' | 'hourly';
|
|
67
|
+
/**
|
|
68
|
+
* Validate optional boolean with default
|
|
69
|
+
* @param value - Value to validate
|
|
70
|
+
* @param name - Parameter name for error messages
|
|
71
|
+
* @param defaultValue - Default value if undefined
|
|
72
|
+
* @returns Validated boolean
|
|
73
|
+
* @throws {Error} If value is invalid
|
|
74
|
+
*/
|
|
75
|
+
export declare function validateOptionalBoolean(value: unknown, name: string, defaultValue: boolean): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Validate historical weather parameters
|
|
78
|
+
* @param args - Arguments object
|
|
79
|
+
* @returns Validated parameters
|
|
80
|
+
* @throws {Error} If parameters are invalid
|
|
81
|
+
*/
|
|
82
|
+
export declare function validateHistoricalWeatherParams(args: unknown): {
|
|
83
|
+
latitude: number;
|
|
84
|
+
longitude: number;
|
|
85
|
+
start_date: string;
|
|
86
|
+
end_date: string;
|
|
87
|
+
limit?: number;
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAOpE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAOrE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAW1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAU,EACf,GAAG,GAAE,MAAgC,GACpC,MAAM,CAWR;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKrE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAYvE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAY1D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CActE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,OAAO,GACpB,OAAO,CAKT;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,OAAO,GAAG;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAoCA"}
|