@dangahagan/weather-mcp 0.1.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +295 -52
  2. package/dist/config/cache.d.ts +30 -0
  3. package/dist/config/cache.d.ts.map +1 -0
  4. package/dist/config/cache.js +105 -0
  5. package/dist/config/cache.js.map +1 -0
  6. package/dist/config/displayThresholds.d.ts +83 -0
  7. package/dist/config/displayThresholds.d.ts.map +1 -0
  8. package/dist/config/displayThresholds.js +83 -0
  9. package/dist/config/displayThresholds.js.map +1 -0
  10. package/dist/errors/ApiError.d.ts +62 -0
  11. package/dist/errors/ApiError.d.ts.map +1 -0
  12. package/dist/errors/ApiError.js +147 -0
  13. package/dist/errors/ApiError.js.map +1 -0
  14. package/dist/handlers/alertsHandler.d.ts +11 -0
  15. package/dist/handlers/alertsHandler.d.ts.map +1 -0
  16. package/dist/handlers/alertsHandler.js +79 -0
  17. package/dist/handlers/alertsHandler.js.map +1 -0
  18. package/dist/handlers/currentConditionsHandler.d.ts +11 -0
  19. package/dist/handlers/currentConditionsHandler.d.ts.map +1 -0
  20. package/dist/handlers/currentConditionsHandler.js +168 -0
  21. package/dist/handlers/currentConditionsHandler.js.map +1 -0
  22. package/dist/handlers/forecastHandler.d.ts +13 -0
  23. package/dist/handlers/forecastHandler.d.ts.map +1 -0
  24. package/dist/handlers/forecastHandler.js +226 -0
  25. package/dist/handlers/forecastHandler.js.map +1 -0
  26. package/dist/handlers/historicalWeatherHandler.d.ts +12 -0
  27. package/dist/handlers/historicalWeatherHandler.d.ts.map +1 -0
  28. package/dist/handlers/historicalWeatherHandler.js +188 -0
  29. package/dist/handlers/historicalWeatherHandler.js.map +1 -0
  30. package/dist/handlers/locationHandler.d.ts +11 -0
  31. package/dist/handlers/locationHandler.d.ts.map +1 -0
  32. package/dist/handlers/locationHandler.js +113 -0
  33. package/dist/handlers/locationHandler.js.map +1 -0
  34. package/dist/handlers/statusHandler.d.ts +12 -0
  35. package/dist/handlers/statusHandler.d.ts.map +1 -0
  36. package/dist/handlers/statusHandler.js +106 -0
  37. package/dist/handlers/statusHandler.js.map +1 -0
  38. package/dist/index.js +149 -343
  39. package/dist/index.js.map +1 -1
  40. package/dist/services/noaa.d.ts +23 -1
  41. package/dist/services/noaa.d.ts.map +1 -1
  42. package/dist/services/noaa.js +154 -41
  43. package/dist/services/noaa.js.map +1 -1
  44. package/dist/services/openmeteo.d.ts +63 -3
  45. package/dist/services/openmeteo.d.ts.map +1 -1
  46. package/dist/services/openmeteo.js +284 -50
  47. package/dist/services/openmeteo.js.map +1 -1
  48. package/dist/types/noaa.d.ts +64 -12
  49. package/dist/types/noaa.d.ts.map +1 -1
  50. package/dist/types/openmeteo.d.ts +156 -0
  51. package/dist/types/openmeteo.d.ts.map +1 -1
  52. package/dist/utils/cache.d.ts +69 -0
  53. package/dist/utils/cache.d.ts.map +1 -0
  54. package/dist/utils/cache.js +164 -0
  55. package/dist/utils/cache.js.map +1 -0
  56. package/dist/utils/logger.d.ts +59 -0
  57. package/dist/utils/logger.d.ts.map +1 -0
  58. package/dist/utils/logger.js +128 -0
  59. package/dist/utils/logger.js.map +1 -0
  60. package/dist/utils/temperatureConversion.d.ts +12 -0
  61. package/dist/utils/temperatureConversion.d.ts.map +1 -0
  62. package/dist/utils/temperatureConversion.js +17 -0
  63. package/dist/utils/temperatureConversion.js.map +1 -0
  64. package/dist/utils/validation.d.ts +89 -0
  65. package/dist/utils/validation.d.ts.map +1 -0
  66. package/dist/utils/validation.js +177 -0
  67. package/dist/utils/validation.js.map +1 -0
  68. package/package.json +10 -3
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Input validation utilities for API parameters
3
+ * Provides runtime type checking and sanitization
4
+ */
5
+ /**
6
+ * Validate that latitude is a valid number within range
7
+ * @param lat - Latitude value to validate
8
+ * @throws {Error} If latitude is invalid
9
+ */
10
+ export declare function validateLatitude(lat: unknown): asserts lat is number;
11
+ /**
12
+ * Validate that longitude is a valid number within range
13
+ * @param lon - Longitude value to validate
14
+ * @throws {Error} If longitude is invalid
15
+ */
16
+ export declare function validateLongitude(lon: unknown): asserts lon is number;
17
+ /**
18
+ * Validate coordinate pair
19
+ * @param args - Arguments object potentially containing coordinates
20
+ * @returns Validated coordinates
21
+ * @throws {Error} If coordinates are invalid
22
+ */
23
+ export declare function validateCoordinates(args: unknown): {
24
+ latitude: number;
25
+ longitude: number;
26
+ };
27
+ /**
28
+ * Validate a positive integer within optional range
29
+ * @param value - Value to validate
30
+ * @param name - Parameter name for error messages
31
+ * @param min - Minimum allowed value (inclusive)
32
+ * @param max - Maximum allowed value (inclusive)
33
+ * @returns Validated number
34
+ * @throws {Error} If value is invalid
35
+ */
36
+ export declare function validatePositiveInteger(value: unknown, name: string, min?: number, max?: number): number;
37
+ /**
38
+ * Validate a boolean value
39
+ * @param value - Value to validate
40
+ * @param name - Parameter name for error messages
41
+ * @returns Validated boolean
42
+ * @throws {Error} If value is invalid
43
+ */
44
+ export declare function validateBoolean(value: unknown, name: string): boolean;
45
+ /**
46
+ * Validate a date string in ISO format
47
+ * @param value - Value to validate
48
+ * @param name - Parameter name for error messages
49
+ * @returns Validated date string
50
+ * @throws {Error} If value is invalid
51
+ */
52
+ export declare function validateDateString(value: unknown, name: string): string;
53
+ /**
54
+ * Validate forecast days parameter
55
+ * @param args - Arguments object potentially containing days parameter
56
+ * @returns Validated days value (defaults to 7 if not provided)
57
+ * @throws {Error} If days parameter is invalid
58
+ */
59
+ export declare function validateForecastDays(args: unknown): number;
60
+ /**
61
+ * Validate granularity parameter
62
+ * @param value - Value to validate
63
+ * @returns Validated granularity ('daily' or 'hourly')
64
+ * @throws {Error} If value is invalid
65
+ */
66
+ export declare function validateGranularity(value: unknown): 'daily' | 'hourly';
67
+ /**
68
+ * Validate optional boolean with default
69
+ * @param value - Value to validate
70
+ * @param name - Parameter name for error messages
71
+ * @param defaultValue - Default value if undefined
72
+ * @returns Validated boolean
73
+ * @throws {Error} If value is invalid
74
+ */
75
+ export declare function validateOptionalBoolean(value: unknown, name: string, defaultValue: boolean): boolean;
76
+ /**
77
+ * Validate historical weather parameters
78
+ * @param args - Arguments object
79
+ * @returns Validated parameters
80
+ * @throws {Error} If parameters are invalid
81
+ */
82
+ export declare function validateHistoricalWeatherParams(args: unknown): {
83
+ latitude: number;
84
+ longitude: number;
85
+ start_date: string;
86
+ end_date: string;
87
+ limit?: number;
88
+ };
89
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAOpE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAOrE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAW1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAU,EACf,GAAG,GAAE,MAAgC,GACpC,MAAM,CAWR;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKrE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAYvE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAY1D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CActE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,OAAO,GACpB,OAAO,CAKT;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,OAAO,GAAG;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAoCA"}
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dangahagan/weather-mcp",
3
- "version": "0.1.2",
3
+ "version": "0.4.0",
4
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
5
  "mcpName": "io.github.dgahagan/weather-mcp",
6
6
  "main": "dist/index.js",
@@ -21,7 +21,12 @@
21
21
  "dev": "tsx src/index.ts",
22
22
  "start": "node dist/index.js",
23
23
  "prepublishOnly": "npm run build",
24
- "test": "echo \"Error: no test specified\" && exit 1"
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"
25
30
  },
26
31
  "keywords": [
27
32
  "mcp",
@@ -56,7 +61,9 @@
56
61
  },
57
62
  "devDependencies": {
58
63
  "@types/node": "^24.10.0",
64
+ "@vitest/coverage-v8": "^4.0.7",
59
65
  "tsx": "^4.20.6",
60
- "typescript": "^5.9.3"
66
+ "typescript": "^5.9.3",
67
+ "vitest": "^4.0.7"
61
68
  }
62
69
  }