A skill library for weather and climate data
Composable weather and climate data skills for AI agents.
A set of composable Agent Skills for building weather/climate data pipelines from an LLM-driven agent: source-specific fetchers, generic operators over a shared Zarr-based container, plot and egress outputs, and tooling that helps the agent operate the set.
One-shot, no install — list available skills
uvx --from git+https://github.com/rhiza-research/forecasting-skills forecasting-skills
Pipeline
Pipelines chain three kinds of skill: fetchers pull data from a source and write a standard envelope, generic middle skills transform any envelope, and plot or egress skills materialize the result. 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
- +9 more
-
plot / egress
envelope → artifact
- plot
- plot-compare
- email-report
- +2 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 envelope contract
Every skill reads and writes the Rhiza Envelope: a CF-compliant Zarr v3
store with a small set of canonical shapes. Gridded data carries
(number?, step|time, latitude, longitude) dimensions; station data
carries (time, station_id) with per-station latitude and longitude
coordinates. Every zarr-writing skill appends to a rhiza_history
attribute — a JSON-encoded, append-only provenance chain recording the skill, its
version, its arguments, and a hash of its input — so any artifact, including a plot
PNG, can be traced back to the commands that produced it. Consumers rely only on
dimensions, coordinates, data variables, and rhiza_* 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, reanalysis
Station envelope
(time, station_id)
latitude(station_id)
longitude(station_id)
in-situ station observations
Skill catalog
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 Rhiza 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 Rhiza Envelope Zarr. Use when a task needs CHIRPS rainfall, recent or historical, e.g. to compare against a forecast or stations 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 Rhiza 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 Rhiza Envelope Zarr. Use when a task needs credential-free forecast or analysis grids for downstream clipping, aggregation, comparison, or plotting.
- ecmwf-fetch
- Fetch an ECMWF S2S precipitation forecast (control + perturbed ensemble) for a date and bbox from the ECMWF Data Stores (ECDS), writing a Rhiza 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 Rhiza 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
- Fetch live IMERG satellite precipitation for a date range and write a Rhiza 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 Rhiza Envelope Zarr. Use when a task needs credential-free gridded SST observations, e.g. for ocean analysis or comparison against forecasts/reanalysis.
- openaq-fetch
- Fetch OpenAQ air-quality station observations (PM2.5, PM10, NO2, O3, SO2, CO) for a date range and region, and write a station-schema Rhiza Envelope Zarr. Use when a task needs in-situ air-quality / atmospheric-composition data, e.g. to compare against gridded model output.
- smap-fetch
- 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 Rhiza Envelope Zarr. Use when a task needs gridded land-surface soil-moisture observations, e.g. for drought or agriculture analysis or comparison against models.
- tahmo-fetch
- Fetch TAHMO station observations for one or more African countries and write a Rhiza Envelope Zarr (station-dim 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 Rhiza 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 Rhiza 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 Rhiza 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 Rhiza 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 Rhiza 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 cftime. 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 diffs, so each step value represents the period since the previous step rather than the accumulation since initialization. - difference
- Subtract one Rhiza 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 Rhiza Envelope Zarr onto a FINER-OR-EQUAL grid, adding information via a chosen --method (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 Rhiza 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. - select
- Select entries along one named dimension of a Rhiza 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 Rhiza 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 itsunitsattr.
Visualization envelope → PNG
- plot
- Render a 2D heatmap or 1D time series PNG from any gridded or station Rhiza 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 Rhiza 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 Rhiza 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.
Egress
- 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.
Agent tooling no envelope output — help an agent operate the set
- provenance
- Inspect the rhiza_history provenance chain stamped on a Rhiza 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 the link fits GitHub's length limit. Use when a user wants to report a bug or suggestion about the skills.
Install
The skills live at github.com/rhiza-research/forecasting-skills. Three ways to use them.
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 agent skills
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@rhiza
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.