@cyanheads/nws-weather-mcp-server

@cyanheads/nws-weather-mcp-server

Get US weather forecasts, active alerts, and current observations via the National Weather Service API.

Category
Visit Server

README

<div align="center"> <h1>@cyanheads/nws-weather-mcp-server</h1> <p><b>Get US weather forecasts, active alerts, and current observations via the National Weather Service API. STDIO or Streamable HTTP.</b> <div>7 Tools • 1 Resource</div> </p> </div>

<div align="center">

Version License Docker MCP SDK npm TypeScript Bun

</div>

<div align="center">

Install in Claude Desktop Install in Cursor Install in VS Code

Framework

</div>

<div align="center">

Public Hosted Server: https://nws.caseyjhand.com/mcp

</div>


Tools

Seven tools for real-time US weather data:

Tool Description
nws_get_forecast 7-day or hourly forecast for coordinates. Resolves NWS grid internally.
nws_search_alerts Active weather alerts filtered by area, point, zone, event, severity, urgency, certainty, and status.
nws_get_observations Current conditions by coordinates (nearest station) or station ID.
nws_find_stations Nearby observation stations sorted by distance with bearing.
nws_list_alert_types All valid alert event type names for filter discovery.
nws_get_office_discussion Latest narrative product (AFD, HWO, ZFP, SPS) from a Weather Forecast Office.
nws_get_zone_forecast Text forecast periods for a public NWS forecast zone.

nws_get_forecast

Get the weather forecast for a US location.

  • Default returns named 12-hour periods (14 total, ~7 days)
  • Hourly mode returns up to 156 one-hour periods with dewpoint and humidity
  • Coordinates resolve to NWS grid internally via /points endpoint
  • Formatted timestamps use the resolved local time zone
  • Returns forecast zone and county zone codes for chaining into nws_search_alerts

nws_search_alerts

Search active weather alerts with flexible filtering.

  • Filter by area (state/territory/marine codes), point (lat,lon), zone, event type, severity, urgency, certainty, or status
  • area, point, and zone are mutually exclusive; specify at most one location filter
  • National search when no filters provided
  • Blank optional location filters are ignored so form-based clients can submit empty fields safely
  • Event matching is case-insensitive and partial, so "tornado" matches both watches and warnings
  • status defaults to live Actual alerts, but can be set to Exercise, System, Test, or Draft
  • Results capped at 25 with truncation notice and guidance to narrow filters
  • Validates area codes and point format before API call

nws_get_observations

Current measured conditions from a weather station.

  • Look up by coordinates (finds nearest station) or station ID directly
  • Blank or whitespace-only station_id values are ignored so clients can fall back to coordinates cleanly
  • Coordinate lookups choose the nearest station from the candidates returned by NWS
  • Dual-unit display: F/C, mph/km/h, inHg/hPa, mi/km
  • Observation timestamps use the station's local time zone when available
  • Warns when most measurements are unavailable from a station

nws_find_stations

Discover nearby observation stations.

  • Sorted by haversine distance from query point
  • Returns distance (km) and compass bearing
  • Includes zone codes, elevation, time zone
  • Useful for finding station IDs for nws_get_observations

nws_list_alert_types

List all valid NWS alert event type names.

  • Returns the full set of event types the NWS API recognizes (e.g., "Tornado Warning", "Heat Advisory")
  • Use to discover valid values for the event filter in nws_search_alerts

nws_get_office_discussion

Get the latest narrative product from a Weather Forecast Office (WFO).

  • office: 3-letter WFO code (e.g., SEW for Seattle) — returned as the office field by nws_get_forecast
  • product_type: AFD (Area Forecast Discussion, default), HWO (Hazardous Weather Outlook), ZFP (Zone Forecast Product), SPS (Special Weather Statement)
  • Two-hop fetch: lists products by office/type (newest first), then retrieves full product text
  • Returns productText plus issuanceTime, issuingOffice, productName, productCode, wmoCollectiveId
  • Unknown office returns a clear error with recovery instructions (the NWS API returns HTTP 200 with an empty list, not a 404)

nws_get_zone_forecast

Get the text forecast for a public NWS forecast zone.

  • zone_id: forecast zone code (e.g., WAZ315) — returned by nws_get_forecast (forecastZone), nws_find_stations (forecastZone column), and nws_search_alerts (affectedZones)
  • 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 zone codes (XXC###) are not supported — use the forecast zone code

Resources

URI Pattern Description
nws://alert-types Static list of all valid NWS alert event type names.

Features

Built on @cyanheads/mcp-ts-core:

  • Declarative tool definitions — single file per tool, framework handles registration and validation
  • Unified error handling across all tools
  • Pluggable auth (none, jwt, oauth)
  • Swappable storage backends: in-memory, filesystem, Supabase, Cloudflare KV/R2/D1
  • Structured logging with optional OpenTelemetry tracing
  • Runs locally (stdio/HTTP) or on Cloudflare Workers from the same codebase

NWS-specific:

  • Zero-auth access to the NWS API — no API keys required
  • Automatic coordinate-to-grid resolution with caching (1h TTL)
  • Request timeouts plus retry/backoff for transient NWS API failures
  • Dual-unit display for observations (F/C, mph/km/h, inHg/hPa, mi/km)
  • Continental US, Alaska, Hawaii, and US territories coverage

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_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp

Prerequisites

Installation

  1. Clone the repository:
git clone https://github.com/cyanheads/nws-weather-mcp-server.git
  1. Navigate into the directory:
cd nws-weather-mcp-server
  1. Install dependencies:
bun install

Configuration

Variable Description Default
NWS_USER_AGENT User-Agent for NWS API requests. The API requires this header. (nws-weather-mcp-server, ...)
MCP_TRANSPORT_TYPE Transport: stdio or http. stdio
MCP_HTTP_PORT Port for HTTP server. 3010
MCP_HTTP_HOST Hostname for HTTP server. 127.0.0.1
MCP_LOG_LEVEL Log level: debug, info, notice, warning, error. info

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:stdio
    
  • Run checks and tests:

    bun run devcheck     # Lints, formats, type-checks
    bun run test         # Runs test suite
    

Project structure

Directory Purpose
src/mcp-server/tools/definitions/ Tool definitions (*.tool.ts).
src/mcp-server/resources/definitions/ Resource definitions (*.resource.ts).
src/services/nws/ NWS API client and response types.
src/config/ Environment variable parsing and validation with Zod.

Development guide

See CLAUDE.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for domain-specific logging, ctx.state for storage
  • Add new tools/resources to the barrel exports and the createApp() arrays in src/index.ts

Contributing

Issues and pull requests are welcome. Run checks before submitting:

bun run devcheck
bun run test

License

Apache-2.0 — see LICENSE for details.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured