@dangahagan/weather-mcp 1.3.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +221 -7
  2. package/dist/config/tools.d.ts +44 -0
  3. package/dist/config/tools.d.ts.map +1 -0
  4. package/dist/config/tools.js +256 -0
  5. package/dist/config/tools.js.map +1 -0
  6. package/dist/errors/ApiError.d.ts +6 -6
  7. package/dist/errors/ApiError.d.ts.map +1 -1
  8. package/dist/errors/ApiError.js +2 -1
  9. package/dist/errors/ApiError.js.map +1 -1
  10. package/dist/handlers/forecastHandler.d.ts.map +1 -1
  11. package/dist/handlers/forecastHandler.js +5 -3
  12. package/dist/handlers/forecastHandler.js.map +1 -1
  13. package/dist/handlers/lightningHandler.d.ts +14 -0
  14. package/dist/handlers/lightningHandler.d.ts.map +1 -0
  15. package/dist/handlers/lightningHandler.js +258 -0
  16. package/dist/handlers/lightningHandler.js.map +1 -0
  17. package/dist/handlers/locationHandler.d.ts.map +1 -1
  18. package/dist/handlers/locationHandler.js +27 -1
  19. package/dist/handlers/locationHandler.js.map +1 -1
  20. package/dist/handlers/marineConditionsHandler.d.ts.map +1 -1
  21. package/dist/handlers/marineConditionsHandler.js +11 -7
  22. package/dist/handlers/marineConditionsHandler.js.map +1 -1
  23. package/dist/handlers/riverConditionsHandler.d.ts +11 -0
  24. package/dist/handlers/riverConditionsHandler.d.ts.map +1 -0
  25. package/dist/handlers/riverConditionsHandler.js +176 -0
  26. package/dist/handlers/riverConditionsHandler.js.map +1 -0
  27. package/dist/handlers/weatherImageryHandler.d.ts +14 -0
  28. package/dist/handlers/weatherImageryHandler.d.ts.map +1 -0
  29. package/dist/handlers/weatherImageryHandler.js +143 -0
  30. package/dist/handlers/weatherImageryHandler.js.map +1 -0
  31. package/dist/handlers/wildfireHandler.d.ts +11 -0
  32. package/dist/handlers/wildfireHandler.d.ts.map +1 -0
  33. package/dist/handlers/wildfireHandler.js +186 -0
  34. package/dist/handlers/wildfireHandler.js.map +1 -0
  35. package/dist/index.js +414 -227
  36. package/dist/index.js.map +1 -1
  37. package/dist/services/blitzortung.d.ts +67 -0
  38. package/dist/services/blitzortung.d.ts.map +1 -0
  39. package/dist/services/blitzortung.js +475 -0
  40. package/dist/services/blitzortung.js.map +1 -0
  41. package/dist/services/nifc.d.ts +44 -0
  42. package/dist/services/nifc.d.ts.map +1 -0
  43. package/dist/services/nifc.js +151 -0
  44. package/dist/services/nifc.js.map +1 -0
  45. package/dist/services/noaa.d.ts +56 -1
  46. package/dist/services/noaa.d.ts.map +1 -1
  47. package/dist/services/noaa.js +232 -1
  48. package/dist/services/noaa.js.map +1 -1
  49. package/dist/services/rainviewer.d.ts +37 -0
  50. package/dist/services/rainviewer.d.ts.map +1 -0
  51. package/dist/services/rainviewer.js +115 -0
  52. package/dist/services/rainviewer.js.map +1 -0
  53. package/dist/types/imagery.d.ts +82 -0
  54. package/dist/types/imagery.d.ts.map +1 -0
  55. package/dist/types/imagery.js +6 -0
  56. package/dist/types/imagery.js.map +1 -0
  57. package/dist/types/lightning.d.ts +89 -0
  58. package/dist/types/lightning.d.ts.map +1 -0
  59. package/dist/types/lightning.js +6 -0
  60. package/dist/types/lightning.js.map +1 -0
  61. package/dist/types/noaa.d.ts +170 -0
  62. package/dist/types/noaa.d.ts.map +1 -1
  63. package/dist/types/wildfire.d.ts +83 -0
  64. package/dist/types/wildfire.d.ts.map +1 -0
  65. package/dist/types/wildfire.js +5 -0
  66. package/dist/types/wildfire.js.map +1 -0
  67. package/dist/utils/distance.d.ts +25 -0
  68. package/dist/utils/distance.d.ts.map +1 -0
  69. package/dist/utils/distance.js +40 -0
  70. package/dist/utils/distance.js.map +1 -0
  71. package/dist/utils/geohash.d.ts +62 -0
  72. package/dist/utils/geohash.d.ts.map +1 -0
  73. package/dist/utils/geohash.js +146 -0
  74. package/dist/utils/geohash.js.map +1 -0
  75. package/dist/utils/logger.d.ts +16 -0
  76. package/dist/utils/logger.d.ts.map +1 -1
  77. package/dist/utils/logger.js +25 -0
  78. package/dist/utils/logger.js.map +1 -1
  79. package/dist/utils/timezone.d.ts.map +1 -1
  80. package/dist/utils/timezone.js +7 -9
  81. package/dist/utils/timezone.js.map +1 -1
  82. package/package.json +9 -5
package/README.md CHANGED
@@ -91,6 +91,39 @@ An MCP (Model Context Protocol) server that provides **global weather data** to
91
91
  - Safety assessment for maritime activities (sailing, boating, surfing)
92
92
  - Wave interpretation guide based on Douglas Sea Scale
93
93
  - Important: Data has limited coastal accuracy - NOT for navigation
94
+ - **Weather Imagery**: Visual weather radar and precipitation maps (NEW in v1.5.0)
95
+ - Global precipitation radar from RainViewer API
96
+ - Static radar images showing current precipitation
97
+ - Animated radar loops (up to 2 hours of history)
98
+ - Tile URLs for efficient rendering
99
+ - Automatic coordinate-to-tile calculation
100
+ - Visual confirmation of approaching weather
101
+ - Free, no API key required
102
+ - **Lightning Activity**: Real-time lightning strike detection and safety monitoring (NEW in v1.5.0)
103
+ - Real-time strike detection from Blitzortung.org network
104
+ - Strikes within customizable radius (default: 100km)
105
+ - 4-level safety assessment (Safe, Elevated, High, Extreme)
106
+ - Distance to nearest strike with comprehensive statistics
107
+ - Strike polarity and amplitude information
108
+ - Safety recommendations based on proximity
109
+ - Critical for outdoor activity safety planning
110
+ - Free, no API key required
111
+ - **River Conditions**: Monitor river levels and flood status for safety and recreation (NEW in v1.6.0)
112
+ - Current water levels from NOAA and USGS gauges
113
+ - Flood stage thresholds (action, minor, moderate, major)
114
+ - Streamflow data in cubic feet per second
115
+ - Distance-based gauge filtering within customizable radius
116
+ - Safety assessment for boating and recreation
117
+ - Historical flood crest data when available
118
+ - US coverage via NOAA NWPS and USGS Water Services
119
+ - **Wildfire Information**: Track active wildfires and fire perimeters (NEW in v1.6.0)
120
+ - Active wildfire locations and prescribed burns
121
+ - Fire size, containment status, and discovery date
122
+ - Distance-based proximity filtering
123
+ - 4-level safety assessment (Extreme Danger, High Alert, Caution, Awareness)
124
+ - Evacuation recommendations based on proximity
125
+ - Detailed fire attributes (type, location, status)
126
+ - Data from NIFC WFIGS (National Interagency Fire Center)
94
127
  - **Service Status Checking**: Proactively verify API availability with health checks
95
128
  - **Enhanced Error Handling**: Detailed, actionable error messages with status page links
96
129
  - **Intelligent Caching**: Built-in in-memory cache reduces API calls and improves performance
@@ -112,6 +145,10 @@ The cache automatically stores and retrieves weather data with intelligent expir
112
145
 
113
146
  - **Location Searches**: Cached for 30 days (locations don't move)
114
147
  - **Climate Normals**: Cached indefinitely (30-year averages are static) - NEW in v1.2.0
148
+ - **Weather Imagery**: Cached for 15 minutes (radar updates frequently) - NEW in v1.5.0
149
+ - **Lightning Strikes**: Cached for 5 minutes (real-time safety data) - NEW in v1.5.0
150
+ - **River Conditions**: Cached for 1 hour (gauge data updates frequently) - NEW in v1.6.0
151
+ - **Wildfire Information**: Cached for 30 minutes (fire data changes rapidly) - NEW in v1.6.0
115
152
  - **Marine Conditions**: Cached for 1 hour (marine data updates hourly) - NEW in v0.6.0
116
153
  - **Air Quality Data**: Cached for 1 hour (air quality updates hourly) - v0.5.0
117
154
  - **Fire Weather Data**: Cached for 2 hours (gridpoint data updates ~hourly) - v0.5.0
@@ -124,6 +161,45 @@ The cache automatically stores and retrieves weather data with intelligent expir
124
161
 
125
162
  ### Configuration
126
163
 
164
+ #### Tool Selection (NEW in v1.4.0)
165
+
166
+ Control which MCP tools are exposed to reduce context overhead and customize functionality. By default, only **basic** tools are enabled.
167
+
168
+ **Available Presets:**
169
+ - `basic` (default): Essential weather tools (5 tools) - forecast, current_conditions, alerts, search_location, check_service_status
170
+ - `standard`: Basic + historical_weather (6 tools)
171
+ - `full`: Standard + air_quality (7 tools)
172
+ - `all`: All available tools (12 tools) - includes marine_conditions, weather_imagery, lightning_activity, river_conditions, wildfire_info
173
+
174
+ **Configuration Examples:**
175
+
176
+ ```bash
177
+ # Use a preset
178
+ export ENABLED_TOOLS=full
179
+
180
+ # Select specific tools
181
+ export ENABLED_TOOLS=forecast,current,alerts,air_quality
182
+
183
+ # Add tools to a preset
184
+ export ENABLED_TOOLS=basic,+historical,+air_quality
185
+
186
+ # Remove tools from a preset
187
+ export ENABLED_TOOLS=all,-marine
188
+
189
+ # Complex combinations
190
+ export ENABLED_TOOLS=standard,+air_quality,-alerts
191
+ ```
192
+
193
+ **Tool Aliases:**
194
+ Short names are supported: `forecast`, `current`, `conditions`, `alerts`, `warnings`, `historical`, `history`, `status`, `location`, `search`, `air_quality`, `aqi`, `marine`, `ocean`, `waves`, `imagery`, `radar`, `satellite`, `lightning`, `strikes`, `thunderstorm`
195
+
196
+ **Benefits:**
197
+ - **Reduced Context**: Load only needed tools to reduce initial MCP context
198
+ - **Better Security**: Only expose necessary functionality
199
+ - **Customization**: Tailor the server to your specific use case
200
+
201
+ #### Cache Configuration
202
+
127
203
  Caching is **enabled by default** with sensible settings. To customize:
128
204
 
129
205
  ```bash
@@ -581,6 +657,144 @@ Provides comprehensive marine weather data with intelligent dual-source support:
581
657
  - Wave period for planning and safety
582
658
  - Optional 5-day forecast with daily summaries
583
659
 
660
+ ### 9. get_weather_imagery (NEW in v1.5.0)
661
+ Get weather radar and precipitation imagery for visual weather analysis.
662
+
663
+ **Parameters:**
664
+ - `latitude` (required): Latitude coordinate (-90 to 90)
665
+ - `longitude` (required): Longitude coordinate (-180 to 180)
666
+ - `type` (required): Imagery type - "precipitation", "radar", or "satellite" (Note: satellite not yet implemented)
667
+ - `animated` (optional): Return animated loop vs static image (default: false)
668
+ - `layers` (optional): Additional map layers (reserved for future use)
669
+
670
+ **Description:**
671
+ Provides access to weather radar and precipitation imagery from RainViewer API with global coverage. Returns tile URLs for efficient rendering of current precipitation or animated radar loops showing up to 2 hours of history. Perfect for visual confirmation of approaching weather systems.
672
+
673
+ **Examples:**
674
+ ```
675
+ "Show me the current radar for New York"
676
+ "Get animated precipitation radar for London for the last 2 hours"
677
+ "Is there any precipitation showing on radar near me?"
678
+ ```
679
+
680
+ **Returns:**
681
+ - Precipitation radar imagery (static or animated)
682
+ - Tile URLs for efficient rendering
683
+ - Frame timestamps for animated sequences
684
+ - Coverage area and resolution information
685
+ - Automatic coordinate-to-tile calculation
686
+ - Up to 2 hours of historical radar frames when animated
687
+
688
+ **Note:** Satellite imagery is planned for a future release. Precipitation radar provides global coverage via the free RainViewer API.
689
+
690
+ ### 10. get_lightning_activity (NEW in v1.5.0)
691
+ Get real-time lightning strike detection and safety assessment for outdoor activity planning.
692
+
693
+ **Parameters:**
694
+ - `latitude` (required): Latitude coordinate (-90 to 90)
695
+ - `longitude` (required): Longitude coordinate (-180 to 180)
696
+ - `radius` (optional): Search radius in kilometers (1-500, default: 100)
697
+ - `timeWindow` (optional): Historical time window in minutes (1-180, default: 60)
698
+
699
+ **Description:**
700
+ Provides real-time lightning strike detection from the Blitzortung.org global lightning detection network. Includes comprehensive safety assessment with 4 risk levels based on strike proximity. Critical for outdoor safety planning including boating, hiking, golfing, and other outdoor activities.
701
+
702
+ **Examples:**
703
+ ```
704
+ "Are there any lightning strikes near Miami?"
705
+ "Check for lightning activity within 50km"
706
+ "Is it safe to be outside based on lightning?"
707
+ "Show me recent lightning strikes in the last hour"
708
+ ```
709
+
710
+ **Returns:**
711
+ - Real-time lightning strikes within specified radius
712
+ - 4-level safety assessment:
713
+ - **Safe** (>50km): No immediate lightning threat
714
+ - **Elevated** (16-50km): Monitor conditions, plan indoor access
715
+ - **High** (8-16km): Seek shelter immediately
716
+ - **Extreme** (<8km): Active thunderstorm, dangerous conditions
717
+ - Comprehensive statistics:
718
+ - Total strikes and strike density (per sq km)
719
+ - Strikes per minute rate
720
+ - Distance to nearest strike
721
+ - Average distance of all strikes
722
+ - Strike details:
723
+ - Polarity (cloud-to-ground vs intra-cloud)
724
+ - Amplitude in kiloamperes (kA)
725
+ - Precise timestamp and location
726
+ - Safety recommendations based on proximity
727
+ - Geographic region-optimized data retrieval
728
+
729
+ **Note:** Data provided by Blitzortung.org, a free community-operated lightning detection network. May have regional coverage variations.
730
+
731
+ ### 11. get_river_conditions (NEW in v1.6.0)
732
+ Monitor river levels and flood status using NOAA and USGS data sources.
733
+
734
+ **Parameters:**
735
+ - `latitude` (required): Latitude coordinate (-90 to 90)
736
+ - `longitude` (required): Longitude coordinate (-180 to 180)
737
+ - `radius` (optional): Search radius in kilometers (1-500, default: 50)
738
+
739
+ **Description:**
740
+ Provides comprehensive river and streamflow monitoring for flood safety and recreation planning. Automatically finds the nearest river gauges within the specified radius and reports current water levels, flood stages, and flow rates. Uses NOAA National Water Prediction Service (NWPS) for gauge locations and USGS Water Services for real-time streamflow data.
741
+
742
+ **Examples:**
743
+ ```
744
+ "What are the river conditions near St. Louis?" (latitude: 38.6270, longitude: -90.1994)
745
+ "Check for flooding on the Mississippi River"
746
+ "Is the river level safe for kayaking?"
747
+ "Show me nearby river gauge readings"
748
+ ```
749
+
750
+ **Returns:**
751
+ - Nearest river gauges with current water levels
752
+ - Flood stage thresholds (action, minor, moderate, major)
753
+ - Current flood status and forecast
754
+ - Streamflow data (cubic feet per second)
755
+ - Distance to each gauge from query location
756
+ - River and location names
757
+ - Safety assessment for recreation
758
+ - Historical context (flood crests if available)
759
+
760
+ **Note:** US coverage only. Data provided by NOAA National Water Prediction Service and USGS Water Services.
761
+
762
+ ### 12. get_wildfire_info (NEW in v1.6.0)
763
+ Monitor active wildfires and fire perimeters for safety and evacuation planning.
764
+
765
+ **Parameters:**
766
+ - `latitude` (required): Latitude coordinate (-90 to 90)
767
+ - `longitude` (required): Longitude coordinate (-180 to 180)
768
+ - `radius` (optional): Search radius in kilometers (1-500, default: 100)
769
+
770
+ **Description:**
771
+ Provides critical wildfire monitoring and safety information using NIFC (National Interagency Fire Center) data. Reports active wildfires and prescribed burns within the specified radius, including fire size, containment status, and proximity-based safety assessments. Essential for residents in fire-prone regions and outdoor activity planning.
772
+
773
+ **Examples:**
774
+ ```
775
+ "Are there any wildfires near Los Angeles?" (latitude: 34.0522, longitude: -118.2437)
776
+ "Check for active fires in Colorado"
777
+ "How close is the nearest wildfire?"
778
+ "Show me fire perimeters and containment status"
779
+ ```
780
+
781
+ **Returns:**
782
+ - Active wildfire locations within search radius
783
+ - Fire size in acres and hectares
784
+ - Containment percentage with visual indicator
785
+ - Distance from query location to each fire
786
+ - Discovery date and days active
787
+ - Fire type (Wildfire vs Prescribed Fire)
788
+ - Location details (state, county, city)
789
+ - 4-level safety assessment:
790
+ - **EXTREME DANGER** (<5km): Evacuate if advised
791
+ - **HIGH ALERT** (5-25km): Prepare for evacuation
792
+ - **CAUTION** (25-50km): Monitor conditions
793
+ - **AWARENESS** (>50km): Stay informed
794
+ - Evacuation recommendations and safety guidance
795
+
796
+ **Note:** Data from NIFC WFIGS (Wildland Fire Interagency Geospatial Services). Always consult official sources for evacuation orders at https://inciweb.nwcg.gov/
797
+
584
798
  ## Error Handling & Service Status
585
799
 
586
800
  ### Enhanced Error Messages
@@ -655,7 +869,7 @@ Use the `check_service_status` tool to proactively verify API availability:
655
869
 
656
870
  ### Automated Test Suite
657
871
 
658
- This project includes a comprehensive test suite with 722 automated tests:
872
+ This project includes a comprehensive test suite with 1,042 automated tests:
659
873
 
660
874
  ```bash
661
875
  # Run all tests
@@ -672,14 +886,14 @@ npm run test:ui
672
886
  ```
673
887
 
674
888
  **Test Coverage:**
675
- - **722 tests** across unit and integration test suites (29 new tests in v1.2.1)
676
- - **100% coverage** on critical utilities (cache, validation, units, errors, normals, snow, timezone)
677
- - **54% overall coverage** with focus on reliability and security
678
- - All tests execute in ~1 second
889
+ - **1,042 tests** across unit and integration test suites (111 new tests in v1.6.0)
890
+ - **100% coverage** on critical utilities (cache, validation, units, errors, normals, snow, timezone, distance, geohash, security)
891
+ - **100% pass rate** with comprehensive security and boundary validation
892
+ - All tests execute in ~2 seconds
679
893
 
680
894
  **Test Categories:**
681
- - **Unit Tests** (427 tests) - Cache, validation, units, errors, config, retry logic, normals, snow, timezone
682
- - **Integration Tests** (19 tests) - Error recovery scenarios, service status checks
895
+ - **Unit Tests** (965 tests) - Cache, validation, units, errors, config, retry logic, normals, snow, timezone, distance, security, geohash
896
+ - **Integration Tests** (77 tests) - Error recovery, service status checks, safety & hazards features
683
897
 
684
898
  ### Quick API Connectivity Test
685
899
 
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Tool configuration for Weather MCP Server
3
+ *
4
+ * Supports both presets and individual tool control for flexible configuration.
5
+ *
6
+ * Usage examples:
7
+ * - ENABLED_TOOLS=basic # Only basic weather tools
8
+ * - ENABLED_TOOLS=full # All tools except experimental
9
+ * - ENABLED_TOOLS=basic,+air_quality # Basic tools + air quality
10
+ * - ENABLED_TOOLS=all,-marine # All tools except marine
11
+ * - ENABLED_TOOLS=forecast,current,alerts # Specific tools only
12
+ */
13
+ /**
14
+ * Available tool names in the Weather MCP Server
15
+ */
16
+ export type ToolName = 'get_forecast' | 'get_current_conditions' | 'get_alerts' | 'get_historical_weather' | 'check_service_status' | 'search_location' | 'get_air_quality' | 'get_marine_conditions' | 'get_weather_imagery' | 'get_lightning_activity' | 'get_river_conditions' | 'get_wildfire_info';
17
+ /**
18
+ * Tool configuration singleton
19
+ */
20
+ declare class ToolConfig {
21
+ private enabledTools;
22
+ constructor();
23
+ /**
24
+ * Check if a specific tool is enabled
25
+ */
26
+ isEnabled(tool: ToolName): boolean;
27
+ /**
28
+ * Get all enabled tools
29
+ */
30
+ getEnabledTools(): ToolName[];
31
+ /**
32
+ * Get available presets
33
+ */
34
+ static getPresets(): Record<string, ToolName[]>;
35
+ /**
36
+ * Get available tool aliases
37
+ */
38
+ static getAliases(): Record<string, ToolName>;
39
+ }
40
+ export declare const toolConfig: ToolConfig;
41
+ export declare const PRESETS: Record<string, ToolName[]>;
42
+ export declare const ALIASES: Record<string, ToolName>;
43
+ export {};
44
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/config/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAChB,cAAc,GACd,wBAAwB,GACxB,YAAY,GACZ,wBAAwB,GACxB,sBAAsB,GACtB,iBAAiB,GACjB,iBAAiB,GACjB,uBAAuB,GACvB,qBAAqB,GACrB,wBAAwB,GACxB,sBAAsB,GACtB,mBAAmB,CAAC;AAoNxB;;GAEG;AACH,cAAM,UAAU;IACd,OAAO,CAAC,YAAY,CAAgB;;IAapC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO;IAIlC;;OAEG;IACH,eAAe,IAAI,QAAQ,EAAE;IAI7B;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAI/C;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;CAG9C;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC;AAG3C,eAAO,MAAM,OAAO,4BAAe,CAAC;AACpC,eAAO,MAAM,OAAO,0BAAe,CAAC"}
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Tool configuration for Weather MCP Server
3
+ *
4
+ * Supports both presets and individual tool control for flexible configuration.
5
+ *
6
+ * Usage examples:
7
+ * - ENABLED_TOOLS=basic # Only basic weather tools
8
+ * - ENABLED_TOOLS=full # All tools except experimental
9
+ * - ENABLED_TOOLS=basic,+air_quality # Basic tools + air quality
10
+ * - ENABLED_TOOLS=all,-marine # All tools except marine
11
+ * - ENABLED_TOOLS=forecast,current,alerts # Specific tools only
12
+ */
13
+ /**
14
+ * Tool presets for easy configuration
15
+ */
16
+ const TOOL_PRESETS = {
17
+ // Essential weather tools - minimal overhead
18
+ basic: [
19
+ 'get_forecast',
20
+ 'get_current_conditions',
21
+ 'get_alerts',
22
+ 'search_location',
23
+ 'check_service_status'
24
+ ],
25
+ // Basic + historical data
26
+ standard: [
27
+ 'get_forecast',
28
+ 'get_current_conditions',
29
+ 'get_alerts',
30
+ 'get_historical_weather',
31
+ 'search_location',
32
+ 'check_service_status'
33
+ ],
34
+ // Standard + environmental data
35
+ full: [
36
+ 'get_forecast',
37
+ 'get_current_conditions',
38
+ 'get_alerts',
39
+ 'get_historical_weather',
40
+ 'search_location',
41
+ 'check_service_status',
42
+ 'get_air_quality'
43
+ ],
44
+ // All available tools
45
+ all: [
46
+ 'get_forecast',
47
+ 'get_current_conditions',
48
+ 'get_alerts',
49
+ 'get_historical_weather',
50
+ 'check_service_status',
51
+ 'search_location',
52
+ 'get_air_quality',
53
+ 'get_marine_conditions',
54
+ 'get_weather_imagery',
55
+ 'get_lightning_activity',
56
+ 'get_river_conditions',
57
+ 'get_wildfire_info'
58
+ ]
59
+ };
60
+ /**
61
+ * Tool aliases for convenience (short names)
62
+ */
63
+ const TOOL_ALIASES = {
64
+ 'forecast': 'get_forecast',
65
+ 'current': 'get_current_conditions',
66
+ 'conditions': 'get_current_conditions',
67
+ 'alerts': 'get_alerts',
68
+ 'warnings': 'get_alerts',
69
+ 'historical': 'get_historical_weather',
70
+ 'history': 'get_historical_weather',
71
+ 'status': 'check_service_status',
72
+ 'location': 'search_location',
73
+ 'search': 'search_location',
74
+ 'air_quality': 'get_air_quality',
75
+ 'aqi': 'get_air_quality',
76
+ 'marine': 'get_marine_conditions',
77
+ 'ocean': 'get_marine_conditions',
78
+ 'waves': 'get_marine_conditions',
79
+ 'imagery': 'get_weather_imagery',
80
+ 'radar': 'get_weather_imagery',
81
+ 'satellite': 'get_weather_imagery',
82
+ 'lightning': 'get_lightning_activity',
83
+ 'strikes': 'get_lightning_activity',
84
+ 'thunderstorm': 'get_lightning_activity',
85
+ 'river': 'get_river_conditions',
86
+ 'rivers': 'get_river_conditions',
87
+ 'flood': 'get_river_conditions',
88
+ 'streamflow': 'get_river_conditions',
89
+ 'wildfire': 'get_wildfire_info',
90
+ 'wildfires': 'get_wildfire_info',
91
+ 'fire': 'get_wildfire_info',
92
+ 'fires': 'get_wildfire_info',
93
+ 'smoke': 'get_wildfire_info'
94
+ };
95
+ /**
96
+ * Parse the ENABLED_TOOLS environment variable
97
+ *
98
+ * Supports:
99
+ * - Presets: "basic", "standard", "full", "all"
100
+ * - Individual tools: "forecast,current,alerts"
101
+ * - Adding to presets: "basic,+air_quality"
102
+ * - Removing from presets: "all,-marine"
103
+ * - Combinations: "standard,+air_quality,-alerts"
104
+ *
105
+ * @param envValue The ENABLED_TOOLS environment variable value
106
+ * @returns Set of enabled tool names
107
+ */
108
+ function parseEnabledTools(envValue) {
109
+ // Default to "basic" preset if not specified
110
+ if (!envValue) {
111
+ return new Set(TOOL_PRESETS.basic);
112
+ }
113
+ const parts = envValue.toLowerCase().split(',').map(s => s.trim()).filter(Boolean);
114
+ let enabledTools = new Set();
115
+ let hasBaseSet = false;
116
+ for (const part of parts) {
117
+ // Handle additions (+tool)
118
+ if (part.startsWith('+')) {
119
+ const toolName = part.slice(1);
120
+ const resolvedTool = resolveToolName(toolName);
121
+ if (resolvedTool) {
122
+ enabledTools.add(resolvedTool);
123
+ }
124
+ else {
125
+ console.warn(`Unknown tool to add: "${toolName}"`);
126
+ }
127
+ continue;
128
+ }
129
+ // Handle removals (-tool)
130
+ if (part.startsWith('-')) {
131
+ const toolName = part.slice(1);
132
+ const resolvedTool = resolveToolName(toolName);
133
+ if (resolvedTool) {
134
+ enabledTools.delete(resolvedTool);
135
+ }
136
+ else {
137
+ console.warn(`Unknown tool to remove: "${toolName}"`);
138
+ }
139
+ continue;
140
+ }
141
+ // Handle presets
142
+ if (part in TOOL_PRESETS) {
143
+ if (!hasBaseSet) {
144
+ // First preset replaces the default
145
+ enabledTools = new Set(TOOL_PRESETS[part]);
146
+ hasBaseSet = true;
147
+ }
148
+ else {
149
+ // Additional presets merge with existing
150
+ for (const tool of TOOL_PRESETS[part]) {
151
+ enabledTools.add(tool);
152
+ }
153
+ }
154
+ continue;
155
+ }
156
+ // Handle individual tools
157
+ const resolvedTool = resolveToolName(part);
158
+ if (resolvedTool) {
159
+ if (!hasBaseSet) {
160
+ // First individual tool creates a new set
161
+ enabledTools = new Set([resolvedTool]);
162
+ hasBaseSet = true;
163
+ }
164
+ else {
165
+ enabledTools.add(resolvedTool);
166
+ }
167
+ }
168
+ else {
169
+ console.warn(`Unknown tool or preset: "${part}"`);
170
+ }
171
+ }
172
+ return enabledTools;
173
+ }
174
+ /**
175
+ * Resolve a tool name or alias to the canonical tool name
176
+ * @param name Tool name or alias
177
+ * @returns Canonical tool name or undefined if not found
178
+ */
179
+ function resolveToolName(name) {
180
+ const normalized = name.toLowerCase();
181
+ // Check if it's already a canonical name
182
+ if (isToolName(normalized)) {
183
+ return normalized;
184
+ }
185
+ // Check aliases
186
+ if (normalized in TOOL_ALIASES) {
187
+ return TOOL_ALIASES[normalized];
188
+ }
189
+ return undefined;
190
+ }
191
+ /**
192
+ * Type guard to check if a string is a valid ToolName
193
+ */
194
+ function isToolName(name) {
195
+ const validTools = [
196
+ 'get_forecast',
197
+ 'get_current_conditions',
198
+ 'get_alerts',
199
+ 'get_historical_weather',
200
+ 'check_service_status',
201
+ 'search_location',
202
+ 'get_air_quality',
203
+ 'get_marine_conditions',
204
+ 'get_weather_imagery',
205
+ 'get_lightning_activity',
206
+ 'get_river_conditions',
207
+ 'get_wildfire_info'
208
+ ];
209
+ return validTools.includes(name);
210
+ }
211
+ /**
212
+ * Tool configuration singleton
213
+ */
214
+ class ToolConfig {
215
+ enabledTools;
216
+ constructor() {
217
+ this.enabledTools = parseEnabledTools(process.env.ENABLED_TOOLS);
218
+ // Log enabled tools for debugging
219
+ if (this.enabledTools.size > 0) {
220
+ console.error(`[ToolConfig] Enabled tools (${this.enabledTools.size}): ${Array.from(this.enabledTools).join(', ')}`);
221
+ }
222
+ else {
223
+ console.error('[ToolConfig] Warning: No tools enabled!');
224
+ }
225
+ }
226
+ /**
227
+ * Check if a specific tool is enabled
228
+ */
229
+ isEnabled(tool) {
230
+ return this.enabledTools.has(tool);
231
+ }
232
+ /**
233
+ * Get all enabled tools
234
+ */
235
+ getEnabledTools() {
236
+ return Array.from(this.enabledTools);
237
+ }
238
+ /**
239
+ * Get available presets
240
+ */
241
+ static getPresets() {
242
+ return { ...TOOL_PRESETS };
243
+ }
244
+ /**
245
+ * Get available tool aliases
246
+ */
247
+ static getAliases() {
248
+ return { ...TOOL_ALIASES };
249
+ }
250
+ }
251
+ // Export singleton instance
252
+ export const toolConfig = new ToolConfig();
253
+ // Export preset definitions for documentation
254
+ export const PRESETS = TOOL_PRESETS;
255
+ export const ALIASES = TOOL_ALIASES;
256
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/config/tools.ts"],"names":[],"mappings":"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"}
@@ -6,11 +6,11 @@
6
6
  */
7
7
  export declare class ApiError extends Error {
8
8
  readonly statusCode: number;
9
- readonly service: 'NOAA' | 'OpenMeteo' | 'NCEI';
9
+ readonly service: 'NOAA' | 'OpenMeteo' | 'NCEI' | 'RainViewer';
10
10
  readonly userMessage: string;
11
11
  readonly helpLinks: string[];
12
12
  readonly isRetryable: boolean;
13
- constructor(message: string, statusCode: number, service: 'NOAA' | 'OpenMeteo' | 'NCEI', userMessage: string, helpLinks?: string[], isRetryable?: boolean);
13
+ constructor(message: string, statusCode: number, service: 'NOAA' | 'OpenMeteo' | 'NCEI' | 'RainViewer', userMessage: string, helpLinks?: string[], isRetryable?: boolean);
14
14
  /**
15
15
  * Format error for display to user
16
16
  */
@@ -21,13 +21,13 @@ export declare class ApiError extends Error {
21
21
  */
22
22
  export declare class RateLimitError extends ApiError {
23
23
  readonly retryAfter?: number;
24
- constructor(service: 'NOAA' | 'OpenMeteo' | 'NCEI', messageOrRetryAfter?: string | number, retryAfter?: number);
24
+ constructor(service: 'NOAA' | 'OpenMeteo' | 'NCEI' | 'RainViewer', messageOrRetryAfter?: string | number, retryAfter?: number);
25
25
  }
26
26
  /**
27
27
  * Service unavailable error - API is down or timing out
28
28
  */
29
29
  export declare class ServiceUnavailableError extends ApiError {
30
- constructor(service: 'NOAA' | 'OpenMeteo' | 'NCEI', messageOrError?: string | Error, originalError?: Error);
30
+ constructor(service: 'NOAA' | 'OpenMeteo' | 'NCEI' | 'RainViewer', messageOrError?: string | Error, originalError?: Error);
31
31
  }
32
32
  /**
33
33
  * Invalid location error - coordinates not supported or out of range
@@ -35,13 +35,13 @@ export declare class ServiceUnavailableError extends ApiError {
35
35
  export declare class InvalidLocationError extends ApiError {
36
36
  readonly latitude?: number;
37
37
  readonly longitude?: number;
38
- constructor(service: 'NOAA' | 'OpenMeteo' | 'NCEI', message: string, latitude?: number, longitude?: number);
38
+ constructor(service: 'NOAA' | 'OpenMeteo' | 'NCEI' | 'RainViewer', message: string, latitude?: number, longitude?: number);
39
39
  }
40
40
  /**
41
41
  * Data not found error - requested data doesn't exist
42
42
  */
43
43
  export declare class DataNotFoundError extends ApiError {
44
- constructor(service: 'NOAA' | 'OpenMeteo' | 'NCEI', message: string);
44
+ constructor(service: 'NOAA' | 'OpenMeteo' | 'NCEI' | 'RainViewer', message: string);
45
45
  }
46
46
  /**
47
47
  * Validation error - invalid input parameters
@@ -1 +1 @@
1
- {"version":3,"file":"ApiError.d.ts","sourceRoot":"","sources":["../../src/errors/ApiError.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACvD,SAAgB,WAAW,EAAE,MAAM,CAAC;IACpC,SAAgB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpC,SAAgB,WAAW,EAAE,OAAO,CAAC;gBAGnC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,EACtC,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAM,EAAO,EACxB,WAAW,GAAE,OAAe;IAgB9B;;OAEG;IACH,aAAa,IAAI,MAAM;CAYxB;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;gBAExB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAiC/G;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,QAAQ;gBACvC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,aAAa,CAAC,EAAE,KAAK;CAiC3G;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,QAAQ;IAChD,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClC,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;gBAGjC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,EACtC,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM;CAerB;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,QAAQ;gBACjC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM;CAYpE;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,KAAK,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAgB,KAAK,CAAC,EAAE,GAAG,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG;CAUzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAetD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAgBvD"}
1
+ {"version":3,"file":"ApiError.d.ts","sourceRoot":"","sources":["../../src/errors/ApiError.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,CAAC;IACtE,SAAgB,WAAW,EAAE,MAAM,CAAC;IACpC,SAAgB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpC,SAAgB,WAAW,EAAE,OAAO,CAAC;gBAGnC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,EACrD,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAM,EAAO,EACxB,WAAW,GAAE,OAAe;IAgB9B;;OAEG;IACH,aAAa,IAAI,MAAM;CAYxB;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;gBAExB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAiC9H;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,QAAQ;gBACvC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,aAAa,CAAC,EAAE,KAAK;CAkC1H;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,QAAQ;IAChD,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClC,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;gBAGjC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,EACrD,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM;CAerB;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,QAAQ;gBACjC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,EAAE,OAAO,EAAE,MAAM;CAYnF;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,KAAK,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAgB,KAAK,CAAC,EAAE,GAAG,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG;CAUzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAetD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAgBvD"}
@@ -86,7 +86,8 @@ export class ServiceUnavailableError extends ApiError {
86
86
  const userMessage = message || `The ${service} weather service is temporarily unavailable. Please try again in a few minutes.`;
87
87
  const helpLink = service === 'NOAA' ? 'https://www.weather.gov/'
88
88
  : service === 'NCEI' ? 'https://www.ncei.noaa.gov/'
89
- : 'https://open-meteo.com/';
89
+ : service === 'RainViewer' ? 'https://www.rainviewer.com/'
90
+ : 'https://open-meteo.com/';
90
91
  super(`${service} API is currently unavailable`, 503, service, userMessage, [helpLink], true // Retryable
91
92
  );
92
93
  this.name = 'ServiceUnavailableError';