@cyanheads/noaa-spaceweather-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/noaa-spaceweather-mcp-serverWhat is the current Kp index and aurora forecast?"
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://noaa-spaceweather.caseyjhand.com/mcp
Overview
Space weather from NOAA's Space Weather Prediction Center (SWPC) — geomagnetic storm scales, Kp index, aurora forecasts, solar wind, solar activity, and active alerts. Query current conditions, aurora visibility at a coordinate, or windowed plasma and magnetic-field time series from any MCP client. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
Tools
Tool | Description |
| Current space-weather snapshot: NOAA R/S/G storm scales, latest Kp, a plain-language status summary, and optionally SWPC's forecast discussion explaining the forecast |
| Planetary K-index (0–9) — recent observed 3-hour values with G-scale equivalents and aurora-latitude guidance, plus 3-day forecast |
| OVATION model aurora forecast: global probability grid, optional local lookup by coordinates with go/no-go verdict |
| Real-time solar wind from the active L1 spacecraft: speed, proton density, temperature, and the critical Bz component with the window's most southward reading — explains why current geomagnetic conditions exist |
| Solar flare picture: discrete flare events with peak class and R-scale level, GOES X-ray flux, the daily F10.7 cm radio flux, 3-day flare-class probabilities, active solar regions with per-region probabilities, and solar radiation storm level |
| Active SWPC alerts, watches, and warnings — structured records with product type, severity, issue time, validity window, and full message text |
Related MCP server: solar-mcp
Capability reference
noaa_spaceweather_get_conditions tool
include_discussion(bool, default false) is the only input — otherwise a single call composing storm scales and current Kp into one snapshotReturns today's observed R/S/G storm levels plus SWPC's 3-day forecast series, which starts with today
Forecast days carry what SWPC issues: a G level, and for R and S a probability — R1–R2, R3 or greater, S1 or greater — with no level. A null level means SWPC forecasts none for that day, which is not the same as level 0
Current Kp with G-scale equivalent and aurora-visibility latitude guidance
With
include_discussion, the forecaster-written Forecast Discussion split into its topic sections (Solar Activity, Energetic Particle, Solar Wind, Geospace), each with its 24-hour summary and 3-day forecast textData sourced from the
noaa-scales.json+noaa-planetary-k-index.jsonfeeds, plus thediscussion.txtproduct when the discussion is requested
noaa_spaceweather_get_kp_index tool
window_days(1–7, default 1) bounds the observed series; the forecast series is always SWPC's full 3-day forecastEach observed/forecast record carries Kp, G-scale equivalent, G-scale label, and aurora-latitude guidance
G levels follow SWPC's minus-third band floors — G1 starts at Kp 4.67 (5−), G4 runs through 8.67 (9−), and only Kp 9 is G5
Forecast excludes the feed's embedded historical "observed" entries — only forward-looking
estimated/predictedrowsobservedCountreports how many observed readings matched the window
noaa_spaceweather_get_aurora_forecast tool
Without coordinates: global metadata only — grid point count, global peak probability, peak region
With
latitude/longitude(WGS84, required together): nearest 1°-grid lookup, the centered-dipole geomagnetic latitude those coordinates convert to, the minimum Kp and G level needed at that geomagnetic latitude, and a plain-language go/no-go verdictinvalid_coordinateserror when only one of the pair is suppliedOVATION model updates every ~5 minutes; forecast horizon is ~30–60 minutes ahead
noaa_spaceweather_get_solar_wind tool
window_hours(1–168, default 3) slices client-side from a feed that carries roughly the last 24 hours at ~1-minute cadenceresolution(reduceddefault, orfull) bounds each returned series to 200 records: the window is bucketed by record count and one real measurement is emitted per bucket — the bucket's fastest speed for plasma, its most southward Bz for mag — with the newest record in the window always last. A series already inside the bound comes back untouched, so a default 3-hour call is unaffected;fullreturns every record (~1,400 per series over 24 hours)Plasma (speed, density, temperature) and magnetic field (Bx/By/Bz/Bt GSM) returned as separate oldest-first series
bzStatussurfaces southward Bz (the storm driver) as a plain-language field, andbzMinInWindowwith its time tag reports the window's most southward reading — both computed from the full window, before any reductionlatestFeedPlasmaTime/latestFeedMagTime/feedStalenessHoursdistinguish an empty window from a stale feedEvery record names its reporting spacecraft — no satellite is assumed as "the" active one
noaa_spaceweather_get_solar_activity tool
include_regions(default true) toggles per-region active-solar-region detail to control response sizeflare_hours(1–168, default 24) bounds the discrete flare events returned, filtered on each flare's onset; the feed keeps a rolling 7 days, so 168 returns everything it carriesFlare events come with the classes SWPC publishes — onset, peak, and decay, each with magnitude — the peak flux, and the NOAA R-scale level (0–5) that flux implies. Decay time and class are null while a flare is still in progress, and an empty window names the newest flare the feed holds
GOES X-ray flux (0.1–0.8 nm) with flare-class letter (A/B/C/M/X), the class with magnitude (
flareClassFull, derived by SWPC's truncation rule so it agrees with the published flare classes), and the unformatted flux alongside the display string; recent readings cover the past hourDaily F10.7 cm solar radio flux in sfu with its 90-day mean, from the Noon Penticton report — the value SWPC reports for the day. It can be up to ~24 h old, so its observation time rides with it
3-day C/M/X flare-class and proton-event probabilities, each duplicated under a legacy
*1Dayname and a date-neutral nameIntegral proton flux (≥10 MeV) drives the reported NOAA S-scale (0–5)
Data sourced from the
goes/primary/xrays-6-hour.json,goes/primary/xray-flares-7-day.json,f107_cm_flux.json,solar_probabilities.json,goes/primary/integral-protons-plot-3-day.json, andsolar_regions.jsonfeeds
noaa_spaceweather_get_alerts tool
active_only(default true) — in-force Warnings/Watches/Alerts only. A product stays in force until the feed says otherwise, so this also drops any product a later cancellation names by serial, and all but the newest Watch carryingTHIS SUPERSEDES ANY/ALL PRIOR WATCHES IN EFFECT— alongside cancellations, Summaries, and products whose validity end has passedmax_age_hours(1–720, default 48) bounds how far back to look for candidates; the SWPC feed itself has no expiry. Underactive_only=trueit does not cut off a product whose validity end is still ahead, so a multi-day Watch survives until the last day it forecasts a storm for ends; underactive_only=falseit is a literal age cutoffEach record carries product type, NOAA scale + level (0 means "no scale stated," not zero severity), serial number, parsed validity window, and full message text
cancelledflags a record that cancels a prior product rather than being active; the product it cancels is a separate record, excluded by the serial link rather than by this flagUnder
active_only=truethe response echoes the applied window and counts what it excluded, by reason — so an empty result reads as "quiet" or "everything was filtered" without a second call
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.
SWPC-specific:
All SWPC feeds are public and keyless — no API keys required
Single
SpaceWeatherServicewraps every NOAA SWPC feed — the JSON products and the plain-text forecast discussion — behind onefetchWithTimeout+withRetryfunnel, so both paths classify an upstream failure the same wayHeterogeneous feed normalization: interleaved multi-spacecraft records (solar wind), keyed objects (storm scales), coordinate triples (OVATION), section-delimited text (forecast discussion)
NOAA scale interpretation: raw Kp 6 → "G2 moderate storm — aurora possible to ~55° geomagnetic latitude"
Feed freshness surfaced per-response: solar wind updates ~1 min, aurora ~5 min, Kp 3-hour intervals
Agent-friendly output:
Observed timestamps on every response so agents can reason about data freshness
Plain-language summaries and verdicts alongside raw values — agents can display or reason without re-interpreting indices
Bz component surfaced as a first-class field in solar wind output (southward Bz = primary storm driver)
Typed error contracts with recovery hints, split on whether retrying can help: a transient feed failure is
feed_unavailable→ "Retry in 30–60 s"; a feed path SWPC no longer serves isfeed_moved→ "Retrying will not help", raised on the first attempt
Getting started
Public Hosted Instance
A public instance is available at https://noaa-spaceweather.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"noaa-spaceweather-mcp-server": {
"type": "streamable-http",
"url": "https://noaa-spaceweather.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
Add the following to your MCP client configuration file.
{
"mcpServers": {
"noaa-spaceweather": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/noaa-spaceweather-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"noaa-spaceweather": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/noaa-spaceweather-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"noaa-spaceweather": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/noaa-spaceweather-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/mcpPrerequisites
Bun v1.3.0 or higher (or Node.js v24+).
No API keys required — all SWPC feeds are public.
Installation
Clone the repository:
git clone https://github.com/cyanheads/noaa-spaceweather-mcp-server.gitNavigate into the directory:
cd noaa-spaceweather-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env if needed — all defaults work out of the boxConfiguration
Variable | Description | Default |
| Transport: |
|
| Port for HTTP server. |
|
| Hostname for HTTP server. |
|
| Endpoint path. |
|
| HTTP session mode. This project explicitly uses |
|
| Auth mode: |
|
| Log level (RFC 5424). |
|
| Directory for log files (Node.js only). |
|
| Storage backend. |
|
| Enable OpenTelemetry instrumentation. |
|
No domain-specific API keys are required. See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t noaa-spaceweather-mcp-server .
docker run --rm -p 3010:3010 noaa-spaceweather-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/noaa-spaceweather-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Path | Purpose |
|
|
|
|
| Tool definitions ( |
| Unit and integration tests mirroring |
| Design doc and directory tree. |
Development guide
See CLAUDE.md/AGENTS.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools via the barrel in
src/mcp-server/tools/definitions/index.tsWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Query SEC EDGAR filings, XBRL financials, and company data through MCP. STDIO & Streamable HTTP.
NOAA Space Weather Prediction Center (solar wind, Kp, aurora, alerts)
Hosted MCP server for Xweather weather data: conditions, forecasts, alerts, and more.
Spacenews MCP — wraps the Spaceflight News API v4 (free, no auth)
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides weather forecasts and active alerts for US locations using the National Weather Service API. It supports both local stdio and remote HTTP/SSE transport modes for flexible integration with MCP clients.95 npmGPL 3.0
- AlicenseAqualityDmaintenanceMCP server for space weather and HF propagation conditions — live solar flux, Kp index, DSCOVR solar wind, X-ray flux, alerts, 27-day forecast, and band-by-band outlook through any MCP-compatible AI assistant.72GPL 3.0
- FlicenseAqualityDmaintenanceProvides weather alerts and forecasts via MCP tools, supporting both STDIO and SSE transports.2-
- AlicenseNot gradedqualityAmaintenanceGeocode places, fetch global weather forecasts, ERA5 historical climate, marine conditions, air quality, and terrain elevation via MCP. Provides 11 tools over STDIO or Streamable HTTP.696 npm7Apache 2.0