Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.cyanheads/noaa-marine-mcp-server

REMOTE · NOAA-MARINE.CASEYJHAND.COM · 2 COMPONENTS · SCANNED SEP 20

Find NOAA tide stations and NDBC buoys, fetch tide predictions, currents, and live conditions.

−1 this week 79 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security66
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation not fully verified: no authorisation is required to call this server, and 7 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
Schema Quality & AI Usability60
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 4229 tokens (~604/item across 7 items; 7 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 7 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 8 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the io.github.cyanheads/noaa-marine-mcp-server server?

io.github.cyanheads/noaa-marine-mcp-server is a hosted endpoint at https://noaa-marine.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · noaa-marine.caseyjhand.com

# add to Claude Code
claude mcp add --transport http cyanheads-noaa-marine-mcp-server 'https://noaa-marine.caseyjhand.com/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "cyanheads-noaa-marine-mcp-server": {
      "url": "https://noaa-marine.caseyjhand.com/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "cyanheads-noaa-marine-mcp-server": {
      "type": "http",
      "url": "https://noaa-marine.caseyjhand.com/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.cyanheads-noaa-marine-mcp-server]
url = "https://noaa-marine.caseyjhand.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-noaa-marine-mcp-server": {
      "type": "remote",
      "url": "https://noaa-marine.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add cyanheads-noaa-marine-mcp-server --url 'https://noaa-marine.caseyjhand.com/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  cyanheads-noaa-marine-mcp-server:
    url: "https://noaa-marine.caseyjhand.com/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "cyanheads-noaa-marine-mcp-server": {
      "Transport": "http",
      "Url": "https://noaa-marine.caseyjhand.com/mcp"
    }
  }
}
# add to Vellum
assistant mcp add cyanheads-noaa-marine-mcp-server -t streamable-http -u 'https://noaa-marine.caseyjhand.com/mcp'
// mcp.json
{
  "mcpServers": {
    "cyanheads-noaa-marine-mcp-server": {
      "type": "http",
      "url": "https://noaa-marine.caseyjhand.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 17 Sept 26 −1
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “noaa_marine_get_water_level” rewrote its description, which is the text the model reads security
    • Tool “noaa_marine_get_tide_predictions” rewrote its description, which is the text the model reads security
    • Tool “noaa_marine_get_ocean_observations” rewrote its description, which is the text the model reads security
    • Tool “noaa_marine_get_currents” rewrote its description, which is the text the model reads security
    • Tool “noaa_marine_get_current_profile” rewrote its description, which is the text the model reads security
    • Tool “noaa_marine_get_conditions” rewrote its description, which is the text the model reads security
    • Tool “noaa_marine_find_stations” rewrote its description, which is the text the model reads security
    • Schema quality: 376 → 604 functional
    • Server version: 0.4.0 → 0.5.0 functional
    • Server version: 0.3.2 → 0.4.0 functional
    • “noaa_marine_get_currents” added an optional parameter “offset” cosmetic
    • “noaa_marine_get_tide_predictions” added an optional parameter “limit” cosmetic
    • “noaa_marine_get_tide_predictions” added an optional parameter “offset” cosmetic
    • “noaa_marine_get_water_level” added an optional parameter “interval” cosmetic
    • “noaa_marine_get_water_level” added an optional parameter “limit” cosmetic
    • “noaa_marine_get_water_level” added an optional parameter “offset” cosmetic
    • “noaa_marine_get_currents” added an optional parameter “limit” cosmetic
    • “noaa_marine_get_currents” added an optional parameter “bin” cosmetic
    • “noaa_marine_get_tide_predictions” reworded the description of “interval” cosmetic
    • “noaa_marine_get_water_level” reworded the description of “datum” cosmetic
    • “noaa_marine_get_water_level” reworded the description of “time_zone” cosmetic
    • “noaa_marine_get_currents” reworded the description of “units” cosmetic
    • “noaa_marine_get_tide_predictions” reworded the description of “datum” cosmetic
    • “noaa_marine_find_stations” reworded the description of “query” cosmetic
    • “noaa_marine_get_ocean_observations” reworded the description of “station_id” cosmetic
  • 16 Sept 26 0
    • Server version: 0.3.1 → 0.3.2 functional
  • 9 Sept 26 0
    • Stability: 0.97 → pass security
  • 8 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 7 Sept 26 −1
    • Stability: pass → 0.93 functional
  • 26 Aug 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Aug 26 +1
    • Stability: 0.97 → pass security
    • MCP protocol: Implements a current MCP spec version (2026-07-28). functional
    • MCP protocol version: 2025-11-25 → 2026-07-28 functional
    • Server version: 0.3.0 → 0.3.1 functional
  • 23 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Probed https://noaa-marine.caseyjhand.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=caseyjhand.com CN=WE1,O=Google Trust Services,C=US 4 Sept 2026 3 Dec 2026 ECDSA 256 ECDSA-SHA256 a6985204ed51ae050e7738aa6be668e9
SANs: caseyjhand.com, *.caseyjhand.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of noaa-marine.caseyjhand.com. Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
caseyjhand.com. present 2371 13 Verified
noaa-marine.caseyjhand.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000; includeSubDomains; preload
x-content-type-options nosniff

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://noaa-marine.caseyjhand.com/mcp Verified 200
http (plaintext) http://noaa-marine.caseyjhand.com/mcp HTTPS enforced 301 https://noaa-marine.caseyjhand.com/mcp
MCP tools · 7 exposed · ~4,070 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
noaa_marine_find_stations ~780

Find CO-OPS tide, water-level and current stations and NDBC buoys near a location, by name, or by station ID, returning a unified list with source, data capabilities, coordinates, and — for NDBC — the physical platform class. This is the required first step for resolving a place name, a coordinate pair, or a bare station number to the station IDs the data tools take: CO-OPS tide and water-level IDs are numeric (e.g. 9447130 for Seattle), CO-OPS current IDs are alphanumeric (e.g. ACT4176), and NDBC buoy IDs are 5-character alphanumeric codes (e.g. 46041). Two axes are reported separately — capabilities and type name the data products a station serves (tide, current, water_level, met, current_profile, water_quality), while platform is the NDBC physical classification (buoy, fixed, oilrig, dart, tao, usv, other) that CO-OPS stations do not carry. Supply latitude and longitude together for a proximity search, or query for a name-or-ID substring matched against both sources, or state for CO-OPS coverage in one state; the filters combine, and results lead with an exact ID match unless a proximity search is ordering them by distance. A search that matches nothing is a success with total_found: 0 carrying an echo of the filters that were applied, and a search whose catalogs did not all answer says which source is missing. CO-OPS prediction stations carry a third axis as well, prediction_class, which says what a station can actually answer: a tide station is either reference, serving both hilo and the 6-minute curve, or subordinate, serving hilo only, while a current station carries its class per depth bin in bins[] — a harmonic or subordinate bin serves the normal flood/ebb/slack series, and a weak_and_variable bin may instead answer noaa_marine_get_currents with a coverage statement and no events, or report that CO-OPS publishes no predictions for it at all, so prefer a harmonic bin when one is in range.

NameTypeReqDescription
latitudenumberCenter latitude in decimal degrees for proximity search. Required together with longitude — supplying only one is rejected rather than silently ignored. Optionally pair with radius_km.
limitintegerMaximum number of stations to return. Defaults to 20.
longitudenumberCenter longitude in decimal degrees for proximity search. Required together with latitude — supplying only one is rejected rather than silently ignored. Optionally pair with radius_km.
querystringStation name or station ID substring to match, case-insensitive, on both sources. E.g. "seattle", "puget sound", "9447130", "46041". A station whose ID matches exactly is returned ahead of name match…
radius_kmnumberSearch radius in kilometers when latitude/longitude are provided. Defaults to 100 km.
sourcestringData source to search: coops (tide/water-level/current stations), ndbc (buoys), or all (default).
statestringFilter by 2-letter US state or territory code. Applies to CO-OPS stations only — providing it restricts results to CO-OPS and excludes NDBC buoys (which carry no state). E.g. "WA", "CA", "PR".
typesarrayFilter by data capability or NDBC platform class. Every returned station matches at least one requested value — a capability value against its capabilities list, or buoy against its platform class. O…
NameTypeReqDescription
applied_searchobjectThe narrowing dimensions this search applied, echoed when nothing matched so the caller can see which filter emptied the result.
errorobjectPresent when the call failed. Absent on success.
noticestringGuidance about the result set: why a search matched nothing, which catalog did not answer, or that the list was capped.
sourcesobjectWhich station catalogs were attempted, answered, and failed. Present only when a catalog fetch rejected, so a partial result set is never read as a complete one.
stationsarrayStations matching the search criteria, sorted by distance (if lat/lon provided) or by exact ID match then name. Empty when nothing matched.
total_foundnumberTotal stations matching the filters before the limit was applied. Zero when nothing matched.
truncatedbooleanTrue when total_found exceeds the limit and not all matching stations are returned. Increase limit or narrow filters to see more.

No examples provided.

noaa_marine_get_conditions ~342

Live marine conditions from an NDBC buoy: wave height, period and direction, wind speed, gust and direction, sea-surface temperature, air temperature, barometric pressure, and dew point. All values are SI units — wind in m/s, wave height in m, pressure in hPa, temperatures in °C — except TIDE, which is in feet, and VIS, in nautical miles, both rarely populated at offshore buoys; a numeric field is null when the buoy sensor did not report a value, which is normal offshore. Row cadence varies by station from 5 to 60 minutes, so observed_at can be that old, and NDBC writes each block of columns on its own cycle, so any block can resolve from an earlier row within 90 minutes of observed_at. Waves carry their own waves_observed_at, null when no wave sample falls inside that window, and any other block read from an earlier row is named with its measurement time in the response notice. Use noaa_marine_find_stations with source="ndbc" and types=["met"] to find station IDs near a location, since met-flagged stations are the ones most likely to serve live conditions: roughly a third of active NDBC stations report neither meteorological nor current data, most of those have no observation file, and omitting the types filter surfaces station IDs this tool cannot read.

NameTypeReqDescription
station_idstringyesNDBC buoy station ID (5-character alphanumeric, e.g. "46041" for Cape Elizabeth). Obtain from noaa_marine_find_stations with source="ndbc" and types=["met"].
NameTypeReqDescription
air_temp_cnumber|nullAir temperature in °C. Null if not reported.
average_period_secnumber|nullAverage wave period in seconds. Null if not reported.
dew_point_cnumber|nullDew point temperature in °C. Null if not reported.
dominant_period_secnumber|nullDominant wave period in seconds. Null if not reported.
errorobjectPresent when the call failed. Absent on success.
gust_speed_msnumber|nullWind gust speed in m/s. Null if not reported.
latitudenumber|nullStation latitude in decimal degrees. Null when the station is absent from the NDBC active-stations list — the realtime feed carries observations but no coordinates.
longitudenumber|nullStation longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list.
mean_wave_direction_degnumber|nullMean wave direction in degrees true. Null if not reported.
noticestringPresent when a sensor block other than waves was read from a row older than observed_at, naming each such block, the output fields it fills, and the time those values were measured. Absent when every…
observed_atstringISO 8601 UTC timestamp of the newest data row. Always a valid instant — a row whose upstream time columns are malformed is rejected rather than timestamped with the current time. A sensor block NDBC…
pressure_hpanumber|nullAtmospheric pressure in hPa. Null if not reported.
sourcestringData source — always "ndbc" for this tool.
station_idstringStation ID echoed from the request — for chaining.
station_namestringStation name from the NDBC active stations list.
tide_ftnumber|nullTide height in feet. NOTE: always in feet regardless of other unit settings. Rarely populated at offshore buoys. Null if not reported.
visibility_nminumber|nullVisibility in nautical miles. NOTE: always in nautical miles regardless of other unit settings. Null if not reported.
water_temp_cnumber|nullSea-surface temperature in °C. Null if not reported.
wave_height_mnumber|nullSignificant wave height in meters. Null if not reported.
waves_observed_atstring|nullISO 8601 UTC timestamp of the row the four wave fields were read from. NDBC runs its wave pass on a slower cycle than the met row, so this can be older than observed_at; it applies to all four wave f…
wind_direction_degnumber|nullWind direction in degrees true (0–360). Null if not reported by the buoy.
wind_speed_msnumber|nullWind speed in m/s. Null if not reported.

No examples provided.

noaa_marine_get_current_profile ~223

Observed ocean-current depth profile from an NDBC ADCP buoy — the most recent measurement of current speed and direction at each depth bin, returning depth in meters, direction in degrees true (the direction the current flows toward), and speed in cm/s. It is distinct from noaa_marine_get_currents, which returns CO-OPS tidal-current predictions of max flood, ebb and slack rather than these observed acoustic-Doppler measurements. A depth bin is reported whenever NDBC gives it a depth, and its direction or speed is null when the sensor did not report that component. Use noaa_marine_find_stations with source="ndbc" and types=["current_profile"] to find station IDs, since most NDBC stations serve no ADCP profile and an unfiltered search returns IDs this tool cannot read.

NameTypeReqDescription
station_idstringyesNDBC station ID (5-character alphanumeric, e.g. "44033"). Obtain from noaa_marine_find_stations with source="ndbc" and types=["current_profile"].
NameTypeReqDescription
bin_countnumberNumber of depth bins in the profile.
binsarrayDepth-binned current measurements, shallowest first (NDBC source order).
errorobjectPresent when the call failed. Absent on success.
latitudenumber|nullStation latitude in decimal degrees. Null when the station is absent from the NDBC active-stations list — the ADCP feed carries current data but no coordinates.
longitudenumber|nullStation longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list.
observed_atstringISO 8601 UTC timestamp of the observation. Always a valid instant — a row whose upstream time columns are malformed is rejected rather than timestamped with the current time.
sourcestringData source — always "ndbc" for this tool.
station_idstringStation ID echoed from the request — for chaining.
station_namestringStation name from the NDBC active stations list.

No examples provided.

noaa_marine_get_currents ~774

Tidal current predictions for a CO-OPS current station: max flood and ebb speeds, slack times, and the station's mean flood and ebb bearings. These are forecast predictions from CO-OPS, distinct from noaa_marine_get_current_profile, which returns NDBC observed ocean-current measurements binned by depth. The default MAX_SLACK interval is the practical planning view, showing when currents peak and when slack water occurs, and a 6-minute interval returns the continuous curve for detailed analysis, each row carrying its own flood/ebb/slack sense. A station can publish predictions for several depth bins at different depths: bin selects one, omitting it takes the CO-OPS default of the shallowest bin, and the bin and its depth are echoed on every response — read bins[] on a noaa_marine_find_stations current row for the bins a station actually has. A station whose currents CO-OPS will not predict as discrete events answers with an empty list and its own wording in the notice rather than an error. Both intervals are bounded by response size: a range whose rows fit is returned whole, a longer one returns the leading rows with rows_matched, rows_returned, and next_offset reporting how much matched and which offset reaches the rest, and offset and limit walk whichever series the interval selects. Current station IDs are alphanumeric (e.g. ACT4176), distinct from the numeric tide and water-level IDs, and the date range is limited to 1 year per request — use noaa_marine_find_stations with types=["current"] to obtain a valid current station ID.

NameTypeReqDescription
begin_datestringyesStart date in YYYYMMDD format, e.g. "20240601".
binintegerDepth bin to predict for, taken from the bins[] array on a noaa_marine_find_stations current row (e.g. 15, 10 or 1 at PUG1515). Omit to take the CO-OPS default, which is the shallowest bin. A bin the…
end_datestringyesEnd date in YYYYMMDD format (inclusive), e.g. "20240607".
intervalstringPrediction interval: MAX_SLACK (default) returns max flood, max ebb, and slack water events — ideal for passage planning. 6min returns a continuous current curve.
limitintegerMaximum prediction rows to return on this page — max/slack events or 6-minute rows, whichever the interval selects — for a caller that wants fewer than the response budget allows. Omit for the larges…
offsetintegerRow offset into the matched prediction series — the max/slack events on the MAX_SLACK interval, the 6-minute curve on 6min — for reading a range whose rows do not fit one response. 0 (default) starts…
station_idstringyesCO-OPS current station ID (alphanumeric, e.g. "ACT4176"). Obtain from noaa_marine_find_stations with types=["current"].
time_zonestringTime zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round.
unitsstringUnit system: english = knots for speed and feet for the echoed depth; metric = cm/s for speed (not m/s) and meters for the echoed depth.
NameTypeReqDescription
binnumber|nullDepth bin CO-OPS answered with — the requested bin, or its default shallowest bin when none was requested. Null when the response carried no prediction rows.
depthnumber|nullDepth of the returned bin, in the requested units: feet under english, meters under metric. Distinct from the bins[].depth on a noaa_marine_find_stations row, which the catalog always publishes in fe…
errorobjectPresent when the call failed. Absent on success.
eventsarrayMax flood, max ebb, and slack events — the whole matched series when it fits one response, otherwise the leading page starting at offset. Present for MAX_SLACK interval, and empty when CO-OPS answere…
next_offsetOffset to pass as offset on the next call, or null when this page reaches the last matched row. Absent when the whole matched series was returned.
noticestringCO-OPS's own statement about the station when it returned that instead of prediction events — the answer to report, not a failure — or what this page of the prediction series covers and how to reach…
page_offsetintegerRow offset this page starts at, echoed from the request. Absent when the whole matched series was returned.
predictionsarray6-minute continuous current predictions — the whole curve when it fits one response, otherwise the leading page starting at offset. Present for 6min interval, and empty when CO-OPS answered with a st…
rows_matchedintegerPrediction rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned.
rows_returnedintegerPrediction rows this page carries — the length of events on the MAX_SLACK interval, of predictions on 6min. Absent when the whole matched series was returned.
station_idstringStation ID echoed from the request — for chaining.
station_namestringStation name as returned by CO-OPS.
truncatedbooleanTrue when this page stops short of the last matched row, so further rows remain at next_offset. False on the final page and on a page past the end. Absent when the whole matched series was returned.
unitsstringUnit system these values are in: "english" (speed in knots, depth in feet) or "metric" (speed in cm/s, depth in meters).

No examples provided.

noaa_marine_get_ocean_observations ~330

Live sub-surface oceanographic observations from an NDBC station's water-quality sensors: at each reported depth, water temperature, conductivity, salinity, dissolved oxygen as both saturation percent and concentration in ppm, chlorophyll, turbidity, pH, and redox potential. This is the water-column counterpart to noaa_marine_get_conditions, which returns surface meteorological and wave data — use this tool for what the water is doing below the surface, that one for weather and sea state at the buoy. It returns the most recent observation as one reading per reported depth, and most stations report a single depth while some report several at the same time; sensor coverage is sparse, most stations populating only water temperature and salinity, and any value the station did not report comes back null rather than a fabricated zero, as do latitude and longitude for a station absent from the NDBC active-stations list. Sub-surface sensors are on only a subset of NDBC stations, so find one with noaa_marine_find_stations using source="ndbc" and types=["water_quality"], which filters on NDBC's own water-quality catalog flag — the flag and actual .ocean availability drift, so this tool reads any station that serves the file and returns observations_not_found for one that does not.

NameTypeReqDescription
station_idstringyesNDBC station ID (5-character alphanumeric, e.g. "44033" or "TIBC1"). Obtain from noaa_marine_find_stations with source="ndbc" and types=["water_quality"].
NameTypeReqDescription
errorobjectPresent when the call failed. Absent on success.
latitudenumber|nullStation latitude in decimal degrees. Null when the station is absent from the NDBC active-stations list — the .ocean feed carries observations but no coordinates.
longitudenumber|nullStation longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list.
observed_atstringISO 8601 UTC timestamp of the observation. Always a valid instant — a row whose upstream time columns are malformed is rejected rather than timestamped with the current time.
reading_countnumberNumber of per-depth readings in the latest observation (usually 1).
readingsarrayPer-depth readings sharing the most recent observation timestamp, in NDBC source order.
sourcestringData source — always "ndbc" for this tool.
station_idstringStation ID echoed from the request — for chaining.
station_namestringStation name from the NDBC active stations list.

No examples provided.

noaa_marine_get_tide_predictions ~725

High and low tide predictions for a CO-OPS tide station over a date range. The default hilo interval returns the time, height, and tide type (H for high, L for low) of each event, while the 6-minute interval returns the detailed tide curve. Most tide stations are subordinate — CO-OPS derives their high and low events as offsets from a reference station and publishes no 6-minute curve for them — so interval="6min" reaches only a reference station, and a subordinate station comes back as subordinate_no_6min naming the reference station to ask instead; the prediction_class on a noaa_marine_find_stations tide row says which kind a station is before the call. Datum defaults to MLLW, mean lower low water, the standard for US nautical charts, and the date range is limited to 1 year per request. A range whose predictions fit the response budget is returned whole; a longer one is returned as a page of leading rows, and rows_matched, rows_returned, and next_offset then report how much matched and which offset reaches the rest, so a year of events is read by walking offset rather than by splitting the range. Use noaa_marine_find_stations first to resolve a station name or location to a numeric station ID.

NameTypeReqDescription
begin_datestringyesStart date in YYYYMMDD format, e.g. "20240601".
datumstringDatum the predicted heights are referenced to. MLLW (default) is the US nautical chart datum, and MHHW (mean higher high water) is the flooding reference; MHW, MTL, MSL, MLW, and DTL (diurnal tide le…
end_datestringyesEnd date in YYYYMMDD format (inclusive), e.g. "20240607".
intervalstringPrediction interval: hilo (default) returns only high and low tide events; 6min returns a continuous prediction curve at 6-minute intervals, and is served only by a reference station — a subordinate…
limitintegerMaximum prediction rows to return on this page, for a caller that wants fewer than the response budget allows. Omit for the largest page that fits; a value larger than the budget allows does not wide…
offsetintegerRow offset into the matched prediction series, for reading a range whose rows do not fit one response. 0 (default) starts at the first row; pass the next_offset from a previous call to continue. An o…
station_idstringyesCO-OPS tide station ID (numeric, e.g. "9447130" for Seattle). Obtain from noaa_marine_find_stations with types=["tide"].
time_zonestringTime zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round.
unitsstringUnit system for heights: english = feet; metric = meters.
NameTypeReqDescription
datumstringTidal datum used (e.g. MLLW) — echoed for correct interpretation of heights.
errorobjectPresent when the call failed. Absent on success.
next_offsetOffset to pass as offset on the next call, or null when this page reaches the last matched row. Absent when the whole matched series was returned.
noticestringWhat this page of the prediction series covers and how to reach the next one. Present only when the response is a page rather than the whole matched series.
page_offsetintegerRow offset this page starts at, echoed from the request. Absent when the whole matched series was returned.
predictionsarrayTide predictions for the requested date range — the whole series when it fits one response, otherwise the leading page starting at offset. rows_matched and next_offset report what a page left behind.
rows_matchedintegerPrediction rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned.
rows_returnedintegerPrediction rows this page carries — the length of predictions. Absent when the whole matched series was returned.
station_idstringStation ID echoed from the request — for chaining.
station_namestringStation name as returned by CO-OPS — confirms the correct station was queried.
truncatedbooleanTrue when this page stops short of the last matched row, so further rows remain at next_offset. False on the final page and on a page past the end. Absent when the whole matched series was returned.
unitsstringHeight units: "english" (feet) or "metric" (meters).

No examples provided.

noaa_marine_get_water_level ~896

Observed water level, real-time or historical, for a CO-OPS water-level station, paired with tide predictions for the same period so the residual (observed − predicted) shows storm surge when positive and anomalous drawdown when negative. The interval selects the cadence: 6min (default) is the full curve, hourly and high_low cover months to a year of the same series at far fewer rows, and daily_mean serves Great Lakes stations only. Each interval carries its own CO-OPS range ceiling — 31 days for 6min, 365 for hourly and high_low, 3655 for daily_mean — rejected locally before the call, and only 6min and hourly report a residual. Observations and predictions are fetched independently, so when the prediction series is empty, predictions_status says whether CO-OPS has none for this station and range or the prediction fetch failed — the observed series returns either way, and residual_summary is present only when both series are and the cadence supports the join. A sensor outage leaves slots with no reading; those slots are dropped and counted in gaps_dropped, so the observed series is continuous across the range only when that count is absent. A range whose rows fit the response budget is returned whole; a longer one returns the leading rows, with rows_matched, rows_returned, and next_offset reporting how much matched and which offset reaches the rest. Use noaa_marine_find_stations first to resolve a station name or location to a valid station ID.

NameTypeReqDescription
begin_datestringyesStart date in YYYYMMDD format, e.g. "20240601".
datumstringDatum the observed heights are referenced to. MLLW (default) is the US nautical chart datum, and MHHW (mean higher high water) is the flooding reference; MHW, MTL, MSL, and MLW are the other tidal pl…
end_datestringyesEnd date in YYYYMMDD format (inclusive), e.g. "20240601".
intervalstringObserved cadence. 6min (default) is the full curve, 31 days per request, the only one carrying a quality flag. hourly is hourly heights, 365 days per request, and reports a residual against the hourl…
limitintegerMaximum observation rows to return on this page, for a caller that wants fewer than the response budget allows. Omit for the largest page that fits; a value larger than the budget allows does not wid…
offsetintegerRow offset into the matched observation series, for reading a range whose rows do not fit one response. 0 (default) starts at the first row; pass the next_offset from a previous call to continue. An…
station_idstringyesCO-OPS water-level station ID (numeric, e.g. "9447130" for Seattle). Obtain from noaa_marine_find_stations with types=["water_level"].
time_zonestringTime zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round. Overridden to lst on interval="daily_mean", which CO-OPS serves i…
unitsstringUnit system: english = feet; metric = meters.
NameTypeReqDescription
datumstringTidal datum used — echoed for correct interpretation of water heights.
errorobjectPresent when the call failed. Absent on success.
gaps_droppedintegerNumber of sample slots CO-OPS sent with no reading, dropped from observations. Present only when there was at least one. The observed series is therefore not continuous across the requested range: it…
intervalstringObserved cadence echoed from the request — the CO-OPS product these rows came from, and what decides whether quality, type, and residual_summary are populated.
next_offsetOffset to pass as offset on the next call, or null when this page reaches the last matched observation. Absent when the whole matched series was returned.
noticestringWhy the paired prediction series is missing or carries no residual, how many sample slots were dropped, and what this page of the observed series covers — whichever of those apply, composed into one…
observationsarrayObserved water level readings at the requested cadence — the whole matched series when it fits one response, otherwise the leading page starting at offset. rows_matched and next_offset report what a…
page_offsetintegerObservation row offset this page starts at, echoed from the request. Absent when the whole matched series was returned.
predictionsarrayPaired tide predictions covering the same period as the returned observations, at the interval matching the observed cadence. Always empty on the daily_mean interval, which has no paired series. Othe…
predictions_statusstringPresent only when predictions is empty on an interval that has a paired series. "empty" means CO-OPS returned no prediction rows for this station and date range; "unavailable" means the prediction fe…
residual_summaryobjectSummary of observed-minus-predicted residuals in the requested units, computed across the whole matched series rather than the returned page — so a paged response still reports the largest surge in t…
rows_matchedintegerObservation rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned.
rows_returnedintegerObservation rows this page carries — the length of observations. Absent when the whole matched series was returned.
station_idstringStation ID echoed from the request — for chaining.
station_namestringStation name as returned by CO-OPS.
truncatedbooleanTrue when this page stops short of the last matched observation, so further rows remain at next_offset. False on the final page and on a page past the end. Absent when the whole matched series was re…
unitsstringHeight units: "english" (feet) or "metric" (meters).

No examples provided.

Common questions

What is the io.github.cyanheads/noaa-marine-mcp-server server?

io.github.cyanheads/noaa-marine-mcp-server is listed in the public MCP registry as io.github.cyanheads/noaa-marine-mcp-server. Find NOAA tide stations and NDBC buoys, fetch tide predictions, currents, and live conditions. This page covers its hosted endpoint (https://noaa-marine.caseyjhand.com/mcp).

Is the io.github.cyanheads/noaa-marine-mcp-server server safe to use?

io.github.cyanheads/noaa-marine-mcp-server scores 79 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.cyanheads/noaa-marine-mcp-server server expose?

io.github.cyanheads/noaa-marine-mcp-server exposes 7 tools: noaa_marine_find_stations, noaa_marine_get_tide_predictions, noaa_marine_get_water_level, noaa_marine_get_currents, noaa_marine_get_conditions, and 2 more. Their descriptions and schemas cost roughly 4,070 tokens of context every time the server is loaded.

Does the io.github.cyanheads/noaa-marine-mcp-server server require authentication?

No. We connected to io.github.cyanheads/noaa-marine-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the io.github.cyanheads/noaa-marine-mcp-server server still maintained?

io.github.cyanheads/noaa-marine-mcp-server is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.