@dangahagan/weather-mcp 1.33.1 → 1.33.2
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. ([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, 3,
|
|
61
|
+
- **Fully open source** — MIT licensed, readable TypeScript, 3,762 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
|
|
|
@@ -390,7 +390,7 @@ Being honest about what free public data can and can't do:
|
|
|
390
390
|
```bash
|
|
391
391
|
npm run build # Compile TypeScript
|
|
392
392
|
npm run dev # Run in development mode
|
|
393
|
-
npm test # Run all 3,
|
|
393
|
+
npm test # Run all 3,762 tests
|
|
394
394
|
npm run test:coverage # Coverage report
|
|
395
395
|
npm run audit # Dependency vulnerability scan
|
|
396
396
|
```
|
|
@@ -4,14 +4,17 @@
|
|
|
4
4
|
* The not-checked list renders into every verdict so a status call made after a
|
|
5
5
|
* specialist tool's error cannot be read as an all-clear for that upstream.
|
|
6
6
|
* tests/unit/status-handler.test.ts pins both lists against src/services/: a new
|
|
7
|
-
* service file
|
|
8
|
-
*
|
|
7
|
+
* service file, and every host literal in src/services/, fails that test until
|
|
8
|
+
* it is placed in one of them (or declared upstream-free/no-request there). The
|
|
9
|
+
* `sources` basenames and the `hosts` hostnames both exist for that test only.
|
|
9
10
|
*/
|
|
10
11
|
export interface NotCheckedUpstream {
|
|
11
12
|
readonly provider: string;
|
|
12
13
|
readonly sources: readonly string[];
|
|
14
|
+
readonly hosts: readonly string[];
|
|
13
15
|
}
|
|
14
16
|
export declare const STATUS_PROBED_SOURCES: readonly string[];
|
|
17
|
+
export declare const STATUS_PROBED_HOSTS: readonly string[];
|
|
15
18
|
export declare const STATUS_NOT_CHECKED: readonly NotCheckedUpstream[];
|
|
16
19
|
export declare function formatNotCheckedLine(): string;
|
|
17
20
|
//# sourceMappingURL=serviceStatusCoverage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceStatusCoverage.d.ts","sourceRoot":"","sources":["../../src/utils/serviceStatusCoverage.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"serviceStatusCoverage.d.ts","sourceRoot":"","sources":["../../src/utils/serviceStatusCoverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAA+C,CAAC;AAGnG,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAqE,CAAC;AAKvH,eAAO,MAAM,kBAAkB,EAAE,SAAS,kBAAkB,EAqC1D,CAAC;AAGH,wBAAgB,oBAAoB,IAAI,MAAM,CAG7C"}
|
|
@@ -4,33 +4,43 @@
|
|
|
4
4
|
* The not-checked list renders into every verdict so a status call made after a
|
|
5
5
|
* specialist tool's error cannot be read as an all-clear for that upstream.
|
|
6
6
|
* tests/unit/status-handler.test.ts pins both lists against src/services/: a new
|
|
7
|
-
* service file
|
|
8
|
-
*
|
|
7
|
+
* service file, and every host literal in src/services/, fails that test until
|
|
8
|
+
* it is placed in one of them (or declared upstream-free/no-request there). The
|
|
9
|
+
* `sources` basenames and the `hosts` hostnames both exist for that test only.
|
|
9
10
|
*/
|
|
10
11
|
export const STATUS_PROBED_SOURCES = Object.freeze(['noaa.ts', 'openmeteo.ts']);
|
|
11
|
-
|
|
12
|
+
// The hosts the two probes' clients are built on (noaa.ts:51, openmeteo.ts:102).
|
|
13
|
+
export const STATUS_PROBED_HOSTS = Object.freeze(['api.weather.gov', 'archive-api.open-meteo.com']);
|
|
14
|
+
const entry = (provider, sources, hosts) => Object.freeze({ provider, sources: Object.freeze(sources), hosts: Object.freeze(hosts) });
|
|
12
15
|
export const STATUS_NOT_CHECKED = Object.freeze([
|
|
13
|
-
entry('NOAA river gauges (NWPS)', ['noaa.ts']),
|
|
14
|
-
entry('USGS', ['noaa.ts']),
|
|
15
|
-
entry('NOAA NCEI', ['ncei.ts']),
|
|
16
|
-
entry('Aviation Weather Center METAR', ['aviationWeather.ts']),
|
|
17
|
-
entry('Open-Meteo (forecast, air quality, marine, flood, ensemble and geocoding hosts)', ['openmeteo.ts', 'geocoding.ts']
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
entry('
|
|
26
|
-
entry('
|
|
27
|
-
entry('
|
|
28
|
-
entry('
|
|
29
|
-
entry('
|
|
30
|
-
entry('
|
|
31
|
-
entry('
|
|
32
|
-
entry('
|
|
33
|
-
entry('
|
|
16
|
+
entry('NOAA river gauges (NWPS)', ['noaa.ts'], ['api.water.noaa.gov']),
|
|
17
|
+
entry('USGS', ['noaa.ts'], ['waterservices.usgs.gov']),
|
|
18
|
+
entry('NOAA NCEI', ['ncei.ts'], ['www.ncei.noaa.gov']),
|
|
19
|
+
entry('Aviation Weather Center METAR', ['aviationWeather.ts'], ['aviationweather.gov']),
|
|
20
|
+
entry('Open-Meteo (forecast, air quality, marine, flood, ensemble and geocoding hosts)', ['openmeteo.ts', 'geocoding.ts'], [
|
|
21
|
+
'api.open-meteo.com',
|
|
22
|
+
'air-quality-api.open-meteo.com',
|
|
23
|
+
'marine-api.open-meteo.com',
|
|
24
|
+
'flood-api.open-meteo.com',
|
|
25
|
+
'ensemble-api.open-meteo.com',
|
|
26
|
+
'geocoding-api.open-meteo.com',
|
|
27
|
+
]),
|
|
28
|
+
entry('Census.gov geocoder', ['geocoding.ts'], ['geocoding.geo.census.gov']),
|
|
29
|
+
entry('Nominatim (OpenStreetMap)', ['nominatim.ts', 'geocoding.ts'], ['nominatim.openstreetmap.org']),
|
|
30
|
+
entry('MET Norway', ['metno.ts'], ['api.met.no']),
|
|
31
|
+
entry('MeteoAlarm', ['meteoalarm.ts'], ['feeds.meteoalarm.org']),
|
|
32
|
+
entry('MSC GeoMet', ['geomet.ts'], ['api.weather.gc.ca']),
|
|
33
|
+
entry('JMA', ['jma.ts'], ['www.data.jma.go.jp']),
|
|
34
|
+
entry('NDMA SACHET, PAGASA and BMKG', ['nationalCap.ts'], ['sachet.ndma.gov.in', 'publicalert.pagasa.dost.gov.ph', 'www.bmkg.go.id']),
|
|
35
|
+
entry('Google Weather', ['googleWeather.ts'], ['weather.googleapis.com']),
|
|
36
|
+
entry('Google Pollen', ['googlePollen.ts'], ['pollen.googleapis.com']),
|
|
37
|
+
entry('Environment Agency', ['environmentAgency.ts'], ['environment.data.gov.uk']),
|
|
38
|
+
entry('NIFC', ['nifc.ts'], ['services3.arcgis.com']),
|
|
39
|
+
entry('NASA FIRMS', ['firms.ts'], ['firms.modaps.eosdis.nasa.gov']),
|
|
40
|
+
entry('NASA GIBS', ['basemap.ts'], ['gibs.earthdata.nasa.gov']),
|
|
41
|
+
entry('RainViewer', ['rainviewer.ts'], ['api.rainviewer.com', 'tilecache.rainviewer.com']),
|
|
42
|
+
entry('Blitzortung', ['blitzortung.ts'], ['blitzortung.ha.sed.pl']),
|
|
43
|
+
entry('RCC ACIS', ['acis.ts'], ['data.rcc-acis.org']),
|
|
34
44
|
]);
|
|
35
45
|
// Semicolons, not commas: several provider labels contain commas.
|
|
36
46
|
export function formatNotCheckedLine() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceStatusCoverage.js","sourceRoot":"","sources":["../../src/utils/serviceStatusCoverage.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"serviceStatusCoverage.js","sourceRoot":"","sources":["../../src/utils/serviceStatusCoverage.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.33.
|
|
3
|
+
"version": "1.33.2",
|
|
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",
|