@pipeworx/noaa-coastwatch
Connect: https://gateway.pipeworx.io/noaa-coastwatch/mcp · Install: one-click buttons
No MCP client? Skip the connection: POST https://gateway.pipeworx.io/v1/tools/search_packs {"query":"..."} to find a tool below, GET /v1/tools/<name> for its schema, POST the same URL with arguments for the data — see For AI agents.
Tools: 4
NOAA CoastWatch’s satellite and model ocean record — sea surface temperature, chlorophyll-a, winds, currents and the full NDBC moored-buoy archive — read live from CoastWatch’s two ERDDAP servers.
Tools
noaa_coastwatch_search_datasets(query, protocol?, node?, limit?)— full-text search of the dataset catalogue. Start here: every other tool takes adataset_idfrom these results.noaa_coastwatch_dataset_info(dataset_id, node?)— variables, units, axes, time coverage, licence. Call it before querying data; variable names are case-sensitive.noaa_coastwatch_tabledap(dataset_id, variables?, constraints?, node?, limit?)— rows from a tabledap dataset, e.g. hourly NDBC buoy observations back to 1970.noaa_coastwatch_griddap_point(dataset_id, variable, latitude, longitude, time?, depth?, node?)— one gridded value at one time/lat/lon, snapped to the nearest grid cell.
Auth
Keyless. Both nodes serve anonymously. A User-Agent is sent on every request.
Data sources
- https://coastwatch.pfeg.noaa.gov/erddap —
node: "westcoast"(default). ERD/SWFSC: satellite SST, chlorophyll, winds, currents, andcwwcNDBCMet, the NDBC buoy archive. - https://coastwatch.noaa.gov/erddap —
node: "national". Operational VIIRS and ABI products.
The two hold different datasets. A dataset_id from one does not resolve on the other, and the
error for that is “Currently unknown datasetID=…”, which reads as a broken id rather than a
wrong node.
Traps
Protocol-level traps live in shared/src/erddap.ts (shared with ioos-erddap) and are documented
in full at the top of that file. The two that bite hardest here:
- ERDDAP reports “nothing found” as HTTP 404 with a plain-text body, not as an empty table — for a search that matches nothing AND for a tabledap query whose constraints exclude every row. The body is not JSON, so a naive parse loses the message entirely. That message is worth keeping: it names the dataset’s real range (“No data matches time>=2050-01-01 because the numeric variable’s source min=1970-02-26T20:00:00Z, max=2026-09-17T23:35:00Z”).
- Variable names are case-sensitive and often UPPERCASE. NDBC water temperature is
WTMP, air temperatureATMP, wind speedWSPD. A lowercase request is a 400Unrecognized variable, which reads as “this buoy does not report water temperature”.
One more, local to this pack: the two nodes do not agree on their search columns. The West
Coast node returns 17 columns including “Accessible”; the national node returns 15 and omits it.
Anything that indexed rows[6] would read the title on one and the ISO-19115 link on the other —
a wrong answer, never an error. The shared client indexes by column name.
Tools
- noaa_coastwatch_search_datasets — Full-text search NOAA CoastWatch’s ERDDAP catalogue for ocean satellite and buoy datasets
- noaa_coastwatch_dataset_info — Variable names, units, axes, time coverage and licence for one CoastWatch ERDDAP dataset.
- noaa_coastwatch_tabledap — Rows from a CoastWatch tabledap dataset — buoy and station timeseries such as the NDBC
- noaa_coastwatch_griddap_point — One gridded value at one time, latitude and longitude — sea surface temperature,
Tools
noaa_coastwatch_dataset_info— Variable names, units, axes, time coverage and licence for one CoastWatch ERDDAP dataset.noaa_coastwatch_griddap_point— One gridded value at one time, latitude and longitude — sea surface temperature,noaa_coastwatch_search_datasets— Full-text search NOAA CoastWatch's ERDDAP catalogue for ocean satellite and buoy datasetsnoaa_coastwatch_tabledap— Rows from a CoastWatch tabledap dataset — buoy and station timeseries such as the NDBC