NES-LTER Data
This skill bundles a working, dependency-free client for the NES-LTER API at https://nes-lter-api.whoi.edu. It converts the core workflows from blongworth/nes-lter-mcp into a reusable skill. The MCP is also available as an optional connector when the agent has it configured.
Use the bundled client
Run the script from this skill directory:
python3 scripts/nes_lter.py stations
python3 scripts/nes_lter.py cruises --year 2025 --season winter
python3 scripts/nes_lter.py query-ctd --station L8 --variable oxygen --year 2025 --season winter
The script uses only the Python standard library and prints JSON. Set NES_LTER_API_BASE_URL or pass --base-url for a compatible API deployment. Every response includes source_url and retrieved_at where the API operation has a source path.
Workflow
- Parse the request into explicit station, variable, year, season, cruise, dataset, depth, time, and output-size filters.
- Discover identifiers before retrieving large data: use
stations, then cruises, then casts.
- Start CTD exploration with
query-ctd, which returns compact profile summaries by default. Add --include-points only for a small, intentional result.
- Use
profile CRUISE CAST for a known profile, rows DATASET CRUISE for underway/bottle/nutrient/HPLC/chlorophyll/event tables, schema DATASET CRUISE for unfamiliar columns, and track CRUISE for mapping.
- Use
--limit, --offset, station/variable filters, and time bounds to keep responses bounded.
- Report the exact filters, cruise/cast identifiers, selected variable column, units or a units caveat, and returned provenance.
CTD conventions
Friendly variables include oxygen, temperature, salinity, density, fluorescence, par, and transmissometer. Raw CTD columns are accepted too. Common candidates are:
- oxygen:
sbox0mm_kg, sbox1mm_kg
- temperature:
t090c, t190c, potemp090c, potemp190c
- salinity:
sal00, sal11
- density:
sigma_00, sigma_11
- fluorescence:
fleco_afl
Confirm units with schema or source metadata. The MCP describes sbox*mm_kg as commonly mmol/kg and t*c as commonly degrees C; do not present those as verified units without checking metadata.
Station matching defaults to a 3 km nearest-station tolerance. State any changed --max-distance-km. Seasons are meteorological; winter 2025 includes December 2024 through February 2025.
Examples
Compact oxygen summaries for station L8:
python3 scripts/nes_lter.py query-ctd \
--station L8 --variable oxygen --year 2025 --season winter --limit 25
Full points for one selected cast:
python3 scripts/nes_lter.py profile CRUISE_NAME CAST_NUMBER \
--variable oxygen --include-points --depth-min 0 --depth-max 500
Nutrient rows with pagination:
python3 scripts/nes_lter.py rows nutrients CRUISE_NAME --limit 200 --offset 0
Failure handling
- If discovery returns no records, relax one filter at a time and explain the change.
- If a variable is absent, run
resolve-variable NAME and then schema DATASET CRUISE.
- If a response is truncated, continue with the returned pagination rather than silently dropping rows.
- If the API fails, report the operation and endpoint; do not fabricate a fallback.
For exact endpoint mappings, dataset names, environment variables, and optional MCP setup, read references/api.md.
1---2name: nes-lter-data3description: Query and analyze New England Shelf Long-term Ecological Research (NES-LTER) oceanographic data with the bundled command-line client or the optional NES-LTER MCP. Use for NES-LTER stations, cruises, casts, CTD profiles, underway or bottle data, nutrients, HPLC, chlorophyll, events, cruise tracks, schemas, variable resolution, and source-backed summaries.4---56# NES-LTER Data78This skill bundles a working, dependency-free client for the NES-LTER API at `https://nes-lter-api.whoi.edu`. It converts the core workflows from [blongworth/nes-lter-mcp](https://github.com/blongworth/nes-lter-mcp) into a reusable skill. The MCP is also available as an optional connector when the agent has it configured.910## Use the bundled client1112Run the script from this skill directory:1314```bash15python3 scripts/nes_lter.py stations16python3 scripts/nes_lter.py cruises --year 2025 --season winter17python3 scripts/nes_lter.py query-ctd --station L8 --variable oxygen --year 2025 --season winter18```1920The script uses only the Python standard library and prints JSON. Set `NES_LTER_API_BASE_URL` or pass `--base-url` for a compatible API deployment. Every response includes `source_url` and `retrieved_at` where the API operation has a source path.2122## Workflow23241. Parse the request into explicit station, variable, year, season, cruise, dataset, depth, time, and output-size filters.252. Discover identifiers before retrieving large data: use `stations`, then `cruises`, then `casts`.263. Start CTD exploration with `query-ctd`, which returns compact profile summaries by default. Add `--include-points` only for a small, intentional result.274. Use `profile CRUISE CAST` for a known profile, `rows DATASET CRUISE` for underway/bottle/nutrient/HPLC/chlorophyll/event tables, `schema DATASET CRUISE` for unfamiliar columns, and `track CRUISE` for mapping.285. Use `--limit`, `--offset`, station/variable filters, and time bounds to keep responses bounded.296. Report the exact filters, cruise/cast identifiers, selected variable column, units or a units caveat, and returned provenance.3031## CTD conventions3233Friendly variables include `oxygen`, `temperature`, `salinity`, `density`, `fluorescence`, `par`, and `transmissometer`. Raw CTD columns are accepted too. Common candidates are:3435- oxygen: `sbox0mm_kg`, `sbox1mm_kg`36- temperature: `t090c`, `t190c`, `potemp090c`, `potemp190c`37- salinity: `sal00`, `sal11`38- density: `sigma_00`, `sigma_11`39- fluorescence: `fleco_afl`4041Confirm units with `schema` or source metadata. The MCP describes `sbox*mm_kg` as commonly mmol/kg and `t*c` as commonly degrees C; do not present those as verified units without checking metadata.4243Station matching defaults to a 3 km nearest-station tolerance. State any changed `--max-distance-km`. Seasons are meteorological; winter 2025 includes December 2024 through February 2025.4445## Examples4647Compact oxygen summaries for station L8:4849```bash50python3 scripts/nes_lter.py query-ctd \51 --station L8 --variable oxygen --year 2025 --season winter --limit 2552```5354Full points for one selected cast:5556```bash57python3 scripts/nes_lter.py profile CRUISE_NAME CAST_NUMBER \58 --variable oxygen --include-points --depth-min 0 --depth-max 50059```6061Nutrient rows with pagination:6263```bash64python3 scripts/nes_lter.py rows nutrients CRUISE_NAME --limit 200 --offset 065```6667## Failure handling6869- If discovery returns no records, relax one filter at a time and explain the change.70- If a variable is absent, run `resolve-variable NAME` and then `schema DATASET CRUISE`.71- If a response is truncated, continue with the returned pagination rather than silently dropping rows.72- If the API fails, report the operation and endpoint; do not fabricate a fallback.7374For exact endpoint mappings, dataset names, environment variables, and optional MCP setup, read [references/api.md](references/api.md).