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)
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)
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/.
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.
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8290b1f0e917eb02a426c9ca67d66004d0970ca76b2f03092db016da2398cd51
|
|
| MD5 |
ff5f8e5e3a4fe5038771e685a8665936
|
|
| BLAKE2b-256 |
b1b1d0547a579ba9e3085bea7b411058e46a7d33537128b23e59355e1c6aafa9
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
170c4e2e1d33744979cae625a3da66d341790f13a92a7954147cb2bc8abe93c7
|
|
| MD5 |
3273f274f733d5d427f039ae3a5c1ffa
|
|
| BLAKE2b-256 |
72a87ee78a122865eca57b893c29a9cc512dbfe0ca89c5ad842ebb4432b7799f
|