Smarter Weather

io.github.smarterweatherPublished by GitHub account smarterweatherv0.1.1Updated Oct 24, 2026

Smarter Weather MCP: forecasts, alerts, outlooks, observations, AQI, grids, and map imagery.

VerifiedStreamable HTTPWeb executableLocation & Lifestyle

Overview

Smarter Weather's hosted MCP server (mcp.smarterweather.com); no sign-in required; Streamable HTTP; 13 tools.

No AI overview yet: these facts come from the registry entry and the server itself.

Endpoint
mcp.smarterweather.com
Last checked

Installation

In SourceWeft

  1. Open Smarter Weather in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.smarterweather%2Fweather/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "smarter-weather": {
      "type": "http",
      "url": "https://mcp.smarterweather.com/"
    }
  }
}

README

@smarterweather/mcp-weather

A stdio-to-Streamable-HTTP bridge for the Smarter Weather hosted MCP server at https://mcp.smarterweather.com. It lets local-only MCP clients (Claude Desktop, Claude Code, Cursor, MCP Inspector, etc.) reach sw-mcp over the network with your API key.

Requires Node.js 22 or later.

The package is a thin wrapper around mcp-remote: no weather logic ships here, and the protocol implementation is not forked. All tools, schemas, rate limiting and metering live server-side in sw-mcp.

Get an API key

Run one of these in your project directory:

bash
# A human is present: device sign-in in the browser (free account, no card)npx -y @smarterweather/mcp-onboarding@latest login
# No human present: mint a trial key you can claim into a free account laternpx -y @smarterweather/mcp-onboarding@latest trial

Both write SMARTERWEATHER_API_KEY to ./.env (mode 0600, gitignored) and print only a key prefix, never the key.

The bridge resolves the key from:

  1. SMARTERWEATHER_API_KEY in the process environment
  2. the file named by SMARTERWEATHER_ENV_FILE
  3. .env in the working directory (skipped when the working directory is / or $HOME)

Unexpanded ${…} placeholders count as unset. The bridge passes the key to mcp-remote as Authorization:${SMARTERWEATHER_AUTH_HEADER}, with the bearer only in the child process environment, never on argv.

Without a key the bridge still connects, and discovery tools such as find_places and search_data stay free. Other tool calls return x402 payment requirements (USDC on Base) with next_steps that point back to login and trial. OAuth sign-in through the bridge is not available yet; use an API key.

Install

bash
npx -y @smarterweather/mcp-weather --version

Claude Desktop

Add to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json):

json
{  "mcpServers": {    "smarterweather": {      "command": "npx",      "args": ["-y", "@smarterweather/mcp-weather"],      "env": {        "SMARTERWEATHER_ENV_FILE": "/absolute/path/to/your/project/.env"      }    }  }}

Claude Desktop does not interpolate env placeholders, so point the bridge at the .env that login / trial wrote, by absolute path. Never paste the key into this file. The bridge sends Authorization: Bearer <key> on every proxied request.

Cursor

Use envFile in the project .cursor/mcp.json (envFile requires "type": "stdio"):

json
{  "mcpServers": {    "smarterweather": {      "type": "stdio",      "command": "npx",      "args": ["-y", "@smarterweather/mcp-weather"],      "envFile": "${workspaceFolder}/.env"    }  }}

Or ${env:NAME} from the process environment:

json
{  "mcpServers": {    "smarterweather": {      "type": "stdio",      "command": "npx",      "args": ["-y", "@smarterweather/mcp-weather"],      "env": {        "SMARTERWEATHER_API_KEY": "${env:SMARTERWEATHER_API_KEY}"      }    }  }}

Environment variables

VariablePurposeDefault
SMARTERWEATHER_API_KEYAPI key. Takes precedence when set; an unexpanded ${…} falls through.unset (then SMARTERWEATHER_ENV_FILE, then .env)
SMARTERWEATHER_ENV_FILEAbsolute .env path, read when the process env key is unset.unset → cwd/.env (not / or $HOME)
SMARTERWEATHER_MCP_URLOverride the target MCP endpoint. A positional URL argument wins over it.https://mcp.smarterweather.com

Any mcp-remote flag passes through unchanged. Examples:

  • --debug: verbose logs at ~/.mcp-auth/{server_hash}_debug.log.
  • --transport http-only: force Streamable HTTP (skip the SSE fallback).
  • --header "X-Custom:value": add a header. Use the no-space form for cross-platform argument escaping.
jsonc
"args": [  "-y", "@smarterweather/mcp-weather",  "--debug",  "--transport", "http-only"]

Troubleshooting

  • Tool calls return "Payment required": the bridge found no key. Its stderr names every place it checked. Run login or trial in the project directory, or set SMARTERWEATHER_ENV_FILE to the .env path, then restart the MCP client.
  • "Incompatible auth server: does not support dynamic client registration": the server rejected the key (unknown, revoked or expired), and the bridge has no sign-in fallback. Mint a new key with login or trial and restart the client. The bridge passes the key verbatim.
  • "Connection error: fetch failed": check that the endpoint is reachable from your machine. curl -i https://mcp.smarterweather.com should return HTTP 405 with Method not allowed. Use POST. (the endpoint accepts POST only).
  • Cursor doesn't see the server: make sure .cursor/mcp.json is valid JSON, then restart Cursor. The MCP panel logs the spawned process's stderr.

How it works

The bin is a small Node script. It resolves the URL (positional arg → SMARTERWEATHER_MCP_URL → default) and the API key (see above), sets SMARTERWEATHER_AUTH_HEADER in the child environment, appends --header "Authorization:${SMARTERWEATHER_AUTH_HEADER}" when a key was found, then spawn()s mcp-remote's dist/proxy.js. mcp-remote reads JSON-RPC over stdio and proxies each message to the hosted Streamable HTTP endpoint. Signals (SIGINT/SIGTERM/SIGHUP) are forwarded and exit codes propagate. The wrapper does not transform or inspect MCP traffic.

License

MIT

Source: packages/mcp-weather/README.md at commit 8b8d503

Tools

13

find_places

Find places

Find places: a name, ZIP, venue or address to ranked candidates with lat/lon, or coordinates to the place and timezone. Pass `query` (fuzzy=true for partial input) or `lat`+`lon`; rows carry `type` place|zip|address|poi, `matched_via: "autosuggest"` marks fallback rows and `partial` a timed-out section. Weather tools take `location`; use this to disambiguate or name a point. Example: {"lat": 39.74, "lon": -104.99} -> Denver, Colorado, America/Denver.

Parameterslatlonfuzzylimitquerynear_latnear_lon

get_forecast

Get forecast

Forecast for a US place: current conditions, daily forecast with sunrise and sunset, active alerts and outlooks in one call, and hour by hour with include=hourly. Blended across NBM, HRRR, GFS, RTMA and SPC and unit-converted server-side; times are UTC ISO 8601, quote daily[].astro.local as local, and if forecast.location.timezone_resolved is false state times as UTC. For hours set `hours` (next N, default 48) or `start`+`end` for one stretch hour by hour, and check hourly_coverage (first_time, last_time, sample_interval_hours, truncated) before answering about a specific hour; past last_time say the forecast does not reach that far. Example: {"location": "Portland, OR", "include": "hourly", "hours": 24}.

Parametersendlatlondaysviewhoursstartunitsincludelocation

get_current_conditions

Get current conditions

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"}.

Parameterslatlonunitslocation

get_alerts

Get NWS alerts

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"]}.

Parametersatlatlonbboxeventsalert_idlocation

get_observed_precipitation

Observed precipitation

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).

Parametersatlatlonunitswindowslocationinclude_nowcast

get_forecast_distribution

Get forecast distribution

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}.

Parameterslatlonhoursunitsaspectrequiredlocation

search_data

Search data

Search the data catalog: which dataset's values answer a weather question, or what data exists at a point. With `query` it ranks grids, radar, satellite, outlooks and observations and returns hits with variable, units, cadence, why and the exact `call` to run next (ready for "now"; `time_start`/`time_end` or `at` for a past time); without it, it lists datasets at the place with freshness, or every public one. A place (`location` or lat/lon) or `domain` keeps datasets covering it; variables come from describe_data. Example: {"location": "Anchorage, AK"}.

Parameterslatlonkindlimitquerydomainfamilylocation

find_tools

Find tools

Lists the weather tools this connection does not show (best times, comparisons, forecast totals, air quality; station observations, soundings, hurricane recon; lightning, storm cells, storm reports; outlooks, forecaster text, hurricanes; climate records and normals; forecast accuracy; maps and charts; people at risk; crop heat units), with when to use each and its required arguments. Run one with call_tool, in this session, no reconnect. With `tools`, returns their full input schemas. Free; no network call.

Parameterstools

call_tool

Call tool

Runs a tool find_tools lists, by name: same price, limits and result as calling it directly. Tools already in your list are called directly, not through this. `arguments` follows that tool's input schema.

Parameterstoolrequiredarguments

describe_data

Describe data

A dataset's variables (standard names, units, display units, categories, bands), horizon, step, cadence, freshness, cost class and an example_query to read its values. Free; call it after search_data, before query_dataset. Example: {"dataset_id": "nbm_conus"}.

Parametersdataset_idrequired

get_status

Get status

Data freshness of the weather platform (no inputs needed; refreshed about every 5 minutes): overall state, per-source states (ok / degraded / outage / no_signal), open incidents with their cause (provider outage vs internal processing delay) and active provider advisories. Use it when asked whether data is current, when other tools return stale-looking data, or before presenting time-critical weather. If a source is degraded or in outage, say the data may be stale rather than presenting it as live. Example: {}.

Parametersinclude_ok

get_time_context

Get time context

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"}.

Parameterslatlonlocation

query_dataset

Query dataset

Raw time series of one dataset's variables at a point, with unit labels: any gridded product (NBM, HRRR, RRFS, GFS, RTMA, MRMS, air quality, ...). Time modes: hours (default 24), time_start+time_end (ISO 8601), or latest=true (newest value). Up to 168 frames: when truncated, send next_cursor as cursor with the same arguments. reference_time pins a model run; each series reports its run (reference_time, or reference_times when runs mix); runs older than about 48 h may be gone. For blended forecasts use get_forecast. 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}.

Parameterslatlonhoursunitscursorlatestlocationtime_endvariablesrequireddataset_idtime_startreference_time

Version history

2
  1. v0.1.1LatestOct 20, 2026
  2. v0.0.1Sep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts