@dangahagan/weather-mcp 1.33.16 → 1.33.17
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 +3 -3
- package/dist/services/nominatim.d.ts.map +1 -1
- package/dist/services/nominatim.js +2 -1
- package/dist/services/nominatim.js.map +1 -1
- package/dist/utils/requestSpacer.d.ts +26 -1
- package/dist/utils/requestSpacer.d.ts.map +1 -1
- package/dist/utils/requestSpacer.js +38 -2
- package/dist/utils/requestSpacer.js.map +1 -1
- package/package.json +1 -1
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. ([Three 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,211 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, no telemetry.
|
|
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,211 tests
|
|
395
395
|
npm run test:coverage # Coverage report
|
|
396
396
|
npm run audit # Dependency vulnerability scan
|
|
397
397
|
```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nominatim.d.ts","sourceRoot":"","sources":["../../src/services/nominatim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAGV,uBAAuB,EAGxB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAQ1D,qDAAqD;AACrD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IAGvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuD;IACtF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6C;IAE7E,YAAY,MAAM,GAAE,sBAA2B,EAuB9C;IAED;;;OAGG;YACW,WAAW;IAsFzB;;;;;;OAMG;YACW,gBAAgB;
|
|
1
|
+
{"version":3,"file":"nominatim.d.ts","sourceRoot":"","sources":["../../src/services/nominatim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAGV,uBAAuB,EAGxB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAQ1D,qDAAqD;AACrD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IAGvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuD;IACtF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6C;IAE7E,YAAY,MAAM,GAAE,sBAA2B,EAuB9C;IAED;;;OAGG;YACW,WAAW;IAsFzB;;;;;;OAMG;YACW,gBAAgB;IAU9B;;;OAGG;IACH,OAAO,CAAC,WAAW;IAgCnB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAoBtB;;;;;;;OAOG;IACG,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAU,EACjB,QAAQ,GAAE,MAAa,GACtB,OAAO,CAAC,uBAAuB,CAAC,CA2ClC;IAED;;;OAGG;YACW,WAAW;IAsEzB;;;;;;;;;;;;;;OAcG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBhF;IAED;;;OAGG;YACW,mBAAmB;IA8BjC;;OAEG;IACH,aAAa,2CAEZ;IAED;;OAEG;IACH,UAAU,IAAI,IAAI,CAEjB;CACF"}
|
|
@@ -119,7 +119,8 @@ export class NominatimService {
|
|
|
119
119
|
await this.spacer.reserve((waitMs) => {
|
|
120
120
|
logger.info('Rate limiting: waiting before next request', {
|
|
121
121
|
service: 'Nominatim',
|
|
122
|
-
|
|
122
|
+
// The spacer's monotonic clock reads fractional ms; log whole ms.
|
|
123
|
+
waitTimeMs: Math.round(waitMs)
|
|
123
124
|
});
|
|
124
125
|
});
|
|
125
126
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nominatim.js","sourceRoot":"","sources":["../../src/services/nominatim.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"nominatim.js","sourceRoot":"","sources":["../../src/services/nominatim.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,18 @@
|
|
|
7
7
|
* The old shape (read the last-request time, sleep, write the time after the
|
|
8
8
|
* sleep) let every caller that arrived during the sleep read the same stale
|
|
9
9
|
* value and start together.
|
|
10
|
+
*
|
|
11
|
+
* A reservation alone spaces the *nominal* slots. When the event loop is
|
|
12
|
+
* blocked past two deadlines, Node delivers both overdue timers in one turn,
|
|
13
|
+
* so each waiter re-checks the last actual start on every wake and sleeps the
|
|
14
|
+
* remainder (G122).
|
|
10
15
|
*/
|
|
11
16
|
export interface RequestSpacerDeps {
|
|
12
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Clock in ms. Defaults to `performance.now`, a monotonic clock: only
|
|
19
|
+
* differences between readings are compared, so the epoch is irrelevant and
|
|
20
|
+
* a system-clock correction cannot stretch or shrink a wait.
|
|
21
|
+
*/
|
|
13
22
|
now?: () => number;
|
|
14
23
|
/** Sleep for `ms`. Defaults to a ref'd global `setTimeout`, looked up at call time. */
|
|
15
24
|
sleep?: (ms: number) => Promise<void>;
|
|
@@ -22,10 +31,17 @@ export interface RequestSpacerDeps {
|
|
|
22
31
|
* which names the revisit trigger). The budget is whatever set of callers
|
|
23
32
|
* share one instance. Pure and I/O-free apart from the injected clock and
|
|
24
33
|
* sleep.
|
|
34
|
+
*
|
|
35
|
+
* Spacing is re-checked against the last actual start on every wake, so
|
|
36
|
+
* overdue timers delivered in one turn cannot dispatch together. A sleep that
|
|
37
|
+
* resolves without moving the clock is an injection error and rejects, rather
|
|
38
|
+
* than spinning.
|
|
25
39
|
*/
|
|
26
40
|
export declare class RequestSpacer {
|
|
27
41
|
private readonly minIntervalMs;
|
|
28
42
|
private nextSlot;
|
|
43
|
+
/** Clock reading at which the most recent caller was released. */
|
|
44
|
+
private lastStart;
|
|
29
45
|
private readonly now;
|
|
30
46
|
private readonly sleep;
|
|
31
47
|
constructor(minIntervalMs: number, deps?: RequestSpacerDeps);
|
|
@@ -38,5 +54,14 @@ export declare class RequestSpacer {
|
|
|
38
54
|
* one synchronous run, with no `await` above the write.
|
|
39
55
|
*/
|
|
40
56
|
reserve(onWait?: (waitMs: number) => void): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* After a wake: release if a full interval has passed since the last actual
|
|
59
|
+
* start, else sleep the remainder and look again. The read, the compare and
|
|
60
|
+
* the record are one synchronous run, so a sibling woken in the same turn
|
|
61
|
+
* sees the start just recorded. `onWait` is not called for these sleeps.
|
|
62
|
+
*/
|
|
63
|
+
private recheck;
|
|
64
|
+
/** Record an actual start and keep later reservations behind it. */
|
|
65
|
+
private release;
|
|
41
66
|
}
|
|
42
67
|
//# sourceMappingURL=requestSpacer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestSpacer.d.ts","sourceRoot":"","sources":["../../src/utils/requestSpacer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"requestSpacer.d.ts","sourceRoot":"","sources":["../../src/utils/requestSpacer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,uFAAuF;IACvF,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,aAAa;IAQtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAPhC,OAAO,CAAC,QAAQ,CAA4B;IAC5C,kEAAkE;IAClE,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IAEtD,YACmB,aAAa,EAAE,MAAM,EACtC,IAAI,GAAE,iBAAsB,EAY7B;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxD;IAED;;;;;OAKG;IACH,OAAO,CAAC,OAAO;IAef,oEAAoE;IACpE,OAAO,CAAC,OAAO;CAIhB"}
|
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
* The old shape (read the last-request time, sleep, write the time after the
|
|
8
8
|
* sleep) let every caller that arrived during the sleep read the same stale
|
|
9
9
|
* value and start together.
|
|
10
|
+
*
|
|
11
|
+
* A reservation alone spaces the *nominal* slots. When the event loop is
|
|
12
|
+
* blocked past two deadlines, Node delivers both overdue timers in one turn,
|
|
13
|
+
* so each waiter re-checks the last actual start on every wake and sleeps the
|
|
14
|
+
* remainder (G122).
|
|
10
15
|
*/
|
|
11
16
|
/**
|
|
12
17
|
* Spaces request **starts** at least `minIntervalMs` apart.
|
|
@@ -16,10 +21,17 @@
|
|
|
16
21
|
* which names the revisit trigger). The budget is whatever set of callers
|
|
17
22
|
* share one instance. Pure and I/O-free apart from the injected clock and
|
|
18
23
|
* sleep.
|
|
24
|
+
*
|
|
25
|
+
* Spacing is re-checked against the last actual start on every wake, so
|
|
26
|
+
* overdue timers delivered in one turn cannot dispatch together. A sleep that
|
|
27
|
+
* resolves without moving the clock is an injection error and rejects, rather
|
|
28
|
+
* than spinning.
|
|
19
29
|
*/
|
|
20
30
|
export class RequestSpacer {
|
|
21
31
|
minIntervalMs;
|
|
22
32
|
nextSlot = Number.NEGATIVE_INFINITY;
|
|
33
|
+
/** Clock reading at which the most recent caller was released. */
|
|
34
|
+
lastStart = Number.NEGATIVE_INFINITY;
|
|
23
35
|
now;
|
|
24
36
|
sleep;
|
|
25
37
|
constructor(minIntervalMs, deps = {}) {
|
|
@@ -27,7 +39,7 @@ export class RequestSpacer {
|
|
|
27
39
|
if (typeof minIntervalMs !== 'number' || !Number.isFinite(minIntervalMs) || minIntervalMs < 0) {
|
|
28
40
|
throw new RangeError('RequestSpacer minIntervalMs must be a finite number >= 0');
|
|
29
41
|
}
|
|
30
|
-
this.now = deps.now ?? (() =>
|
|
42
|
+
this.now = deps.now ?? (() => performance.now());
|
|
31
43
|
// The global is read when a sleep starts, never captured at module load,
|
|
32
44
|
// so a spy installed later still sees the call. The timer is ref'd: the
|
|
33
45
|
// wait is short and a caller is awaiting it.
|
|
@@ -49,10 +61,34 @@ export class RequestSpacer {
|
|
|
49
61
|
this.nextSlot = slot + this.minIntervalMs;
|
|
50
62
|
const wait = slot - now;
|
|
51
63
|
if (wait <= 0) {
|
|
64
|
+
this.release(now);
|
|
52
65
|
return Promise.resolve();
|
|
53
66
|
}
|
|
54
67
|
onWait?.(wait);
|
|
55
|
-
return this.sleep(wait);
|
|
68
|
+
return this.sleep(wait).then(() => this.recheck(now));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* After a wake: release if a full interval has passed since the last actual
|
|
72
|
+
* start, else sleep the remainder and look again. The read, the compare and
|
|
73
|
+
* the record are one synchronous run, so a sibling woken in the same turn
|
|
74
|
+
* sees the start just recorded. `onWait` is not called for these sleeps.
|
|
75
|
+
*/
|
|
76
|
+
recheck(before) {
|
|
77
|
+
const now = this.now();
|
|
78
|
+
if (now === before) {
|
|
79
|
+
return Promise.reject(new Error('RequestSpacer: the injected sleep resolved without advancing the injected clock'));
|
|
80
|
+
}
|
|
81
|
+
const due = this.lastStart + this.minIntervalMs;
|
|
82
|
+
if (now < due) {
|
|
83
|
+
return this.sleep(due - now).then(() => this.recheck(now));
|
|
84
|
+
}
|
|
85
|
+
this.release(now);
|
|
86
|
+
return Promise.resolve();
|
|
87
|
+
}
|
|
88
|
+
/** Record an actual start and keep later reservations behind it. */
|
|
89
|
+
release(now) {
|
|
90
|
+
this.lastStart = now;
|
|
91
|
+
this.nextSlot = Math.max(this.nextSlot, now + this.minIntervalMs);
|
|
56
92
|
}
|
|
57
93
|
}
|
|
58
94
|
//# sourceMappingURL=requestSpacer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestSpacer.js","sourceRoot":"","sources":["../../src/utils/requestSpacer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"requestSpacer.js","sourceRoot":"","sources":["../../src/utils/requestSpacer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,aAAa;IAQL,aAAa;IAPxB,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAC5C,kEAAkE;IAC1D,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAC5B,GAAG,CAAe;IAClB,KAAK,CAAgC;IAEtD,YACmB,aAAqB,EACtC,IAAI,GAAsB,EAAE;6BADX,aAAa;QAG9B,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YAC9F,MAAM,IAAI,UAAU,CAAC,0DAA0D,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;QACjD,yEAAyE;QACzE,wEAAwE;QACxE,6CAA6C;QAC7C,IAAI,CAAC,KAAK;YACR,IAAI,CAAC,KAAK;gBACV,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,MAAiC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;QACxB,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;;;OAKG;IACK,OAAO,CAAC,MAAc;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAC7F,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;QAChD,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,oEAAoE;IAC5D,OAAO,CAAC,GAAW;QACzB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACpE,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dangahagan/weather-mcp",
|
|
3
|
-
"version": "1.33.
|
|
3
|
+
"version": "1.33.17",
|
|
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",
|