@dangahagan/weather-mcp 0.1.2 → 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 +295 -52
- package/dist/config/cache.d.ts +30 -0
- package/dist/config/cache.d.ts.map +1 -0
- package/dist/config/cache.js +105 -0
- package/dist/config/cache.js.map +1 -0
- 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 +149 -343
- package/dist/index.js.map +1 -1
- package/dist/services/noaa.d.ts +23 -1
- package/dist/services/noaa.d.ts.map +1 -1
- package/dist/services/noaa.js +154 -41
- package/dist/services/noaa.js.map +1 -1
- package/dist/services/openmeteo.d.ts +63 -3
- package/dist/services/openmeteo.d.ts.map +1 -1
- package/dist/services/openmeteo.js +284 -50
- 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 +69 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +164 -0
- package/dist/utils/cache.js.map +1 -0
- 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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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory cache with TTL (Time To Live) and LRU (Least Recently Used) eviction
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Configurable TTL per cache entry
|
|
6
|
+
* - LRU eviction when max size is reached
|
|
7
|
+
* - Type-safe generic implementation
|
|
8
|
+
* - Cache statistics tracking (hits, misses, evictions)
|
|
9
|
+
*/
|
|
10
|
+
export interface CacheStats {
|
|
11
|
+
hits: number;
|
|
12
|
+
misses: number;
|
|
13
|
+
evictions: number;
|
|
14
|
+
size: number;
|
|
15
|
+
maxSize: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class Cache<T = any> {
|
|
18
|
+
private cache;
|
|
19
|
+
private stats;
|
|
20
|
+
private maxSize;
|
|
21
|
+
private cleanupInterval;
|
|
22
|
+
constructor(maxSize?: number, cleanupIntervalMs?: number);
|
|
23
|
+
/**
|
|
24
|
+
* Get a value from the cache
|
|
25
|
+
* @param key Cache key
|
|
26
|
+
* @returns Cached value or undefined if not found or expired
|
|
27
|
+
*/
|
|
28
|
+
get(key: string): T | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Set a value in the cache with TTL
|
|
31
|
+
* @param key Cache key
|
|
32
|
+
* @param value Value to cache
|
|
33
|
+
* @param ttlMs Time to live in milliseconds (Infinity for no expiration)
|
|
34
|
+
*/
|
|
35
|
+
set(key: string, value: T, ttlMs: number): void;
|
|
36
|
+
/**
|
|
37
|
+
* Evict the least recently used entry
|
|
38
|
+
*/
|
|
39
|
+
private evictLRU;
|
|
40
|
+
/**
|
|
41
|
+
* Clear all entries from the cache
|
|
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;
|
|
49
|
+
/**
|
|
50
|
+
* Get cache statistics
|
|
51
|
+
*/
|
|
52
|
+
getStats(): CacheStats;
|
|
53
|
+
/**
|
|
54
|
+
* Remove expired entries from cache
|
|
55
|
+
*/
|
|
56
|
+
private cleanupExpired;
|
|
57
|
+
/**
|
|
58
|
+
* Generate a cache key from components
|
|
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
|
|
62
|
+
*/
|
|
63
|
+
static generateKey(...components: (string | number | boolean | null | undefined)[]): string;
|
|
64
|
+
/**
|
|
65
|
+
* Calculate hit rate percentage
|
|
66
|
+
*/
|
|
67
|
+
getHitRate(): number;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +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;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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory cache with TTL (Time To Live) and LRU (Least Recently Used) eviction
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Configurable TTL per cache entry
|
|
6
|
+
* - LRU eviction when max size is reached
|
|
7
|
+
* - Type-safe generic implementation
|
|
8
|
+
* - Cache statistics tracking (hits, misses, evictions)
|
|
9
|
+
*/
|
|
10
|
+
export class Cache {
|
|
11
|
+
cache = new Map();
|
|
12
|
+
stats;
|
|
13
|
+
maxSize;
|
|
14
|
+
cleanupInterval = null;
|
|
15
|
+
constructor(maxSize = 1000, cleanupIntervalMs = 5 * 60 * 1000) {
|
|
16
|
+
this.maxSize = maxSize;
|
|
17
|
+
this.stats = {
|
|
18
|
+
hits: 0,
|
|
19
|
+
misses: 0,
|
|
20
|
+
evictions: 0,
|
|
21
|
+
size: 0,
|
|
22
|
+
maxSize: maxSize,
|
|
23
|
+
};
|
|
24
|
+
// Automatic cleanup of expired entries every 5 minutes by default
|
|
25
|
+
this.cleanupInterval = setInterval(() => {
|
|
26
|
+
this.cleanupExpired();
|
|
27
|
+
}, cleanupIntervalMs);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get a value from the cache
|
|
31
|
+
* @param key Cache key
|
|
32
|
+
* @returns Cached value or undefined if not found or expired
|
|
33
|
+
*/
|
|
34
|
+
get(key) {
|
|
35
|
+
const entry = this.cache.get(key);
|
|
36
|
+
if (!entry) {
|
|
37
|
+
this.stats.misses++;
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
// Check if expired
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
if (entry.expiresAt < now) {
|
|
43
|
+
this.cache.delete(key);
|
|
44
|
+
this.stats.misses++;
|
|
45
|
+
this.stats.size = this.cache.size;
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
// Update last accessed time for LRU
|
|
49
|
+
entry.lastAccessedAt = now;
|
|
50
|
+
this.stats.hits++;
|
|
51
|
+
return entry.value;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Set a value in the cache with TTL
|
|
55
|
+
* @param key Cache key
|
|
56
|
+
* @param value Value to cache
|
|
57
|
+
* @param ttlMs Time to live in milliseconds (Infinity for no expiration)
|
|
58
|
+
*/
|
|
59
|
+
set(key, value, ttlMs) {
|
|
60
|
+
const now = Date.now();
|
|
61
|
+
// If cache is at max size and key doesn't exist, evict LRU entry
|
|
62
|
+
if (this.cache.size >= this.maxSize && !this.cache.has(key)) {
|
|
63
|
+
this.evictLRU();
|
|
64
|
+
}
|
|
65
|
+
const entry = {
|
|
66
|
+
value,
|
|
67
|
+
expiresAt: ttlMs === Infinity ? Infinity : now + ttlMs,
|
|
68
|
+
lastAccessedAt: now,
|
|
69
|
+
};
|
|
70
|
+
this.cache.set(key, entry);
|
|
71
|
+
this.stats.size = this.cache.size;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Evict the least recently used entry
|
|
75
|
+
*/
|
|
76
|
+
evictLRU() {
|
|
77
|
+
let oldestKey = null;
|
|
78
|
+
let oldestTime = Infinity;
|
|
79
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
80
|
+
if (entry.lastAccessedAt < oldestTime) {
|
|
81
|
+
oldestTime = entry.lastAccessedAt;
|
|
82
|
+
oldestKey = key;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (oldestKey) {
|
|
86
|
+
this.cache.delete(oldestKey);
|
|
87
|
+
this.stats.evictions++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Clear all entries from the cache
|
|
92
|
+
*/
|
|
93
|
+
clear() {
|
|
94
|
+
this.cache.clear();
|
|
95
|
+
this.stats.size = 0;
|
|
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
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get cache statistics
|
|
110
|
+
*/
|
|
111
|
+
getStats() {
|
|
112
|
+
// Clean up expired entries before returning stats
|
|
113
|
+
this.cleanupExpired();
|
|
114
|
+
return {
|
|
115
|
+
...this.stats,
|
|
116
|
+
size: this.cache.size,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Remove expired entries from cache
|
|
121
|
+
*/
|
|
122
|
+
cleanupExpired() {
|
|
123
|
+
const now = Date.now();
|
|
124
|
+
const keysToDelete = [];
|
|
125
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
126
|
+
if (entry.expiresAt < now) {
|
|
127
|
+
keysToDelete.push(key);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
keysToDelete.forEach(key => this.cache.delete(key));
|
|
131
|
+
this.stats.size = this.cache.size;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Generate a cache key from components
|
|
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
|
|
138
|
+
*/
|
|
139
|
+
static generateKey(...components) {
|
|
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(':');
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Calculate hit rate percentage
|
|
156
|
+
*/
|
|
157
|
+
getHitRate() {
|
|
158
|
+
const total = this.stats.hits + this.stats.misses;
|
|
159
|
+
if (total === 0)
|
|
160
|
+
return 0;
|
|
161
|
+
return (this.stats.hits / total) * 100;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|