@cyanheads/nws-weather-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@cyanheads/nws-weather-mcp-serverWhat's the forecast for Denver, CO?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Public Hosted Server: https://nws.caseyjhand.com/mcp
Overview
US weather data from the National Weather Service API (api.weather.gov). Get forecasts, active alerts, current observations, forecast-office narrative products, and zone-level text forecasts for any coordinate in the 50 states, US territories, and adjacent marine areas. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
Tools
Tool | Description |
| 7-day or hourly forecast for coordinates. Resolves NWS grid internally. |
| Active weather alerts filtered by area, point, zone, event, severity, urgency, certainty, and status. |
| Current conditions by coordinates (nearest station) or station ID. |
| Nearby observation stations sorted by distance with bearing. |
| All valid alert event type names for filter discovery. |
| Latest narrative product (AFD, HWO, ZFP, SPS) from a Weather Forecast Office. |
| Text forecast periods for a public NWS forecast zone. |
Resources
Resource | Description |
| Static list of all valid NWS alert event type names. |
Also reachable via the nws_list_alert_types tool, for MCP clients that don't support resources.
Related MCP server: weather-mcp
Capability reference
nws_get_forecast tool
Default returns named 12-hour periods (14 total, ~7 days)
Hourly mode returns 48 one-hour periods per page with dewpoint and humidity — the upstream feed carries ~156, and the pre-page total (
totalCount, against this page'sshown) plus a truncation notice are surfaced in the enrichment blockPass the returned
nextCursorback ascursorto reach the remaining periods; it is omitted on the last pageCoordinates resolve to NWS grid internally via
/pointsFormatted timestamps use the resolved local time zone
Returns forecast zone and county zone codes for chaining into
nws_search_alerts
nws_search_alerts tool
area,point,zone,region_type, andregionare mutually exclusive location filters (at most one, or none for a national search);eventmatches case-insensitively and partially ("tornado"matches both watches and warnings);statusdefaults toActual(alsoExercise,System,Test,Draft)A blank string filter or an empty-array filter is rejected rather than silently widened to an unfiltered search
Area/point/zone shape is validated locally before the API call, failing fast with typed
invalid_area_code/invalid_point/invalid_zonereasons instead of a raw upstream 400limit(1-25, default 25) pages results;totalCountis the full distinct-alert count (duplicates collapsed onid) againstshown, andnextCursorcontinues — pages are contiguous only within one response, since every call re-fetches the live feedEach
affectedZonesentry carries its zonetype(forecast/county/fire) so callers know which codes chain intonws_get_zone_forecastCAP message-lifecycle fields (
sent,effective,status,messageType,references) are distinct from the hazard's ownonset/ends
nws_get_observations tool
Look up by coordinates (resolves nearest station) or
station_iddirectly; a blank/whitespace-onlystation_idis rejected rather than silently falling back to coordinatesDual-unit display on every measurement: F/C, mph/km/h, inHg/hPa, mi/km
Observation timestamps use the station's local time zone when known
Flags observations older than 2 hours with a staleness notice, and warns separately when most measurements are unavailable from the station
nws_find_stations tool
Sorted by haversine distance from the query point; each result carries distance (km), bearing, zone codes, elevation, and time zone
Optional
limit(1-50, default 10) sizes the page;totalCountreports every station near the point and holds steady across pages, whileshownis the size of this pagePass the returned
nextCursorback ascursorto reach stations beyond the page; it is omitted on the last pageUseful for finding station IDs for
nws_get_observations
nws_list_alert_types tool
Returns the full set of event types the NWS API recognizes (e.g., "Tornado Warning", "Heat Advisory")
Use to discover valid values for the
eventfilter innws_search_alerts
nws_get_office_discussion tool
office: 3-letter WFO code (e.g., "SEW" for Seattle) — returned as theofficefield bynws_get_forecastproduct_type:AFD(default, forecaster reasoning and model analysis),HWO(1-7 day hazard outlook),ZFP(zone-by-zone text forecast),SPS(short-fuse advisory)Returns
productTextplusissuanceTime,issuingOffice,productName,productCode,wmoCollectiveIdAn unknown office, or a valid office with no current product of the requested type, fails with a typed
no_productserror and recovery guidance — NWS answers HTTP 200 with an empty list rather than a 404
nws_get_zone_forecast tool
zone_id: forecast zone code (e.g., "WAZ315") — returned bynws_get_forecast(forecastZone),nws_find_stations(forecastZonecolumn), andnws_search_alerts(thecodeof anaffectedZonesentry withtype: "forecast")Returns named periods (e.g., "Today", "Tonight", "Monday") with narrative text from local forecasters
Completes the alert-to-forecast chain: look up alert zones, then retrieve zone forecasts
County (
XXC###) and fire zone codes are not supported here — NWS publishes no text forecast for them, though they remain valid values for thezonefilter onnws_search_alerts; an unsupported or unknown zone fails with a typedzone_not_founderror
nws://alert-types resource
Static list of all valid NWS alert event type names, returned as
application/jsonDuplicates
nws_list_alert_typesfor MCP clients that support resources rather than toolsCached publicly for 1 hour — NWS revises this vocabulary on the order of years
No parameters
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
NWS-specific:
Sends the required
User-Agentheader automatically (configurable viaNWS_USER_AGENT) — NWS returns 403 without oneAutomatic coordinate-to-grid resolution via
/points, cached for 1h since grid cells rarely changeRequest timeouts plus retry/backoff for transient NWS API failures
Zero-auth access — no API keys required
Dual-unit display for observations (F/C, mph/km/h, inHg/hPa, mi/km)
Agent-friendly output:
Provenance — forecast, observation, and station responses echo office codes, time zones, and forecast/county zone codes so agents can chain directly into
nws_get_office_discussion,nws_get_zone_forecast, andnws_search_alertswithout re-deriving themGuidance over silence — empty, truncated, or cursor-past-end results carry a
noticenaming the cause and the concrete next step, rather than an empty array or a bare pageDiscriminated output contracts — zone
type(forecast/county/fire), CAPstatus/messageTypedistinct from hazardonset/ends, and typed error reasons (invalid_area_code,no_products,zone_not_found, …) — callers branch on data, not string parsingResponse shaping — upstream single-unit floats are normalized into dual-unit pairs (F/C, mph/km/h, inHg/hPa, mi/km) and rounded to match what
format()renders, so structured and text output agree
Getting started
Public Hosted Instance
A public instance is available at https://nws.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"nws-weather-mcp-server": {
"type": "streamable-http",
"url": "https://nws.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
Add the following to your MCP client configuration file.
{
"mcpServers": {
"nws-weather-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/nws-weather-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"nws-weather-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/nws-weather-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"nws-weather-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/nws-weather-mcp-server:latest"]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_SESSION_MODE=stateless MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Installation
Clone the repository:
git clone https://github.com/cyanheads/nws-weather-mcp-server.gitNavigate into the directory:
cd nws-weather-mcp-serverInstall dependencies:
bun installConfiguration
Variable | Description | Default |
| User-Agent for NWS API requests. The API requires this header. |
|
| Transport: |
|
| Port for HTTP server. |
|
| Hostname for HTTP server. |
|
| HTTP session mode: |
|
| Log level: |
|
See .env.example for the full list including auth, storage, and OpenTelemetry options.
Running the server
Local development
Build and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdioRun checks and tests:
bun run devcheck # Lints, formats, type-checks bun run test # Runs test suite
Project structure
Directory | Purpose |
|
|
| Tool definitions ( |
| Resource definitions ( |
| NWS API client and response types. |
| Environment variable parsing and validation with Zod. |
| Unit and integration tests mirroring |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor domain-specific logging,ctx.statefor storageAdd new tools/resources to the barrel exports and the
createApp()arrays insrc/index.tsWrap NWS API calls: validate raw JSON → normalize to domain types → return the output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
US weather & geo for AI agents: forecasts, alerts, earthquakes, elevation, geocoding. No keys.
US weather & geo for AI agents: forecasts, alerts, earthquakes, elevation, geocoding. No keys.
US weather alerts (NWS): warnings, watches. $0.01/query. Register in-session — free testnet funds.
Provide real-time and forecast weather information for locations in the United States using natura…
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides weather alerts and forecasts for US locations using the National Weather Service API.102 npmGPL 3.0
- AlicenseNot gradedqualityDmaintenanceProvides US weather alerts and forecasts via the National Weather Service API.102 npmGPL 3.0
- FlicenseNot gradedqualityDmaintenanceProvides weather forecasts, current conditions, and alerts for US locations using the National Weather Service API.1-
- FlicenseBqualityDmaintenanceProvides weather forecasts and active alerts from the US National Weather Service API for US locations.2-