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.
Available components
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
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
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
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
claude mcp add --transport http cyanheads-noaa-marine-mcp-server 'https://noaa-marine.caseyjhand.com/mcp'
{
"mcpServers": {
"cyanheads-noaa-marine-mcp-server": {
"url": "https://noaa-marine.caseyjhand.com/mcp"
}
}
} {
"servers": {
"cyanheads-noaa-marine-mcp-server": {
"type": "http",
"url": "https://noaa-marine.caseyjhand.com/mcp"
}
}
} [mcp_servers.cyanheads-noaa-marine-mcp-server] url = "https://noaa-marine.caseyjhand.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cyanheads-noaa-marine-mcp-server": {
"type": "remote",
"url": "https://noaa-marine.caseyjhand.com/mcp",
"enabled": true
}
}
} openclaw mcp add cyanheads-noaa-marine-mcp-server --url 'https://noaa-marine.caseyjhand.com/mcp' --transport streamable-http
mcp_servers:
cyanheads-noaa-marine-mcp-server:
url: "https://noaa-marine.caseyjhand.com/mcp" {
"McpServers": {
"cyanheads-noaa-marine-mcp-server": {
"Transport": "http",
"Url": "https://noaa-marine.caseyjhand.com/mcp"
}
}
} assistant mcp add cyanheads-noaa-marine-mcp-server -t streamable-http -u 'https://noaa-marine.caseyjhand.com/mcp'
{
"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.
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.
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 |
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 →
noaa_marine_find_stations Find Marine 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.
| Name | Type | Req | Description |
|---|---|---|---|
| latitude | number | – | Center 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. |
| limit | integer | – | Maximum number of stations to return. Defaults to 20. |
| longitude | number | – | Center 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. |
| query | string | – | Station 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_km | number | – | Search radius in kilometers when latitude/longitude are provided. Defaults to 100 km. |
| source | string | – | Data source to search: coops (tide/water-level/current stations), ndbc (buoys), or all (default). |
| state | string | – | Filter 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". |
| types | array | – | Filter 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… |
| Name | Type | Req | Description |
|---|---|---|---|
| applied_search | object | – | The narrowing dimensions this search applied, echoed when nothing matched so the caller can see which filter emptied the result. |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Guidance about the result set: why a search matched nothing, which catalog did not answer, or that the list was capped. |
| sources | object | – | Which 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. |
| stations | array | – | Stations matching the search criteria, sorted by distance (if lat/lon provided) or by exact ID match then name. Empty when nothing matched. |
| total_found | number | – | Total stations matching the filters before the limit was applied. Zero when nothing matched. |
| truncated | boolean | – | True 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 Get Marine 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.
| Name | Type | Req | Description |
|---|---|---|---|
| station_id | string | yes | NDBC buoy station ID (5-character alphanumeric, e.g. "46041" for Cape Elizabeth). Obtain from noaa_marine_find_stations with source="ndbc" and types=["met"]. |
| Name | Type | Req | Description |
|---|---|---|---|
| air_temp_c | number|null | – | Air temperature in °C. Null if not reported. |
| average_period_sec | number|null | – | Average wave period in seconds. Null if not reported. |
| dew_point_c | number|null | – | Dew point temperature in °C. Null if not reported. |
| dominant_period_sec | number|null | – | Dominant wave period in seconds. Null if not reported. |
| error | object | – | Present when the call failed. Absent on success. |
| gust_speed_ms | number|null | – | Wind gust speed in m/s. Null if not reported. |
| latitude | number|null | – | Station latitude in decimal degrees. Null when the station is absent from the NDBC active-stations list — the realtime feed carries observations but no coordinates. |
| longitude | number|null | – | Station longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list. |
| mean_wave_direction_deg | number|null | – | Mean wave direction in degrees true. Null if not reported. |
| notice | string | – | Present 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_at | string | – | ISO 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_hpa | number|null | – | Atmospheric pressure in hPa. Null if not reported. |
| source | string | – | Data source — always "ndbc" for this tool. |
| station_id | string | – | Station ID echoed from the request — for chaining. |
| station_name | string | – | Station name from the NDBC active stations list. |
| tide_ft | number|null | – | Tide height in feet. NOTE: always in feet regardless of other unit settings. Rarely populated at offshore buoys. Null if not reported. |
| visibility_nmi | number|null | – | Visibility in nautical miles. NOTE: always in nautical miles regardless of other unit settings. Null if not reported. |
| water_temp_c | number|null | – | Sea-surface temperature in °C. Null if not reported. |
| wave_height_m | number|null | – | Significant wave height in meters. Null if not reported. |
| waves_observed_at | string|null | – | ISO 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_deg | number|null | – | Wind direction in degrees true (0–360). Null if not reported by the buoy. |
| wind_speed_ms | number|null | – | Wind speed in m/s. Null if not reported. |
No examples provided.
noaa_marine_get_current_profile Get Ocean 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.
| Name | Type | Req | Description |
|---|---|---|---|
| station_id | string | yes | NDBC station ID (5-character alphanumeric, e.g. "44033"). Obtain from noaa_marine_find_stations with source="ndbc" and types=["current_profile"]. |
| Name | Type | Req | Description |
|---|---|---|---|
| bin_count | number | – | Number of depth bins in the profile. |
| bins | array | – | Depth-binned current measurements, shallowest first (NDBC source order). |
| error | object | – | Present when the call failed. Absent on success. |
| latitude | number|null | – | Station 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. |
| longitude | number|null | – | Station longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list. |
| observed_at | string | – | ISO 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. |
| source | string | – | Data source — always "ndbc" for this tool. |
| station_id | string | – | Station ID echoed from the request — for chaining. |
| station_name | string | – | Station name from the NDBC active stations list. |
No examples provided.
noaa_marine_get_currents Get Tidal 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.
| Name | Type | Req | Description |
|---|---|---|---|
| begin_date | string | yes | Start date in YYYYMMDD format, e.g. "20240601". |
| bin | integer | – | Depth 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_date | string | yes | End date in YYYYMMDD format (inclusive), e.g. "20240607". |
| interval | string | – | Prediction interval: MAX_SLACK (default) returns max flood, max ebb, and slack water events — ideal for passage planning. 6min returns a continuous current curve. |
| limit | integer | – | Maximum 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… |
| offset | integer | – | Row 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_id | string | yes | CO-OPS current station ID (alphanumeric, e.g. "ACT4176"). Obtain from noaa_marine_find_stations with types=["current"]. |
| time_zone | string | – | Time zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round. |
| units | string | – | Unit 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| bin | number|null | – | Depth 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. |
| depth | number|null | – | Depth 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… |
| error | object | – | Present when the call failed. Absent on success. |
| events | array | – | Max 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_offset | – | – | Offset 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. |
| notice | string | – | CO-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_offset | integer | – | Row offset this page starts at, echoed from the request. Absent when the whole matched series was returned. |
| predictions | array | – | 6-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_matched | integer | – | Prediction rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned. |
| rows_returned | integer | – | Prediction 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_id | string | – | Station ID echoed from the request — for chaining. |
| station_name | string | – | Station name as returned by CO-OPS. |
| truncated | boolean | – | True 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. |
| units | string | – | Unit 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| station_id | string | yes | NDBC station ID (5-character alphanumeric, e.g. "44033" or "TIBC1"). Obtain from noaa_marine_find_stations with source="ndbc" and types=["water_quality"]. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| latitude | number|null | – | Station latitude in decimal degrees. Null when the station is absent from the NDBC active-stations list — the .ocean feed carries observations but no coordinates. |
| longitude | number|null | – | Station longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list. |
| observed_at | string | – | ISO 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_count | number | – | Number of per-depth readings in the latest observation (usually 1). |
| readings | array | – | Per-depth readings sharing the most recent observation timestamp, in NDBC source order. |
| source | string | – | Data source — always "ndbc" for this tool. |
| station_id | string | – | Station ID echoed from the request — for chaining. |
| station_name | string | – | Station name from the NDBC active stations list. |
No examples provided.
noaa_marine_get_tide_predictions 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.
| Name | Type | Req | Description |
|---|---|---|---|
| begin_date | string | yes | Start date in YYYYMMDD format, e.g. "20240601". |
| datum | string | – | Datum 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_date | string | yes | End date in YYYYMMDD format (inclusive), e.g. "20240607". |
| interval | string | – | Prediction 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… |
| limit | integer | – | Maximum 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… |
| offset | integer | – | Row 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_id | string | yes | CO-OPS tide station ID (numeric, e.g. "9447130" for Seattle). Obtain from noaa_marine_find_stations with types=["tide"]. |
| time_zone | string | – | Time zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round. |
| units | string | – | Unit system for heights: english = feet; metric = meters. |
| Name | Type | Req | Description |
|---|---|---|---|
| datum | string | – | Tidal datum used (e.g. MLLW) — echoed for correct interpretation of heights. |
| error | object | – | Present when the call failed. Absent on success. |
| next_offset | – | – | Offset 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. |
| notice | string | – | What 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_offset | integer | – | Row offset this page starts at, echoed from the request. Absent when the whole matched series was returned. |
| predictions | array | – | Tide 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_matched | integer | – | Prediction rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned. |
| rows_returned | integer | – | Prediction rows this page carries — the length of predictions. Absent when the whole matched series was returned. |
| station_id | string | – | Station ID echoed from the request — for chaining. |
| station_name | string | – | Station name as returned by CO-OPS — confirms the correct station was queried. |
| truncated | boolean | – | True 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. |
| units | string | – | Height units: "english" (feet) or "metric" (meters). |
No examples provided.
noaa_marine_get_water_level 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.
| Name | Type | Req | Description |
|---|---|---|---|
| begin_date | string | yes | Start date in YYYYMMDD format, e.g. "20240601". |
| datum | string | – | Datum 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_date | string | yes | End date in YYYYMMDD format (inclusive), e.g. "20240601". |
| interval | string | – | Observed 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… |
| limit | integer | – | Maximum 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… |
| offset | integer | – | Row 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_id | string | yes | CO-OPS water-level station ID (numeric, e.g. "9447130" for Seattle). Obtain from noaa_marine_find_stations with types=["water_level"]. |
| time_zone | string | – | Time 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… |
| units | string | – | Unit system: english = feet; metric = meters. |
| Name | Type | Req | Description |
|---|---|---|---|
| datum | string | – | Tidal datum used — echoed for correct interpretation of water heights. |
| error | object | – | Present when the call failed. Absent on success. |
| gaps_dropped | integer | – | Number 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… |
| interval | string | – | Observed 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_offset | – | – | Offset 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. |
| notice | string | – | Why 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… |
| observations | array | – | Observed 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_offset | integer | – | Observation row offset this page starts at, echoed from the request. Absent when the whole matched series was returned. |
| predictions | array | – | Paired 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_status | string | – | Present 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_summary | object | – | Summary 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_matched | integer | – | Observation rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned. |
| rows_returned | integer | – | Observation rows this page carries — the length of observations. Absent when the whole matched series was returned. |
| station_id | string | – | Station ID echoed from the request — for chaining. |
| station_name | string | – | Station name as returned by CO-OPS. |
| truncated | boolean | – | True 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… |
| units | string | – | Height units: "english" (feet) or "metric" (meters). |
No examples provided.
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.