A curated skill library for weather and climate data
Let your AI assistant fetch, transform, and visualize weather data — with provenance you can audit.
Weather skills turn scientific weather-data pipelines into fixed, reviewable tools that are meant for agentic AI. They run in any AI environment with a code-execution runtime and uv. Each output file carries provenance: a record of which skill, version, and arguments produced it, so someone else can rerun or check the chain. The skill is the script that was checked in; nothing is generated at runtime unless you want it to be. Initiated by Rhiza Research. A community working group will steward the catalog.
- artifact
- weekly.png
- produced by
- ecmwf-fetch → aggregate-temporal → convert-to-totals → plot
- provenance
- weather_skills_history — append-only JSON chain
- standards
- CF conventions · Zarr v3
Stamped on every standard dataset Zarr and plot PNG.
See it run
From a plain-language request, the agent picks skills and runs them in order. This is a real session, replayed: first call resolve-region to print Senegal's bounding box → fetch IMERG → clip to the region → aggregate to weekly mean rates → convert to 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 standard dimensions and types, including non-standard model calendars.
Auditable provenance
Provenance is a record of which skill, version, and arguments produced
a file, so a colleague can rerun or check the chain. Every
zarr-writing skill appends that record to
weather_skills_history, an append-only JSON chain that
also stores a hash of each input. Plot PNGs embed the same chain in
their metadata and, when the chain is intact, a corner
provenance-verified mark. 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 on each invocation, so any AI environment with a
code-execution runtime can invoke them. Nothing is generated at runtime
unless you want it to be. 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 standard dataset
Pipelines chain three kinds of skills: fetchers pull data from a source and write a standard dataset, transforms operate on any standard dataset, and figure skills render the result. A fourth group, agent capabilities, supports pipelines without producing a standard dataset — resolving a region name to a bounding box or inspecting provenance. A user states the goal in natural language and the agent picks skills from the set and runs them in order.
-
fetch
source → standard dataset
- arco-era5-fetch
- chirps-fetch
- cmip6-fetch
- +9 more
-
transform
standard dataset → standard dataset
- aggregate-temporal
- clip-region
- coarsen
- +11 more
-
figure
standard dataset → PNG
- kenya-forecast-png
- plot
- plot-compare
- +3 more
Example — first call resolve-region to print the N/W/S/E bbox, then pass it to fetch and clip. A forecast is aggregated to weekly mean rates, converted to totals, and plotted; satellite observations are clipped to the same bbox:
# First call resolve-region to print the bbox; reuse it on fetch and 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 mean \
--output /tmp/ecmwf_weekly.zarr
forecasting-skills convert-to-totals \
--input /tmp/ecmwf_weekly.zarr \
--output /tmp/ecmwf_weekly_totals.zarr
forecasting-skills plot \
--input /tmp/ecmwf_weekly_totals.zarr \
--variable tp \
--output /tmp/weekly.png
forecasting-skills imerg-fetch \
--start-time 2025-12-24 \
--end-time 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 standard dataset is a CF-compliant Zarr v3 store.
Skills declare what they need as dimension names
(lat, lon, time,
init_time, prediction_timedelta,
member, point_id, …)
or as a type — a named bundle of those dimensions.
forecast means the Zarr must have lat,
lon, init_time, and
prediction_timedelta; spatial means
lat and lon. Incoming datasets often use other
names for the same axes (step for
prediction_timedelta, number for
member); those count. 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
STANDARD_DATASET.md.
observations
lat, lon, time
satellite grids, reanalyses
forecast
lat, lon, init_time,
prediction_timedelta
ensembles add member
point_obs
point_id, time
in-situ station observations
Units live on each data variable as a CF units string that
must be pintable — parseable by pint / UDUNITS. Known
kinds convert to a standard unit: temperature as
degree_Celsius, precipitation rate as
mm day-1, precipitation amount as mm. For
accumulated variables such as precipitation, fetch writes a
rate, not a period total. A total is
the rate multiplied by a stamped aggregation_period
(convert-to-totals). Those totals helpers refuse inputs that
are already amounts, so multiplying by the period cannot double-count.
See
UNITS.md
for the full units contract.
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.
Prefer dynamical-fetch when the dynamical.org catalog has the
dataset (GFS, GEFS, ECMWF IFS-ENS, AIFS, and others) — it needs no
credentials. Use ecmwf-fetch for ECMWF S2S, and other
source-specific fetchers when the catalog does not carry the product.
Fetchers ingress — source → standard dataset
- 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 standard dataset 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 standard dataset 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 standard dataset Zarr. Use when a task needs climate-projection grids (historical or future scenario) for downstream clipping, aggregation, comparison, or plotting.
- dynamical-fetch
- Prefer this over credentialed fetchers when the dynamical.org catalog has the dataset. Fetch a dataset from the open weather catalog (GFS, GEFS, ECMWF IFS-ENS, AIFS, ICON-EU, MRMS, their analyses, and the IMERG precipitation analyses) and write a weather-skills standard dataset Zarr. Use when a task needs credential-free forecast or analysis grids for downstream clipping, aggregation, comparison, or plotting.
-vmust be the catalog name (e.g. precipitation_surface), not total_precipitation / 2m_temperature from other fetchers. Pressure-level fields (temperature_850hpa,geopotential_height_500hpa) are stacked onto averticaldim;-v t/-v ghselect all native levels. Precip is already a rate — do not deaccumulate; aggregate-temporal then convert-to-totals for period mm. - ecmwf-fetch requires credentials
- On the first call, inject secrets ECMWF_DATASTORES_URL and ECMWF_DATASTORES_KEY as environment variables — do not run once without them and retry. Prefer dynamical-fetch for medium-range ECMWF IFS-ENS / AIFS (credential-free). This skill fetches an ECMWF S2S ensemble forecast (control + perturbed) for a date and bbox from the ECMWF Data Stores (ECDS), writing a weather-skills standard dataset Zarr. Default
-v tp. Most used:tp,t2m,sst(thend2m, winds). Pressure-level:-v t/-v gh(control only, all native levels).-vis the short name (t2m,sst,t), not ARCO2m_temperature. Real-time S2S has a 2-day embargo — request an init at least 2 days old. Fetch writestpas a per-step rate (mm day-1) and temperatures asdegree_Celsius— do not run deaccumulate after this skill. 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 point_obs weather-skills standard dataset 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 daily satellite precipitation for a date range and write a weather-skills standard dataset Zarr. Use when a task needs recent daily IMERG rainfall, e.g. for station-vs-satellite comparison or verification. For half-hourly IMERG, use dynamical-fetch
nasa-imerg-analysis-early/nasa-imerg-analysis-late. - kenya-forecast-fetch
- Fetch a raw forecast grid from the public Kenya forecasts archive (gs://kenya-forecasting-data/<date>/data/*.zarr) and write a weather-skills standard dataset Zarr. Use when a task needs analyzable Kenya pilot fields (ECMWF S2S precip/temps/winds, GEFS, medium-range precip) for clipping, aggregation, comparison, or flexible plotting via plot / plot-timeseries / plot-mediogram. For pre-rendered product PNGs, use kenya-forecast-png instead.
- 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 standard dataset 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 point_obs weather-skills standard dataset 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 standard dataset 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 standard dataset Zarr (point_obs). Use when a task needs in-situ station rainfall/temperature/humidity/pressure, e.g. to compare against gridded satellite or forecast data.
Transforms standard dataset → standard dataset
- aggregate-temporal
- Roll up a weather-skills standard dataset Zarr along its time axis (or forecast step axis) into fixed windows (daily, weekly, dekadal, monthly, or a pint duration like '21 day') or a rolling --window, with mean/min/max. Keeps data_interval; stamps aggregation_period, aggregation_coverage, and CF cell_methods. Rates in and rates out — use convert-to-totals for period amounts (refuses overlapping rolling series; select non-overlapping times first).
- clip-region
- Spatially subset a weather-skills standard dataset Zarr to a lat/lon bbox or GeoJSON polygon. Use when you need to restrict any dataset (forecast, satellite, reanalysis, stations) before downstream aggregation or plotting. Named places: get a bbox (or polygon) from the resolve-region skill first.
- coarsen
- Coarsen or align a weather-skills standard dataset 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 standard dataset 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 standard dataset 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.
- convert-to-totals
- Convert rate variables to period totals by multiplying by stamped aggregation_period (pint). Use as a terminal step before plotting. Requires aggregate-temporal first. Refuses precip totals (would double-count). Default --min-coverage 1.0. Refuses overlapping intervals — run select on time/step first.
- deaccumulate
- Convert a leftover cumulative-since-init forecast variable along its
stepaxis into per-step rates (precip → mm day-1). Fetchers (ecmwf-fetch,dynamical-fetch,kenya-forecast-fetch) already write rates — do not run this after them. Use on older cumulative archives that still have amount units. - difference
- Subtract one weather-skills standard dataset 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 datasets must be compared cell-by-cell as a difference field.
- downscale
- Downscale a weather-skills standard dataset 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.
- rename
- Rename one data variable in a weather-skills standard dataset Zarr to a new name, writing a new standard dataset. 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 standard dataset 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 datasets before merging them along a new model dim.
- step-to-time
- Realize a forecast dataset'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. - summarize-dim
- Summarize one or more named dimensions of a weather-skills standard dataset 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 summary along a named dimension (the dim disappears). For coarser time windows that keep a time axis, use aggregate-temporal. - unit-convert
- Convert data variables in a weather-skills standard dataset to target units (pint / CF), or normalize recognized temp/precip variables to standard display units (degree_Celsius, mm day-1, mm) via --to-standard.
Figure standard dataset → PNG
- kenya-forecast-png
- Fetch a pre-rendered PNG from the public Kenya forecasts archive (Filestash / gs://kenya-forecasting-data) and write it to disk. Use when a task needs an official KMSA / Sheerwater product figure (weekly, dekadal, or monthly) from https://kenya-forecasts.sheerwater.rhizaresearch.org/files/ without regenerating the plot. For analyzable grids, use kenya-forecast-fetch then plot.
- plot
- Render a 2D heatmap or 1D time series PNG from any gridded or station weather-skills standard dataset Zarr. Use when you need to visualize a single dataset as a map or as a time/step profile. For precipitation, run aggregate-temporal then convert-to-totals first — plot period totals (
mm), not fetch rates (mm day-1). - plot-compare
- Render a side-by-side multi-panel comparison PNG of two weather-skills standard dataset Zarr stores (gridded-vs-gridded or station-vs-gridded). Use for sat-vs-station validation, model-vs-obs comparison, or cross-source QC. For precipitation, convert-to-totals after aggregate-temporal before plotting.
- plot-compare-forecasts
- Compare two or more gridded datasets as a heatmap grid PNG. Each input is a row; columns are the union of times (forecast init+step, or a time dim on observations / analyses). A dataset that lacks a column's time is a blank n/a cell, not a dropped column. Use after aggregating to a common resolution. For precipitation, convert-to-totals after that aggregation before plotting. For a single dataset use plot; for exactly two datasets including station-vs-grid use plot-compare.
- 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. For precipitation, run convert-to-totals after aggregate-temporal before plotting.
- 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 standard dataset 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. For precipitation, run aggregate-temporal then convert-to-totals first — plot totals (
mm), not rates.
Agent capabilities no dataset output — capabilities the agent uses alongside pipelines
- inspect-zarr
- Inspect a weather-skills standard dataset Zarr — print dimension sizes, coordinate values, and a data-variable summary (names, dims, dtype, units). Use when you need to see what is in a Zarr before clipping, selecting, aggregating, or plotting, or to confirm lat/lon/time coordinates after a fetch.
- provenance
- Inspect the weather_skills_history provenance chain stamped on a weather-skills artifact (a standard dataset 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, a Natural Earth multi-country region (East Africa, Western Africa), a sub-national region (state, province, county), or a leftover landmark name to a lat/lon bbox and optionally a boundary polygon GeoJSON. Use when you need to turn a country, county, or named place into a
--bbox N/W/S/Evalue (or a polygon mask) for clip-region, ecmwf-fetch, plot, or plot-compare. Prefer ISO3 / country-admin1 / Natural Earth region names; Nominatim is the fallback for landmarks. - resolve-time
- Resolve a relative date query (the last two weeks, today, latest, last month, now-3d) to absolute
--start-time/--end-timeor--datevalues from the current UTC date. Use before any fetch when the user said a relative window rather than YYYY-MM-DD. Does not know product lag — for the latest published day, run that fetcher with--probe-latest. - 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 standard dataset 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.