meteoswiss-ogd — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited meteoswiss-ogd (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Access Swiss weather data from MeteoSwiss Open Government Data. Free, no API key. All data from data.geo.admin.ch. CSVs use semicolon (;) delimiters. Metadata CSVs are Latin1 — pipe through iconv -f latin1 -t utf-8.
| Data | URL / Method | Updates |
|---|---|---|
| Current weather | https://data.geo.admin.ch/ch.meteoschweiz.messwerte-aktuell/VQHA80.csv | 10 min |
| Station metadata | STAC ch.meteoschweiz.ogd-smn → asset ogd-smn_meta_stations.csv (Latin1) | Daily |
| Forecast metadata | STAC ch.meteoschweiz.ogd-local-forecasting → asset containing meta_point.csv (Latin1) | Daily |
| Forecast data | STAC items in ch.meteoschweiz.ogd-local-forecasting → parameter CSVs | Hourly |
| Pollen data | https://data.geo.admin.ch/ch.meteoschweiz.ogd-pollen/{abbr}/ogd-pollen_{abbr}_d_recent.csv (Latin1) | Daily |
STAC API base: https://data.geo.admin.ch/api/stac/v1
# Get weather for Zurich (station SMA) — key columns: tre200s0 (temp °C),
# ure200s0 (humidity %), rre150z0 (precip mm), fu3010z0 (wind km/h)
curl -s 'https://data.geo.admin.ch/ch.meteoschweiz.messwerte-aktuell/VQHA80.csv' \
| awk -F';' 'NR==1 || $1=="SMA"'Full parameter list in ${CLAUDE_SKILL_DIR}/REFERENCE.md. Missing values appear as empty fields or -. Timestamps are YYYYMMDDHHmm in UTC.
# Search weather stations by name (Latin1 encoded)
curl -s 'https://data.geo.admin.ch/ch.meteoschweiz.ogd-smn/ogd-smn_meta_stations.csv' \
| iconv -f latin1 -t utf-8 \
| awk -F';' 'NR==1 || tolower($0) ~ /zurich/'Columns: station_abbr, station_name, station_canton, station_height_masl, station_coordinates_wgs84_lat, station_coordinates_wgs84_lon.
# Search forecast locations (~6000 points: stations, postal codes, mountains)
# NOTE: Asset key has a known typo "forcasting" — always get URL from STAC
META_URL=$(curl -s 'https://data.geo.admin.ch/api/stac/v1/collections/ch.meteoschweiz.ogd-local-forecasting' \
| jq -r '[.assets | to_entries[] | select(.key | contains("meta_point")) | .value.href] | first')
curl -s "$META_URL" | iconv -f latin1 -t utf-8 \
| awk -F';' 'NR==1 || $3 ~ /8001/' # search by postal codePoint columns: point_id, point_type_id (1=station, 2=postal_code, 3=mountain), postal_code, station_abbr, point_name.
Two steps: get the latest STAC item, then download parameter CSVs.
# Step 1: Get latest forecast item
ITEM=$(curl -s 'https://data.geo.admin.ch/api/stac/v1/collections/ch.meteoschweiz.ogd-local-forecasting/items?limit=10' \
| jq -r '[.features[].id] | sort | reverse | .[0]')
# Step 2: Get a parameter CSV (e.g., daily max temperature for Zurich station, point_id=48)
ASSET_URL=$(curl -s "https://data.geo.admin.ch/api/stac/v1/collections/ch.meteoschweiz.ogd-local-forecasting/items/$ITEM" \
| jq -r '[.assets | to_entries[] | select(.key | contains("tre200dx"))] | sort_by(.key) | last | .value.href')
curl -s "$ASSET_URL" | awk -F';' 'NR==1 || $1=="48"'Station forecasts (point_type_id=1) have daily params: tre200dx (max temp), tre200dn (min temp), rka150d0 (precip), jp2000d0 (weather icon). Postal codes/mountains (type 2,3) have hourly params: tre200h0, rre150h0, jww003i0 — aggregate to daily by grouping on first 8 timestamp chars. Common point_ids: Zurich=48, Bern=29, Geneva=53.
Weather icon SVGs: https://www.meteoschweiz.admin.ch/static/resources/weather-symbols/{CODE}.svg — replace {CODE} with the numeric icon code (e.g., 1.svg for sunny, 101.svg for clear night). See ${CLAUDE_SKILL_DIR}/REFERENCE.md for all codes.
# Stations: PBE, PBS, PBU, PCF, PDS, PGE, PJU, PLO, PLS, PLU, PLZ, PMU, PNE, PPY, PSN, PZH
# Use lowercase in URLs
curl -s 'https://data.geo.admin.ch/ch.meteoschweiz.ogd-pollen/pzh/ogd-pollen_pzh_d_recent.csv' \
| iconv -f latin1 -t utf-8 \
| awk -F';' 'NR==1{print} {last=$0} END{print last}'Columns: station_abbr, reference_timestamp, then pollen parameter codes (e.g. kabetud1=birch, khpoacd1=grasses) in particles/m³. See ${CLAUDE_SKILL_DIR}/REFERENCE.md for all codes.
iconv -f latin1 -t utf-8Token-efficient CLI tools that output structured key=value pairs. Use these instead of raw curl when available — they handle encoding, error checking, and output parsing.
${CLAUDE_SKILL_DIR}/scripts/current-weather.sh SMA # current weather for Zurich
${CLAUDE_SKILL_DIR}/scripts/search-stations.sh zurich # find weather stations
${CLAUDE_SKILL_DIR}/scripts/search-forecast-points.sh 8001 # find forecast point_id by postal code
${CLAUDE_SKILL_DIR}/scripts/forecast.sh 48 # forecast for Zurich (point_id=48)
${CLAUDE_SKILL_DIR}/scripts/pollen.sh ZUE # pollen data for ZurichAll scripts accept --help for usage details. Requires: curl, awk, iconv. Forecast also needs jq.
For complex queries (fuzzy search, geocoding, structured JSON), use the MCP server: claude mcp add meteoswiss https://meteoswiss-mcp.ars.is/mcp
See ${CLAUDE_SKILL_DIR}/REFERENCE.md for all parameters, weather icon codes, and STAC collections.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.