@dangahagan/weather-mcp 1.34.3 → 1.34.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@dangahagan/weather-mcp)
|
|
4
4
|
[](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.dgahagan/weather-mcp)
|
|
5
5
|
[](https://opensource.org/licenses/MIT)
|
|
6
|
-
[](./docs/testing/TEST_SUITE_README.md)
|
|
7
7
|
[](https://nodejs.org)
|
|
8
8
|
|
|
9
9
|
**Give your AI assistant real weather data — 17 tools, zero API keys, zero signup, zero cost.**
|
|
@@ -58,7 +58,7 @@ Choose this one if you want:
|
|
|
58
58
|
|
|
59
59
|
- **Genuinely free** — every data source is a free public API. No trial that expires, no credit card, no rate-limited "free tier" bait.
|
|
60
60
|
- **No API keys** — install to first forecast in under a minute. Nothing to configure, nothing to leak into a repo. ([Four optional keys](#optional-api-keys) add extras if you want them; the default configuration needs none.)
|
|
61
|
-
- **Fully open source** — MIT licensed, readable TypeScript, 4,
|
|
61
|
+
- **Fully open source** — MIT licensed, readable TypeScript, 4,481 tests. Audit it, fork it, fix it.
|
|
62
62
|
- **Privacy-respecting** — your queries go directly from your machine to public weather APIs. No middleman server, and no telemetry unless you opt in.
|
|
63
63
|
- **Breadth** — 17 tools covering weather, safety hazards (lightning, floods, wildfires), marine conditions, air quality, and historical data back to 1940. Most weather MCPs stop at forecasts.
|
|
64
64
|
|
|
@@ -391,7 +391,7 @@ Being honest about what free public data can and can't do:
|
|
|
391
391
|
```bash
|
|
392
392
|
npm run build # Compile TypeScript
|
|
393
393
|
npm run dev # Run in development mode
|
|
394
|
-
npm test # Run all 4,
|
|
394
|
+
npm test # Run all 4,481 tests
|
|
395
395
|
npm run test:coverage # Coverage report
|
|
396
396
|
npm run audit # Dependency vulnerability scan
|
|
397
397
|
```
|
|
@@ -47,18 +47,20 @@ export declare class GeoMetService {
|
|
|
47
47
|
*/
|
|
48
48
|
getAlerts(latitude: number, longitude: number): Promise<GeoMetAlertFeature[]>;
|
|
49
49
|
/**
|
|
50
|
-
* Request with retry/backoff,
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
50
|
+
* Request with retry/backoff: a 429, a 5xx or a failed connection is
|
|
51
|
+
* retried up to `maxRetries` times with exponential backoff and jitter; a
|
|
52
|
+
* timeout and any other status are not. The decision is
|
|
53
|
+
* `GeoMetRequestError.transient`, set once in `handleError` — the thrown
|
|
54
|
+
* message is never read.
|
|
54
55
|
* @private
|
|
55
56
|
*/
|
|
56
57
|
private makeRequest;
|
|
57
58
|
/**
|
|
58
59
|
* Handle API errors. GeoMet has no service literal in `ApiError` (it is
|
|
59
60
|
* not one of the project's original data sources), so errors are
|
|
60
|
-
* surfaced as plain, sanitized `Error`s
|
|
61
|
-
*
|
|
61
|
+
* surfaced as plain, sanitized `Error`s with fixed, pre-written messages —
|
|
62
|
+
* upstream body text and axios text are never forwarded. Follows
|
|
63
|
+
* `AcisService`'s precedent (`src/services/acis.ts`).
|
|
62
64
|
* @private
|
|
63
65
|
*/
|
|
64
66
|
private handleError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geomet.d.ts","sourceRoot":"","sources":["../../src/services/geomet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAA2B,MAAM,oBAAoB,CAAC;AAMtF,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"geomet.d.ts","sourceRoot":"","sources":["../../src/services/geomet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAA2B,MAAM,oBAAoB,CAAC;AAMtF,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAoFD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,GAAG,GAAE,IAAiB,GACrB,kBAAkB,EAAE,CAWtB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,UAAU,CAAS;IAE3B,YAAY,MAAM,GAAE,mBAAwB,EAuB3C;IAED;;;;;;OAMG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA+BlF;IAED;;;;;;;OAOG;YACW,WAAW;IAiBzB;;;;;;;OAOG;YACW,WAAW;CAuC1B"}
|
package/dist/services/geomet.js
CHANGED
|
@@ -24,9 +24,39 @@ import { CacheConfig } from '../config/cache.js';
|
|
|
24
24
|
const BBOX_HALF_EXTENT = 0.25;
|
|
25
25
|
/** Values of `status_en` (case-insensitive) that mean the alert record itself is over and must be filtered out. */
|
|
26
26
|
const ENDED_STATUS_VALUES = new Set(['ended', 'expired']);
|
|
27
|
+
/**
|
|
28
|
+
* Transport codes that mean the connection failed before any answer — retried.
|
|
29
|
+
* The first five match `jma.ts` and `metno.ts`; the unreachable-network pair
|
|
30
|
+
* is added because a dropped route is as transient as a dropped DNS answer.
|
|
31
|
+
* Timeout codes are deliberately absent (see `handleError`).
|
|
32
|
+
*/
|
|
33
|
+
const CONNECTION_FAILURE_CODES = new Set([
|
|
34
|
+
'ENOTFOUND',
|
|
35
|
+
'ECONNREFUSED',
|
|
36
|
+
'ECONNRESET',
|
|
37
|
+
'EAI_AGAIN',
|
|
38
|
+
'EPIPE',
|
|
39
|
+
'ENETUNREACH',
|
|
40
|
+
'EHOSTUNREACH'
|
|
41
|
+
]);
|
|
27
42
|
function isAxiosLikeError(error) {
|
|
28
43
|
return typeof error === 'object' && error !== null;
|
|
29
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* A GeoMet failure already classified by `handleError`. `transient` is the
|
|
47
|
+
* retry decision — read by `makeRequest`, decided in exactly one place.
|
|
48
|
+
* A plain `Error` subclass on purpose: GeoMet is outside `ApiServiceName`
|
|
49
|
+
* (CLAUDE.md, Error Handling), so `formatErrorForUser` takes its generic
|
|
50
|
+
* branch and renders `Error: <message>` unchanged.
|
|
51
|
+
*/
|
|
52
|
+
class GeoMetRequestError extends Error {
|
|
53
|
+
transient;
|
|
54
|
+
constructor(message, transient) {
|
|
55
|
+
super(message);
|
|
56
|
+
this.transient = transient;
|
|
57
|
+
this.name = 'GeoMetRequestError';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
30
60
|
/** Build a GeoMet `bbox` string ("minLon,minLat,maxLon,maxLat") around a coordinate. */
|
|
31
61
|
function buildBbox(latitude, longitude, halfExtent) {
|
|
32
62
|
const minLon = longitude - halfExtent;
|
|
@@ -127,10 +157,11 @@ export class GeoMetService {
|
|
|
127
157
|
return filterActiveGeoMetAlerts(features);
|
|
128
158
|
}
|
|
129
159
|
/**
|
|
130
|
-
* Request with retry/backoff,
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
160
|
+
* Request with retry/backoff: a 429, a 5xx or a failed connection is
|
|
161
|
+
* retried up to `maxRetries` times with exponential backoff and jitter; a
|
|
162
|
+
* timeout and any other status are not. The decision is
|
|
163
|
+
* `GeoMetRequestError.transient`, set once in `handleError` — the thrown
|
|
164
|
+
* message is never read.
|
|
134
165
|
* @private
|
|
135
166
|
*/
|
|
136
167
|
async makeRequest(bbox, retries = 0) {
|
|
@@ -141,16 +172,11 @@ export class GeoMetService {
|
|
|
141
172
|
return response.data;
|
|
142
173
|
}
|
|
143
174
|
catch (error) {
|
|
144
|
-
if (retries < this.maxRetries) {
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
const baseDelay = Math.pow(2, retries) * 1000;
|
|
150
|
-
const delay = baseDelay * (0.5 + Math.random() * 0.5);
|
|
151
|
-
await new Promise(resolve => setTimeout(resolve, delay));
|
|
152
|
-
return this.makeRequest(bbox, retries + 1);
|
|
153
|
-
}
|
|
175
|
+
if (retries < this.maxRetries && error instanceof GeoMetRequestError && error.transient) {
|
|
176
|
+
const baseDelay = Math.pow(2, retries) * 1000;
|
|
177
|
+
const delay = baseDelay * (0.5 + Math.random() * 0.5);
|
|
178
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
179
|
+
return this.makeRequest(bbox, retries + 1);
|
|
154
180
|
}
|
|
155
181
|
throw error;
|
|
156
182
|
}
|
|
@@ -158,37 +184,43 @@ export class GeoMetService {
|
|
|
158
184
|
/**
|
|
159
185
|
* Handle API errors. GeoMet has no service literal in `ApiError` (it is
|
|
160
186
|
* not one of the project's original data sources), so errors are
|
|
161
|
-
* surfaced as plain, sanitized `Error`s
|
|
162
|
-
*
|
|
187
|
+
* surfaced as plain, sanitized `Error`s with fixed, pre-written messages —
|
|
188
|
+
* upstream body text and axios text are never forwarded. Follows
|
|
189
|
+
* `AcisService`'s precedent (`src/services/acis.ts`).
|
|
163
190
|
* @private
|
|
164
191
|
*/
|
|
165
192
|
async handleError(error) {
|
|
166
193
|
if (isAxiosLikeError(error)) {
|
|
167
194
|
if (error.response) {
|
|
168
195
|
const status = error.response.status;
|
|
169
|
-
const message = error.response.data?.message;
|
|
170
196
|
if (status === 429) {
|
|
171
|
-
throw new
|
|
197
|
+
throw new GeoMetRequestError(`GeoMet API returned status ${status} (rate limit)`, true);
|
|
172
198
|
}
|
|
173
199
|
if (status >= 500) {
|
|
174
|
-
throw new
|
|
200
|
+
throw new GeoMetRequestError(`GeoMet API returned status ${status} (server error)`, true);
|
|
175
201
|
}
|
|
176
|
-
throw new
|
|
202
|
+
throw new GeoMetRequestError(`GeoMet API returned status ${status}`, false);
|
|
177
203
|
}
|
|
204
|
+
// Not retried: a timeout has already spent API_TIMEOUT_MS (30 s by
|
|
205
|
+
// default) and the MCP SDK's request budget is 60 s, so a retry would
|
|
206
|
+
// answer after the client has given up — the v1.34.2 rule for NOAA and
|
|
207
|
+
// Open-Meteo (`isTransientFailure`).
|
|
178
208
|
if (error.code === 'ECONNABORTED' || error.code === 'ETIMEDOUT') {
|
|
179
|
-
throw new
|
|
209
|
+
throw new GeoMetRequestError('GeoMet request timed out', false);
|
|
180
210
|
}
|
|
181
|
-
if (error.code
|
|
182
|
-
throw new
|
|
211
|
+
if (error.code !== undefined && CONNECTION_FAILURE_CODES.has(error.code)) {
|
|
212
|
+
throw new GeoMetRequestError('Unable to connect to GeoMet API', true);
|
|
183
213
|
}
|
|
184
214
|
if (error.message) {
|
|
185
|
-
throw new
|
|
215
|
+
throw new GeoMetRequestError('GeoMet request failed', false);
|
|
186
216
|
}
|
|
187
217
|
}
|
|
218
|
+
// `isAxiosLikeError` accepts any object, so this rethrow is reached only
|
|
219
|
+
// by an `Error` whose message is empty — there is no text to forward.
|
|
188
220
|
if (error instanceof Error) {
|
|
189
221
|
throw error;
|
|
190
222
|
}
|
|
191
|
-
throw new
|
|
223
|
+
throw new GeoMetRequestError('Unknown error occurred while contacting GeoMet API', false);
|
|
192
224
|
}
|
|
193
225
|
}
|
|
194
226
|
//# sourceMappingURL=geomet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geomet.js","sourceRoot":"","sources":["../../src/services/geomet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAwB,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,wEAAwE;AACxE,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,mHAAmH;AACnH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"geomet.js","sourceRoot":"","sources":["../../src/services/geomet.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": "1.34.
|
|
3
|
+
"version": "1.34.4",
|
|
4
4
|
"description": "MCP server giving AI assistants 17 weather tools with zero API keys: global forecasts, current conditions, alerts, air quality, marine conditions, lightning detection, radar imagery, river levels, wildfire tracking, and historical weather back to 1940. Built entirely on free public APIs (NOAA, Open-Meteo, USGS, NIFC).",
|
|
5
5
|
"mcpName": "io.github.dgahagan/weather-mcp",
|
|
6
6
|
"main": "dist/index.js",
|