A curated skill library for weather and climate data
Let your AI assistant fetch, transform, and visualize weather data — with provenance you can audit.
Curated, standards-compliant Agent Skills that run in any AI environment with a code-execution runtime and uv. Initiated by Rhiza Research. A community working group will steward the catalog.
- artifact
- weekly.png
- produced by
- ecmwf-fetch → aggregate-temporal → plot
- provenance
- weather_skills_history — append-only JSON chain
- standards
- CF conventions · Zarr v3
Stamped on every envelope Zarr and plot PNG.
See it run
From a plain-language request, the agent picks and composes skills. This is a real session, replayed: resolve Senegal's bounding box → fetch IMERG → clip to the region → aggregate to weekly totals → plot — then a follow-up adds The Gambia by merging the mask, no re-fetch needed.
Standards and review
Three mechanisms back the catalog: reviewed contributions, open standards, and auditable provenance.
Reviewed contributions
Every skill enters the catalog through a pull request reviewed against the contribution guidelines and validated by CI checks. A working group of weather and climate data practitioners will oversee a formal submission and review process.
Open standards
Skills read and write CF-compliant Zarr stores. The CF conventions themselves are the contract — not a repo-specific subset — so producers must emit valid CF and consumers must read any valid CF representation of the envelope's canonical shapes, including non-standard model calendars.
Auditable provenance
Every zarr-writing skill appends to weather_skills_history,
an append-only JSON chain recording the skill, its version, its arguments,
and a hash of its input. Plot PNGs embed the same chain in their metadata,
and the provenance skill renders any chain as a human-readable
lineage, the raw JSON, or a runnable reproduction script.
Runs anywhere
Skills are plain Python scripts whose inline dependency blocks are resolved by
uv run --script on each invocation, so any AI environment with a
code-execution runtime can invoke them. The skills live at
github.com/rhiza-research/forecasting-skills;
pick the install path that matches your environment.
As a CLI tool
For ad-hoc command-line use (no agent involved), install the skills as a single forecasting-skills binary:
# One-shot, no install — list available skills
uvx --from git+https://github.com/rhiza-research/forecasting-skills forecasting-skills
# Run one
uvx --from git+https://github.com/rhiza-research/forecasting-skills forecasting-skills <skill> [args]
Or install once and invoke directly:
uv tool install git+https://github.com/rhiza-research/forecasting-skills
forecasting-skills # list
forecasting-skills <skill> [args] # run one
As an agent skill set
For use by an LLM agent, install the SKILL.md files into your project with skillkit:
# List what skillkit discovers in the repo
npx skillkit install rhiza-research/forecasting-skills --list
# Install all skills to the current project
npx skillkit install rhiza-research/forecasting-skills --all --yes
# Install just a subset
npx skillkit install rhiza-research/forecasting-skills --skill=ecmwf-fetch
As a plugin
For Claude Code, install the plugin from the in-repo marketplace:
claude plugin marketplace add rhiza-research/forecasting-skills
claude plugin install rhiza-forecasting@weather-skills
Pipeline and envelope
Pipelines chain three kinds of skills: fetchers pull data from a source and write a standard envelope, transforms operate on any envelope, and visualization skills render the result. A fourth group, agent capabilities, supports pipelines without producing an envelope — resolving a region name to a bounding box or composing results into an email report. A user states the goal in natural language and the agent picks and composes skills from the set.
-
fetch
source → envelope
- arco-era5-fetch
- chirps-fetch
- cmip6-fetch
- +8 more
-
transform
envelope → envelope
- aggregate-temporal
- clip-region
- coarsen
- +10 more
-
visualize
envelope → PNG
- plot
- plot-compare
- plot-mediogram
- +1 more
Example — a forecast for one country fetched, aggregated to weekly totals, and plotted; satellite observations clipped to the same bbox:
# Resolve the country bbox once, reuse it across the fetch and the clip.
KENYA_BBOX=$(forecasting-skills resolve-region KEN)
forecasting-skills ecmwf-fetch \
--date 2026-02-13 \
--bbox "$KENYA_BBOX" \
--output /tmp/ecmwf.zarr
forecasting-skills aggregate-temporal \
--input /tmp/ecmwf.zarr \
--period weekly \
--method sum \
--output /tmp/ecmwf_weekly.zarr
forecasting-skills plot \
--input /tmp/ecmwf_weekly.zarr \
--variable tp \
--output /tmp/weekly.png
forecasting-skills imerg-fetch \
--start 2025-12-24 \
--end 2026-02-13 \
--output /tmp/imerg.zarr
forecasting-skills clip-region \
--input /tmp/imerg.zarr \
--bbox "$KENYA_BBOX" \
--output /tmp/imerg_kenya.zarr
The weather-skills envelope is a CF-compliant Zarr v3 store with two
canonical shapes. Consumers rely only on dimensions, coordinates, data
variables, and weather_skills_* attributes — never on per-variable
codec encoding — which keeps skills independent across library versions. The
full contract is documented in
ENVELOPE.md.
Gridded envelope
(number?, step|time,
latitude, longitude)
forecasts, satellite grids, reanalyses
Station envelope
(time, station_id)
latitude(station_id)
longitude(station_id)
in-situ station observations
Skill catalog
Generated from each skill's SKILL.md. Entries marked
requires credentials read API credentials from
environment variables; each skill's
compatibility notes
name the specific variables.
Fetchers ingress — source → envelope
- arco-era5-fetch
- Fetch ARCO-ERA5 reanalysis (temperature, wind, precipitation, pressure, and more) for a date range and region from the public, credential-free Google Cloud Zarr store, and write a weather-skills envelope Zarr. Use when a task needs multi-variable gridded reanalysis ground truth for comparison, verification, or downstream clipping/aggregation/plotting.
- chirps-fetch
- Fetch CHIRPS precipitation observations for a date range — the validated final product back to 1998, with a preliminary fallback for very recent days — and write a weather-skills envelope Zarr. Use when a task needs CHIRPS rainfall, recent or historical, e.g. to compare against a forecast or station data, or to build a reference period.
- cmip6-fetch
- Fetch a CMIP6 climate-model projection (e.g. temperature, precipitation) for a date range and region from the public, credential-free Pangeo Google Cloud catalog, and write a weather-skills envelope Zarr. Use when a task needs climate-projection grids (historical or future scenario) for downstream clipping, aggregation, comparison, or plotting.
- dynamical-fetch
- Fetch a dataset from the dynamical.org open weather catalog (GFS, GEFS, ECMWF IFS-ENS, AIFS, ICON-EU, MRMS, and their analyses) and write a weather-skills envelope Zarr. Use when a task needs credential-free forecast or analysis grids for downstream clipping, aggregation, comparison, or plotting.
- ecmwf-fetch requires credentials
- Fetch an ECMWF S2S precipitation forecast (control + perturbed ensemble) for a date and bbox from the ECMWF Data Stores (ECDS), writing a weather-skills envelope Zarr. Use when a task needs raw S2S forecast precipitation for downstream aggregation, clipping, downscaling, or plotting. To fetch over a country, get its bbox from the resolve-region skill first.
- ghcn-daily-fetch
- Fetch NOAA GHCN-Daily global in-situ station observations (precipitation, max/min/avg temperature) for a date range and region, and write a station-schema weather-skills envelope Zarr. Use when a task needs credential-free worldwide daily station data, e.g. to compare against gridded satellite, reanalysis, or forecast data.
- imerg-fetch requires credentials
- Fetch live IMERG satellite precipitation for a date range and write a weather-skills envelope Zarr. Use when a task needs recent half-hourly/daily IMERG rainfall, e.g. for station-vs-satellite comparison or verification.
- oisst-fetch
- Fetch NOAA OISST v2.1 daily sea-surface temperature for a date range and region from NOAA PSL's public OPeNDAP server, and write a weather-skills envelope Zarr. Use when a task needs credential-free gridded SST observations, e.g. for ocean analysis or comparison against forecasts/reanalysis.
- openaq-fetch requires credentials
- Fetch OpenAQ air-quality station observations (PM2.5, PM10, NO2, O3, SO2, CO) for a date range and region, and write a station-schema weather-skills envelope Zarr. Use when a task needs in-situ air-quality and atmospheric-composition data, e.g. to compare against gridded model output.
- smap-fetch requires credentials
- Fetch NASA SMAP SPL3SMP_E daily 9 km volumetric soil moisture for a bounded region and short date range via Earthdata, and write a fully CF-1.13 weather-skills envelope Zarr. Use when a task needs gridded land-surface soil-moisture observations, e.g. for drought or agricultural analysis, or comparison against models.
- tahmo-fetch requires credentials
- Fetch TAHMO station observations for one or more African countries and write a weather-skills envelope Zarr (station schema). Use when a task needs in-situ station rainfall/temperature/humidity/pressure, e.g. to compare against gridded satellite or forecast data.
Transforms envelope → envelope
- aggregate-temporal
- Roll up a weather-skills envelope Zarr along its time axis (or forecast step axis) into fixed windows (daily, weekly, dekadal, monthly) with a chosen reducer. Use whenever any dataset needs to be resampled to a canonical aggregation period before plotting or comparison.
- clip-region
- Spatially subset a gridded weather-skills envelope Zarr to an explicit lat/lon bbox. Use when you need to restrict any dataset (forecast, satellite, reanalysis) to a custom bounding box before downstream aggregation or plotting. To clip to a country, get its bbox from the resolve-region skill first.
- coarsen
- Coarsen or align a weather-skills envelope Zarr by linearly interpolating it onto a target grid defined by a resolution and an offset (target points at offset + k*resolution). Geometry-only — it changes grid spacing/alignment and adds no information. Use to make a grid coarser or to put two datasets on the same grid for comparison.
- concat
- Concatenate two or more weather-skills envelope Zarr stores along a named dimension, optionally assigning coordinate values to the new axis. Use when combining ensemble members, stitching time windows, or merging per-country fetches into a single dataset.
- convert-calendar
- Convert a weather-skills envelope Zarr's time axis to a target CF calendar by wrapping xarray's Dataset.convert_calendar. Use to align two datasets onto a common calendar before comparison — e.g. converting a model-calendar forecast (noleap/360_day) to the standard calendar of observations. Converting to a standard calendar yields a datetime64 axis; converting to a model calendar yields a cftime axis. Dates not representable in the target calendar are dropped.
- deaccumulate
- Convert a cumulative-since-init forecast variable (e.g. ECMWF S2S
tp) along itsstepaxis into per-step differences, so each step value represents the period since the previous step rather than the accumulation since initialization. - difference
- Subtract one weather-skills envelope Zarr from another (A − B) with xarray inner-join alignment and broadcasting — e.g. anomalies as a field minus its baseline mean, or a scenario-minus-historical change map. Use whenever two envelopes must be compared cell-by-cell as a difference field.
- downscale
- Downscale a weather-skills envelope Zarr onto a finer-or-equal grid, adding information via a chosen --algorithm (linear-interpolation or q-q empirical quantile mapping). The target is given by an integer factor, a target resolution, or a reference dataset's grid. Equal resolution is accepted as a no-op on geometry (q-q still applies its mapping). Use when a task needs higher spatial resolution; to make a grid coarser, use the coarsen skill.
- reduce
- Collapse one or more named dimensions of a weather-skills envelope Zarr with a statistic (mean, std, min, max, sum, median) — e.g. ensemble spread as the std across
number, model disagreement as the std across a model dim, or a time-mean baseline for anomalies. Use whenever a dataset needs a statistical reduction along a named dimension. - rename
- Rename one data variable in a weather-skills envelope Zarr to a new name, writing a new envelope. The renamed variable keeps its values and attributes; all other variables, coordinates, and dimensions pass through unchanged.
- select
- Select entries along one named dimension of a weather-skills envelope Zarr, by integer position or by coordinate value. A single selection collapses the dimension and drops the coordinates it leaves scalar, so outputs from different sources are ready to concat — e.g. pick the same forecast week from several model envelopes before merging them along a new model dim.
- step-to-time
- Realize a forecast envelope's
steplead-time axis as wall-clock valid times (time = init + step), replacing thestepdim with atimedim. Use it to compare a forecast against observations — e.g. before plot-compare, plot-timeseries, or difference against a time-based dataset. - unit-convert
- Convert one data variable in a weather-skills envelope Zarr to a target units string (e.g. a precipitation flux
kg m-2 s-1to a depth ratemm/day), updating the variable's values and itsunitsattribute.
Visualization envelope → PNG
- plot
- Render a 2D heatmap or 1D time series PNG from any gridded or station weather-skills envelope Zarr. Use when you need to visualize a single dataset as a map or as a time/step profile.
- plot-compare
- Render a side-by-side multi-panel comparison PNG of two weather-skills envelope Zarr stores (gridded-vs-gridded or station-vs-gridded). Use for sat-vs-station validation, model-vs-obs comparison, or cross-source QC.
- plot-mediogram
- Render an ECMWF-style mediogram PNG comparing a forecast ensemble against an m-climate (historical) ensemble at a single lat/lon. Two-layer boxplots per time step show an extremes box underneath (p0–p100 whiskers, p10–p90 box, p50 median) with a wider p25–p75 IQR box overlaid on top, whose visible black caps mark the IQR edges.
- plot-timeseries
- Render a single PNG with one 1D trace per input Zarr overlaid on a shared time axis. Use when you want to compare a variable across multiple weather-skills envelope Zarrs as line traces. Inputs whose variable still has non-time dims after selection must list those dims via repeated --reduce flags; no silent averaging.
Agent capabilities no envelope output — capabilities the agent uses alongside pipelines
- email-report
- Assemble an email message with optional file attachments and write it to disk as a standards-compliant .eml file. Mocks actual SMTP delivery — does not send. Use at the end of a pipeline to materialize what would have been sent.
- provenance
- Inspect the weather_skills_history provenance chain stamped on a weather-skills artifact (an envelope Zarr or a plot PNG) and render it as a human-readable lineage, the raw JSON chain, or a runnable reproduction script. Use when you need to answer "how did this file come to exist, and how do I regenerate it?" — especially for a PNG, whose chain lives in binary tEXt chunks an editor can't open.
- resolve-region
- Resolve an ISO 3166-1 alpha-3 country code to a lat/lon bbox (and optionally a boundary polygon GeoJSON) from a bundled Natural Earth 1:110m admin-0 dataset. Use when you need to turn a country into a
--bbox N/W/S/Evalue (or a polygon mask) for clip-region, ecmwf-fetch, plot, or plot-compare. - submit-feedback
- Build a prefilled GitHub new-issue link the user clicks to file feedback under their own GitHub account. You supply the title and body; the skill URL-encodes them and checks that the link fits GitHub's length limit. Use when a user wants to report a bug or suggestion about the skills.
Governance
The library will be overseen by a working group of weather and climate data practitioners. A submission and review process will define how new skills are proposed, tested against the envelope contract, and admitted to the catalog.
Until that process is in place, contributions go through the repository directly: open an issue or a pull request.