WeatherSAFE
Free, open-source MCP server giving AI assistants 17 weather tools — a one-call weather summary plus forecasts, alerts, air quality, marine, radar, lightning, rivers, wildfires, and historical data back to 1940. Ask by city name or coordinates. Built on free public APIs (NOAA, Open-Meteo). No API ke
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://www.npmjs.com/package/@dangahagan/weather-mcp) [](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.dgahagan/weather-mcp) [](https://opensource.org/licenses/MIT) [](./docs/testing/TESTSUITEREADME.md) [](https://nodejs.org)
Give your AI assistant real weather data — 17 tools, zero API keys, zero signup, zero cost.
Weather MCP is a Model Context Protocol server that connects AI assistants (Claude, Cursor, Cline, Zed, and any other MCP client) to live weather data: forecasts, current conditions, alerts, air quality, marine conditions, lightning, radar, rivers, wildfires, and 85+ years of historical weather. It's built entirely on free public data sources — NOAA, Open-Meteo, MET Norway, USGS, NIFC, NASA FIRMS, RainViewer, and Blitzortung.org — so there is nothing to sign up for and no key to paste in. (A few optional keys unlock extras — see Optional API keys — but no tool ever requires one.)
claude mcp add weather -- npx -y @dangahagan/weather-mcp@latest
That's the whole install for Claude Code. For any other MCP client, add this to its MCP config:
{
"mcpServers": {
"weather": {
"command": "npx",
"args": ["-y", "@dangahagan/weather-mcp@latest"]
}
}
}Then just ask:
"What's the weather in Tokyo this weekend?" "Is there any lightning near the lake right now?" "How does today compare to normal for this time of year?" "Are there wildfires within 50 miles of my cabin?" "Will there be a full moon this weekend?" *"Is this a record h
cb2ece07935bOBSERVED · 2026-10-08Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add weather-mcp -- npx -y @dangahagan/[email protected]
Trust audit
SAFEgrade B · trust 82/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (4 observation(s))
- Network
- declared (7 observation(s))
- Shell
- declared (1 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (25)
const stripped = xml.replace(/^/, '').trimStart();
.mcp.json.example
console.log('Token configured:', !!token);const TOOLS_TS = new URL('../../src/config/tools.ts', import.meta.url);const REPO_ROOT = new URL('../../', import.meta.url);readFileSync(join(__dirname, '../../package.json'), 'utf-8')
readFileSync(join(__dirname, '../../package.json'), 'utf-8')
import { handleGetForecast } from '../../src/handlers/forecastHandler.js';const malicious = 'Seattle"\\n';
expect(isAllowedFeedUrl('https://169.254.169.254/output/gfa/x.cap', feed)).toBe(false);linkLocal: 'https://169.254.169.254/cap_public_website/x',
`https://121.58.193.10/output/gfa/...` instead of `publicalert.pagasa.dost.gov.ph`.
`HTTPS_PROXY=http://127.0.0.1:9` and `HTTP_PROXY=http://127.0.0.1:9`, when the file talks to its
- use a domain name, not an IP address — neither IPv4 (`https://10.0.0.1/`) nor IPv6
const url = new URL(req.url ?? '/', 'http://127.0.0.1');
origin = `http://127.0.0.1:${(server.address() as AddressInfo).port}`;current_units: { time: 'iso8601', interval: 'seconds', us_aqi: '', pm2_5: 'μg/m3' },buildAQCurrentResponse({ ammonia: null }, { ammonia: 'μg/m3' })current_units: { time: 'iso8601', interval: 'seconds', us_aqi: '', pm2_5: 'μg/m3' },current_units: { time: 'iso8601', interval: 'seconds', us_aqi: '', pm2_5: 'μg/m3' },@modelcontextprotocol/sdk, axios, dotenv, fast-xml-parser, luxon, pngjs, @eslint/js, @types/luxon
You can point the lightning tool at your own broker with `BLITZORTUNG_MQTT_URL`, and that address can carry a username and password. The server wrote the whole address, credentials included, to its lo
- **Tool registration and the dispatch moved out of `src/index.ts` into `src/server/weatherServer.ts`, behind `createWeatherServer({ locationStore })`.** The factory returns an **unconnected** `Server| [`NCEI_API_TOKEN`](https://www.ncdc.noaa.gov/cdo-web/token) | Free registration (email) | Official NOAA station climate normals for US locations | Normals are computed from the Open-Meteo reanalysis
Gates applied: no_behavioural_pass.
cb2ece07935bfull audit observations/trust-audit/mcp-server/weather-mcp__weather-114.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-08 | cb2ece07935b | SAFE | B | 82 | first audit |
Questions
What is the Weather MCP server?
Free, open-source MCP server giving AI assistants 17 weather tools — a one-call weather summary plus forecasts, alerts, air quality, marine, radar, lightning, rivers, wildfires, and historical data back to 1940. Ask by city name or coordinates. Built on free public APIs (NOAA, Open-Meteo). No API ke
Is Weather safe to connect to an agent?
The audit found nothing in the source that contradicts what it says it does, and graded it B (82/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B.
What credentials does Weather need?
It reads FIRMS_MAP_KEY, GOOGLE_POLLEN_API_KEY, GOOGLE_WEATHER_API_KEY, NCEI_API_TOKEN and NOAA_CDO_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does Weather run?
It speaks stdio, so it runs as a local process your client starts. It is published on npm as @dangahagan/weather-mcp at 1.34.4.
How current is this page?
The grade is for one exact copy of the source (cb2ece07935b), read on 2026-10-08. The repository is watched and re-audited when it changes.