Given a US location (lat/lon, ZIP, or city+state), return the National Weather Service forecast: current observation, hourly forecast, 7-day multi-day periods, active alerts/watches/warnings, the forecast office, and the underlying grid cell. Read-only via the public api.weather.gov JSON surface (no auth).
Works with
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionget-forecastExecute the skills CLI command in your project's root directory to begin installation:
Fetches get-forecast from weather.gov/get-forecast-1uezib and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
Restart Cursor to activate get-forecast. Access via /get-forecast in your agent's command palette.
We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.
Skills execute code in your environment. Always review source, verify the publisher, and test in isolation before production.
Submit your Claude Code skill and start earning
Automate repetitive workflows and reduce manual effort
Example
Generate reports, summarize documents, draft communications
Save 3-5 hours per week on routine tasks
Learn new skills, understand complex topics, get expert guidance
Example
Explain concepts, provide examples, suggest learning resources
Accelerate learning and skill development by 2x
Enhance output quality through reviews, suggestions, and refinements
Example
Review drafts, suggest improvements, catch errors
Improve work quality by 30-40% with less effort
0
total installs
0
this week
0
upvotes
Run in your terminal
0
installs
0
this week
—
stars
| name | get-forecast |
| title | NWS Weather Forecast for a US Point |
| description | >- Given a US location (lat/lon, ZIP, or city+state), return the National Weather Service forecast: current observation, hourly forecast, 7-day multi-day periods, active alerts/watches/warnings, the forecast office, and the underlying grid cell. Read-only via the public api.weather.gov JSON surface (no auth). |
| website | weather.gov |
| category | weather |
| tags | - weather - forecast - nws - noaa - alerts - read-only |
| source | 'browserbase: agent-runtime 2026-05-18' |
| updated | '2026-05-18' |
| recommended_method | api |
| alternative_methods | - method: browser rationale: >- When api.weather.gov is unreachable (NWS server outage, restricted network), fall back to scripted browsing of forecast.weather.gov/MapClick.php?lat=X&lon=Y — plain HTML, no anti-bot, but ~30x slower and structurally less reliable than the API. |
| verified | false |
| proxies | false |
Given a US location (latitude+longitude, ZIP, or city+state), return the National Weather Service forecast for that point: current observation, hourly forecast (next ~24–48h), multi-day forecast (~7 days × day+night periods), any active alerts/watches/warnings, the forecast office (WFO) handling the point, and the underlying grid cell. Read-only. The public api.weather.gov JSON surface (no auth, no anti-bot, CORS-enabled) is the canonical and recommended path; scripted browsing of forecast.weather.gov is a last-resort fallback when the API is unreachable.
forecast.weather.gov — the API is faster, structured, and rate-limit-friendly (24h cache on /points/, 2-minute cache on /forecast).Do NOT use when the point is outside US territory — NWS only covers US states, DC, Puerto Rico, US Virgin Islands, Guam, and CONUS coastal/marine zones. For non-US points, /points/{lat,lon} returns 404 with "title": "Data Unavailable For Requested Point".
The NWS API is a three-call chain from a (lat, lon): resolve point → fetch forecast(s) + observations → fetch active alerts. Then a geocoder up front if the input is a ZIP or city. No auth, no cookies, no anti-bot. A residential proxy is not required. Set a descriptive User-Agent (NWS terms of service request it — App-Name (contact-email) — and although the API currently returns 200 without one via Browserbase Fetch, an honest UA avoids future-proofing pain).
(lat, lon)If the user passed a ZIP or city+state, geocode first. The NWS API itself does not accept ZIPs or city names — only decimal lat/lon.
66526):
GET https://nominatim.openstreetmap.org/search?postalcode=66526&country=us&format=json&limit=1
Use [0].lat, [0].lon from the response. Set User-Agent: <yourapp> (<contact>) — Nominatim enforces this.Boulder, CO):
GET https://nominatim.openstreetmap.org/search?city=Boulder&state=Colorado&country=us&format=json&limit=1
GET https://api.weather.gov/points/{lat},{lon}
Accept: application/geo+json
User-Agent: yourapp/1.0 ([email protected])
Response properties carries:
cwa / gridId — 3-letter WFO code (e.g. TOP = Topeka KS, BOX = Boston MA, MTR = San Francisco Bay Area, LWX = Baltimore/DC, PAFC = Anchorage AK, HFO = Honolulu HI).gridX, gridY — integer grid cell coordinates in the WFO's 2.5km grid.forecast — multi-day forecast URL.forecastHourly — hourly forecast URL.forecastGridData — raw gridded data (every variable NWS models for the cell).observationStations — list-URL of nearby METAR stations.forecastZone — public forecast zone URL (broader than gridpoint).county — county zone URL.fireWeatherZone — fire-weather zone URL.timeZone — IANA tz (e.g. America/Chicago).relativeLocation.properties.{city,state} — nearest named place + distance/bearing. Use this for human-readable display; do not use it as a slug for further lookups.forecastOffice — https://api.weather.gov/offices/{cwa} (dereference for office name, address, phone, email if needed).The /points/ response is cacheable for 24 hours — persist (lat,lon → {cwa, gridX, gridY}) locally and skip this call on repeat queries for the same rounded point.
Three independent calls; fan out:
GET {properties.forecast} # 7-day periods, day + night
GET {properties.forecastHourly} # ~156 hourly periods (~6.5 days)
GET https://api.weather.gov/alerts/active?point={lat},{lon}
Multi-day periods — typically 14 entries: 7 days × {day, night}. The first period is named contextually: "This Afternoon", "Tonight", "Overnight", then proper weekday names ("Thursday", "Thursday Night", "Friday", ...). Each period carries:
name, number, startTime, endTime, isDaytime, temperature, temperatureUnit,
temperatureTrend, probabilityOfPrecipitation:{value,unitCode}, windSpeed,
windDirection, icon, shortForecast, detailedForecast
Hourly periods — same shape plus dewpoint, relativeHumidity. name is empty ("") for hourly; number is the sequence index. Returns 156 periods today (~6.5 days); future trim with Array.slice(0, 48) if you only want 24–48h.
The point response gives you observationStations which is itself a list-URL. Resolve it, take the first station (sorted by proximity), then GET its latest observation:
GET {properties.observationStations} # list of nearby stations
# → features[0].properties.stationIdentifier e.g. "KCNK"
GET https://api.weather.gov/stations/{stationId}/observations/latest
Returns properties with timestamp, temperature{value,unitCode}, dewpoint, windSpeed, windDirection, windGust, barometricPressure, visibility, relativeHumidity, textDescription (human-readable, e.g. "Cloudy"), icon, presentWeather[]. All values use WMO unit codes (wmoUnit:degC, wmoUnit:km_h-1, wmoUnit:m, wmoUnit:Pa, wmoUnit:percent) — convert to imperial client-side if needed.
If temperature.value is null or qualityControl: "Z" (failed QC), try the next station in the list — small/regional airports drop in and out frequently.
/alerts/active?point={lat},{lon} is a GeoJSON FeatureCollection of CAP alerts intersecting the point. Each feature's properties has:
event, severity, urgency, certainty, effective, onset, expires, ends,
status, messageType, category, headline, description, instruction,
sender, senderName, response, areaDesc, affectedZones (URL array),
geocode.{SAME, UGC} (ID arrays)
To resolve affectedZones to human names, dereference each URL (/zones/{type}/{id} returns properties.name etc.). Most callers only need areaDesc (already a comma-joined human string).
When the API is unreachable (NWS server hiccups, network policy block, etc.), the public forecast.weather.gov page is parseable HTML — no JS framework, no anti-bot:
https://forecast.weather.gov/MapClick.php?lat={lat}&lon={lon}
Read with browse open ... --remote and browse get markdown body. Key DOM hooks:
#current_conditions-summary — current obs (temperature + textDescription).#detailed-forecast-body .row .col-sm-2.forecast-label / .col-sm-10.forecast-text — multi-day forecast period pairs.#seven-day-forecast-container .tombstone-container — short-form day cards..panel-danger, .panel-warning divs with .panel-heading headlines.Construct a (lat, lon) first (geocoder step 1 is the same). The browser path is ~30× slower and structurally less reliable than the API — use it only as a fallback.
/points/{lat,lon} rejects lat/lon with more than 4 decimal places. Returns HTTP 301 (not 4xx) with Location: /points/{rounded} and a body {"title": "Adjusting Precision Of Point Coordinate"}. Either pre-truncate client-side (lat.toFixed(4)) or set --allow-redirects / equivalent. Confirmed against 39.74560,-97.08921 → 301 and 39.745634,-97.089215 → 301; 39.7456,-97.0892 → 200.[lon, lat], the URL form is /points/{lat},{lon}. Reversing them either 404s or returns a forecast for an unintended point (e.g. ocean)./points/ returns 404 for non-US territory. Body: {"title": "Data Unavailable For Requested Point", "detail": "Unable to provide data for requested point ..."}. Detect by status code and surface a not_supported_region outcome.User-Agent. Per their terms: User-Agent: AppName/version (contact-email). They reserve the right to throttle/block UAs that look bot-generic. The Browserbase Fetch API doesn't expose --header, so the default UA from the Fetch backend is what gets sent — production callers should hit the API directly (Browserbase Fetch is fine for read-only sandbox use).gridId/gridX/gridY and therefore the same forecast. Round generously (3–4 decimal places ≈ 11–110m of precision); going finer wastes the /points/ cache.temperatureTrend is frequently null even when the forecast is changing. The trend is encoded in the detailedForecast text (e.g. "High near 79, with temperatures falling to around 70 in the afternoon"). If you need an explicit rising/falling flag, regex the detailed forecast or fall back to the hourly forecast's adjacent-period delta.temperature.value is degrees Celsius (wmoUnit:degC), wind speed is km/h (wmoUnit:km_h-1), pressure is pascals (wmoUnit:Pa), visibility is meters (wmoUnit:m). Forecast periods, by contrast, use temperatureUnit: "F" and human strings like "10 to 15 mph" — units are inconsistent across endpoints. Don't assume the same conversion table.features[] of /gridpoints/.../stations in order — first station is closest but may be a regional airport whose ASOS dropped. Filter on temperature.value != null && qualityControl != "Z" and walk the list. Most points have 15–25 stations to choose from.properties.periods.length and slice to your time horizon."This Afternoon" → "Tonight" → "Tuesday" → "Tuesday Night" …. At 22:00 local you'll see "Tonight" → "Tuesday" …. Don't assume periods[0].name === "Today".affectedZones is an array of URLs, not names. Each URL is /zones/{forecast|county|fire}/{ZONE_ID}. To get human names, dereference; or read areaDesc which is already a comma-joined display string. geocode.UGC is the legacy UGC code array, geocode.SAME is the SAME/FIPS code array.severity ∈ {Extreme, Severe, Moderate, Minor, Unknown}, urgency ∈ {Immediate, Expected, Future, Past, Unknown}, certainty ∈ {Observed, Likely, Possible, Unlikely, Unknown}, status ∈ {Actual, Test, Exercise, System, Draft}. Filter status === "Actual" unless you explicitly want test traffic.messageType: "Update" and messageType: "Cancel" follow earlier alerts. A single weather event will emit Alert → Update → ... → Cancel as conditions evolve. references[] links to the prior alert IDs. If you want the latest state of an event, take the alert with the most recent sent timestamp among entries sharing a references chain.PAFC Anchorage, PAFG Fairbanks, PAJK Juneau, HFO Honolulu, SJU San Juan, GUM Guam. The API surface is identical; only the gridId namespace differs./gridpoints/{wfo}/{x},{y}/forecast is the public land forecast. Marine forecasts live at /zones/forecast/{zoneId}/forecast for coastal/offshore zones. Aviation is at /stations/{stationId}/tafs/.... This skill targets land-point forecasts only./gridpoints/{wfo}/{x},{y}/forecast/hourly occasionally returns 500 during NWS model update windows (typically 00, 06, 12, 18 UTC). Retry with 30s exponential backoff up to 3 times before falling back to the gridded raw /gridpoints/{wfo}/{x},{y} and synthesizing hourly periods from temperature / windSpeed / probabilityOfPrecipitation time series./points/ returns Cache-Control: public, max-age=86400, s-maxage=120; /forecast returns max-age=120, s-maxage=60; /alerts/active returns very short or no-cache. Caching /points/ by (rounded_lat, rounded_lon) for ≥1h cuts request volume drastically.forecastOffice URL is dereferenceable but rarely needed. It returns office name, postal address, phone, email, nwsRegion (e.g. cr Central Region). Only fetch it if you're surfacing the WFO to the end user./points/ call will 404. Check Nominatim's address.country_code === "us" before forwarding to NWS.{
"location": {
"input": "39.7456,-97.0892",
"lat": 39.7456,
"lon": -97.0892,
"rounded": [39.7456, -97.0892],
"relative_location": { "city": "Linn", "state": "KS", "distance_m": 7367, "bearing_deg": 358 },
"time_zone": "America/Chicago"
},
"grid": { "wfo": "TOP", "gridX": 32, "gridY": 81 },
"forecast_office": {
"id": "TOP",
"name": "Topeka, KS",
"phone": "785-234-2592",
"email": "[email protected]",
"region": "cr"
},
"current_observation": {
"station_id": "KCNK",
"timestamp": "2026-05-18T19:10:00+00:00",
"text_description": "Cloudy",
"icon": "https://api.weather.gov/icons/land/day/ovc?size=medium",
"temperature_c": 22,
"temperature_f": 71.6,
"dewpoint_c": 19,
"relative_humidity_pct": 83.1,
"wind_speed_kmh": 9.252,
"wind_speed_mph": 5.7,
"wind_direction_deg": 160,
"wind_gust_kmh": null,
"barometric_pressure_pa": null,
"visibility_m": 16093.44
},
"forecast_multi_day": [
{
"number": 1,
"name": "This Afternoon",
"start_time": "2026-05-18T14:00:00-05:00",
"end_time": "2026-05-18T18:00:00-05:00",
"is_daytime": true,
"temperature": 79,
"temperature_unit": "F",
"temperature_trend": null,
"wind_speed": "10 to 15 mph",
"wind_direction": "SE",
"probability_of_precipitation_pct": 84,
"short_forecast": "Chance Showers And Thunderstorms",
"detailed_forecast": "A chance of showers and thunderstorms before 3pm, then showers and thunderstorms. Some of the storms could be severe...",
"icon": "https://api.weather.gov/icons/land/day/tsra_sct,80?size=medium"
}
],
"forecast_hourly": [
{
"number": 1,
"start_time": "2026-05-18T14:00:00-05:00",
"end_time": "2026-05-18T15:00:00-05:00",
"is_daytime": true,
"temperature": 77,
"temperature_unit": "F",
"wind_speed": "15 mph",
"wind_direction": "SE",
"probability_of_precipitation_pct": 51,
"dewpoint_c": 19.44,
"relative_humidity_pct": 71,
"short_forecast": "Chance Showers And Thunderstorms",
"icon": "https://api.weather.gov/icons/land/day/tsra_sct,50?size=small"
}
],
"alerts": [
{
"id": "urn:oid:2.49.0.1.840.0.cf592762d2c61016d0c7f733f87f1671a4e8e675.001.1",
"event": "Tornado Watch",
"severity": "Extreme",
"urgency": "Future",
"certainty": "Possible",
"status": "Actual",
"message_type": "Alert",
"effective": "2026-05-18T12:50:00-05:00",
"onset": "2026-05-18T12:50:00-05:00",
"expires": "2026-05-18T20:00:00-05:00",
"headline": "Tornado Watch issued May 18 at 12:50PM CDT until May 18 at 8:00PM CDT by NWS Topeka KS",
"description": "THE NATIONAL WEATHER SERVICE HAS ISSUED TORNADO WATCH 222 IN EFFECT UNTIL 8 PM CDT THIS EVENING ...",
"instruction": null,
"area_desc": "Atchison, KS; Brown, KS; Doniphan, KS; ...",
"affected_zones": [
"https://api.weather.gov/zones/county/KSC013",
"https://api.weather.gov/zones/county/KSC027"
],
"sender_name": "NWS Topeka KS"
}
]
}
Distinct outcome shapes:
// Successful US-point query (above shape, with arrays populated)
// US point with no active alerts
{ "...": "...", "alerts": [] }
// Point is outside US territory (NWS /points/ 404)
{ "success": false, "reason": "outside_us_coverage", "lat": 51.5074, "lon": -0.1278 }
// Geocoder couldn't resolve the input (ZIP/city not found)
{ "success": false, "reason": "input_not_resolvable", "input": "12345 Notarealplace, ZZ" }
// NWS API transient failure (5xx persisting after retries)
{ "success": false, "reason": "nws_api_unavailable", "last_status": 503, "fallback_attempted": true }
Prerequisites
Time Estimate
15-45 minutes depending on use case complexity
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ Use when
Use when skill capabilities match your task, clear ROI on time saved, and you can validate outputs. Best for repetitive tasks, learning, and quality improvement.
✗ Avoid when
Avoid when task requires deep expertise you can't validate, involves sensitive decisions, or when learning process is more valuable than speed of completion.
chandima/agent-skills
booking.com/search-hotels-asq6cc
aliexpress.com/search-product-p0h8a7
nav.com/get-smb-funding-2s1rpm
ruwangi.com/ruwangi-parfum-laki-laki-ko0z5t
shopee.com.my/search-products-5epzg0
get-forecast is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
get-forecast has been reliable in day-to-day use. Documentation quality is above average for community skills.
Useful defaults in get-forecast — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
We added get-forecast from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
Keeps context tight: get-forecast is the kind of skill you can hand to a new teammate without a long onboarding doc.
get-forecast has been reliable in day-to-day use. Documentation quality is above average for community skills.
I recommend get-forecast for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
Solid pick for teams standardizing on skills: get-forecast is focused, and the summary matches what you get after install.
get-forecast fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
get-forecast is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
showing 1-10 of 49