@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
  [![npm version](https://badge.fury.io/js/@dangahagan%2Fweather-mcp.svg)](https://www.npmjs.com/package/@dangahagan/weather-mcp)
4
4
  [![MCP Registry](https://img.shields.io/badge/MCP-Registry-blue)](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.dgahagan/weather-mcp)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
- [![Tests](https://img.shields.io/badge/tests-4%2C462%20passing-brightgreen)](./docs/testing/TEST_SUITE_README.md)
6
+ [![Tests](https://img.shields.io/badge/tests-4%2C481%20passing-brightgreen)](./docs/testing/TEST_SUITE_README.md)
7
7
  [![Node](https://img.shields.io/badge/node-%3E%3D18-339933?logo=node.js&logoColor=white)](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,462 tests. Audit it, fork it, fix it.
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,462 tests
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, mirroring `NOAAService.makeRequest`
51
- * (`src/services/noaa.ts:175-199`): exponential backoff with jitter,
52
- * retrying only on messages that indicate a transient failure (rate
53
- * limit, server error, timeout).
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 — following `AcisService`'s
61
- * precedent (`src/services/acis.ts`).
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;AAmDD;;;;;;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;;;;;;OAMG;YACW,WAAW;IAwBzB;;;;;;OAMG;YACW,WAAW;CAkC1B"}
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"}
@@ -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, mirroring `NOAAService.makeRequest`
131
- * (`src/services/noaa.ts:175-199`): exponential backoff with jitter,
132
- * retrying only on messages that indicate a transient failure (rate
133
- * limit, server error, timeout).
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 shouldRetry = error.message.includes('rate limit') ||
146
- error.message.includes('server error') ||
147
- error.message.includes('timed out');
148
- if (shouldRetry) {
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 — following `AcisService`'s
162
- * precedent (`src/services/acis.ts`).
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 Error(message || `GeoMet API returned status ${status} (rate limit)`);
197
+ throw new GeoMetRequestError(`GeoMet API returned status ${status} (rate limit)`, true);
172
198
  }
173
199
  if (status >= 500) {
174
- throw new Error(message || `GeoMet API returned status ${status} (server error)`);
200
+ throw new GeoMetRequestError(`GeoMet API returned status ${status} (server error)`, true);
175
201
  }
176
- throw new Error(message || `GeoMet API returned status ${status}`);
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 Error('GeoMet request timed out');
209
+ throw new GeoMetRequestError('GeoMet request timed out', false);
180
210
  }
181
- if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {
182
- throw new Error('Unable to connect to GeoMet API');
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 Error(error.message);
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 Error('Unknown error occurred while contacting GeoMet API');
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":"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"}
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",
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",