@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
  [![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-3%2C756%20passing-brightgreen)](./docs/testing/TEST_SUITE_README.md)
6
+ [![Tests](https://img.shields.io/badge/tests-3%2C762%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. ([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,756 tests. Audit it, fork it, fix it.
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,756 tests
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 fails that test until it is placed in one of them (or declared
8
- * upstream-free there). The `sources` basenames exist for that test only.
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;;;;;;;;GAQG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAA+C,CAAC;AAKnG,eAAO,MAAM,kBAAkB,EAAE,SAAS,kBAAkB,EAsB1D,CAAC;AAGH,wBAAgB,oBAAoB,IAAI,MAAM,CAG7C"}
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 fails that test until it is placed in one of them (or declared
8
- * upstream-free there). The `sources` basenames exist for that test only.
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
- const entry = (provider, sources) => Object.freeze({ provider, sources: Object.freeze(sources) });
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
- entry('Census.gov geocoder', ['geocoding.ts']),
19
- entry('Nominatim (OpenStreetMap)', ['nominatim.ts', 'geocoding.ts']),
20
- entry('MET Norway', ['metno.ts']),
21
- entry('MeteoAlarm', ['meteoalarm.ts']),
22
- entry('MSC GeoMet', ['geomet.ts']),
23
- entry('JMA', ['jma.ts']),
24
- entry('NDMA SACHET, PAGASA and BMKG', ['nationalCap.ts']),
25
- entry('Google Weather', ['googleWeather.ts']),
26
- entry('Google Pollen', ['googlePollen.ts']),
27
- entry('Environment Agency', ['environmentAgency.ts']),
28
- entry('NIFC', ['nifc.ts']),
29
- entry('NASA FIRMS', ['firms.ts']),
30
- entry('NASA GIBS', ['basemap.ts']),
31
- entry('RainViewer', ['rainviewer.ts']),
32
- entry('Blitzortung', ['blitzortung.ts']),
33
- entry('RCC ACIS', ['acis.ts']),
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;;;;;;;;GAQG;AAOH,MAAM,CAAC,MAAM,qBAAqB,GAAsB,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;AAEnG,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAE,OAAiB,EAAsB,EAAE,CACxE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,kBAAkB,GAAkC,MAAM,CAAC,MAAM,CAAC;IAC7E,KAAK,CAAC,0BAA0B,EAAE,CAAC,SAAS,CAAC,CAAC;IAC9C,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1B,KAAK,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/B,KAAK,CAAC,+BAA+B,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAC9D,KAAK,CAAC,iFAAiF,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAC1H,KAAK,CAAC,qBAAqB,EAAE,CAAC,cAAc,CAAC,CAAC;IAC9C,KAAK,CAAC,2BAA2B,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IACpE,KAAK,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC,CAAC;IACjC,KAAK,CAAC,YAAY,EAAE,CAAC,eAAe,CAAC,CAAC;IACtC,KAAK,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,CAAC;IAClC,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC;IACxB,KAAK,CAAC,8BAA8B,EAAE,CAAC,gBAAgB,CAAC,CAAC;IACzD,KAAK,CAAC,gBAAgB,EAAE,CAAC,kBAAkB,CAAC,CAAC;IAC7C,KAAK,CAAC,eAAe,EAAE,CAAC,iBAAiB,CAAC,CAAC;IAC3C,KAAK,CAAC,oBAAoB,EAAE,CAAC,sBAAsB,CAAC,CAAC;IACrD,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1B,KAAK,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC,CAAC;IACjC,KAAK,CAAC,WAAW,EAAE,CAAC,YAAY,CAAC,CAAC;IAClC,KAAK,CAAC,YAAY,EAAE,CAAC,eAAe,CAAC,CAAC;IACtC,KAAK,CAAC,aAAa,EAAE,CAAC,gBAAgB,CAAC,CAAC;IACxC,KAAK,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC;CAC/B,CAAC,CAAC;AAEH,kEAAkE;AAClE,MAAM,UAAU,oBAAoB;IAClC,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5D,OAAO,iCAAiC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,wDAAwD,CAAC;AACvH,CAAC"}
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.1",
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",