@jablum/weather-mcp 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1319 -0
- package/dist/analytics/anonymizer.d.ts +37 -0
- package/dist/analytics/anonymizer.d.ts.map +1 -0
- package/dist/analytics/anonymizer.js +112 -0
- package/dist/analytics/anonymizer.js.map +1 -0
- package/dist/analytics/collector.d.ts +72 -0
- package/dist/analytics/collector.d.ts.map +1 -0
- package/dist/analytics/collector.js +282 -0
- package/dist/analytics/collector.js.map +1 -0
- package/dist/analytics/config.d.ts +15 -0
- package/dist/analytics/config.d.ts.map +1 -0
- package/dist/analytics/config.js +172 -0
- package/dist/analytics/config.js.map +1 -0
- package/dist/analytics/index.d.ts +8 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +7 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/middleware.d.ts +33 -0
- package/dist/analytics/middleware.d.ts.map +1 -0
- package/dist/analytics/middleware.js +99 -0
- package/dist/analytics/middleware.js.map +1 -0
- package/dist/analytics/transport.d.ts +11 -0
- package/dist/analytics/transport.d.ts.map +1 -0
- package/dist/analytics/transport.js +92 -0
- package/dist/analytics/transport.js.map +1 -0
- package/dist/analytics/types.d.ts +74 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +6 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/config/api.d.ts +30 -0
- package/dist/config/api.d.ts.map +1 -0
- package/dist/config/api.js +32 -0
- package/dist/config/api.js.map +1 -0
- package/dist/config/cache.d.ts +31 -0
- package/dist/config/cache.d.ts.map +1 -0
- package/dist/config/cache.js +108 -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/config/tools.d.ts +44 -0
- package/dist/config/tools.d.ts.map +1 -0
- package/dist/config/tools.js +269 -0
- package/dist/config/tools.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 +171 -0
- package/dist/errors/ApiError.js.map +1 -0
- package/dist/handlers/airQualityHandler.d.ts +11 -0
- package/dist/handlers/airQualityHandler.d.ts.map +1 -0
- package/dist/handlers/airQualityHandler.js +154 -0
- package/dist/handlers/airQualityHandler.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 +98 -0
- package/dist/handlers/alertsHandler.js.map +1 -0
- package/dist/handlers/currentConditionsHandler.d.ts +13 -0
- package/dist/handlers/currentConditionsHandler.d.ts.map +1 -0
- package/dist/handlers/currentConditionsHandler.js +296 -0
- package/dist/handlers/currentConditionsHandler.js.map +1 -0
- package/dist/handlers/forecastHandler.d.ts +16 -0
- package/dist/handlers/forecastHandler.d.ts.map +1 -0
- package/dist/handlers/forecastHandler.js +454 -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/lightningHandler.d.ts +14 -0
- package/dist/handlers/lightningHandler.d.ts.map +1 -0
- package/dist/handlers/lightningHandler.js +258 -0
- package/dist/handlers/lightningHandler.js.map +1 -0
- package/dist/handlers/locationHandler.d.ts +12 -0
- package/dist/handlers/locationHandler.d.ts.map +1 -0
- package/dist/handlers/locationHandler.js +149 -0
- package/dist/handlers/locationHandler.js.map +1 -0
- package/dist/handlers/marineConditionsHandler.d.ts +13 -0
- package/dist/handlers/marineConditionsHandler.d.ts.map +1 -0
- package/dist/handlers/marineConditionsHandler.js +270 -0
- package/dist/handlers/marineConditionsHandler.js.map +1 -0
- package/dist/handlers/riverConditionsHandler.d.ts +11 -0
- package/dist/handlers/riverConditionsHandler.d.ts.map +1 -0
- package/dist/handlers/riverConditionsHandler.js +176 -0
- package/dist/handlers/riverConditionsHandler.js.map +1 -0
- package/dist/handlers/savedLocationsHandler.d.ts +50 -0
- package/dist/handlers/savedLocationsHandler.d.ts.map +1 -0
- package/dist/handlers/savedLocationsHandler.js +397 -0
- package/dist/handlers/savedLocationsHandler.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 +115 -0
- package/dist/handlers/statusHandler.js.map +1 -0
- package/dist/handlers/weatherImageryHandler.d.ts +14 -0
- package/dist/handlers/weatherImageryHandler.d.ts.map +1 -0
- package/dist/handlers/weatherImageryHandler.js +143 -0
- package/dist/handlers/weatherImageryHandler.js.map +1 -0
- package/dist/handlers/wildfireHandler.d.ts +11 -0
- package/dist/handlers/wildfireHandler.d.ts.map +1 -0
- package/dist/handlers/wildfireHandler.js +186 -0
- package/dist/handlers/wildfireHandler.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +735 -0
- package/dist/index.js.map +1 -0
- package/dist/services/blitzortung.d.ts +67 -0
- package/dist/services/blitzortung.d.ts.map +1 -0
- package/dist/services/blitzortung.js +475 -0
- package/dist/services/blitzortung.js.map +1 -0
- package/dist/services/geocoding.d.ts +57 -0
- package/dist/services/geocoding.d.ts.map +1 -0
- package/dist/services/geocoding.js +393 -0
- package/dist/services/geocoding.js.map +1 -0
- package/dist/services/locationStore.d.ts +62 -0
- package/dist/services/locationStore.d.ts.map +1 -0
- package/dist/services/locationStore.js +201 -0
- package/dist/services/locationStore.js.map +1 -0
- package/dist/services/ncei.d.ts +61 -0
- package/dist/services/ncei.d.ts.map +1 -0
- package/dist/services/ncei.js +126 -0
- package/dist/services/ncei.js.map +1 -0
- package/dist/services/nifc.d.ts +44 -0
- package/dist/services/nifc.d.ts.map +1 -0
- package/dist/services/nifc.js +159 -0
- package/dist/services/nifc.js.map +1 -0
- package/dist/services/noaa.d.ts +161 -0
- package/dist/services/noaa.d.ts.map +1 -0
- package/dist/services/noaa.js +681 -0
- package/dist/services/noaa.js.map +1 -0
- package/dist/services/nominatim.d.ts +62 -0
- package/dist/services/nominatim.d.ts.map +1 -0
- package/dist/services/nominatim.js +254 -0
- package/dist/services/nominatim.js.map +1 -0
- package/dist/services/openmeteo.d.ts +189 -0
- package/dist/services/openmeteo.d.ts.map +1 -0
- package/dist/services/openmeteo.js +936 -0
- package/dist/services/openmeteo.js.map +1 -0
- package/dist/services/rainviewer.d.ts +37 -0
- package/dist/services/rainviewer.d.ts.map +1 -0
- package/dist/services/rainviewer.js +115 -0
- package/dist/services/rainviewer.js.map +1 -0
- package/dist/types/imagery.d.ts +82 -0
- package/dist/types/imagery.d.ts.map +1 -0
- package/dist/types/imagery.js +6 -0
- package/dist/types/imagery.js.map +1 -0
- package/dist/types/lightning.d.ts +89 -0
- package/dist/types/lightning.d.ts.map +1 -0
- package/dist/types/lightning.js +6 -0
- package/dist/types/lightning.js.map +1 -0
- package/dist/types/noaa.d.ts +535 -0
- package/dist/types/noaa.d.ts.map +1 -0
- package/dist/types/noaa.js +5 -0
- package/dist/types/noaa.js.map +1 -0
- package/dist/types/nominatim.d.ts +72 -0
- package/dist/types/nominatim.d.ts.map +1 -0
- package/dist/types/nominatim.js +6 -0
- package/dist/types/nominatim.js.map +1 -0
- package/dist/types/openmeteo.d.ts +583 -0
- package/dist/types/openmeteo.d.ts.map +1 -0
- package/dist/types/openmeteo.js +6 -0
- package/dist/types/openmeteo.js.map +1 -0
- package/dist/types/savedLocations.d.ts +58 -0
- package/dist/types/savedLocations.d.ts.map +1 -0
- package/dist/types/savedLocations.js +5 -0
- package/dist/types/savedLocations.js.map +1 -0
- package/dist/types/wildfire.d.ts +83 -0
- package/dist/types/wildfire.d.ts.map +1 -0
- package/dist/types/wildfire.js +5 -0
- package/dist/types/wildfire.js.map +1 -0
- package/dist/utils/airQuality.d.ts +54 -0
- package/dist/utils/airQuality.d.ts.map +1 -0
- package/dist/utils/airQuality.js +251 -0
- package/dist/utils/airQuality.js.map +1 -0
- 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/distance.d.ts +25 -0
- package/dist/utils/distance.d.ts.map +1 -0
- package/dist/utils/distance.js +40 -0
- package/dist/utils/distance.js.map +1 -0
- package/dist/utils/fireWeather.d.ts +76 -0
- package/dist/utils/fireWeather.d.ts.map +1 -0
- package/dist/utils/fireWeather.js +243 -0
- package/dist/utils/fireWeather.js.map +1 -0
- package/dist/utils/geography.d.ts +79 -0
- package/dist/utils/geography.d.ts.map +1 -0
- package/dist/utils/geography.js +266 -0
- package/dist/utils/geography.js.map +1 -0
- package/dist/utils/geohash.d.ts +62 -0
- package/dist/utils/geohash.d.ts.map +1 -0
- package/dist/utils/geohash.js +146 -0
- package/dist/utils/geohash.js.map +1 -0
- package/dist/utils/locationResolver.d.ts +34 -0
- package/dist/utils/locationResolver.d.ts.map +1 -0
- package/dist/utils/locationResolver.js +120 -0
- package/dist/utils/locationResolver.js.map +1 -0
- package/dist/utils/logger.d.ts +75 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +153 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/marine.d.ts +59 -0
- package/dist/utils/marine.d.ts.map +1 -0
- package/dist/utils/marine.js +215 -0
- package/dist/utils/marine.js.map +1 -0
- package/dist/utils/normals.d.ts +86 -0
- package/dist/utils/normals.d.ts.map +1 -0
- package/dist/utils/normals.js +223 -0
- package/dist/utils/normals.js.map +1 -0
- package/dist/utils/snow.d.ts +45 -0
- package/dist/utils/snow.d.ts.map +1 -0
- package/dist/utils/snow.js +144 -0
- package/dist/utils/snow.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/timezone.d.ts +56 -0
- package/dist/utils/timezone.d.ts.map +1 -0
- package/dist/utils/timezone.js +167 -0
- package/dist/utils/timezone.js.map +1 -0
- package/dist/utils/units.d.ts +69 -0
- package/dist/utils/units.d.ts.map +1 -0
- package/dist/utils/units.js +158 -0
- package/dist/utils/units.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/dist/utils/version.d.ts +15 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +24 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for search_location tool
|
|
3
|
+
* Now uses multi-service geocoding with automatic fallback
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Escape user input for safe embedding in Markdown
|
|
7
|
+
* Prevents Markdown injection attacks (e.g., embedded links, images, code blocks)
|
|
8
|
+
* @param text - User-provided text to escape
|
|
9
|
+
* @returns Escaped text safe for Markdown rendering
|
|
10
|
+
*/
|
|
11
|
+
function escapeMarkdown(text) {
|
|
12
|
+
// Escape Markdown special characters and normalize whitespace
|
|
13
|
+
return text
|
|
14
|
+
.replace(/\\/g, '\\\\') // Backslash (must be first)
|
|
15
|
+
.replace(/\*/g, '\\*') // Asterisk (bold/italic)
|
|
16
|
+
.replace(/_/g, '\\_') // Underscore (bold/italic)
|
|
17
|
+
.replace(/\[/g, '\\[') // Left bracket (links)
|
|
18
|
+
.replace(/\]/g, '\\]') // Right bracket (links)
|
|
19
|
+
.replace(/\(/g, '\\(') // Left paren (links)
|
|
20
|
+
.replace(/\)/g, '\\)') // Right paren (links)
|
|
21
|
+
.replace(/</g, '<') // Less than (HTML/autolinks)
|
|
22
|
+
.replace(/>/g, '>') // Greater than (HTML/autolinks)
|
|
23
|
+
.replace(/`/g, '\\`') // Backtick (code)
|
|
24
|
+
.replace(/~/g, '\\~') // Tilde (strikethrough)
|
|
25
|
+
.replace(/#/g, '\\#') // Hash (headers)
|
|
26
|
+
.replace(/!/g, '\\!') // Exclamation (images)
|
|
27
|
+
.replace(/\n/g, ' ') // Newlines -> spaces (prevent structure injection)
|
|
28
|
+
.replace(/\r/g, ''); // Remove carriage returns
|
|
29
|
+
}
|
|
30
|
+
export async function handleSearchLocation(args, geocodingService) {
|
|
31
|
+
// Validate input parameters
|
|
32
|
+
const locationArgs = args;
|
|
33
|
+
if (!locationArgs.query || typeof locationArgs.query !== 'string') {
|
|
34
|
+
throw new Error('query parameter is required and must be a string');
|
|
35
|
+
}
|
|
36
|
+
const query = locationArgs.query.trim();
|
|
37
|
+
const limit = typeof locationArgs.limit === 'number' ?
|
|
38
|
+
Math.min(Math.max(1, locationArgs.limit), 50) : 5; // Nominatim max is 50
|
|
39
|
+
// Search for locations using multi-service geocoding
|
|
40
|
+
const results = await geocodingService.geocode(query, limit);
|
|
41
|
+
// Format the results for display
|
|
42
|
+
let output = `# Location Search Results\n\n`;
|
|
43
|
+
// Escape user query to prevent Markdown injection
|
|
44
|
+
output += `**Query:** "${escapeMarkdown(query)}"\n`;
|
|
45
|
+
output += `**Found:** ${results.length} location${results.length > 1 ? 's' : ''}\n\n`;
|
|
46
|
+
output += `---\n\n`;
|
|
47
|
+
for (let i = 0; i < results.length; i++) {
|
|
48
|
+
const location = results[i];
|
|
49
|
+
output += `## ${i + 1}. ${location.name}\n\n`;
|
|
50
|
+
// Build location description
|
|
51
|
+
const parts = [location.name];
|
|
52
|
+
if (location.admin1)
|
|
53
|
+
parts.push(location.admin1);
|
|
54
|
+
if (location.admin2 && location.admin2 !== location.admin1)
|
|
55
|
+
parts.push(location.admin2);
|
|
56
|
+
if (location.country)
|
|
57
|
+
parts.push(location.country);
|
|
58
|
+
output += `**Full Name:** ${location.display_name}\n`;
|
|
59
|
+
output += `**Coordinates:** ${location.latitude.toFixed(4)}°, ${location.longitude.toFixed(4)}°\n`;
|
|
60
|
+
if (location.country_code) {
|
|
61
|
+
output += `**Country Code:** ${location.country_code.toUpperCase()}\n`;
|
|
62
|
+
}
|
|
63
|
+
if (location.timezone) {
|
|
64
|
+
output += `**Timezone:** ${location.timezone}\n`;
|
|
65
|
+
}
|
|
66
|
+
if (location.elevation !== undefined) {
|
|
67
|
+
const elevationFt = Math.round(location.elevation * 3.28084);
|
|
68
|
+
output += `**Elevation:** ${location.elevation}m (${elevationFt}ft)\n`;
|
|
69
|
+
}
|
|
70
|
+
if (location.population !== undefined && location.population > 0) {
|
|
71
|
+
output += `**Population:** ${location.population.toLocaleString()}\n`;
|
|
72
|
+
}
|
|
73
|
+
if (location.feature_code) {
|
|
74
|
+
const featureDescription = getFeatureDescription(location.feature_code);
|
|
75
|
+
if (featureDescription) {
|
|
76
|
+
output += `**Type:** ${featureDescription}\n`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Show confidence and source
|
|
80
|
+
const confidenceEmoji = location.confidence === 'high' ? '✅' :
|
|
81
|
+
location.confidence === 'medium' ? '⚡' : '⚠️';
|
|
82
|
+
output += `**Confidence:** ${confidenceEmoji} ${location.confidence.charAt(0).toUpperCase() + location.confidence.slice(1)}\n`;
|
|
83
|
+
output += `**Data Source:** ${getSourceName(location.source)}\n`;
|
|
84
|
+
output += `\n`;
|
|
85
|
+
// Add usage example
|
|
86
|
+
output += `*To get weather for this location, use these coordinates:*\n`;
|
|
87
|
+
output += `*Latitude: ${location.latitude}, Longitude: ${location.longitude}*\n\n`;
|
|
88
|
+
if (i < results.length - 1) {
|
|
89
|
+
output += `---\n\n`;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
output += `---\n`;
|
|
93
|
+
output += `*Multi-service geocoding with automatic fallback (Census.gov, Nominatim, Open-Meteo)*\n`;
|
|
94
|
+
return {
|
|
95
|
+
content: [
|
|
96
|
+
{
|
|
97
|
+
type: 'text',
|
|
98
|
+
text: output
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get friendly source name for display
|
|
105
|
+
*/
|
|
106
|
+
function getSourceName(source) {
|
|
107
|
+
switch (source) {
|
|
108
|
+
case 'census': return 'US Census Bureau';
|
|
109
|
+
case 'nominatim': return 'OpenStreetMap Nominatim';
|
|
110
|
+
case 'openmeteo': return 'Open-Meteo';
|
|
111
|
+
default: return source;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get human-readable description for feature code
|
|
116
|
+
* Based on GeoNames feature codes: https://www.geonames.org/export/codes.html
|
|
117
|
+
*/
|
|
118
|
+
function getFeatureDescription(code) {
|
|
119
|
+
const featureCodes = {
|
|
120
|
+
'PPL': 'Populated place',
|
|
121
|
+
'PPLA': 'Administrative capital',
|
|
122
|
+
'PPLA2': 'Second-order administrative capital',
|
|
123
|
+
'PPLA3': 'Third-order administrative capital',
|
|
124
|
+
'PPLA4': 'Fourth-order administrative capital',
|
|
125
|
+
'PPLC': 'National capital',
|
|
126
|
+
'PPLG': 'Seat of government',
|
|
127
|
+
'PPLS': 'Populated places',
|
|
128
|
+
'PPLX': 'Section of populated place',
|
|
129
|
+
'ADM1': 'First-order administrative division',
|
|
130
|
+
'ADM2': 'Second-order administrative division',
|
|
131
|
+
'ADM3': 'Third-order administrative division',
|
|
132
|
+
'ADM4': 'Fourth-order administrative division',
|
|
133
|
+
'PCLI': 'Independent political entity',
|
|
134
|
+
'PCLD': 'Dependent political entity',
|
|
135
|
+
'ISL': 'Island',
|
|
136
|
+
'MT': 'Mountain',
|
|
137
|
+
'MTS': 'Mountains',
|
|
138
|
+
'LAKE': 'Lake',
|
|
139
|
+
'RSTN': 'Railroad station',
|
|
140
|
+
'AIRP': 'Airport',
|
|
141
|
+
'AIRF': 'Airfield',
|
|
142
|
+
'PRK': 'Park',
|
|
143
|
+
'RES': 'Reserve',
|
|
144
|
+
'RESN': 'Nature reserve',
|
|
145
|
+
'RESW': 'Wildlife reserve'
|
|
146
|
+
};
|
|
147
|
+
return featureCodes[code] || null;
|
|
148
|
+
}
|
|
149
|
+
//# 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,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for get_marine_conditions tool
|
|
3
|
+
* Supports dual data sources: NOAA (Great Lakes/coastal) and Open-Meteo (oceans)
|
|
4
|
+
*/
|
|
5
|
+
import { NOAAService } from '../services/noaa.js';
|
|
6
|
+
import { OpenMeteoService } from '../services/openmeteo.js';
|
|
7
|
+
export declare function handleGetMarineConditions(args: unknown, noaaService: NOAAService, openMeteoService: OpenMeteoService): Promise<{
|
|
8
|
+
content: Array<{
|
|
9
|
+
type: string;
|
|
10
|
+
text: string;
|
|
11
|
+
}>;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=marineConditionsHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marineConditionsHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/marineConditionsHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAwB5D,wBAAsB,yBAAyB,CAC7C,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,CAkG7D"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for get_marine_conditions tool
|
|
3
|
+
* Supports dual data sources: NOAA (Great Lakes/coastal) and Open-Meteo (oceans)
|
|
4
|
+
*/
|
|
5
|
+
import { DateTime } from 'luxon';
|
|
6
|
+
import { validateCoordinates, validateOptionalBoolean } from '../utils/validation.js';
|
|
7
|
+
import { formatWaveHeight, formatWavePeriod, formatDirection, formatCurrentVelocity, formatWindSpeed, getWaveHeightCategory, getSafetyAssessment, extractNOAAMarineConditions } from '../utils/marine.js';
|
|
8
|
+
import { shouldUseNOAAMarine } from '../utils/geography.js';
|
|
9
|
+
import { logger, redactCoordinatesForLogging } from '../utils/logger.js';
|
|
10
|
+
import { formatInTimezone, guessTimezoneFromCoords } from '../utils/timezone.js';
|
|
11
|
+
export async function handleGetMarineConditions(args, noaaService, openMeteoService) {
|
|
12
|
+
// Validate input parameters with runtime checks
|
|
13
|
+
const { latitude, longitude } = validateCoordinates(args);
|
|
14
|
+
const forecast = validateOptionalBoolean(args?.forecast, 'forecast', false);
|
|
15
|
+
// Get timezone for proper time formatting
|
|
16
|
+
let timezone = guessTimezoneFromCoords(latitude, longitude); // fallback
|
|
17
|
+
try {
|
|
18
|
+
// Try to get timezone from station (preferred)
|
|
19
|
+
const stations = await noaaService.getStations(latitude, longitude);
|
|
20
|
+
if (stations.features && stations.features.length > 0) {
|
|
21
|
+
const stationTimezone = stations.features[0].properties.timeZone;
|
|
22
|
+
if (stationTimezone) {
|
|
23
|
+
timezone = stationTimezone;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
// Use fallback timezone
|
|
29
|
+
}
|
|
30
|
+
// Check if we should try NOAA first (Great Lakes or major coastal bays)
|
|
31
|
+
const regionDetection = shouldUseNOAAMarine(latitude, longitude);
|
|
32
|
+
if (regionDetection.useNOAA) {
|
|
33
|
+
// Try NOAA first for Great Lakes and coastal bays
|
|
34
|
+
try {
|
|
35
|
+
// Redact coordinates for logging to protect user privacy
|
|
36
|
+
const redacted = redactCoordinatesForLogging(latitude, longitude);
|
|
37
|
+
logger.info('Attempting NOAA marine data', {
|
|
38
|
+
latitude: redacted.lat,
|
|
39
|
+
longitude: redacted.lon,
|
|
40
|
+
region: regionDetection.region,
|
|
41
|
+
source: regionDetection.source
|
|
42
|
+
});
|
|
43
|
+
const gridpointData = await noaaService.getGridpointDataByCoordinates(latitude, longitude);
|
|
44
|
+
const noaaMarineData = extractNOAAMarineConditions(gridpointData);
|
|
45
|
+
if (noaaMarineData) {
|
|
46
|
+
// Format NOAA marine data
|
|
47
|
+
const output = formatNOAAMarineConditions(noaaMarineData, latitude, longitude, regionDetection.region || 'Unknown Region', timezone, forecast);
|
|
48
|
+
return {
|
|
49
|
+
content: [
|
|
50
|
+
{
|
|
51
|
+
type: 'text',
|
|
52
|
+
text: output
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const redacted2 = redactCoordinatesForLogging(latitude, longitude);
|
|
59
|
+
logger.info('NOAA gridpoint has no marine data, falling back to Open-Meteo', {
|
|
60
|
+
latitude: redacted2.lat,
|
|
61
|
+
longitude: redacted2.lon
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
// NOAA failed, fall back to Open-Meteo
|
|
67
|
+
const redacted3 = redactCoordinatesForLogging(latitude, longitude);
|
|
68
|
+
logger.warn('NOAA marine data failed, falling back to Open-Meteo', {
|
|
69
|
+
latitude: redacted3.lat,
|
|
70
|
+
longitude: redacted3.lon,
|
|
71
|
+
error: error.message
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Use Open-Meteo (default for oceans, or fallback for NOAA regions)
|
|
76
|
+
const marineData = await openMeteoService.getMarine(latitude, longitude, forecast, 5 // Default 5-day forecast
|
|
77
|
+
);
|
|
78
|
+
// Format the marine data for display
|
|
79
|
+
const output = formatOpenMeteoMarineConditions(marineData, latitude, longitude, forecast);
|
|
80
|
+
return {
|
|
81
|
+
content: [
|
|
82
|
+
{
|
|
83
|
+
type: 'text',
|
|
84
|
+
text: output
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Format NOAA marine conditions data as markdown
|
|
91
|
+
*/
|
|
92
|
+
function formatNOAAMarineConditions(data, latitude, longitude, region, timezone, includeForecast) {
|
|
93
|
+
let output = `# Marine Conditions Report - ${region}\n\n`;
|
|
94
|
+
output += `**Location:** ${latitude.toFixed(4)}, ${longitude.toFixed(4)}\n`;
|
|
95
|
+
output += `**Region:** ${region}\n`;
|
|
96
|
+
output += `**Last Updated:** ${formatInTimezone(data.timestamp, timezone)}\n\n`;
|
|
97
|
+
// Wave Conditions
|
|
98
|
+
output += `## 🌊 Wave Conditions\n\n`;
|
|
99
|
+
if (data.waveHeight !== undefined && data.waveHeight > 0) {
|
|
100
|
+
const waveCategory = getWaveHeightCategory(data.waveHeight);
|
|
101
|
+
output += `**Significant Wave Height:** ${formatWaveHeight(data.waveHeight)}`;
|
|
102
|
+
output += ` (${waveCategory.description})\n`;
|
|
103
|
+
if (data.waveDirection !== undefined) {
|
|
104
|
+
output += `**Wave Direction:** ${formatDirection(data.waveDirection)}\n`;
|
|
105
|
+
}
|
|
106
|
+
if (data.wavePeriod !== undefined) {
|
|
107
|
+
output += `**Wave Period:** ${formatWavePeriod(data.wavePeriod)}\n`;
|
|
108
|
+
}
|
|
109
|
+
output += `\n**Safety:** ${waveCategory.recommendation}\n\n`;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
output += `**Wave Height:** Calm or minimal wave activity\n\n`;
|
|
113
|
+
}
|
|
114
|
+
// Wind Conditions
|
|
115
|
+
if (data.windSpeed !== undefined || data.windDirection !== undefined) {
|
|
116
|
+
output += `## 💨 Wind Conditions\n\n`;
|
|
117
|
+
if (data.windSpeed !== undefined) {
|
|
118
|
+
output += `**Wind Speed:** ${formatWindSpeed(data.windSpeed)}\n`;
|
|
119
|
+
}
|
|
120
|
+
if (data.windDirection !== undefined) {
|
|
121
|
+
output += `**Wind Direction:** ${formatDirection(data.windDirection)}\n`;
|
|
122
|
+
}
|
|
123
|
+
if (data.windGust !== undefined && data.windGust > data.windSpeed * 1.2) {
|
|
124
|
+
output += `**Wind Gusts:** ${formatWindSpeed(data.windGust)}\n`;
|
|
125
|
+
}
|
|
126
|
+
output += `\n`;
|
|
127
|
+
}
|
|
128
|
+
// Forecast note
|
|
129
|
+
if (includeForecast) {
|
|
130
|
+
output += `---\n\n`;
|
|
131
|
+
output += `*Note: NOAA gridpoint data provides current conditions. `;
|
|
132
|
+
output += `For detailed multi-day marine forecasts, NOAA offers zone-based marine forecasts `;
|
|
133
|
+
output += `available through their website.*\n\n`;
|
|
134
|
+
}
|
|
135
|
+
// Footer
|
|
136
|
+
output += `---\n\n`;
|
|
137
|
+
output += `*Data source: NOAA National Weather Service*\n`;
|
|
138
|
+
output += `*Great Lakes and coastal marine conditions from NOAA gridpoint data*\n`;
|
|
139
|
+
return output;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Format Open-Meteo marine conditions data as markdown
|
|
143
|
+
*/
|
|
144
|
+
function formatOpenMeteoMarineConditions(data, latitude, longitude, includeForecast) {
|
|
145
|
+
let output = `# Marine Conditions Report\n\n`;
|
|
146
|
+
output += `**Location:** ${latitude.toFixed(4)}, ${longitude.toFixed(4)}\n`;
|
|
147
|
+
output += `**Timezone:** ${data.timezone}\n`;
|
|
148
|
+
output += `\n`;
|
|
149
|
+
// Important disclaimer at the top
|
|
150
|
+
output += `⚠️ **DISCLAIMER:** This data is modeled and may have limited accuracy in coastal areas. `;
|
|
151
|
+
output += `**NOT suitable for coastal navigation.** Always consult official marine forecasts for safety-critical decisions.\n\n`;
|
|
152
|
+
if (!data.current) {
|
|
153
|
+
output += `⚠️ **No current marine conditions data available for this location.**\n`;
|
|
154
|
+
return output;
|
|
155
|
+
}
|
|
156
|
+
const current = data.current;
|
|
157
|
+
output += `**Observation Time:** ${formatInTimezone(current.time, data.timezone)}\n\n`;
|
|
158
|
+
// Overall safety assessment
|
|
159
|
+
const safety = getSafetyAssessment(current.wave_height, current.wind_wave_height, current.swell_wave_height, current.wave_period);
|
|
160
|
+
const safetyEmoji = safety.level === 'Calm' ? '🟢' :
|
|
161
|
+
safety.level === 'Moderate' ? '🟡' :
|
|
162
|
+
safety.level === 'Rough' ? '🟠' :
|
|
163
|
+
safety.level === 'Very Rough' ? '🔴' : '🟤';
|
|
164
|
+
output += `## ${safetyEmoji} Current Conditions: ${safety.level}\n\n`;
|
|
165
|
+
output += `${safety.description}\n\n`;
|
|
166
|
+
// Wave Height Summary
|
|
167
|
+
output += `## 🌊 Wave Conditions\n\n`;
|
|
168
|
+
if (current.wave_height !== undefined) {
|
|
169
|
+
const waveCategory = getWaveHeightCategory(current.wave_height);
|
|
170
|
+
output += `**Significant Wave Height:** ${formatWaveHeight(current.wave_height)}`;
|
|
171
|
+
output += ` (${waveCategory.description})\n`;
|
|
172
|
+
}
|
|
173
|
+
if (current.wave_direction !== undefined) {
|
|
174
|
+
output += `**Wave Direction:** ${formatDirection(current.wave_direction)}\n`;
|
|
175
|
+
}
|
|
176
|
+
if (current.wave_period !== undefined) {
|
|
177
|
+
output += `**Wave Period:** ${formatWavePeriod(current.wave_period)}\n`;
|
|
178
|
+
}
|
|
179
|
+
output += `\n`;
|
|
180
|
+
// Wind Waves (locally generated)
|
|
181
|
+
if (current.wind_wave_height !== undefined && current.wind_wave_height > 0) {
|
|
182
|
+
output += `### Wind Waves\n\n`;
|
|
183
|
+
output += `**Height:** ${formatWaveHeight(current.wind_wave_height)}\n`;
|
|
184
|
+
if (current.wind_wave_direction !== undefined) {
|
|
185
|
+
output += `**Direction:** ${formatDirection(current.wind_wave_direction)}\n`;
|
|
186
|
+
}
|
|
187
|
+
if (current.wind_wave_period !== undefined) {
|
|
188
|
+
output += `**Period:** ${formatWavePeriod(current.wind_wave_period)}\n`;
|
|
189
|
+
}
|
|
190
|
+
if (current.wind_wave_peak_period !== undefined) {
|
|
191
|
+
output += `**Peak Period:** ${formatWavePeriod(current.wind_wave_peak_period)}\n`;
|
|
192
|
+
}
|
|
193
|
+
output += `\n`;
|
|
194
|
+
}
|
|
195
|
+
// Swell Waves (propagated from distant storms)
|
|
196
|
+
if (current.swell_wave_height !== undefined && current.swell_wave_height > 0) {
|
|
197
|
+
output += `### Swell\n\n`;
|
|
198
|
+
output += `**Height:** ${formatWaveHeight(current.swell_wave_height)}\n`;
|
|
199
|
+
if (current.swell_wave_direction !== undefined) {
|
|
200
|
+
output += `**Direction:** ${formatDirection(current.swell_wave_direction)}\n`;
|
|
201
|
+
}
|
|
202
|
+
if (current.swell_wave_period !== undefined) {
|
|
203
|
+
output += `**Period:** ${formatWavePeriod(current.swell_wave_period)}\n`;
|
|
204
|
+
}
|
|
205
|
+
if (current.swell_wave_peak_period !== undefined) {
|
|
206
|
+
output += `**Peak Period:** ${formatWavePeriod(current.swell_wave_peak_period)}\n`;
|
|
207
|
+
}
|
|
208
|
+
output += `\n`;
|
|
209
|
+
}
|
|
210
|
+
// Ocean Currents
|
|
211
|
+
if (current.ocean_current_velocity !== undefined || current.ocean_current_direction !== undefined) {
|
|
212
|
+
output += `## 🌀 Ocean Currents\n\n`;
|
|
213
|
+
if (current.ocean_current_velocity !== undefined) {
|
|
214
|
+
output += `**Velocity:** ${formatCurrentVelocity(current.ocean_current_velocity)}\n`;
|
|
215
|
+
}
|
|
216
|
+
if (current.ocean_current_direction !== undefined) {
|
|
217
|
+
output += `**Direction:** ${formatDirection(current.ocean_current_direction)}\n`;
|
|
218
|
+
}
|
|
219
|
+
output += `\n`;
|
|
220
|
+
}
|
|
221
|
+
// Add forecast summary if requested
|
|
222
|
+
if (includeForecast && data.daily && data.daily.time && data.daily.time.length > 0) {
|
|
223
|
+
output += `---\n\n`;
|
|
224
|
+
output += `## 📅 Marine Forecast\n\n`;
|
|
225
|
+
const daysToShow = Math.min(5, data.daily.time.length);
|
|
226
|
+
output += `**Next ${daysToShow} days:**\n\n`;
|
|
227
|
+
for (let i = 0; i < daysToShow; i++) {
|
|
228
|
+
const dt = DateTime.fromISO(data.daily.time[i], { setZone: false }).setZone(data.timezone);
|
|
229
|
+
const dayName = dt.toLocaleString({ weekday: 'short', month: 'short', day: 'numeric' });
|
|
230
|
+
output += `**${dayName}:**\n`;
|
|
231
|
+
if (data.daily.wave_height_max?.[i] !== undefined) {
|
|
232
|
+
const maxWaveHeight = data.daily.wave_height_max[i];
|
|
233
|
+
const category = getWaveHeightCategory(maxWaveHeight);
|
|
234
|
+
output += ` • Max Wave Height: ${formatWaveHeight(maxWaveHeight)} (${category.description})\n`;
|
|
235
|
+
}
|
|
236
|
+
if (data.daily.wave_direction_dominant?.[i] !== undefined) {
|
|
237
|
+
output += ` • Wave Direction: ${formatDirection(data.daily.wave_direction_dominant[i])}\n`;
|
|
238
|
+
}
|
|
239
|
+
if (data.daily.wave_period_max?.[i] !== undefined) {
|
|
240
|
+
output += ` • Max Wave Period: ${formatWavePeriod(data.daily.wave_period_max[i])}\n`;
|
|
241
|
+
}
|
|
242
|
+
// Show swell info if significant
|
|
243
|
+
if (data.daily.swell_wave_height_max?.[i] !== undefined && data.daily.swell_wave_height_max[i] > 0.5) {
|
|
244
|
+
output += ` • Swell Height: ${formatWaveHeight(data.daily.swell_wave_height_max[i])}\n`;
|
|
245
|
+
if (data.daily.swell_wave_direction_dominant?.[i] !== undefined) {
|
|
246
|
+
output += ` • Swell Direction: ${formatDirection(data.daily.swell_wave_direction_dominant[i])}\n`;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
output += `\n`;
|
|
250
|
+
}
|
|
251
|
+
// Add hourly forecast note if available
|
|
252
|
+
if (data.hourly && data.hourly.time && data.hourly.time.length > 0) {
|
|
253
|
+
output += `*Hourly forecast data available for ${data.hourly.time.length} hours*\n\n`;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Footer with interpretation guidance
|
|
257
|
+
output += `---\n\n`;
|
|
258
|
+
output += `### Interpreting Marine Conditions\n\n`;
|
|
259
|
+
output += `**Significant Wave Height:** The average height of the highest 1/3 of waves\n`;
|
|
260
|
+
output += `**Wind Waves:** Waves generated by local winds (shorter period)\n`;
|
|
261
|
+
output += `**Swell:** Long-period waves from distant weather systems (longer period)\n`;
|
|
262
|
+
output += `**Wave Period:** Time between successive wave crests (longer = more powerful)\n\n`;
|
|
263
|
+
output += `🟢 **Calm** (0-2m): Safe for most vessels\n`;
|
|
264
|
+
output += `🟡 **Moderate** (2-4m): Challenging for small craft\n`;
|
|
265
|
+
output += `🟠 **Rough** (4-6m): Hazardous for small vessels\n`;
|
|
266
|
+
output += `🔴 **Very Rough** (6-9m): Dangerous for most vessels\n`;
|
|
267
|
+
output += `🟤 **High** (>9m): Extremely dangerous\n`;
|
|
268
|
+
return output;
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=marineConditionsHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marineConditionsHandler.js","sourceRoot":"","sources":["../../src/handlers/marineConditionsHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for get_river_conditions tool
|
|
3
|
+
*/
|
|
4
|
+
import { NOAAService } from '../services/noaa.js';
|
|
5
|
+
export declare function handleGetRiverConditions(args: unknown, noaaService: NOAAService): Promise<{
|
|
6
|
+
content: Array<{
|
|
7
|
+
type: string;
|
|
8
|
+
text: string;
|
|
9
|
+
}>;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=riverConditionsHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"riverConditionsHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/riverConditionsHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAYlD,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAmF7D"}
|