Smarter Weather
by smarterweather · remote · local (npm) · no sign-in to list tools · v0.1.1 · published by GitHub user smarterweather
Smarter Weather MCP: forecasts, alerts, outlooks, observations, AQI, grids, and map imagery.
14 tools: 14 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things0Claude Code: ask
- Only reads14Claude Code: allow: see these tools
No check matched anything in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http weather https://mcp.smarterweather.comTools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
14 tools
Only reads 14Claude Code: allow
describe_datasetVariables available in a dataset, with standard names, units, descriptions, and the time range of available data.Reads text others writeNo findings
Why it is in this group
- The name "describe_dataset" says "describe": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Variables available in a dataset, with standard names, units, descriptions, and the time range of available data. Use before query_dataset to discover valid variable names. Example: {"dataset_id": "nbm_conus"}.
Annotations the server declares
- title: Describe dataset
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
get_alertsNWS watches, warnings, advisories.Reads text others writeNo findings
Why it is in this group
- The name "get_alerts" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it NWS watches, warnings, advisories. Point (city/ZIP/lat+lon): containing polygons. BBox or US state/DC/CONUS (codes, full names, US/national): intersecting polygons. A city miss is not a statewide all-clear — query the state or a bbox; never say regional inventory is impossible. NY/WA and "New York State"/"Washington State" are states; "New York"/"Washington" stay cities. Omit at for now; at (ISO-8601 UTC) is the snapshot then. Empty = all-clear or purged (~24h). alert_id = detail+geometry, ignores at. Ex: {"location":"WI","events":["Tornado Warning"]}.
Annotations the server declares
- title: Get NWS alerts
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
get_current_conditionsCurrent weather right now at a location from two independent sources in one call: the RTMA gridded analysis (exact-point values, updated sub-hourly) and the nearest METAR station o…Reads text others writeNo findings
Why it is in this group
- The name "get_current_conditions" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Current weather right now at a location from two independent sources in one call: the RTMA gridded analysis (exact-point values, updated sub-hourly) and the nearest METAR station observation (ground truth with raw METAR, flight category). Use the analysis for point-accurate values and the station for verification. Analysis fields: temperature_2m, dew_point_2m, relative_humidity_2m (derived here from temperature and dew point; listed in analysis.derived), wind_speed_10m, wind_direction_10m, wind_gusts_10m, surface_pressure (station pressure at ground level, not sea-level pressure), visibility, cloud_cover, cloud_ceiling, in units (labels in analysis.unit_labels). nearest_station is the station's own report, unconverted. For a forecast, use get_forecast. Example: {"location": "Pella, IA"}.
Annotations the server declares
- title: Get current conditions
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
get_forecastComplete weather overview for a location: current conditions, daily forecast (SPC threats, severity; view "detailed" adds CAPE, UV, full day/night periods), active alerts, and outl…Reads text others writeNo findings
Why it is in this group
- The name "get_forecast" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Complete weather overview for a location: current conditions, daily forecast (SPC threats, severity; view "detailed" adds CAPE, UV, full day/night periods), active alerts, and outlooks in one call. Pre-aggregated across NBM, HRRR, GFS, RTMA, and SPC and unit-converted server-side. Primary weather tool; reach for lower-level tools only when you need raw observations or a specific dataset. Times are UTC ISO 8601; quote daily[].astro.local to users, not UTC. If forecast.location.timezone_resolved is false, zone unknown: state times as UTC, never as local. Accepts a place name directly. Examples: {"location": "Denver, CO"} or {"location": "Portland, OR", "days": 5} or {"lat": 41.4, "lon": -92.9}.
Annotations the server declares
- title: Get forecast
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
get_forecast_distributionNBM probabilistic guidance for one weather aspect: percentiles (p10-p90), exceedance probabilities and ensemble spread.Reads text others writeNo findings
Why it is in this group
- The name "get_forecast_distribution" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it NBM probabilistic guidance for one weather aspect: percentiles (p10-p90), exceedance probabilities and ensemble spread. Use this for any question about odds, ranges, potential or confidence ("how much could we get", "range of possible highs", "how sure is this") -- a deterministic forecast value cannot answer one. Reading the percentiles: p50 is the most likely outcome, p90 is the reasonable worst case when the risk is the high end (snow totals, wind, rainfall), and p10 when the risk is the low end (cold, visibility, ceiling). A single percentile is not the forecast -- report the likely value with the tail that matters, and label which is which. Aspects: precip (PoP, QPF + percentiles), snow (accumulation percentiles, >1/2/4in probabilities, snow level, snow-type probability), ice (ice accretion, freezing-rain / ice-pellet probabilities), temperature (`daily` high/low p10/p50/p90: the NBM value -/+ 1.28 stddev; hourly temp + stddev), wind (speed/gust percentiles), severe (thunderstorm probability plus NBM CWASP, a severe-environment index, both in percent: severe_weather_prob_p50 is the median CWASP value and severe_weather_prob_above_75 the probability CWASP exceeds 75; NBM has no tornado, hail or damaging-wind odds; SPC's: get_outlooks (guidance) hazard=severe), aviation (LIFR/IFR/MVFR visibility + ceiling odds), confidence (ensemble stddev; low = settled, high = details still in play). Labels in unit_labels. Example: {"location": "Denver, CO", "aspect": "snow", "hours": 72}.
Annotations the server declares
- title: Get forecast distribution
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
get_hourly_forecastBlended hourly forecast: temperature, feels-like, humidity, wind, precipitation probability/amount, conditions, and icon per hour.Reads text others writeNo findings
Why it is in this group
- The name "get_hourly_forecast" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Blended hourly forecast: temperature, feels-like, humidity, wind, precipitation probability/amount, conditions, and icon per hour. hourly[0] is the current or next hour; hourly_coverage.first_time says which. Timestamps are UTC ISO 8601; convert to the local timezone before presenting. Ask for the days you need up front -- one call with days: 4 beats four calls. ALWAYS check hourly_coverage before answering about a specific hour: it reports first_time and last_time (the window the rows actually span), sample_interval_hours (past the first day rows are every 2-3h, not every hour), and truncated: true when upstream returned less than you asked for. If the hour the user cares about is after last_time, say the forecast does not reach that far yet rather than answering from the nearest row you do have. For one stretch of time ask for that stretch with hours_from/hours_to: it comes back hour by hour even where the full range would be sampled. Accepts a place name or coordinates. Examples: {"location": "Portland, OR", "days": 2} or {"lat": 41.88, "lon": -87.63, "hours_from": 36, "hours_to": 48}.
Annotations the server declares
- title: Get hourly forecast
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
get_observed_precipitationHow much rain fell: observed precipitation totals at a location.Reads text others writeNo findings
Why it is in this group
- The name "get_observed_precipitation" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it How much rain fell: observed precipitation totals at a location. Use for "did it rain", "how much rain fell", "rain in the last 24 hours / since yesterday". Source: MRMS MultiSensor QPE Pass2 (radar bias-corrected to rain gauges) over 1/3/6/24/48/72 h windows (CONUS; 1 h only in Alaska and Hawaii). Values have about 2 mm (0.08 in) resolution, so 0 means under about 1 mm; data runs about an hour behind real time. Pass `at` (within 33 h) for totals ending at a past time (newest frame up to 3 h before it). With include_nowcast (default) it also returns a next-hour radar nowcast (CONUS): peak intensity (light/moderate/heavy), type and start time, not an amount. Forecast totals past the next hour: get_period_totals (planning); station reports: get_observations (observed).
Annotations the server declares
- title: Observed precipitation
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
get_platform_statusCurrent data-freshness status of the weather platform: overall state, per-source states (ok / degraded / outage / no_signal), open incidents with cause attribution (provider outage…Reads text others writeNo findings
Why it is in this group
- The name "get_platform_status" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Current data-freshness status of the weather platform: overall state, per-source states (ok / degraded / outage / no_signal), open incidents with cause attribution (provider outage vs internal processing delay), and active provider advisories. Use this when a user asks whether data is current, when other tools return surprisingly stale data, or before presenting time-critical weather. If a source is degraded or in outage, tell the user their data may be stale rather than presenting it as live. No inputs. Refreshed about every 5 minutes.
Annotations the server declares
- title: Get platform status
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
get_time_contextComplete temporal context for a location: local time, timezone, 14-day calendar with day names and Today/Tomorrow offsets, sunrise/sunset/solar times (from the weather pipeline's a…Reads private dataReads text others writeNo findings
Why it is in this group
- The name "get_time_context" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "calendar": it reads calendars.
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Complete temporal context for a location: local time, timezone, 14-day calendar with day names and Today/Tomorrow offsets, sunrise/sunset/solar times (from the weather pipeline's astro product), and moon phase. Use whenever you need to reason about dates, times, or daylight for a location -- including "what time is sunset?", "is it dark there now?", or "what day of the week is the 4th-day forecast?". If current_time.timezone_resolved is false, zone unknown: state times as UTC, never as local. Accepts a place name directly. Example: {"location": "Seattle, WA"}.
Annotations the server declares
- title: Get time context
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
list_datasetsDiscover the gridded datasets (model grids, analyses) available at a location, or every public one when none is given, keyed by dataset_id.Reads text others writeNo findings
Why it is in this group
- The name "list_datasets" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Discover the gridded datasets (model grids, analyses) available at a location, or every public one when none is given, keyed by dataset_id. At a point: its domain (CONUS/Alaska/Hawaii) plus global grids, with freshness where tracked (latest model run as latest_run, latest_time, data_age_seconds, freshness_status). Use this to find dataset_id values for query_dataset or check whether data is current. Variables, units and standard names come from describe_dataset. Example: {"location": "Anchorage, AK"}.
Annotations the server declares
- title: List datasets
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
query_datasetRaw time series from a specific dataset for specific variables at a point.Reads text others writeNo findings
Why it is in this group
- The name "query_dataset" says "query": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Raw time series from a specific dataset for specific variables at a point. Power-user access to any gridded product (NBM, HRRR, RRFS, GFS, RTMA, MRMS, air quality, ...). Time modes: hours (next N hours, default 24), time_start+time_end (explicit ISO-8601 window), or latest=true (single most-recent value). reference_time pins a specific model run, and each returned series reports the run that served it (reference_time, or reference_times when a series mixes runs) — check it before comparing two runs, since a run older than about 48 hours may no longer be available. For blended forecasts use get_forecast instead. Examples: {"location": "Denver, CO", "dataset_id": "rrfs_surface", "variables": ["temperature_2m"], "hours": 18} or {"lat": 41.4, "lon": -92.9, "dataset_id": "rtma_conus", "variables": ["temperature_2m"], "latest": true}.
Annotations the server declares
- title: Query dataset
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
reverse_geocodeResolve coordinates to a human-readable place (city, state, county, timezone).Reads text others writeNo findings
Why it is in this group
- The description's first verb is "resolve": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Resolve coordinates to a human-readable place (city, state, county, timezone). Use when you have lat/lon but need a display name or the local timezone. Example: {"lat": 39.74, "lon": -104.99} -> Denver, Colorado, America/Denver.
Annotations the server declares
- title: Reverse geocode
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
search_catalogFind which dataset answers a weather question when no dedicated tool fits: ranks the data catalog (model grids, radar, satellite, outlooks, observations) by the question's words an…No findings
Why it is in this group
- The name "search_catalog" says "search": a word for reading.
Description, as the server wrote it Find which dataset answers a weather question when no dedicated tool fits: ranks the data catalog (model grids, radar, satellite, outlooks, observations) by the question's words and returns the best datasets with variable, units, cadence, a one-line why and the exact `call` (tool and arguments) to run next. Pass lat/lon, or `domain`, to keep only datasets covering the place; without one, Alaska/Hawaii twins fold into the CONUS dataset. Calls are ready for "now"; for a past time set `time_start`/`time_end` (or `at` where the tool supports it). Free; no network call.
Annotations the server declares
- title: Search catalog
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
- destructiveHint: false
search_locationsResolve a place to ranked candidates with lat/lon: city ("Denver"), "city, ST", ZIP ("50219"), or partial input with fuzzy=true ("bost" -> Boston); venues and addresses where enabl…Reads text others writeNo findings
Why it is in this group
- The name "search_locations" says "search": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Resolve a place to ranked candidates with lat/lon: city ("Denver"), "city, ST", ZIP ("50219"), or partial input with fuzzy=true ("bost" -> Boston); venues and addresses where enabled. Rows carry `type` place|zip|address|poi; pass a row's lat/lon to weather tools. `matched_via: "autosuggest"` marks rows found after the exact match missed; `partial` means a section timed out. Weather tools take `location` directly, venues included -- use this to disambiguate ("which Springfield?") or present choices.
Annotations the server declares
- title: Search locations
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
- destructiveHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
No private-data, untrusted-input, outbound path in this server alone: no tool is tagged outbound.
- Reads private data1
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write13
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out0
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Install
Pinned to version 0.1.1. Values in angle brackets are yours to fill in.
claude mcp add --transport http weather https://mcp.smarterweather.comRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__weather__search_locations",
"mcp__weather__get_forecast",
"mcp__weather__get_hourly_forecast",
"mcp__weather__get_current_conditions",
"mcp__weather__get_alerts",
"mcp__weather__get_observed_precipitation",
"mcp__weather__get_forecast_distribution",
"mcp__weather__search_catalog",
"mcp__weather__describe_dataset",
"mcp__weather__get_platform_status",
"mcp__weather__get_time_context",
"mcp__weather__list_datasets",
"mcp__weather__query_dataset",
"mcp__weather__reverse_geocode"
],
"ask": [],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as weather. Review it before you use it.
Capability tags behind 13 rules
- mcp__weather__search_locations untrusted-input
- mcp__weather__get_forecast untrusted-input
- mcp__weather__get_hourly_forecast untrusted-input
- mcp__weather__get_current_conditions untrusted-input
- mcp__weather__get_alerts untrusted-input
- mcp__weather__get_observed_precipitation untrusted-input
- mcp__weather__get_forecast_distribution untrusted-input
- mcp__weather__describe_dataset untrusted-input
- mcp__weather__get_platform_status untrusted-input
- mcp__weather__get_time_context private-data, untrusted-input
- mcp__weather__list_datasets untrusted-input
- mcp__weather__query_dataset untrusted-input
- mcp__weather__reverse_geocode untrusted-input
