nexrad-mcp
Click on "Install 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., "@nexrad-mcpCheck the radar at my location (38.9, -78.2) near KLWX"
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.
nexrad-mcp
An MCP server that gives an AI client (Claude Desktop, Claude Code, any MCP client) direct access to raw NEXRAD radar data — the same data classes a human interrogates in RadarScope:
Level II dual-pol moments (reflectivity, velocity, CC, ZDR, spectrum width, differential phase, opt-in KDP retrieval), queried at any point, at any tilt, for the latest volume or any archived timestamp;
Level 3 derived products (digital VIL, enhanced echo tops, 1-hour and storm-total rainfall, hydrometeor classification, storm cell tracks, mesocyclone detections);
Active NWS warnings for a point;
NWS hourly forecasts and thunderstorm outlook for a point;
Lightning detection via GOES GLM satellite data.
Unlike weather MCPs that return pre-rendered radar images, this decodes the actual data with Py-ART and MetPy, so you can ask questions like "what's the CC over my house right now, and is that a debris signature or just clutter?" — the same interrogation you'd do by hand in RadarScope.
For AI agents: self-install
If you are an AI agent with shell access and want to use this server, install and register it in one command (Claude Code):
claude mcp add nexrad -- uvx --from git+https://github.com/gm2211/nexrad-mcp nexrad-mcpVerify the installation by piping an initialize + tools/list JSON-RPC
handshake into the server and checking that 13 tools are listed:
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
| uvx --from git+https://github.com/gm2211/nexrad-mcp nexrad-mcpExpect a tools/list response containing 13 tools. Note that macOS has no
timeout command; if you need a time limit, prefix the pipeline with
perl -e 'alarm 120; exec @ARGV' instead.
The first run downloads heavy dependencies (Py-ART, scipy, and friends), so allow a few minutes before deciding it has hung. Subsequent runs start in seconds from uv's cache.
If a pre-0.2.0 version of this server was installed before, run
uv cache clean nexrad-mcp once — otherwise uv stays pinned to the old
commit.
Agents without shell access (for example, claude.ai web chat) cannot
self-install this way. In that case the server must be hosted remotely
(nexrad-mcp --transport http) and added as a custom connector by the user,
or wired into Claude Desktop's claude_desktop_config.json by the user.
Sandboxed agents with a shell but no control over their MCP client config
(for example, Cowork sessions) don't need MCP registration at all: call the
library directly instead, e.g.
uvx --from git+https://github.com/gm2211/nexrad-mcp python -c "from nexrad_mcp.forecast import get_hourly_forecast; print(get_hourly_forecast(38.9, -77.0, 6))"
— every MCP tool is a plain function in nexrad_mcp.radar, .level3,
.forecast, .lightning, and .warnings.
Related MCP server: Weather MCP Server
Installation
Requires uv. The first run is slow (a minute or
two): uvx resolves and installs Py-ART/MetPy, which pull in scipy and
friends. Subsequent runs start in seconds from uv's cache.
Claude Code
claude mcp add nexrad -- uvx --from git+https://github.com/gm2211/nexrad-mcp nexrad-mcpClaude Desktop — add to claude_desktop_config.json
(macOS: ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"nexrad": {
"command": "uvx",
"args": ["--from", "git+https://github.com/gm2211/nexrad-mcp", "nexrad-mcp"]
}
}
}Any other MCP client — configure the server command as:
uvx --from git+https://github.com/gm2211/nexrad-mcp nexrad-mcp(stdio transport; no API keys or credentials — all data sources are public.)
Transport flags — by default the server speaks stdio. To host it over streamable HTTP instead (e.g. as a remote connector), use:
nexrad-mcp --transport http --host 127.0.0.1 --port 8748--transport:stdio(default) orhttp--host: bind address for http (default127.0.0.1)--port: bind port for http (default8748)
For development, clone and uv sync, then run uv run nexrad-mcp.
Tools
Tool | What it answers | Source |
| Which radar covers my location? | Py-ART site table |
| What's the newest volume and how old is it? | Level II |
| What are all products at this exact spot? Optional: at a past time ( | Level II |
| What does the storm look like at every height above this spot? Includes composite reflectivity and 18 dBZ echo top | Level II |
| Any cores near me, and which direction? | Level II |
| Is the nearest storm coming toward me? | Level II |
| Which derived products are fresh at this site? | Level 3 |
| VIL / echo tops / rainfall / precip type at this spot | Level 3 |
| NWS-tracked cells with motion + forecast tracks, mesocyclone detections | Level 3 |
| Any tornado/severe/flood warnings here right now? | api.weather.gov |
| What's the hourly forecast (temp, wind, precip chance, short description)? | api.weather.gov |
| What's the hourly thunderstorm probability, wind gust, and precip probability outlook? | api.weather.gov |
| Any lightning near me in the last few minutes? | GOES GLM (NOAA, public) |
site is a 4-letter radar ID (e.g. KLWX = Sterling VA) — use
find_nearest_radar if you don't know it.
RadarScope data-parity coverage
RadarScope data class | Surfaced here | Source | Notes |
Base reflectivity / velocity / CC / ZDR / spectrum width | ✅ | Level II | velocity auto-falls back to the Doppler split cut |
Differential phase / KDP | ✅ raw PhiDP always; KDP via | Level II | |
Storm-relative velocity | ✅ | Level II (computed) | supply storm motion, e.g. from |
Composite reflectivity, echo tops | ✅ | Level II + Level 3 | |
Digital VIL (DVL) | ✅ | Level 3 | kg/m² |
Enhanced echo tops (EET) | ✅ | Level 3 | kft, with "capped" flag |
1-hour / storm-total precip (DAA/DTA) | ✅ | Level 3 | inches, dual-pol QPE |
Hydrometeor classification (HHC) | ✅ | Level 3 | text class (rain/hail/snow/…) |
Storm tracks (STI) | ✅ | Level 3 (NST) | position, motion vector, past + forecast track |
Mesocyclone (MD) | ✅ | Level 3 (NMD) | detections with lat/lon |
TVS (tornado vortex signature) | ❌ product retired by the NWS | — | no fleet-wide NTV data published since before 2025 (verified in-bucket); use mesocyclones + low-CC debris checks + warnings instead |
Hail index (HI) | ❌ product retired by the NWS | — | same; hail potential via DVL/EET/HHC |
NWS warnings/watches | ✅ | api.weather.gov | radar-relevant filter by default |
Lightning | ✅ | GOES GLM (NOAA, public) | total lightning (in-cloud + cloud-to-ground), ~1-2 min latency, Americas + adjacent oceans only |
Beyond RadarScope parity — forecasting (RadarScope doesn't do this at all):
Feature | Surfaced here | Source |
Hourly forecast (temp, wind, precip chance) | ✅ | api.weather.gov |
Thunderstorm probability outlook | ✅ | api.weather.gov (gridpoint data) |
Data sources
Level II: NOAA Open Data volumes on AWS S3, discovered via the
nexradawsindex. Decoded with Py-ART.Level 3: the public
unidata-nexrad-level3S3 bucket (anonymous access). Decoded with MetPy; scaling cross-checked against Py-ART.Warnings, hourly forecast, thunderstorm outlook:
api.weather.gov(requires only a User-Agent header).Lightning: GOES GLM (Geostationary Lightning Mapper) Level 2 data on the public
noaa-goes19(GOES-East) andnoaa-goes18(GOES-West) S3 buckets, anonymous access. Decoded with netCDF4.
Try it without MCP
uv run python -c "from nexrad_mcp import radar as R; \
import json; print(json.dumps(R.query_point('KLWX', 38.905, -78.235), indent=2))"How the polling works
Each call lists the current UTC day's volumes for the site via the nexradaws
index (the main archive bucket blocks anonymous listing, so we go through the
index rather than raw S3), grabs the newest *_V06 key, downloads it, and
decodes it. A completed volume in VCP 212 lands every ~4–6 minutes, so
re-querying more often than ~30–60s just returns the same file. Volume loads
are LRU-cached so repeated queries on one volume don't re-decode. Level 3
products update on a similar cadence and are fetched by day-prefixed key
listing (the bucket is a flat namespace, SSS_PPP_YYYY_MM_DD_HH_MM_SS).
Caveats
Not for life-safety. This is an analysis aid. For warnings, always use NWS / official sources (
get_active_warningssurfaces exactly those). The tools return numbers; interpreting a debris signature vs. clutter still needs judgment (which is exactly why it pairs well with an LLM that can weigh reflectivity + velocity + CC together).Beam height rises with range: at 100+ km the lowest tilt is well above ground, so a clean surface reading is best within ~60–80 km of the radar.
get_vertical_profilereports the actual beam height of every sample.Radar-estimated rainfall (DAA/DTA) is an estimate; gauges beat radar.
License
MIT. NEXRAD data is public domain (NOAA); Level 3 mirror courtesy of Unidata.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/gm2211/nexrad-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server