@cyanheads/noaa-marine-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@cyanheads/noaa-marine-mcp-serverFind tide stations near Key West, FL"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Public Hosted Server: https://noaa-marine.caseyjhand.com/mcp
Tools
Seven tools covering the full US marine operational workflow — station discovery, tide predictions, observed water levels, tidal current predictions and profiles, and live offshore buoy conditions:
Tool | Description |
| Find CO-OPS tide/water-level/current stations and NDBC buoys near a location or by name/state. Required first step to resolve place names or coordinates to station IDs. |
| High/low tide predictions for a CO-OPS tide station over a date range. Supports 6-minute interval output and multiple datums (defaults to MLLW — US nautical chart standard). |
| Observed water level (real-time or historical) for a CO-OPS station, paired with predictions to compute storm surge or anomalous drawdown. |
| Tidal current predictions for a CO-OPS current station: max flood/ebb speeds, slack times, and directions. Defaults to MAX_SLACK (practical passage-planning view). |
| Live marine conditions from an NDBC buoy: wave height/period/direction, wind, sea-surface temp, air temp, and barometric pressure. |
| Observed ocean-current depth profile from an NDBC ADCP buoy: speed and direction at each depth bin. Distinct from |
| Sub-surface water-column observations from an NDBC station: water temperature, salinity, dissolved oxygen, chlorophyll, turbidity, and pH at each reported depth. The water-column counterpart to |
noaa_marine_find_stations
Unified station discovery across CO-OPS (3,450+ tide/water-level stations, 4,430+ current stations) and NDBC (1,354+ active buoys worldwide).
Filter by proximity (latitude/longitude + radius), name substring, state/territory, source (CO-OPS vs NDBC), or
types: data capabilities (tide, current, water_level, met, current_profile) or NDBC platform class (buoy)Returns a unified station list with source, coordinates, distance, data capabilities, and — for NDBC — the physical platform class (buoy, fixed, oilrig, dart, tao, usv, other)
Station lists are cached in-memory (6-hour TTL) — first call after startup may be slightly slower
Required first step: CO-OPS and NDBC use non-overlapping ID systems; guessing a station ID reliably fails
noaa_marine_get_tide_predictions
CO-OPS MLLW tide predictions for planning tidal windows.
High/low events (default) or 6-minute continuous curve
Eight datums: MLLW (default, US nautical chart), MHHW, MSL, MTL, MHW, MLW, CD, STND
Time zone options: local standard/daylight (default), GMT, local standard only
Units: English (feet, default) or metric (meters)
Maximum date range: 1 year per request (typed error
date_range_exceededfor longer ranges)
noaa_marine_get_water_level
Observed water level vs. predicted — the storm surge view.
6-minute observed water level readings with quality flags
Paired tide predictions fetched in parallel (failure degrades gracefully — observed levels still returned)
Optional residual summary: max surge and max drawdown when both series are present
Maximum date range: 31 days per request for 6-minute data
noaa_marine_get_currents
CO-OPS tidal current predictions for passage planning.
MAX_SLACK interval (default): max flood, max ebb, and slack events only — the actionable view for transiting inlets and channels
6-minute interval: full continuous current curve for charting or integration
Current station IDs use alphanumeric format (e.g.,
ACT4176), distinct from numeric tide station IDs — usefind_stationswithtypes: ["current"]to discover them
noaa_marine_get_conditions
Live NDBC buoy observations (most recent ~45 days, updated every 10 minutes).
Wave height (m), dominant and average period (sec), mean wave direction
Wind speed and gust (m/s), wind direction
Sea-surface temperature, air temperature, dew point (°C)
Barometric pressure (hPa)
All sensor fields nullable (
nullwhen buoy sensor did not report — normal for offshore buoys)All values in SI units except
TIDE(feet) andVIS(nautical miles), which are rarely populated at offshore buoys
noaa_marine_get_current_profile
Observed ocean-current depth profile from an NDBC ADCP buoy — the most recent measurement at each depth bin.
Depth (m), direction (degrees true, the direction the current flows toward), and speed (cm/s) per bin
Distinct from
noaa_marine_get_currents: this is an NDBC observed acoustic-Doppler measurement, not a CO-OPS tidal-current predictionMost NDBC stations serve no ADCP profile — use
find_stationswithsource="ndbc"andtypes: ["current_profile"]to discover the ones that doDirection or speed is
nullfor a bin when NDBC did not report that component
noaa_marine_get_ocean_observations
Sub-surface water-column observations from an NDBC station — the most recent reading at each reported depth.
Water temperature (°C), conductivity (mS/cm), salinity (psu), dissolved oxygen (% saturation and ppm), chlorophyll (µg/l), turbidity (FTU), pH, and redox potential (mV) per depth
The water-column counterpart to
noaa_marine_get_conditions: this reports what the water is doing below the surface, that one reports surface weather and sea stateSensor coverage is sparse — most stations report only temperature and salinity; any value the station did not report comes back
null, never a fabricated zeroSub-surface sensors are on only a subset of NDBC stations and carry no station-catalog flag, so there is no capability filter — call it on candidate
source="ndbc"station IDs and expect theobservations_not_founderror on the many stations that serve no ocean file
Related MCP server: mcp-noaa-tides
Resources and prompts
Type | Name | Description |
Resource |
| Metadata for a CO-OPS or NDBC station by ID: name, coordinates, source, data capabilities, state, and — for NDBC — physical platform class. |
All resource data is also reachable via tools. Use noaa_marine_find_stations to discover station IDs before accessing the resource.
Features
Built on @cyanheads/mcp-ts-core:
Declarative tool and resource definitions — single file per primitive, framework handles registration and validation
Unified error handling — handlers throw, framework catches, classifies, and formats with typed error contracts
Structured logging with optional OpenTelemetry tracing
STDIO and Streamable HTTP transports
Pluggable auth:
none,jwt,oauth
NOAA-specific:
In-memory station cache (6-hour TTL) for CO-OPS and NDBC station lists — discovery is fast after first startup
CO-OPS and NDBC integrated in a unified station model —
find_stationsfans out across both sources in parallelNDBC fixed-width text parser:
MM(missing sensor data) normalized tonull, not passed through as stringsPaired water-level + prediction fetches for storm surge residual computation
CO-OPS
application=courtesy parameter sent on every request (configurable viaNOAA_APPLICATION_ID)
Agent-friendly output:
Datum echoed on every tide/water-level response — agents can state units and reference correctly without assumptions
total_foundonfind_stationsshows count beforelimitslice so agents know whether to re-queryAll NDBC sensor fields explicitly nullable with per-field unit documentation — agents don't fabricate missing readings
Typed station source (
coops|ndbc) on every station record, plus a data-capabilitytypeand (NDBC only) aplatformclass where applicable — agents can branch on data, not string parsing
Getting started
No API key required. Both NOAA CO-OPS and NDBC are open, keyless data sources.
Public Hosted Instance
Connect directly via Streamable HTTP — no install, no API key:
{
"mcpServers": {
"noaa-marine": {
"type": "streamable-http",
"url": "https://noaa-marine.caseyjhand.com/mcp"
}
}
}Self-hosted / local
Add the following to your MCP client configuration file:
{
"mcpServers": {
"noaa-marine": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/noaa-marine-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"noaa-marine": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/noaa-marine-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"noaa-marine": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/noaa-marine-mcp-server:latest"
]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.3.14 or higher (or Node.js v24+).
No external API keys needed — NOAA CO-OPS and NDBC are fully open.
Installation
Clone the repository:
git clone https://github.com/cyanheads/noaa-marine-mcp-server.gitNavigate into the directory:
cd noaa-marine-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env if needed (all vars optional)Configuration
Variable | Description | Default |
| Courtesy identifier sent as |
|
| Transport: |
|
| Port for HTTP server. |
|
| Auth mode: |
|
| Log level (RFC 5424). |
|
| Directory for log files (Node.js only). |
|
| Enable OpenTelemetry instrumentation. |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run:
bun run rebuild bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t noaa-marine-mcp-server .
docker run --rm -p 3010:3010 noaa-marine-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/noaa-marine-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Path | Purpose |
|
|
|
|
| CO-OPS Tides & Currents API client: station list cache, data fetch, error detection. |
| NDBC buoy service: active stations XML parser, realtime text parser. |
| Five tool definitions ( |
| Station metadata resource ( |
| Vitest tests mirroring |
| Design doc and directory tree. |
Development guide
See CLAUDE.md/AGENTS.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped loggingRegister tools and resources in
src/index.tsdirectly (no barrels for this server)Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
NDBC
MMvalues must normalize tonull, not be passed through as strings
Contributing
Issues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityBmaintenanceThis is an MCP (Model Context Protocol) server that provides tools for interacting with the NOAA Tides and Currents API.Last updated24945MIT
- Alicense-qualityCmaintenanceMCP server that provides access to NOAA Tides & Currents data including tide predictions, water levels, currents, and meteorological observations.Last updated3MIT
- Flicense-qualityDmaintenanceMinimal MCP server exposing tools for kitesurfing forecasts (wind and waves via Open-Meteo) and tide predictions (via NOAA CO-OPS).Last updated
- Flicense-qualityBmaintenanceMCP server that provides tide predictions, station lookup, and tidal event alerts for US coastal locations using live NOAA data.Last updated
Related MCP Connectors
Tides MCP — NOAA Tides and Currents data
NOAA Tides & Currents — observations, predictions, datums, station metadata
Search NOAA climate stations and datasets, fetch historical weather observations.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/cyanheads/noaa-marine-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server