weather‑skills.org 37 skills MIT license github

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 record
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.

01

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.

agent session
02

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.

03

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
04

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.

  1. fetch

    source → standard dataset

    • arco-era5-fetch
    • chirps-fetch
    • cmip6-fetch
    • +9 more
  2. transform

    standard dataset → standard dataset

    • aggregate-temporal
    • clip-region
    • coarsen
    • +11 more
  3. 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.

05

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. -v must 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 a vertical dim; -v t / -v gh select 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 (then d2m, winds). Pressure-level: -v t / -v gh (control only, all native levels). -v is the short name (t2m, sst, t), not ARCO 2m_temperature. Real-time S2S has a 2-day embargo — request an init at least 2 days old. Fetch writes tp as a per-step rate (mm day-1) and temperatures as degree_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 step axis 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 step lead-time axis as wall-clock valid times (time = init + step), replacing the step dim with a time dim. 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/E value (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-time or --date values 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.
06

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.

An interactive way to try the skills from this site is planned.

Submit a skill →