@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
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for get_forecast tool
|
|
3
|
+
* Supports both NOAA (US) and Open-Meteo (global) forecast sources
|
|
4
|
+
*/
|
|
5
|
+
import { validateCoordinates, validateForecastDays, validateGranularity, validateOptionalBoolean, } from '../utils/validation.js';
|
|
6
|
+
/**
|
|
7
|
+
* Determine if coordinates are within the United States (including Alaska, Hawaii, and territories)
|
|
8
|
+
* Uses bounding box approach for simplicity
|
|
9
|
+
*/
|
|
10
|
+
function isInUS(latitude, longitude) {
|
|
11
|
+
// Continental US, Alaska, Hawaii, Puerto Rico, and territories
|
|
12
|
+
const inContinentalUS = latitude >= 24.5 && latitude <= 49.4 && longitude >= -125 && longitude <= -66.9;
|
|
13
|
+
const inAlaska = latitude >= 51 && latitude <= 71.4 && longitude >= -180 && longitude <= -129.9;
|
|
14
|
+
const inHawaii = latitude >= 18.9 && latitude <= 28.5 && longitude >= -178.4 && longitude <= -154.8;
|
|
15
|
+
const inPuertoRico = latitude >= 17.9 && latitude <= 18.5 && longitude >= -67.3 && longitude <= -65.2;
|
|
16
|
+
return inContinentalUS || inAlaska || inHawaii || inPuertoRico;
|
|
17
|
+
}
|
|
18
|
+
export async function handleGetForecast(args, noaaService, openMeteoService) {
|
|
19
|
+
// Validate input parameters with runtime checks
|
|
20
|
+
const { latitude, longitude } = validateCoordinates(args);
|
|
21
|
+
const days = validateForecastDays(args);
|
|
22
|
+
const granularity = validateGranularity(args?.granularity);
|
|
23
|
+
const include_precipitation_probability = validateOptionalBoolean(args?.include_precipitation_probability, 'include_precipitation_probability', true);
|
|
24
|
+
// Get source preference or auto-detect
|
|
25
|
+
const requestedSource = args?.source || 'auto';
|
|
26
|
+
let useNOAA;
|
|
27
|
+
if (requestedSource === 'auto') {
|
|
28
|
+
// Auto-detect based on location (US = NOAA, elsewhere = Open-Meteo)
|
|
29
|
+
useNOAA = isInUS(latitude, longitude);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
useNOAA = requestedSource === 'noaa';
|
|
33
|
+
}
|
|
34
|
+
// Use NOAA for US locations or if explicitly requested
|
|
35
|
+
if (useNOAA) {
|
|
36
|
+
return await formatNOAAForecast(noaaService, latitude, longitude, days, granularity, include_precipitation_probability);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Use Open-Meteo for international locations
|
|
40
|
+
return await formatOpenMeteoForecast(openMeteoService, latitude, longitude, days, granularity, include_precipitation_probability);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Format NOAA forecast data for display
|
|
45
|
+
*/
|
|
46
|
+
async function formatNOAAForecast(noaaService, latitude, longitude, days, granularity, include_precipitation_probability) {
|
|
47
|
+
// Get forecast data based on granularity
|
|
48
|
+
const forecast = granularity === 'hourly'
|
|
49
|
+
? await noaaService.getHourlyForecastByCoordinates(latitude, longitude)
|
|
50
|
+
: await noaaService.getForecastByCoordinates(latitude, longitude);
|
|
51
|
+
// Determine how many periods to show
|
|
52
|
+
let periods;
|
|
53
|
+
if (granularity === 'hourly') {
|
|
54
|
+
// For hourly, show up to days * 24 hours
|
|
55
|
+
periods = forecast.properties.periods.slice(0, days * 24);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// For daily, show up to days * 2 (day/night periods)
|
|
59
|
+
periods = forecast.properties.periods.slice(0, days * 2);
|
|
60
|
+
}
|
|
61
|
+
// Format the forecast for display
|
|
62
|
+
let output = `# Weather Forecast (${granularity === 'hourly' ? 'Hourly' : 'Daily'})\n\n`;
|
|
63
|
+
output += `**Location:** ${latitude.toFixed(4)}, ${longitude.toFixed(4)}\n`;
|
|
64
|
+
output += `**Elevation:** ${forecast.properties.elevation.value}m\n`;
|
|
65
|
+
if (forecast.properties.updated) {
|
|
66
|
+
output += `**Updated:** ${new Date(forecast.properties.updated).toLocaleString()}\n`;
|
|
67
|
+
}
|
|
68
|
+
output += `**Showing:** ${periods.length} ${granularity === 'hourly' ? 'hours' : 'periods'}\n\n`;
|
|
69
|
+
for (const period of periods) {
|
|
70
|
+
// For hourly forecasts, use the start time as the header since period names are empty
|
|
71
|
+
const periodHeader = granularity === 'hourly' && !period.name
|
|
72
|
+
? new Date(period.startTime).toLocaleString()
|
|
73
|
+
: period.name;
|
|
74
|
+
output += `## ${periodHeader}\n`;
|
|
75
|
+
output += `**Temperature:** ${period.temperature}°${period.temperatureUnit}`;
|
|
76
|
+
// Add temperature trend if available
|
|
77
|
+
if (period.temperatureTrend && period.temperatureTrend.trim()) {
|
|
78
|
+
output += ` (${period.temperatureTrend})`;
|
|
79
|
+
}
|
|
80
|
+
output += `\n`;
|
|
81
|
+
// Add precipitation probability if requested and available
|
|
82
|
+
if (include_precipitation_probability && period.probabilityOfPrecipitation?.value !== null && period.probabilityOfPrecipitation?.value !== undefined) {
|
|
83
|
+
output += `**Precipitation Chance:** ${period.probabilityOfPrecipitation.value}%\n`;
|
|
84
|
+
}
|
|
85
|
+
output += `**Wind:** ${period.windSpeed} ${period.windDirection}\n`;
|
|
86
|
+
// Add humidity if available (more common in hourly forecasts)
|
|
87
|
+
if (period.relativeHumidity?.value !== null && period.relativeHumidity?.value !== undefined) {
|
|
88
|
+
output += `**Humidity:** ${period.relativeHumidity.value}%\n`;
|
|
89
|
+
}
|
|
90
|
+
output += `**Forecast:** ${period.shortForecast}\n\n`;
|
|
91
|
+
// For daily forecasts, include detailed forecast
|
|
92
|
+
if (granularity === 'daily' && period.detailedForecast) {
|
|
93
|
+
output += `${period.detailedForecast}\n\n`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
output += `---\n`;
|
|
97
|
+
output += `*Data source: NOAA National Weather Service (US)*\n`;
|
|
98
|
+
return {
|
|
99
|
+
content: [
|
|
100
|
+
{
|
|
101
|
+
type: 'text',
|
|
102
|
+
text: output
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Format Open-Meteo forecast data for display
|
|
109
|
+
*/
|
|
110
|
+
async function formatOpenMeteoForecast(openMeteoService, latitude, longitude, days, granularity, include_precipitation_probability) {
|
|
111
|
+
// Get forecast data from Open-Meteo
|
|
112
|
+
const forecast = await openMeteoService.getForecast(latitude, longitude, days, granularity === 'hourly');
|
|
113
|
+
let output = `# Weather Forecast (${granularity === 'hourly' ? 'Hourly' : 'Daily'})\n\n`;
|
|
114
|
+
output += `**Location:** ${latitude.toFixed(4)}, ${longitude.toFixed(4)}\n`;
|
|
115
|
+
output += `**Elevation:** ${forecast.elevation}m\n`;
|
|
116
|
+
output += `**Timezone:** ${forecast.timezone}\n`;
|
|
117
|
+
output += `**Forecast Days:** ${days}\n\n`;
|
|
118
|
+
if (granularity === 'hourly' && forecast.hourly) {
|
|
119
|
+
// Format hourly data
|
|
120
|
+
const hourly = forecast.hourly;
|
|
121
|
+
const numHours = Math.min(hourly.time.length, days * 24);
|
|
122
|
+
for (let i = 0; i < numHours; i++) {
|
|
123
|
+
const time = new Date(hourly.time[i]);
|
|
124
|
+
output += `## ${time.toLocaleString()}\n`;
|
|
125
|
+
if (hourly.temperature_2m?.[i] !== undefined) {
|
|
126
|
+
output += `**Temperature:** ${Math.round(hourly.temperature_2m[i])}°F`;
|
|
127
|
+
if (hourly.apparent_temperature?.[i] !== undefined) {
|
|
128
|
+
output += ` (feels like ${Math.round(hourly.apparent_temperature[i])}°F)`;
|
|
129
|
+
}
|
|
130
|
+
output += `\n`;
|
|
131
|
+
}
|
|
132
|
+
if (include_precipitation_probability && hourly.precipitation_probability?.[i] !== undefined) {
|
|
133
|
+
output += `**Precipitation Chance:** ${hourly.precipitation_probability[i]}%\n`;
|
|
134
|
+
}
|
|
135
|
+
if (hourly.precipitation?.[i] !== undefined && hourly.precipitation[i] > 0) {
|
|
136
|
+
output += `**Precipitation:** ${hourly.precipitation[i].toFixed(2)} in\n`;
|
|
137
|
+
}
|
|
138
|
+
if (hourly.wind_speed_10m?.[i] !== undefined) {
|
|
139
|
+
const windDir = hourly.wind_direction_10m?.[i] !== undefined
|
|
140
|
+
? ` ${getWindDirection(hourly.wind_direction_10m[i])}`
|
|
141
|
+
: '';
|
|
142
|
+
output += `**Wind:** ${Math.round(hourly.wind_speed_10m[i])} mph${windDir}\n`;
|
|
143
|
+
if (hourly.wind_gusts_10m?.[i] !== undefined && hourly.wind_gusts_10m[i] > hourly.wind_speed_10m[i] * 1.2) {
|
|
144
|
+
output += `**Wind Gusts:** ${Math.round(hourly.wind_gusts_10m[i])} mph\n`;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (hourly.relative_humidity_2m?.[i] !== undefined) {
|
|
148
|
+
output += `**Humidity:** ${hourly.relative_humidity_2m[i]}%\n`;
|
|
149
|
+
}
|
|
150
|
+
if (hourly.weather_code?.[i] !== undefined) {
|
|
151
|
+
output += `**Conditions:** ${openMeteoService.getWeatherDescription(hourly.weather_code[i])}\n`;
|
|
152
|
+
}
|
|
153
|
+
output += `\n`;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else if (forecast.daily) {
|
|
157
|
+
// Format daily data with sunrise/sunset
|
|
158
|
+
const daily = forecast.daily;
|
|
159
|
+
const numDays = Math.min(daily.time.length, days);
|
|
160
|
+
for (let i = 0; i < numDays; i++) {
|
|
161
|
+
const date = new Date(daily.time[i]);
|
|
162
|
+
output += `## ${date.toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric' })}\n`;
|
|
163
|
+
if (daily.temperature_2m_max?.[i] !== undefined && daily.temperature_2m_min?.[i] !== undefined) {
|
|
164
|
+
output += `**Temperature:** High ${Math.round(daily.temperature_2m_max[i])}°F / Low ${Math.round(daily.temperature_2m_min[i])}°F\n`;
|
|
165
|
+
}
|
|
166
|
+
if (daily.apparent_temperature_max?.[i] !== undefined && daily.apparent_temperature_min?.[i] !== undefined) {
|
|
167
|
+
output += `**Feels Like:** High ${Math.round(daily.apparent_temperature_max[i])}°F / Low ${Math.round(daily.apparent_temperature_min[i])}°F\n`;
|
|
168
|
+
}
|
|
169
|
+
// Include sunrise/sunset data
|
|
170
|
+
if (daily.sunrise?.[i]) {
|
|
171
|
+
const sunrise = new Date(daily.sunrise[i]);
|
|
172
|
+
output += `**Sunrise:** ${sunrise.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })}\n`;
|
|
173
|
+
}
|
|
174
|
+
if (daily.sunset?.[i]) {
|
|
175
|
+
const sunset = new Date(daily.sunset[i]);
|
|
176
|
+
output += `**Sunset:** ${sunset.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })}\n`;
|
|
177
|
+
}
|
|
178
|
+
if (daily.daylight_duration?.[i] !== undefined) {
|
|
179
|
+
const hours = Math.floor(daily.daylight_duration[i] / 3600);
|
|
180
|
+
const minutes = Math.floor((daily.daylight_duration[i] % 3600) / 60);
|
|
181
|
+
output += `**Daylight Duration:** ${hours}h ${minutes}m\n`;
|
|
182
|
+
}
|
|
183
|
+
if (include_precipitation_probability && daily.precipitation_probability_max?.[i] !== undefined) {
|
|
184
|
+
output += `**Precipitation Chance:** ${daily.precipitation_probability_max[i]}%\n`;
|
|
185
|
+
}
|
|
186
|
+
if (daily.precipitation_sum?.[i] !== undefined && daily.precipitation_sum[i] > 0) {
|
|
187
|
+
output += `**Precipitation:** ${daily.precipitation_sum[i].toFixed(2)} in\n`;
|
|
188
|
+
}
|
|
189
|
+
if (daily.wind_speed_10m_max?.[i] !== undefined) {
|
|
190
|
+
const windDir = daily.wind_direction_10m_dominant?.[i] !== undefined
|
|
191
|
+
? ` ${getWindDirection(daily.wind_direction_10m_dominant[i])}`
|
|
192
|
+
: '';
|
|
193
|
+
output += `**Wind:** ${Math.round(daily.wind_speed_10m_max[i])} mph${windDir}\n`;
|
|
194
|
+
if (daily.wind_gusts_10m_max?.[i] !== undefined && daily.wind_gusts_10m_max[i] > daily.wind_speed_10m_max[i] * 1.2) {
|
|
195
|
+
output += `**Wind Gusts:** ${Math.round(daily.wind_gusts_10m_max[i])} mph\n`;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (daily.weather_code?.[i] !== undefined) {
|
|
199
|
+
output += `**Conditions:** ${openMeteoService.getWeatherDescription(daily.weather_code[i])}\n`;
|
|
200
|
+
}
|
|
201
|
+
if (daily.uv_index_max?.[i] !== undefined) {
|
|
202
|
+
output += `**UV Index:** ${daily.uv_index_max[i].toFixed(1)}\n`;
|
|
203
|
+
}
|
|
204
|
+
output += `\n`;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
output += `---\n`;
|
|
208
|
+
output += `*Data source: Open-Meteo (Global)*\n`;
|
|
209
|
+
return {
|
|
210
|
+
content: [
|
|
211
|
+
{
|
|
212
|
+
type: 'text',
|
|
213
|
+
text: output
|
|
214
|
+
}
|
|
215
|
+
]
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Convert wind direction degrees to cardinal direction
|
|
220
|
+
*/
|
|
221
|
+
function getWindDirection(degrees) {
|
|
222
|
+
const directions = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'];
|
|
223
|
+
const index = Math.round(degrees / 22.5) % 16;
|
|
224
|
+
return directions[index];
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=forecastHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forecastHandler.js","sourceRoot":"","sources":["../../src/handlers/forecastHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for get_historical_weather tool
|
|
3
|
+
*/
|
|
4
|
+
import { NOAAService } from '../services/noaa.js';
|
|
5
|
+
import { OpenMeteoService } from '../services/openmeteo.js';
|
|
6
|
+
export declare function handleGetHistoricalWeather(args: unknown, noaaService: NOAAService, openMeteoService: OpenMeteoService): Promise<{
|
|
7
|
+
content: Array<{
|
|
8
|
+
type: string;
|
|
9
|
+
text: string;
|
|
10
|
+
}>;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=historicalWeatherHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historicalWeatherHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/historicalWeatherHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAK5D,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,WAAW,EACxB,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,CA+N7D"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for get_historical_weather tool
|
|
3
|
+
*/
|
|
4
|
+
import { validateHistoricalWeatherParams } from '../utils/validation.js';
|
|
5
|
+
import { convertToFahrenheit } from '../utils/temperatureConversion.js';
|
|
6
|
+
import { ApiConstants, FormatConstants } from '../config/displayThresholds.js';
|
|
7
|
+
export async function handleGetHistoricalWeather(args, noaaService, openMeteoService) {
|
|
8
|
+
// Validate input parameters with runtime checks
|
|
9
|
+
const { latitude, longitude, start_date, end_date, limit = FormatConstants.defaultHistoricalLimit } = validateHistoricalWeatherParams(args);
|
|
10
|
+
// Parse dates
|
|
11
|
+
const startTime = new Date(start_date);
|
|
12
|
+
const endTime = new Date(end_date);
|
|
13
|
+
// Validate dates are not in the future
|
|
14
|
+
const now = new Date();
|
|
15
|
+
if (startTime > now) {
|
|
16
|
+
throw new Error(`Start date (${start_date}) cannot be in the future. Current date is ${now.toISOString().split('T')[0]}.`);
|
|
17
|
+
}
|
|
18
|
+
if (endTime > now) {
|
|
19
|
+
throw new Error(`End date (${end_date}) cannot be in the future. Current date is ${now.toISOString().split('T')[0]}.`);
|
|
20
|
+
}
|
|
21
|
+
// Determine which API to use based on date range
|
|
22
|
+
// If start date is older than threshold, use archival API
|
|
23
|
+
const thresholdDate = new Date(now.getTime() - ApiConstants.historicalDataThresholdDays * 24 * 60 * 60 * 1000);
|
|
24
|
+
const useArchivalData = startTime < thresholdDate;
|
|
25
|
+
if (useArchivalData) {
|
|
26
|
+
// Use Open-Meteo API for historical/archival data
|
|
27
|
+
try {
|
|
28
|
+
// Determine whether to use hourly or daily data based on date range
|
|
29
|
+
const daysDiff = Math.ceil((endTime.getTime() - startTime.getTime()) / (1000 * 60 * 60 * 24));
|
|
30
|
+
const useHourly = daysDiff <= ApiConstants.maxHourlyHistoricalDays;
|
|
31
|
+
const weatherData = await openMeteoService.getHistoricalWeather(latitude, longitude, start_date.split('T')[0], // Ensure YYYY-MM-DD format
|
|
32
|
+
end_date.split('T')[0], useHourly);
|
|
33
|
+
// Format the response based on data granularity
|
|
34
|
+
if (useHourly && weatherData.hourly) {
|
|
35
|
+
// Format hourly observations
|
|
36
|
+
let output = `# Historical Weather Observations (Hourly)\n\n`;
|
|
37
|
+
output += `**Period:** ${startTime.toLocaleDateString()} to ${endTime.toLocaleDateString()}\n`;
|
|
38
|
+
output += `**Location:** ${weatherData.latitude.toFixed(4)}°N, ${Math.abs(weatherData.longitude).toFixed(4)}°${weatherData.longitude >= 0 ? 'E' : 'W'} (${weatherData.elevation}m elevation)\n`;
|
|
39
|
+
output += `**Number of observations:** ${weatherData.hourly.time.length}\n`;
|
|
40
|
+
output += `**Data source:** Open-Meteo Historical Weather API (Reanalysis)\n\n`;
|
|
41
|
+
const maxObservations = Math.min(limit, weatherData.hourly.time.length);
|
|
42
|
+
for (let i = 0; i < maxObservations; i++) {
|
|
43
|
+
const time = new Date(weatherData.hourly.time[i]);
|
|
44
|
+
output += `## ${time.toLocaleString()}\n`;
|
|
45
|
+
if (weatherData.hourly.temperature_2m?.[i] !== null && weatherData.hourly.temperature_2m?.[i] !== undefined) {
|
|
46
|
+
output += `- **Temperature:** ${Math.round(weatherData.hourly.temperature_2m[i])}°F\n`;
|
|
47
|
+
}
|
|
48
|
+
if (weatherData.hourly.apparent_temperature?.[i] !== null && weatherData.hourly.apparent_temperature?.[i] !== undefined) {
|
|
49
|
+
output += `- **Feels Like:** ${Math.round(weatherData.hourly.apparent_temperature[i])}°F\n`;
|
|
50
|
+
}
|
|
51
|
+
if (weatherData.hourly.weather_code?.[i] !== null && weatherData.hourly.weather_code?.[i] !== undefined) {
|
|
52
|
+
output += `- **Conditions:** ${openMeteoService.getWeatherDescription(weatherData.hourly.weather_code[i])}\n`;
|
|
53
|
+
}
|
|
54
|
+
if (weatherData.hourly.precipitation?.[i] !== null && weatherData.hourly.precipitation?.[i] !== undefined && weatherData.hourly.precipitation[i] > 0) {
|
|
55
|
+
output += `- **Precipitation:** ${weatherData.hourly.precipitation[i].toFixed(2)} in\n`;
|
|
56
|
+
}
|
|
57
|
+
if (weatherData.hourly.snowfall?.[i] !== null && weatherData.hourly.snowfall?.[i] !== undefined && weatherData.hourly.snowfall[i] > 0) {
|
|
58
|
+
output += `- **Snowfall:** ${weatherData.hourly.snowfall[i].toFixed(1)} in\n`;
|
|
59
|
+
}
|
|
60
|
+
if (weatherData.hourly.wind_speed_10m?.[i] !== null && weatherData.hourly.wind_speed_10m?.[i] !== undefined) {
|
|
61
|
+
output += `- **Wind:** ${Math.round(weatherData.hourly.wind_speed_10m[i])} mph`;
|
|
62
|
+
if (weatherData.hourly.wind_direction_10m?.[i] !== null && weatherData.hourly.wind_direction_10m?.[i] !== undefined) {
|
|
63
|
+
output += ` from ${Math.round(weatherData.hourly.wind_direction_10m[i])}°`;
|
|
64
|
+
}
|
|
65
|
+
output += `\n`;
|
|
66
|
+
}
|
|
67
|
+
if (weatherData.hourly.relative_humidity_2m?.[i] !== null && weatherData.hourly.relative_humidity_2m?.[i] !== undefined) {
|
|
68
|
+
output += `- **Humidity:** ${Math.round(weatherData.hourly.relative_humidity_2m[i])}%\n`;
|
|
69
|
+
}
|
|
70
|
+
if (weatherData.hourly.pressure_msl?.[i] !== null && weatherData.hourly.pressure_msl?.[i] !== undefined) {
|
|
71
|
+
const pressureInHg = weatherData.hourly.pressure_msl[i] * 0.02953;
|
|
72
|
+
output += `- **Pressure:** ${pressureInHg.toFixed(2)} inHg\n`;
|
|
73
|
+
}
|
|
74
|
+
if (weatherData.hourly.cloud_cover?.[i] !== null && weatherData.hourly.cloud_cover?.[i] !== undefined) {
|
|
75
|
+
output += `- **Cloud Cover:** ${weatherData.hourly.cloud_cover[i]}%\n`;
|
|
76
|
+
}
|
|
77
|
+
output += `\n`;
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
content: [
|
|
81
|
+
{
|
|
82
|
+
type: 'text',
|
|
83
|
+
text: output
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
else if (weatherData.daily) {
|
|
89
|
+
// Format daily summaries
|
|
90
|
+
let output = `# Historical Weather Data (Daily Summaries)\n\n`;
|
|
91
|
+
output += `**Period:** ${startTime.toLocaleDateString()} to ${endTime.toLocaleDateString()}\n`;
|
|
92
|
+
output += `**Location:** ${weatherData.latitude.toFixed(4)}°N, ${Math.abs(weatherData.longitude).toFixed(4)}°${weatherData.longitude >= 0 ? 'E' : 'W'} (${weatherData.elevation}m elevation)\n`;
|
|
93
|
+
output += `**Number of days:** ${weatherData.daily.time.length}\n`;
|
|
94
|
+
output += `**Data source:** Open-Meteo Historical Weather API (Reanalysis)\n\n`;
|
|
95
|
+
for (let i = 0; i < weatherData.daily.time.length; i++) {
|
|
96
|
+
const date = new Date(weatherData.daily.time[i]);
|
|
97
|
+
output += `## ${date.toLocaleDateString()}\n`;
|
|
98
|
+
if (weatherData.daily.temperature_2m_max?.[i] !== null && weatherData.daily.temperature_2m_max?.[i] !== undefined) {
|
|
99
|
+
output += `- **High Temperature:** ${Math.round(weatherData.daily.temperature_2m_max[i])}°F\n`;
|
|
100
|
+
}
|
|
101
|
+
if (weatherData.daily.temperature_2m_min?.[i] !== null && weatherData.daily.temperature_2m_min?.[i] !== undefined) {
|
|
102
|
+
output += `- **Low Temperature:** ${Math.round(weatherData.daily.temperature_2m_min[i])}°F\n`;
|
|
103
|
+
}
|
|
104
|
+
if (weatherData.daily.temperature_2m_mean?.[i] !== null && weatherData.daily.temperature_2m_mean?.[i] !== undefined) {
|
|
105
|
+
output += `- **Average Temperature:** ${Math.round(weatherData.daily.temperature_2m_mean[i])}°F\n`;
|
|
106
|
+
}
|
|
107
|
+
if (weatherData.daily.weather_code?.[i] !== null && weatherData.daily.weather_code?.[i] !== undefined) {
|
|
108
|
+
output += `- **Conditions:** ${openMeteoService.getWeatherDescription(weatherData.daily.weather_code[i])}\n`;
|
|
109
|
+
}
|
|
110
|
+
if (weatherData.daily.precipitation_sum?.[i] !== null && weatherData.daily.precipitation_sum?.[i] !== undefined) {
|
|
111
|
+
output += `- **Precipitation:** ${weatherData.daily.precipitation_sum[i].toFixed(2)} in\n`;
|
|
112
|
+
}
|
|
113
|
+
if (weatherData.daily.snowfall_sum?.[i] !== null && weatherData.daily.snowfall_sum?.[i] !== undefined && weatherData.daily.snowfall_sum[i] > 0) {
|
|
114
|
+
output += `- **Snowfall:** ${weatherData.daily.snowfall_sum[i].toFixed(1)} in\n`;
|
|
115
|
+
}
|
|
116
|
+
if (weatherData.daily.wind_speed_10m_max?.[i] !== null && weatherData.daily.wind_speed_10m_max?.[i] !== undefined) {
|
|
117
|
+
output += `- **Max Wind Speed:** ${Math.round(weatherData.daily.wind_speed_10m_max[i])} mph\n`;
|
|
118
|
+
}
|
|
119
|
+
output += `\n`;
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
content: [
|
|
123
|
+
{
|
|
124
|
+
type: 'text',
|
|
125
|
+
text: output
|
|
126
|
+
}
|
|
127
|
+
]
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
throw new Error('No weather data available in response');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
// If Open-Meteo API fails, provide helpful error message
|
|
136
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
137
|
+
throw new Error(`Unable to retrieve historical data: ${errorMessage}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
// Use real-time NOAA API for recent data (last 7 days)
|
|
142
|
+
const observations = await noaaService.getHistoricalObservations(latitude, longitude, startTime, endTime, limit);
|
|
143
|
+
if (!observations.features || observations.features.length === 0) {
|
|
144
|
+
return {
|
|
145
|
+
content: [
|
|
146
|
+
{
|
|
147
|
+
type: 'text',
|
|
148
|
+
text: `No historical observations found for the specified date range (${start_date} to ${end_date}).\n\nThis may occur because:\n- The dates are outside the station's available data range\n- There are gaps in the observation records for this location\n- The weather station near this location may not have archived data for these dates\n\nNote: Historical weather data availability varies by location and weather station. Some stations have limited historical records.`
|
|
149
|
+
}
|
|
150
|
+
]
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// Format the observations
|
|
154
|
+
let output = `# Historical Weather Observations\n\n`;
|
|
155
|
+
output += `**Period:** ${startTime.toLocaleDateString()} to ${endTime.toLocaleDateString()}\n`;
|
|
156
|
+
output += `**Number of observations:** ${observations.features.length}\n`;
|
|
157
|
+
output += `**Data source:** NOAA Real-time API\n\n`;
|
|
158
|
+
for (const obs of observations.features) {
|
|
159
|
+
const props = obs.properties;
|
|
160
|
+
output += `## ${new Date(props.timestamp).toLocaleString()}\n`;
|
|
161
|
+
if (props.temperature.value !== null) {
|
|
162
|
+
const tempF = convertToFahrenheit(props.temperature.value, props.temperature.unitCode);
|
|
163
|
+
if (tempF !== null) {
|
|
164
|
+
output += `- **Temperature:** ${Math.round(tempF)}°F\n`;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (props.textDescription) {
|
|
168
|
+
output += `- **Conditions:** ${props.textDescription}\n`;
|
|
169
|
+
}
|
|
170
|
+
if (props.windSpeed.value !== null) {
|
|
171
|
+
const windMph = props.windSpeed.unitCode.includes('km_h')
|
|
172
|
+
? props.windSpeed.value * 0.621371
|
|
173
|
+
: props.windSpeed.value * 2.23694;
|
|
174
|
+
output += `- **Wind:** ${Math.round(windMph)} mph\n`;
|
|
175
|
+
}
|
|
176
|
+
output += `\n`;
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
content: [
|
|
180
|
+
{
|
|
181
|
+
type: 'text',
|
|
182
|
+
text: output
|
|
183
|
+
}
|
|
184
|
+
]
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=historicalWeatherHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historicalWeatherHandler.js","sourceRoot":"","sources":["../../src/handlers/historicalWeatherHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for search_location tool
|
|
3
|
+
*/
|
|
4
|
+
import { OpenMeteoService } from '../services/openmeteo.js';
|
|
5
|
+
export declare function handleSearchLocation(args: unknown, openMeteoService: OpenMeteoService): Promise<{
|
|
6
|
+
content: Array<{
|
|
7
|
+
type: string;
|
|
8
|
+
text: string;
|
|
9
|
+
}>;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=locationHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locationHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/locationHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAQ5D,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,OAAO,EACb,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA0F7D"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for search_location tool
|
|
3
|
+
*/
|
|
4
|
+
import { DataNotFoundError } from '../errors/ApiError.js';
|
|
5
|
+
export async function handleSearchLocation(args, openMeteoService) {
|
|
6
|
+
// Validate input parameters
|
|
7
|
+
const locationArgs = args;
|
|
8
|
+
if (!locationArgs.query || typeof locationArgs.query !== 'string') {
|
|
9
|
+
throw new Error('query parameter is required and must be a string');
|
|
10
|
+
}
|
|
11
|
+
const query = locationArgs.query.trim();
|
|
12
|
+
const limit = typeof locationArgs.limit === 'number' ?
|
|
13
|
+
Math.min(Math.max(1, locationArgs.limit), 100) : 5;
|
|
14
|
+
// Search for locations
|
|
15
|
+
const response = await openMeteoService.searchLocation(query, limit);
|
|
16
|
+
if (!response.results || response.results.length === 0) {
|
|
17
|
+
throw new DataNotFoundError('OpenMeteo', `No locations found matching "${query}". Try:\n` +
|
|
18
|
+
`- Using a different spelling\n` +
|
|
19
|
+
`- Being more specific (e.g., "Paris, France" instead of "Paris")\n` +
|
|
20
|
+
`- Using a nearby city or landmark`);
|
|
21
|
+
}
|
|
22
|
+
// Format the results for display
|
|
23
|
+
let output = `# Location Search Results\n\n`;
|
|
24
|
+
output += `**Query:** "${query}"\n`;
|
|
25
|
+
output += `**Found:** ${response.results.length} location${response.results.length > 1 ? 's' : ''}\n\n`;
|
|
26
|
+
output += `---\n\n`;
|
|
27
|
+
for (let i = 0; i < response.results.length; i++) {
|
|
28
|
+
const location = response.results[i];
|
|
29
|
+
output += `## ${i + 1}. ${location.name}\n\n`;
|
|
30
|
+
// Build location description
|
|
31
|
+
const parts = [location.name];
|
|
32
|
+
if (location.admin1)
|
|
33
|
+
parts.push(location.admin1);
|
|
34
|
+
if (location.admin2 && location.admin2 !== location.admin1)
|
|
35
|
+
parts.push(location.admin2);
|
|
36
|
+
if (location.country)
|
|
37
|
+
parts.push(location.country);
|
|
38
|
+
output += `**Full Name:** ${parts.join(', ')}\n`;
|
|
39
|
+
output += `**Coordinates:** ${location.latitude.toFixed(4)}°, ${location.longitude.toFixed(4)}°\n`;
|
|
40
|
+
if (location.country_code) {
|
|
41
|
+
output += `**Country Code:** ${location.country_code.toUpperCase()}\n`;
|
|
42
|
+
}
|
|
43
|
+
if (location.timezone) {
|
|
44
|
+
output += `**Timezone:** ${location.timezone}\n`;
|
|
45
|
+
}
|
|
46
|
+
if (location.elevation !== undefined) {
|
|
47
|
+
const elevationFt = Math.round(location.elevation * 3.28084);
|
|
48
|
+
output += `**Elevation:** ${location.elevation}m (${elevationFt}ft)\n`;
|
|
49
|
+
}
|
|
50
|
+
if (location.population !== undefined && location.population > 0) {
|
|
51
|
+
output += `**Population:** ${location.population.toLocaleString()}\n`;
|
|
52
|
+
}
|
|
53
|
+
if (location.feature_code) {
|
|
54
|
+
const featureDescription = getFeatureDescription(location.feature_code);
|
|
55
|
+
if (featureDescription) {
|
|
56
|
+
output += `**Type:** ${featureDescription}\n`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
output += `\n`;
|
|
60
|
+
// Add usage example
|
|
61
|
+
output += `*To get weather for this location, use these coordinates:*\n`;
|
|
62
|
+
output += `*Latitude: ${location.latitude}, Longitude: ${location.longitude}*\n\n`;
|
|
63
|
+
if (i < response.results.length - 1) {
|
|
64
|
+
output += `---\n\n`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
output += `---\n`;
|
|
68
|
+
output += `*Data source: Open-Meteo Geocoding API*\n`;
|
|
69
|
+
return {
|
|
70
|
+
content: [
|
|
71
|
+
{
|
|
72
|
+
type: 'text',
|
|
73
|
+
text: output
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get human-readable description for feature code
|
|
80
|
+
* Based on GeoNames feature codes: https://www.geonames.org/export/codes.html
|
|
81
|
+
*/
|
|
82
|
+
function getFeatureDescription(code) {
|
|
83
|
+
const featureCodes = {
|
|
84
|
+
'PPL': 'Populated place',
|
|
85
|
+
'PPLA': 'Administrative capital',
|
|
86
|
+
'PPLA2': 'Second-order administrative capital',
|
|
87
|
+
'PPLA3': 'Third-order administrative capital',
|
|
88
|
+
'PPLA4': 'Fourth-order administrative capital',
|
|
89
|
+
'PPLC': 'National capital',
|
|
90
|
+
'PPLG': 'Seat of government',
|
|
91
|
+
'PPLS': 'Populated places',
|
|
92
|
+
'PPLX': 'Section of populated place',
|
|
93
|
+
'ADM1': 'First-order administrative division',
|
|
94
|
+
'ADM2': 'Second-order administrative division',
|
|
95
|
+
'ADM3': 'Third-order administrative division',
|
|
96
|
+
'ADM4': 'Fourth-order administrative division',
|
|
97
|
+
'PCLI': 'Independent political entity',
|
|
98
|
+
'PCLD': 'Dependent political entity',
|
|
99
|
+
'ISL': 'Island',
|
|
100
|
+
'MT': 'Mountain',
|
|
101
|
+
'MTS': 'Mountains',
|
|
102
|
+
'LAKE': 'Lake',
|
|
103
|
+
'RSTN': 'Railroad station',
|
|
104
|
+
'AIRP': 'Airport',
|
|
105
|
+
'AIRF': 'Airfield',
|
|
106
|
+
'PRK': 'Park',
|
|
107
|
+
'RES': 'Reserve',
|
|
108
|
+
'RESN': 'Nature reserve',
|
|
109
|
+
'RESW': 'Wildlife reserve'
|
|
110
|
+
};
|
|
111
|
+
return featureCodes[code] || null;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=locationHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locationHandler.js","sourceRoot":"","sources":["../../src/handlers/locationHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for check_service_status tool
|
|
3
|
+
*/
|
|
4
|
+
import { NOAAService } from '../services/noaa.js';
|
|
5
|
+
import { OpenMeteoService } from '../services/openmeteo.js';
|
|
6
|
+
export declare function handleCheckServiceStatus(noaaService: NOAAService, openMeteoService: OpenMeteoService): Promise<{
|
|
7
|
+
content: Array<{
|
|
8
|
+
type: string;
|
|
9
|
+
text: string;
|
|
10
|
+
}>;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=statusHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/statusHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,WAAW,EACxB,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,CA+G7D"}
|