fstwthr
Plain-text weather for humans and agents.
fstwthr is a free, keyless weather service at fstwthr.com. It serves the same canonical forecast in seven formats — modern HTML, minimal HTML, plain text, JSON, YAML, wttr.in-style one-liners, and Model Context Protocol for AI agents.
No API keys. No accounts. No advertising. No third-party aggregators. Just government weather data (NOAA in the US, MET Norway globally) shaped into a clean, fast surface.
Try it
curl fstwthr.com/boulder
curl json.fstwthr.com/tokyo
curl 'fstwthr.com/london?units=metric&voice=snark'
curl 'fstwthr.com/denver?format=3' # wttr.in-style one-liner
curl fstwthr.com/80302 # any US ZIP code
Formats
| Host | Browser | curl / agents |
|---|---|---|
fstwthr.com | Modern HTML | Plain text |
min.fstwthr.com | Minimal HTML | Plain text |
json.fstwthr.com | JSON | JSON |
api.fstwthr.com | JSON (alias) | JSON |
yaml.fstwthr.com | YAML | YAML |
mcp.fstwthr.com | Model Context Protocol (StreamableHTTP at /mcp) | |
Query parameters layered on top:
?units=metric for °C/kph/hPa,
?voice=snark|hype for stylistic personality on the
summary, ?format=1..4 for one-liners,
?fmt=text|json|yaml|min|modern for explicit format
override.
Location lookup
- US cities:
/denver,/boulder,/new-york. - US ZIP codes (33,800 ZCTAs):
/80302,/10001. - Globally famous cities:
/london,/paris,/tokyo,/sydney. - Disambiguate with a region after a comma:
/portland,mevs/portland,or;/london,gbvs/london,ky. - Anywhere OpenStreetMap can find: the long tail resolves via Nominatim and gets KV-cached.
For AI agents
The MCP server at
https://mcp.fstwthr.com/mcp exposes eight tools, three
resources, and six prompt templates over the same canonical
Forecast. Wire it into any MCP-compatible client.
Claude Desktop
// ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"fstwthr": { "url": "https://mcp.fstwthr.com/mcp" }
}
}
Cursor / Continue / Cline / Zed / VS Code
All MCP-compatible clients support the same URL-based config —
add https://mcp.fstwthr.com/mcp as a server in your
settings. See your client's MCP docs for the exact JSON shape.
Tools available
get_weather(location, units?)— current conditions + short forecast.get_forecast(location, days?, units?)— 7-day forecast.get_timeline(location, hours?, units?)— next-12-hours hourly outlook.get_alerts(location)— active severe-weather alerts.get_best_window(location, activity?, units?)— when to be outside (hourly window when available).get_activity_weather(location, activity?, units?)— go / caution / avoid for an outdoor activity.compare_weather(locations[], units?)— compare 2–4 places and pick the nicest.get_nowcast(location)— radar-derived current precipitation (US).
See /llms.txt (short) and /llms-full.txt (long) for the machine-readable description of every surface.
Data sources
- NOAA / National Weather Service — US forecast, alerts, real-time station observations, and radar (MRMS).
- MET Norway / Norwegian Meteorological Institute — global forecast fallback.
- OpenStreetMap Foundation / Nominatim — geocoding for the long tail.
- US Census Bureau Gazetteer — embedded place + ZIP-code data.
All free for non-commercial use. fstwthr passes through attribution
in its source field and surfaces no third-party tracking.
Architecture
Single Cloudflare Worker, written in TypeScript with Hono. Every URL is cacheable at the edge (5 min fresh + 1 hour stale-while-revalidate); the upstream JSON is KV-cached separately. Bundle is ~995 KB gzipped including ~50,000 embedded US places + ZIP codes.
A sibling Cloudflare Container parses NOAA MRMS radar tiles every five minutes and writes per-gridpoint "rain on radar" records into shared KV, surfaced to readers as a one-sentence clause in the natural-language summary. That's the heaviest piece of machinery in the project and it still gets out of the way of the main worker entirely.
Contact
Open an issue at github.com/RJFerguson/fstwthr for bug reports, feature requests, or peering interest.