Skip to main content

FastMCP server for NOAA CO-OPS Tides and Currents API

Project description

mcnoaa-tides

MCP server for NOAA CO-OPS Tides and Currents. Exposes tide predictions, observed water levels, and meteorological data from ~301 U.S. coastal stations as tools, resources, and prompts via FastMCP 3.0.

Built for marine planning — fishing trips, boating, crabbing, safety checks.

Install

# Run directly (no install needed)
uvx mcnoaa-tides

# Or add to Claude Code
claude mcp add mcnoaa-tides -- uvx mcnoaa-tides

# With visualization support (charts)
uv pip install mcnoaa-tides[viz]

# Local development
uv run mcnoaa-tides

Tools

search_stations — Find stations by name, state, or type

search_stations(state="WA")

Returns up to 50 matching stations:

[
  {"id": "9447130", "name": "Seattle", "state": "WA", "lat": 47.6026, "lng": -122.3393, "tidal": true},
  {"id": "9446484", "name": "Tacoma", "state": "WA", "lat": 47.2671, "lng": -122.4132, "tidal": true},
  {"id": "9444900", "name": "Port Townsend", "state": "WA", "lat": 48.1129, "lng": -122.7595, "tidal": true}
]

Also supports query (name search) and is_tidal (filter tidal vs non-tidal).

find_nearest_stations — Proximity search by coordinates

find_nearest_stations(latitude=47.6, longitude=-122.34, limit=3)

Distances in nautical miles:

[
  {"id": "9447130", "name": "Seattle", "state": "WA", "lat": 47.6026, "lng": -122.3393, "distance_nm": 0.2},
  {"id": "9446484", "name": "Tacoma", "state": "WA", "lat": 47.2671, "lng": -122.4132, "distance_nm": 20.1},
  {"id": "9445958", "name": "Bremerton", "state": "WA", "lat": 47.5615, "lng": -122.6225, "distance_nm": 14.7}
]

get_station_info — Expanded station metadata

get_station_info(station_id="9447130")

Returns sensors, datums, products, and station details. Seattle has been operating since 1899.

Full response (194 lines)

See examples/station-detail-seattle.json

get_tide_predictions — High/low tide times

get_tide_predictions(station_id="9447130", hours=24)

Defaults to hilo interval (high/low times only) — the most useful format for planning:

{
  "predictions": [
    {"t": "2026-02-21 00:49", "v": "2.658", "type": "L"},
    {"t": "2026-02-21 07:08", "v": "12.261", "type": "H"},
    {"t": "2026-02-21 13:43", "v": "1.167", "type": "L"},
    {"t": "2026-02-21 19:54", "v": "9.857", "type": "H"}
  ]
}

type: H = high tide, L = low tide. Values in feet above MLLW.

Other intervals: "h" (hourly), "6" (6-minute). Datum options: MLLW, MSL, NAVD, STND.

get_observed_water_levels — Actual readings

get_observed_water_levels(station_id="9447130", hours=3)

6-minute interval observations. Compare with predictions to see how reality diverges:

{
  "metadata": {"id": "9447130", "name": "Seattle", "lat": "47.6026", "lon": "-122.3393"},
  "data": [
    {"t": "2026-02-21 17:24", "v": "7.41", "s": "0.059", "f": "0,0,0,0", "q": "p"},
    {"t": "2026-02-21 17:30", "v": "7.62", "s": "0.072", "f": "0,0,0,0", "q": "p"},
    {"t": "2026-02-21 17:36", "v": "7.803", "s": "0.069", "f": "0,0,0,0", "q": "p"}
  ]
}

q: "p" = preliminary (real-time), "v" = verified (post-processed). s = standard deviation.

Full 3-hour response (213 lines)

See examples/water-levels-seattle.json

get_meteorological_data — Weather observations

One tool, 8 products. Select via product parameter:

Product Fields Units
air_temperature v deg F
water_temperature v deg F
wind s (speed), d (dir deg), dr (compass), g (gust) knots
air_pressure v millibars
conductivity v mS/cm
visibility v nautical miles
humidity v percent
salinity v PSU
get_meteorological_data(station_id="8454000", product="wind", hours=1)
{
  "metadata": {"id": "8454000", "name": "Providence", "lat": "41.8072", "lon": "-71.4007"},
  "data": [
    {"t": "2026-02-21 22:24", "s": "2.72", "d": "109.0", "dr": "ESE", "g": "3.3", "f": "0,0"},
    {"t": "2026-02-21 22:30", "s": "3.3", "d": "103.0", "dr": "ESE", "g": "3.89", "f": "0,0"},
    {"t": "2026-02-21 22:36", "s": "2.72", "d": "108.0", "dr": "ESE", "g": "3.5", "f": "0,0"}
  ]
}

Not all stations support all products — use get_station_info to check available sensors.

marine_conditions_snapshot — Everything at once

marine_conditions_snapshot(station_id="9447130")

Fires 6 parallel API calls (predictions, water level, water temp, air temp, wind, pressure) and returns a combined snapshot. Products that aren't available at a station appear under unavailable instead of failing the whole request:

{
  "station_id": "9447130",
  "fetched_utc": "2026-02-22T04:15:38.291Z",
  "predictions": {"predictions": [{"t": "...", "v": "12.261", "type": "H"}, "..."]},
  "water_level": {"data": [{"t": "...", "v": "10.22", "s": "0.053", "f": "0,0,0,0", "q": "p"}, "..."]},
  "air_pressure": {"data": [{"t": "...", "v": "1012.4", "f": "0,0,0"}, "..."]},
  "unavailable": {
    "water_temperature": "ValueError: No data was found...",
    "air_temperature": "ValueError: No data was found...",
    "wind": "ValueError: No data was found..."
  }
}

Best starting point for trip planning or safety assessments.

visualize_tides — Tide prediction chart

visualize_tides(station_id="9447130", hours=48, format="png")

Generates a tide prediction chart with the water level curve, high/low markers, and optional observed water level overlay. PNG returns an inline image via MCP; HTML saves an interactive Plotly chart to artifacts/charts/.

Seattle tide predictions — 48-hour forecast with predicted curve (blue), observed overlay (teal dashed), and high/low markers

Parameters:

  • hours — forecast window (default 48)
  • include_observed — overlay actual readings (default true)
  • format"png" (inline image) or "html" (interactive file)

Requires mcnoaa-tides[viz] — install with uv pip install mcnoaa-tides[viz].

visualize_conditions — Multi-panel conditions dashboard

visualize_conditions(station_id="9447130", hours=24, format="png")

Generates a multi-panel dashboard with up to 4 panels: tide predictions + observed overlay, wind speed/gust, air/water temperature, and barometric pressure with trend indicator. Products unavailable at a station are omitted.

Seattle marine conditions — 4-panel dashboard showing tides, wind, temperature, and barometric pressure

Parameters:

  • hours — data window (default 24)
  • format"png" (inline image) or "html" (interactive file)

Requires mcnoaa-tides[viz].

Resources

URI Description
noaa://stations Full station catalog (~301 stations)
noaa://stations/{station_id} Expanded metadata for one station
noaa://stations/{station_id}/nearby Stations within 50 nm

Prompts

plan_fishing_trip

Guides the LLM through station discovery, tide analysis, and weather assessment to recommend optimal fishing windows.

plan_fishing_trip(location="Narragansett Bay", target_species="striped bass", date="20260615")

marine_safety_check

GO / CAUTION / NO-GO assessment based on wind, visibility, water temperature, and pressure trends.

marine_safety_check(station_id="9447130")

Response field reference

Field Meaning
t Timestamp (local station time)
v Value (water level ft, temp F, pressure mb, etc.)
type H (high) or L (low) — predictions only
s Speed (wind, knots) or sigma (water level, std deviation)
d Wind direction in degrees true
dr Wind compass direction (N, NE, SW, etc.)
g Wind gust speed (knots)
f Data quality flags (comma-separated)
q QA level: p = preliminary, v = verified

Development

git clone <repo-url> && cd mcnoaa-tides
uv sync --dev

# Run tests (mock client, no network)
uv run pytest tests/ -v

# Lint
uv run ruff check src/

# Start server locally
uv run mcnoaa-tides

# Headless test with Claude
claude -p "Search for tide stations in Rhode Island" \
  --mcp-config .mcp.json \
  --allowedTools "mcp__mcnoaa-tides__*"

Data source

All data from NOAA Center for Operational Oceanographic Products and Services (CO-OPS). No API key required. Station IDs are 7-digit numbers (e.g. 9447130 for Seattle, 8454000 for Providence).

Two separate APIs are used:

  • Data API — observations and predictions (api.tidesandcurrents.noaa.gov/api/prod/datagetter)
  • Metadata API — station info, sensors, datums (api.tidesandcurrents.noaa.gov/mdapi/prod/webapi)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mcnoaa_tides-2026.2.22.tar.gz (1.3 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcnoaa_tides-2026.2.22-py3-none-any.whl (32.8 kB view details)

Uploaded Python 3

File details

Details for the file mcnoaa_tides-2026.2.22.tar.gz.

File metadata

  • Download URL: mcnoaa_tides-2026.2.22.tar.gz
  • Upload date:
  • Size: 1.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"EndeavourOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mcnoaa_tides-2026.2.22.tar.gz
Algorithm Hash digest
SHA256 8290b1f0e917eb02a426c9ca67d66004d0970ca76b2f03092db016da2398cd51
MD5 ff5f8e5e3a4fe5038771e685a8665936
BLAKE2b-256 b1b1d0547a579ba9e3085bea7b411058e46a7d33537128b23e59355e1c6aafa9

See more details on using hashes here.

File details

Details for the file mcnoaa_tides-2026.2.22-py3-none-any.whl.

File metadata

  • Download URL: mcnoaa_tides-2026.2.22-py3-none-any.whl
  • Upload date:
  • Size: 32.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"EndeavourOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mcnoaa_tides-2026.2.22-py3-none-any.whl
Algorithm Hash digest
SHA256 170c4e2e1d33744979cae625a3da66d341790f13a92a7954147cb2bc8abe93c7
MD5 3273f274f733d5d427f039ae3a5c1ffa
BLAKE2b-256 72a87ee78a122865eca57b893c29a9cc512dbfe0ca89c5ad842ebb4432b7799f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page