@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,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities for API parameters
|
|
3
|
+
* Provides runtime type checking and sanitization
|
|
4
|
+
*/
|
|
5
|
+
import { FormatConstants } from '../config/displayThresholds.js';
|
|
6
|
+
/**
|
|
7
|
+
* Validate that latitude is a valid number within range
|
|
8
|
+
* @param lat - Latitude value to validate
|
|
9
|
+
* @throws {Error} If latitude is invalid
|
|
10
|
+
*/
|
|
11
|
+
export function validateLatitude(lat) {
|
|
12
|
+
if (typeof lat !== 'number' || !Number.isFinite(lat)) {
|
|
13
|
+
throw new Error(`Invalid latitude: must be a finite number, received ${typeof lat}`);
|
|
14
|
+
}
|
|
15
|
+
if (lat < -90 || lat > 90) {
|
|
16
|
+
throw new Error(`Invalid latitude: ${lat}. Must be between -90 and 90.`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Validate that longitude is a valid number within range
|
|
21
|
+
* @param lon - Longitude value to validate
|
|
22
|
+
* @throws {Error} If longitude is invalid
|
|
23
|
+
*/
|
|
24
|
+
export function validateLongitude(lon) {
|
|
25
|
+
if (typeof lon !== 'number' || !Number.isFinite(lon)) {
|
|
26
|
+
throw new Error(`Invalid longitude: must be a finite number, received ${typeof lon}`);
|
|
27
|
+
}
|
|
28
|
+
if (lon < -180 || lon > 180) {
|
|
29
|
+
throw new Error(`Invalid longitude: ${lon}. Must be between -180 and 180.`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validate coordinate pair
|
|
34
|
+
* @param args - Arguments object potentially containing coordinates
|
|
35
|
+
* @returns Validated coordinates
|
|
36
|
+
* @throws {Error} If coordinates are invalid
|
|
37
|
+
*/
|
|
38
|
+
export function validateCoordinates(args) {
|
|
39
|
+
if (typeof args !== 'object' || args === null) {
|
|
40
|
+
throw new Error('Invalid arguments: expected object with latitude and longitude');
|
|
41
|
+
}
|
|
42
|
+
const { latitude, longitude } = args;
|
|
43
|
+
validateLatitude(latitude);
|
|
44
|
+
validateLongitude(longitude);
|
|
45
|
+
return { latitude, longitude };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validate a positive integer within optional range
|
|
49
|
+
* @param value - Value to validate
|
|
50
|
+
* @param name - Parameter name for error messages
|
|
51
|
+
* @param min - Minimum allowed value (inclusive)
|
|
52
|
+
* @param max - Maximum allowed value (inclusive)
|
|
53
|
+
* @returns Validated number
|
|
54
|
+
* @throws {Error} If value is invalid
|
|
55
|
+
*/
|
|
56
|
+
export function validatePositiveInteger(value, name, min = 1, max = Number.MAX_SAFE_INTEGER) {
|
|
57
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
58
|
+
throw new Error(`Invalid ${name}: must be a finite number, received ${typeof value}`);
|
|
59
|
+
}
|
|
60
|
+
if (!Number.isInteger(value)) {
|
|
61
|
+
throw new Error(`Invalid ${name}: must be an integer, received ${value}`);
|
|
62
|
+
}
|
|
63
|
+
if (value < min || value > max) {
|
|
64
|
+
throw new Error(`Invalid ${name}: ${value}. Must be between ${min} and ${max}.`);
|
|
65
|
+
}
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validate a boolean value
|
|
70
|
+
* @param value - Value to validate
|
|
71
|
+
* @param name - Parameter name for error messages
|
|
72
|
+
* @returns Validated boolean
|
|
73
|
+
* @throws {Error} If value is invalid
|
|
74
|
+
*/
|
|
75
|
+
export function validateBoolean(value, name) {
|
|
76
|
+
if (typeof value !== 'boolean') {
|
|
77
|
+
throw new Error(`Invalid ${name}: must be a boolean, received ${typeof value}`);
|
|
78
|
+
}
|
|
79
|
+
return value;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Validate a date string in ISO format
|
|
83
|
+
* @param value - Value to validate
|
|
84
|
+
* @param name - Parameter name for error messages
|
|
85
|
+
* @returns Validated date string
|
|
86
|
+
* @throws {Error} If value is invalid
|
|
87
|
+
*/
|
|
88
|
+
export function validateDateString(value, name) {
|
|
89
|
+
if (typeof value !== 'string') {
|
|
90
|
+
throw new Error(`Invalid ${name}: must be a string, received ${typeof value}`);
|
|
91
|
+
}
|
|
92
|
+
// Check if it's a valid date format (YYYY-MM-DD or ISO 8601)
|
|
93
|
+
const date = new Date(value);
|
|
94
|
+
if (isNaN(date.getTime())) {
|
|
95
|
+
throw new Error(`Invalid ${name}: "${value}" is not a valid date format`);
|
|
96
|
+
}
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Validate forecast days parameter
|
|
101
|
+
* @param args - Arguments object potentially containing days parameter
|
|
102
|
+
* @returns Validated days value (defaults to 7 if not provided)
|
|
103
|
+
* @throws {Error} If days parameter is invalid
|
|
104
|
+
*/
|
|
105
|
+
export function validateForecastDays(args) {
|
|
106
|
+
if (typeof args !== 'object' || args === null) {
|
|
107
|
+
return FormatConstants.defaultForecastDays;
|
|
108
|
+
}
|
|
109
|
+
const { days } = args;
|
|
110
|
+
if (days === undefined) {
|
|
111
|
+
return FormatConstants.defaultForecastDays;
|
|
112
|
+
}
|
|
113
|
+
return validatePositiveInteger(days, 'days', 1, FormatConstants.maxForecastDays);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Validate granularity parameter
|
|
117
|
+
* @param value - Value to validate
|
|
118
|
+
* @returns Validated granularity ('daily' or 'hourly')
|
|
119
|
+
* @throws {Error} If value is invalid
|
|
120
|
+
*/
|
|
121
|
+
export function validateGranularity(value) {
|
|
122
|
+
if (value === undefined) {
|
|
123
|
+
return 'daily'; // default
|
|
124
|
+
}
|
|
125
|
+
if (typeof value !== 'string') {
|
|
126
|
+
throw new Error(`Invalid granularity: must be a string, received ${typeof value}`);
|
|
127
|
+
}
|
|
128
|
+
if (value !== 'daily' && value !== 'hourly') {
|
|
129
|
+
throw new Error(`Invalid granularity: "${value}". Must be either "daily" or "hourly".`);
|
|
130
|
+
}
|
|
131
|
+
return value;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Validate optional boolean with default
|
|
135
|
+
* @param value - Value to validate
|
|
136
|
+
* @param name - Parameter name for error messages
|
|
137
|
+
* @param defaultValue - Default value if undefined
|
|
138
|
+
* @returns Validated boolean
|
|
139
|
+
* @throws {Error} If value is invalid
|
|
140
|
+
*/
|
|
141
|
+
export function validateOptionalBoolean(value, name, defaultValue) {
|
|
142
|
+
if (value === undefined) {
|
|
143
|
+
return defaultValue;
|
|
144
|
+
}
|
|
145
|
+
return validateBoolean(value, name);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Validate historical weather parameters
|
|
149
|
+
* @param args - Arguments object
|
|
150
|
+
* @returns Validated parameters
|
|
151
|
+
* @throws {Error} If parameters are invalid
|
|
152
|
+
*/
|
|
153
|
+
export function validateHistoricalWeatherParams(args) {
|
|
154
|
+
if (typeof args !== 'object' || args === null) {
|
|
155
|
+
throw new Error('Invalid arguments: expected object with coordinates and date range');
|
|
156
|
+
}
|
|
157
|
+
const { latitude, longitude, start_date, end_date, limit } = args;
|
|
158
|
+
validateLatitude(latitude);
|
|
159
|
+
validateLongitude(longitude);
|
|
160
|
+
const validatedStartDate = validateDateString(start_date, 'start_date');
|
|
161
|
+
const validatedEndDate = validateDateString(end_date, 'end_date');
|
|
162
|
+
// Ensure start_date is before end_date
|
|
163
|
+
if (new Date(validatedStartDate) > new Date(validatedEndDate)) {
|
|
164
|
+
throw new Error('Invalid date range: start_date must be before or equal to end_date');
|
|
165
|
+
}
|
|
166
|
+
const result = {
|
|
167
|
+
latitude,
|
|
168
|
+
longitude,
|
|
169
|
+
start_date: validatedStartDate,
|
|
170
|
+
end_date: validatedEndDate,
|
|
171
|
+
};
|
|
172
|
+
if (limit !== undefined) {
|
|
173
|
+
result.limit = validatePositiveInteger(limit, 'limit', 1, FormatConstants.maxHistoricalLimit);
|
|
174
|
+
}
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version utility - Single source of truth for application version
|
|
3
|
+
*
|
|
4
|
+
* Reads version from package.json to ensure consistency across all services
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Application version from package.json
|
|
8
|
+
*/
|
|
9
|
+
export declare const VERSION: string;
|
|
10
|
+
/**
|
|
11
|
+
* Get User-Agent string for HTTP requests
|
|
12
|
+
* @returns User-Agent string in format "weather-mcp/VERSION"
|
|
13
|
+
*/
|
|
14
|
+
export declare function getUserAgent(): string;
|
|
15
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH;;GAEG;AACH,eAAO,MAAM,OAAO,EAA0B,MAAM,CAAC;AAErD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version utility - Single source of truth for application version
|
|
3
|
+
*
|
|
4
|
+
* Reads version from package.json to ensure consistency across all services
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync } from 'fs';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
import { dirname, join } from 'path';
|
|
9
|
+
// Read version from package.json once at module load time
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = dirname(__filename);
|
|
12
|
+
const packageJson = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));
|
|
13
|
+
/**
|
|
14
|
+
* Application version from package.json
|
|
15
|
+
*/
|
|
16
|
+
export const VERSION = packageJson.version;
|
|
17
|
+
/**
|
|
18
|
+
* Get User-Agent string for HTTP requests
|
|
19
|
+
* @returns User-Agent string in format "weather-mcp/VERSION"
|
|
20
|
+
*/
|
|
21
|
+
export function getUserAgent() {
|
|
22
|
+
return `weather-mcp/${VERSION}`;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,0DAA0D;AAC1D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAC7D,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAC,OAAiB,CAAC;AAErD;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,eAAe,OAAO,EAAE,CAAC;AAClC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jablum/weather-mcp",
|
|
3
|
+
"version": "1.7.0",
|
|
4
|
+
"description": "MCP (Model Context Protocol) server providing weather data from NOAA and Open-Meteo APIs. Supports forecasts, current conditions, and historical weather data (1940-present) with no API keys required.",
|
|
5
|
+
"mcpName": "io.github.jablum/weather-mcp",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"weather-mcp": "dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=18.0.0"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"dev": "tsx src/index.ts",
|
|
22
|
+
"start": "node dist/index.js",
|
|
23
|
+
"prepublishOnly": "npm run build",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest",
|
|
26
|
+
"test:coverage": "vitest run --coverage",
|
|
27
|
+
"test:ui": "vitest --ui",
|
|
28
|
+
"audit": "npm audit --audit-level=moderate",
|
|
29
|
+
"audit:fix": "npm audit fix"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"mcp",
|
|
33
|
+
"mcp-server",
|
|
34
|
+
"model-context-protocol",
|
|
35
|
+
"weather",
|
|
36
|
+
"weather-api",
|
|
37
|
+
"noaa",
|
|
38
|
+
"open-meteo",
|
|
39
|
+
"forecast",
|
|
40
|
+
"climate",
|
|
41
|
+
"historical-weather",
|
|
42
|
+
"claude",
|
|
43
|
+
"claude-code",
|
|
44
|
+
"ai",
|
|
45
|
+
"llm"
|
|
46
|
+
],
|
|
47
|
+
"author": "Dan Gahagan",
|
|
48
|
+
"license": "MIT",
|
|
49
|
+
"homepage": "https://github.com/jablum/weather-mcp/weather-mcp#readme",
|
|
50
|
+
"repository": {
|
|
51
|
+
"type": "git",
|
|
52
|
+
"url": "git+https://github.com/jablum/weather-mcp/weather-mcp.git"
|
|
53
|
+
},
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/weather-mcp/weather-mcp/issues"
|
|
56
|
+
},
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"@modelcontextprotocol/sdk": "^1.21.1",
|
|
59
|
+
"axios": "^1.13.1",
|
|
60
|
+
"dotenv": "^17.2.3",
|
|
61
|
+
"luxon": "^3.7.2",
|
|
62
|
+
"mqtt": "^5.14.1",
|
|
63
|
+
"ngeohash": "^0.6.3"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@types/luxon": "^3.7.1",
|
|
67
|
+
"@types/ngeohash": "^0.6.8",
|
|
68
|
+
"@types/node": "^24.10.0",
|
|
69
|
+
"@vitest/coverage-v8": "^4.0.8",
|
|
70
|
+
"tsx": "^4.20.6",
|
|
71
|
+
"typescript": "^5.9.3",
|
|
72
|
+
"vitest": "^4.0.8"
|
|
73
|
+
}
|
|
74
|
+
}
|