agentleFS
OutsharpOutsharp/shipp-skills/skills/noaa-weather/SKILL.md

noaa-weather

Skill4 starsChanged 8 months agoApache-2.0View on GitHub

The NOAA Weather.gov API provides access to National Weather Service forecasts, alerts, observations, radar data, and more for the United States. Use this skill to fetch weather forecasts, active alerts, station observations, and zone data. No API key is required — just a User-Agent header.

The file

We split this skill into the rules it gives an agent

2 rules. About 0 are common, 2 are distinctive, and 0 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    No API key is needed. However, a User-Agent header is required on every request to identify your application.

    line 53
  2. Distinctive:

    All times are in ISO-8601 format.

    line 237

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

NOAA Weather.gov API

The National Weather Service (NWS) API provides free, open access to weather forecasts, alerts, observations, radar data, and more for the United States. All data is public domain — no API key or account required.

Always check the official API documentation and OpenAPI spec for the latest endpoint details.


Base URL

https://api.weather.gov

Authentication

No API key is needed. However, a User-Agent header is required on every request to identify your application.

User-Agent: (myweatherapp.com, contact@myweatherapp.com)

The string can be anything — the more unique to your application, the less likely it will be affected by a security event. Requests without a User-Agent may be blocked.


Key Concepts

TermDescription
PointA latitude/longitude coordinate. Use /points/{lat},{lon} to resolve it to grid and zone info.
GridpointA 2.5km forecast grid cell identified by a WFO office ID and x,y coordinates.
WFOWeather Forecast Office — the NWS office responsible for a geographic area (e.g., DEN, OKX, LOT).
ZoneA geographic area used for forecasts and alerts. Types include land, marine, forecast, fire, county.
StationAn observation station (e.g., KDEN for Denver International Airport) that reports current conditions.
AlertA weather warning, watch, or advisory issued by the NWS (e.g., tornado warning, winter storm watch).
SIGMET/AIRMETAviation weather advisories for significant or airmen's meteorological conditions.
TAFTerminal Aerodrome Forecast — aviation weather forecast for an airport.
GeoJSONThe default response format — standard JSON with geographic feature geometry.

Core Workflow: Get a Forecast for a Location

The API uses a two-step pattern to get a forecast:

Step 1: Resolve coordinates to a grid point

GET /points/{latitude},{longitude}

This returns metadata including the WFO office, grid coordinates, and URLs for forecasts.

Step 2: Fetch the forecast using the grid info

GET /gridpoints/{wfo}/{gridX},{gridY}/forecast

This returns the human-readable 12-hour period forecast (7 days).

Example (curl)

# Step 1: Get grid info for Denver, CO
curl -s -H "User-Agent: MyApp" \
  "https://api.weather.gov/points/39.7456,-104.9994" | jq '.properties.forecast'

# Returns: "https://api.weather.gov/gridpoints/BOU/63,62/forecast"

# Step 2: Get the forecast
curl -s -H "User-Agent: MyApp" \
  "https://api.weather.gov/gridpoints/BOU/63,62/forecast" | jq '.properties.periods[0]'

Endpoint Reference

Points / Location Lookup

EndpointDescription
GET /points/{lat},{lon}Metadata for a coordinate — returns grid info, forecast URLs, timezone, county, zone
GET /points/{lat},{lon}/stationsNearby observation stations (deprecated — use gridpoint stations instead)

Forecasts

EndpointDescription
GET /gridpoints/{wfo}/{x},{y}/forecast12-hour period forecast (7-day), human-readable
GET /gridpoints/{wfo}/{x},{y}/forecast/hourlyHourly forecast (7-day), human-readable
GET /gridpoints/{wfo}/{x},{y}Raw numerical forecast data (temperature, wind, precip probability, etc.)
GET /gridpoints/{wfo}/{x},{y}/stationsObservation stations within the grid area

Alerts

EndpointDescription
GET /alertsQuery alerts (past 7 days) with filters: status, event, area, zone, urgency, severity, certainty
GET /alerts/activeAll currently active alerts
GET /alerts/active/countCount of active alerts by area, zone, and region
GET /alerts/active/zone/{zoneId}Active alerts for a specific zone
GET /alerts/active/area/{area}Active alerts for a state (2-letter code) or marine area
GET /alerts/active/region/{region}Active alerts for a marine region
GET /alerts/typesList of recognized alert event types
GET /alerts/{id}Retrieve a specific alert by its ID

Stations & Observations

EndpointDescription
GET /stationsList observation stations; filter by id, state, limit
GET /stations/{stationId}Metadata for a specific station
GET /stations/{stationId}/observationsHistorical observations (paginated)
GET /stations/{stationId}/observations/latestMost recent observation
GET /stations/{stationId}/observations/{time}Observation at a specific ISO-8601 timestamp

Zones

EndpointDescription
GET /zonesQuery zones; filter by id, area, type, point, include_geometry
GET /zones/{type}List zones of a specific type (land, marine, forecast, fire, county)
GET /zones/{type}/{zoneId}Metadata for a specific zone
GET /zones/{type}/{zoneId}/forecastCurrent text forecast for a zone
GET /zones/forecast/{zoneId}/observationsObservations within a forecast zone
GET /zones/forecast/{zoneId}/stationsStations within a forecast zone

Aviation

EndpointDescription
GET /stations/{stationId}/tafsTerminal Aerodrome Forecasts for a station
GET /stations/{stationId}/tafs/{date}/{time}Specific TAF
GET /aviation/cwsus/{cwsuId}Center Weather Service Unit metadata
GET /aviation/cwsus/{cwsuId}/cwasCenter Weather Advisories
GET /aviation/sigmetsQuery SIGMETs/AIRMETs with filters
GET /aviation/sigmets/{atsu}SIGMETs for a specific ATSU
GET /aviation/cwsus/{cwsuId}/cwas/{date}/{sequence}Specific Center Weather Advisory
GET /aviation/sigmets/{atsu}/{date}/{time}Specific SIGMET by date and time

Radar

EndpointDescription
GET /radar/serversList of radar servers
GET /radar/stationsList of radar stations; filter by stationType, host
GET /radar/stations/{stationId}Specific radar station metadata
GET /radar/stations/{stationId}/alarmsAlarms for a radar station
GET /radar/profilers/{stationId}Wind profiler data

Text Products

EndpointDescription
GET /productsQuery text products; filter by location, type, start, end
GET /products/{productId}Specific text product
GET /products/typesList of valid product type codes
GET /products/locationsList of valid product issuance locations
GET /products/types/{typeId}Products of a given type
GET /products/types/{typeId}/locationsIssuance locations for a product type
GET /products/locations/{locationId}/typesProduct types for a location
GET /products/types/{typeId}/locations/{locationId}Products by type and location
GET /products/types/{typeId}/locations/{locationId}/latestLatest product by type and location

Offices

EndpointDescription
GET /offices/{officeId}NWS forecast office metadata
GET /offices/{officeId}/headlinesNews headlines from an office
GET /offices/{officeId}/headlines/{headlineId}Specific headline
GET /offices/{officeId}/briefingActive office briefing
GET /offices/{officeId}/weatherstoriesActive weather stories

Miscellaneous

EndpointDescription
GET /glossaryWeather terminology definitions
GET /points/{lat},{lon}/radioNOAA Weather Radio script for a location
GET /radio/{callSign}/broadcastWeather Radio broadcast script by call sign

Response Format

The default response format is GeoJSON (application/geo+json). Control the format with the Accept header:

FormatAccept Header
GeoJSON (default)application/geo+json
JSON-LDapplication/ld+json
DWML (XML)application/vnd.noaa.dwml+xml
CAP (Alerts XML)application/cap+xml
OXML (Observations XML)application/vnd.noaa.obs+xml
ATOMapplication/atom+xml

All times are in ISO-8601 format.


Feature Flags

Optional headers to enable new features:

Header ValueDescription
Feature-Flags: forecast_temperature_qvRepresent temperature as QuantitativeValue
Feature-Flags: forecast_wind_speed_qvRepresent wind speed as QuantitativeValue
Feature-Flags: obs_station_providerShow MADIS provider details for stations

Code Examples

Get Forecast for a Location (Python)

import requests

BASE = "https://api.weather.gov"
HEADERS = {"User-Agent": "(myapp, contact@example.com)"}

# Step 1: Resolve coordinates
point = requests.get(f"{BASE}/points/39.7456,-104.9994", headers=HEADERS).json()
forecast_url = point["properties"]["forecast"]

# Step 2: Get forecast
forecast = requests.get(forecast_url, headers=HEADERS).json()
for period in forecast["properties"]["periods"][:4]:
    print(f"{period['name']}: {period['detailedForecast']}")

Get Active Alerts for a State (curl)

curl -s -H "User-Agent: MyApp" \
  "https://api.weather.gov/alerts/active?area=CO" \
  | jq '.features[] | {event: .properties.event, headline: .properties.headline}'

Get Current Observations (curl)

# Get latest observation from Denver International Airport
curl -s -H "User-Agent: MyApp" \
  "https://api.weather.gov/stations/KDEN/observations/latest" \
  | jq '.properties | {
    temperature: .temperature.value,
    windSpeed: .windSpeed.value,
    description: .textDescription
  }'

Get Hourly Forecast (Node.js)

const https = require("https");

const options = {
  headers: { "User-Agent": "MyApp (contact@example.com)" },
};

// Step 1: Get grid info
https.get("https://api.weather.gov/points/40.7128,-74.0060", options, (res) => {
  let data = "";
  res.on("data", (chunk) => (data += chunk));
  res.on("end", () => {
    const forecastUrl = JSON.parse(data).properties.forecastHourly;

    // Step 2: Get hourly forecast
    https.get(forecastUrl, options, (res2) => {
      let forecast = "";
      res2.on("data", (chunk) => (forecast += chunk));
      res2.on("end", () => {
        const periods = JSON.parse(forecast).properties.periods;
        periods.slice(0, 6).forEach((p) => {
          console.log(`${p.startTime}: ${p.temperature}°${p.temperatureUnit} - ${p.shortForecast}`);
        });
      });
    });
  });
});

Find Nearby Stations (Python)

import requests

BASE = "https://api.weather.gov"
HEADERS = {"User-Agent": "(myapp, contact@example.com)"}

# Get grid info for a point
point = requests.get(f"{BASE}/points/34.0522,-118.2437", headers=HEADERS).json()
stations_url = point["properties"]["observationStations"]

# List nearby stations
stations = requests.get(stations_url, headers=HEADERS).json()
for station in stations["features"][:5]:
    props = station["properties"]
    print(f"{props['stationIdentifier']}: {props['name']}")

Rate Limits

The rate limit is not publicly documented but is described as "generous for typical use."

GuidelineDetails
Rate limitUndisclosed, but generous
On limit exceededRequest returns an error; retry after ~5 seconds
User-AgentRequired — requests without it may be blocked
Best practiceCache /points responses (they rarely change) to reduce calls

Error Handling

HTTP StatusMeaningAction
200SuccessParse the JSON response
301/302RedirectFollow the redirect
404Not foundCheck coordinates, station ID, or zone ID
500Server errorRetry with backoff
503Service unavailableCommon on /radar/queues — add filters to reduce results

Error responses include a JSON body with type, title, status, detail, and correlationId fields.


Known Issues

  • /radar/queues endpoints may return 503 errors when results are large — filter with additional parameters.
  • Station observations outside the central timezone may show null 24-hour max/min temperatures.
  • Observation data can be delayed up to 20 minutes from the upstream MADIS source.
  • Icon endpoints (/icons) are deprecated.

Resources

ResourceURL
API Documentationweather.gov/documentation/services-web-api
OpenAPI Specificationapi.weather.gov/openapi.json
GitHub Discussionweather-gov.github.io/api
Operational Supportnco.ops@noaa.gov

Changelog

  • 0.1.0 — Initial release with forecasts, alerts, observations, stations, zones, aviation, radar, and text products.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.