noaa-marine-mcp-server
Server Details
Find NOAA tide stations and NDBC buoys, fetch tide predictions, currents, and live conditions.
- Status
- Healthy
- Uptime
- 99.9% over 79 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/noaa-marine-mcp-server
- GitHub Stars
- 1
- Server Listing
- @cyanheads/noaa-marine-mcp-server
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 8 tools
Each tool targets a distinct NOAA data product or source: station discovery, NDBC surface conditions, NDBC current profiles, CO-OPS current predictions, CO-OPS monthly means, NDBC water-quality observations, CO-OPS tide predictions, and CO-OPS observed water level. Potentially confusable pairs such as get_currents vs get_current_profile and get_conditions vs get_ocean_observations are explicitly distinguished in their descriptions.
All tools use the same noaa_marine_ prefix and snake_case action-oriented naming. The set is consistently verb_noun style, with find_stations appropriately signaling discovery while the rest are get_* retrieval tools.
Eight tools is well scoped for a marine data server covering station discovery plus the main CO-OPS and NDBC data products. Each tool appears to earn its place without excessive fragmentation.
The surface covers station resolution and the core data workflows: surface conditions, subsurface ocean observations, tidal currents, current profiles, tide predictions, observed water level with residual, and monthly means/datums. No obvious core lifecycle or retrieval gap is apparent for the stated NOAA marine domain.
Available Tools
8 toolsnoaa_marine_find_stationsFind Marine StationsARead-onlyInspect
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 coordinate pair, a station name, or a bare station number to the station IDs the data tools take (query matches station names and IDs, not places, so a town or marina no station is named after needs geocoding to coordinates first): 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 station IDs are mostly 5-character alphanumeric codes (e.g. 46041), with some 7-digit numbers. 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 | Required | Description | Default |
|---|---|---|---|
| limit | No | Stations to return on this page. Default 20; a larger value returns at most 200 and says so. | |
| query | No | 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 matches, unless latitude/longitude were supplied — a proximity search orders by distance instead. Blank or whitespace-only values are treated as omitted. | |
| state | No | 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). A station matches on its own catalog code, or — when its catalog rows carry none, as with every current station — on the state of the nearest state-bearing CO-OPS tide or water-level station within 25 km, which can be wrong on waters shared across a state or national border. E.g. "WA", "CA", "PR". | |
| types | No | 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. Omit to return all stations. | |
| offset | No | Index of the first match to return, for reading a result larger than one page. 0 (default) starts at the first match; pass the next_offset from a previous call to continue. An offset past the last match returns an empty page rather than an error. | |
| source | No | Data source to search: coops (tide/water-level/current stations), ndbc (buoys), or all (default). | all |
| latitude | No | 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. | |
| longitude | No | 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. | |
| radius_km | No | Search radius in kilometers when latitude/longitude are provided. Defaults to 100 km. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance about the result set: why a search matched nothing, which catalog did not answer, that limit was clamped to its cap, or which matches this page carries and the offset that reaches the rest. |
| sources | No | 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 | No | The page of matching stations starting at offset, sorted by distance (if lat/lon provided) or by exact ID match then name, with ties ordered by source and then station ID so every call orders the matches the same way. Empty when nothing matched or offset is past the last match. |
| truncated | No | True when matches remain past this page; next_offset reaches them. Absent on the last page. |
| next_offset | No | Offset to pass as offset for the next page. Present only while matches remain past this page. |
| total_found | No | Total stations matching the filters, across every page. Zero when nothing matched. |
| applied_search | No | The narrowing dimensions this search applied, echoed when nothing matched so the caller can see which filter emptied the result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint and openWorldHint, and the description goes further by disclosing that a no-match search is a success with total_found: 0 and echoed filters, that partial catalog failure names the missing source, and that results lead with an exact ID match unless distance ordering applies. However, the long prediction_class/bins discussion describes downstream data-tool behavior rather than this tool's own behavior, diluting the disclosure with material that belongs to the return schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is a single sprawling multi-clause construction riddled with em-dash parentheticals that is hard to parse. The final third on prediction_class and bins[] is output-level detail already covered by the output schema and consumes a large share of the text without helping an agent call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter tool with full schema coverage and an output schema, the description covers the modes, the no-match and partial-failure semantics, and the ID formats. It is complete enough to call correctly, though it overspends on return-value interpretation that the output schema already handles.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the per-parameter docs are unusually rich, including the state-nearest-station caveat and the buoy-vs-capability distinction, so the baseline is 3. The description restates the capability/platform axis split and the query-exact-match ordering rather than adding syntax or edge cases the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource set (CO-OPS tide/water-level/current stations and NDBC buoys) plus the three lookup modes (proximity, name/ID substring, state) and what the result carries. It is immediately distinguishable from every sibling, all of which are data-retrieval tools rather than resolvers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly declares itself the required first step for resolving coordinates, names, or bare station IDs to the IDs the data tools consume, and warns that `query` matches names/IDs and not places, so towns need geocoding first. It also gives a conditional preference rule (prefer a harmonic bin when one is in range) that routes downstream tool choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
noaa_marine_get_conditionsGet Marine ConditionsARead-onlyInspect
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. A 7-digit CO-OPS station ID also works when NDBC relays that gauge's met sensors under a station of its own: the response reads the relay, returns its ID as station_id with its name and coordinates, and returns the requested ID as coops_station_id; a gauge NDBC does not relay fails buoy_not_found.
| Name | Required | Description | Default |
|---|---|---|---|
| station_id | Yes | NDBC station ID (e.g. "46041" for Cape Elizabeth). Obtain from noaa_marine_find_stations with source="ndbc" and types=["met"]. A 7-digit CO-OPS station ID (e.g. "8654467") also works when NDBC relays that gauge's met sensors under a station ID of its own. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Present when a CO-OPS station ID was read through its NDBC relay (naming both IDs), 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), or both, in one string. Absent for a station read under its own ID whose blocks outside the wave columns all came from the newest row. |
| source | No | Data source — always "ndbc" for this tool. |
| tide_ft | No | Tide height in feet. NOTE: always in feet regardless of other unit settings. Rarely populated at offshore buoys. Null if not reported. |
| latitude | No | 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 | No | Station longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list. |
| air_temp_c | No | Air temperature in °C. Null if not reported. |
| station_id | No | ID of the NDBC station these observations come from: the requested ID, uppercased, or — when a CO-OPS station ID was requested — the NDBC station that relays that gauge's met sensors. |
| dew_point_c | No | Dew point temperature in °C. Null if not reported. |
| observed_at | No | 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 wrote on an earlier row was measured before this time: waves report theirs in waves_observed_at, and any other block is named with its own time in the notice. |
| pressure_hpa | No | Atmospheric pressure in hPa. Null if not reported. |
| station_name | No | Station name from the NDBC active stations list. |
| water_temp_c | No | Sea-surface temperature in °C. Null if not reported. |
| gust_speed_ms | No | Wind gust speed in m/s. Null if not reported. |
| wave_height_m | No | Significant wave height in meters. Null if not reported. |
| wind_speed_ms | No | Wind speed in m/s. Null if not reported. |
| visibility_nmi | No | Visibility in nautical miles. NOTE: always in nautical miles regardless of other unit settings. Null if not reported. |
| coops_station_id | No | The CO-OPS station ID that was requested, present only when it was read through the NDBC relay in station_id. Use it with the CO-OPS tools (tides, water level, currents); use station_id for NDBC reads. Absent when station_id is the ID requested. |
| waves_observed_at | No | 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 fields, which are never sampled apart. Null when no wave sample falls inside the 90-minute look-back window, including when the buoy has no wave sensor. |
| average_period_sec | No | Average wave period in seconds. Null if not reported. |
| wind_direction_deg | No | Wind direction in degrees true (0–360). Null if not reported by the buoy. |
| dominant_period_sec | No | Dominant wave period in seconds. Null if not reported. |
| mean_wave_direction_deg | No | Mean wave direction in degrees true. Null if not reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/openWorldHint, it discloses units for every field, the TIDE/VIS unit exceptions and their rarity, null semantics (sensor did not report — normal offshore), row cadence of 5–60 minutes, and per-block staleness up to 90 minutes with named measurement times. It also documents the relay behavior returning coops_station_id and the buoy_not_found failure, which annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense paragraph, but nearly every sentence carries non-redundant information (units, nulls, cadence, staleness, station discovery, relay). Front-loading the field list is correct; a bulleted or segmented layout would improve scanability without cutting content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with an output schema, this covers everything an agent needs: units, null meaning, temporal staleness expectations, how to obtain a valid station ID, and the error path. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter at 100% schema coverage the baseline is 3, but the description adds real meaning: it clarifies why met-flagged NDBC IDs are the ones this tool can actually read, and that a 7-digit CO-OPS ID resolves through a relay with the response exposing both station_id and coops_station_id. That goes past the schema's brief note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource — live marine conditions from an NDBC buoy — and enumerates the exact measurement set (waves, wind, SST, air temp, pressure, dew point), which cleanly separates it from siblings like get_currents and get_tide_predictions. An agent knows immediately what this returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to noaa_marine_find_stations with source="ndbc" and types=["met"], and explains the failure mode of omitting the types filter (roughly a third of stations report nothing, so unfiltered IDs may be unreadable). It also states the alternative path for 7-digit CO-OPS IDs and when that path fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
noaa_marine_get_current_profileGet Ocean Current ProfileARead-onlyInspect
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 | Required | Description | Default |
|---|---|---|---|
| station_id | Yes | NDBC station ID (mostly 5-character alphanumeric codes, e.g. "44033"; some are 7-digit numbers). Obtain from noaa_marine_find_stations with source="ndbc" and types=["current_profile"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| bins | No | Depth-binned current measurements, shallowest first (NDBC source order). |
| error | No | Present when the call failed. Absent on success. |
| source | No | Data source — always "ndbc" for this tool. |
| latitude | No | 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. |
| bin_count | No | Number of depth bins in the profile. |
| longitude | No | Station longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list. |
| station_id | No | Station ID echoed from the request — for chaining. |
| observed_at | No | 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. |
| station_name | No | Station name from the NDBC active stations list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and openWorldHint=true already covering the safety profile, the description adds important behavioral context: it is an observed acoustic-Doppler measurement rather than a prediction, depth bins appear only when NDBC provides a depth, and missing direction/speed components are null. This goes beyond the annotations and is directly useful for interpreting calls and results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core definition and then adds only distinctions, null semantics, and station-discovery guidance that matter for correct use. There is no filler or repetition that would obscure the key points.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with an output schema and safety annotations, the description is complete enough to select and invoke it correctly. It covers purpose, sibling differentiation, valid station discovery, return semantics, and null-component behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single station_id parameter is already well documented in the schema, including its expected source and format. The description reinforces how to find valid station IDs but does not add new parameter syntax or constraints beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific observed resource: the most recent NDBC ADCP ocean-current depth profile, with current speed/direction per depth bin. It explicitly distinguishes this from noaa_marine_get_currents, which returns CO-OPS tidal-current predictions, so an agent can select it without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use noaa_marine_find_stations with source="ndbc" and types=["current_profile"] to obtain station IDs. It also explains why unfiltered station searches are a problem: most NDBC stations do not serve ADCP profiles, so this tool cannot read them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
noaa_marine_get_currentsGet Tidal CurrentsARead-onlyIdempotentInspect
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 page by row count: each call returns up to limit rows of whichever series the interval selects, starting at offset, and a range that matched more reports rows_matched, rows_returned, and next_offset — how much matched and which offset reaches the rest. 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 | Required | Description | Default |
|---|---|---|---|
| bin | No | 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 station does not publish comes back as bin_unavailable naming the bins it does. | |
| limit | No | Prediction rows to return on this page — max/slack events or 6-minute rows, whichever the interval selects. Default 50; a larger value returns at most 1,000 and says so. | |
| units | No | 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. | english |
| offset | No | 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 longer than one page. 0 (default) starts at the first row; pass the next_offset from a previous call to continue. An offset past the last row returns an empty page rather than an error. | |
| end_date | Yes | End date (inclusive), YYYYMMDD or YYYY-MM-DD, e.g. "20240607" or "2024-06-07". | |
| interval | No | Prediction interval: MAX_SLACK (default) returns max flood, max ebb, and slack water events — ideal for passage planning. 6min returns a continuous current curve. | MAX_SLACK |
| time_zone | No | Time zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round. | lst_ldt |
| begin_date | Yes | Start date, YYYYMMDD or YYYY-MM-DD, e.g. "20240601" or "2024-06-01". | |
| station_id | Yes | CO-OPS current station ID (alphanumeric, e.g. "ACT4176"). Obtain from noaa_marine_find_stations with types=["current"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| bin | No | 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 | No | 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 feet. Null when CO-OPS publishes no depth for the bin, or when the response carried no prediction rows. |
| error | No | Present when the call failed. Absent on success. |
| units | No | Unit system these values are in: "english" (speed in knots, depth in feet) or "metric" (speed in cm/s, depth in meters). |
| events | No | Max flood, max ebb, and slack events — up to limit events starting at offset, and the whole matched series when it fits one page. Present for MAX_SLACK interval, and empty when CO-OPS answered with a statement instead of events — read notice for its wording. |
| notice | No | 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 the next one. Opens with the requested and applied values when limit was clamped to its cap. |
| truncated | No | 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. |
| station_id | No | Station ID echoed from the request — for chaining. |
| next_offset | No | 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. |
| page_offset | No | Row offset this page starts at, echoed from the request. Absent when the whole matched series was returned. |
| predictions | No | 6-minute continuous current predictions — up to limit rows starting at offset, and the whole curve when it fits one page. Present for 6min interval, and empty when CO-OPS answered with a statement instead of a curve — read notice for its wording. |
| rows_matched | No | Prediction rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned. |
| station_name | No | Station name as returned by CO-OPS. |
| rows_returned | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/openWorld annotations, the description discloses important behavior: stations that cannot be predicted as discrete events return an empty list with a notice rather than an error, bin selection defaults to the shallowest and is echoed, pagination returns rows_matched/rows_returned/next_offset, and offsets past the end return empty pages. These details materially help an agent interpret responses and avoid mistaking empty results for failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the tool's purpose and its key sibling distinction before moving into interval, bin, pagination, and station-ID details. It is dense and somewhat run-on for a single paragraph, but the length is largely justified by the tool's 9 parameters and the need to cover multiple behavioral edge cases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the schema coverage, annotations, and existing output schema, the description is complete enough for correct invocation. It covers station ID format, date limits, interval choice, bin behavior, pagination, and non-error empty responses, leaving no material ambiguity about how to call or interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 9 parameters thoroughly. The description still adds useful meaning beyond the schema: the 1-year date-range limit, the practical-planning rationale for MAX_SLACK versus 6min, and pagination response fields like rows_matched and next_offset. Most individual parameter semantics remain schema-driven, so this is strong but not maximally additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and data shape: tidal current predictions for a CO-OPS current station, including max flood/ebb speeds, slack times, and mean bearings. It explicitly distinguishes itself from noaa_marine_get_current_profile by noting that sibling returns NDBC observed depth-binned measurements, so an agent can choose correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage selection guidance: MAX_SLACK is the practical planning view, 6min is for detailed continuous-curve analysis, and noaa_marine_find_stations with types=["current"] is named as the way to obtain a valid station ID. It also states concrete constraints such as the 1-year maximum date range and the alternative observed-current tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
noaa_marine_get_monthly_meansGet Monthly MeansARead-onlyIdempotentInspect
Verified monthly means for a CO-OPS water-level station, one row per station-month: the month's highest and lowest water, its tidal datums (MHHW, MHW, MSL, MTL, MLW, MLLW, DTL), tidal ranges (GT, MN, DHQ, DLQ), and lunitidal intervals (HWI, LWI) — the record a sea-level or tidal-range trend over years to decades is read from. Heights are relative to the requested datum in the requested units. A value CO-OPS publishes no figure for is omitted rather than reported as zero; a Great Lakes station carries only highest, msl, and lowest. A range may span up to 73,000 days, checked before the call, and CO-OPS verifies this product monthly, for the prior month, so a window ending on or after the first day of the prior month can fail with verified_data_lag. Each call returns up to limit months from offset; a range of at most limit months returns whole, and a longer one reports rows_matched, rows_returned, and next_offset, the offset that reaches the rest — raise limit to read a decades-long record in one call. Use noaa_marine_find_stations with types=["water_level"] first to resolve a station name or location to a station ID.
| Name | Required | Description | Default |
|---|---|---|---|
| datum | No | Datum the monthly heights are referenced to. MLLW (default) is the US nautical chart datum; MHHW, MHW, MTL, MSL, and MLW are the other tidal planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and reads any station. IGLD and LWD apply at Great Lakes stations only, which carry no tidal datum, and CRD at Columbia River stations only. A datum this station does not carry comes back as datum_unavailable, whose hint names a datum to retry with, and a station with no water-level gauge at all as no_gauge. | MLLW |
| limit | No | Months to return on this page. Default 24; a larger value returns at most 1,000 and says so. | |
| units | No | Unit system for the heights: english = feet; metric = meters. The lunitidal intervals are hours either way. | english |
| offset | No | Month offset into the matched series, for reading a range longer than one page. 0 (default) starts at the first month; pass the next_offset from a previous call to continue. An offset past the last month returns an empty page rather than an error. | |
| end_date | Yes | End date (inclusive), YYYYMMDD or YYYY-MM-DD, e.g. "20251231" or "2025-12-31". The month it falls in is the last month returned. | |
| begin_date | Yes | Start date, YYYYMMDD or YYYY-MM-DD, e.g. "19750101" or "1975-01-01". The month it falls in is the first month returned. | |
| station_id | Yes | CO-OPS water-level station ID (numeric, e.g. "9447130" for Seattle). Obtain from noaa_marine_find_stations with types=["water_level"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| datum | No | Datum the heights are referenced to — echoed for correct interpretation. |
| error | No | Present when the call failed. Absent on success. |
| units | No | Height units: "english" (feet) or "metric" (meters). |
| months | No | One row per station-month in the requested range, oldest first — the whole matched series when it holds at most limit months, otherwise the page of up to limit months starting at offset. rows_matched and next_offset report what a page left behind. |
| notice | No | That limit was clamped to its cap, then what this page of the monthly series covers and how to reach the next page — whichever apply, composed into one string. |
| end_date | No | End of the requested range as sent to CO-OPS, YYYYMMDD. |
| truncated | No | True when this page stops short of the last matched month, so further months remain at next_offset. False on the final page and on a page past the end. Absent when the whole matched series was returned. |
| begin_date | No | Start of the requested range as sent to CO-OPS, YYYYMMDD. |
| station_id | No | Station ID echoed from the request — for chaining. |
| next_offset | No | Offset to pass as offset on the next call, or null when this page reaches the last matched month. Absent when the whole matched series was returned. |
| page_offset | No | Month offset this page starts at, echoed from the request. Absent when the whole matched series was returned. |
| rows_matched | No | Months the requested range matched, before the page was cut. Absent when the whole matched series was returned. |
| station_name | No | Station name as returned by CO-OPS. |
| rows_returned | No | Months this page carries — the length of months. Absent when the whole matched series was returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover read-only/idempotent safety, and the description layers on genuinely non-obvious behavior: unpublished values are omitted rather than zeroed, Great Lakes stations carry only highest/msl/lowest, the span cap, the monthly verification lag with its error code, and how pagination and next_offset behave. This is far beyond what the structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded, with the core identity first and operational caveats after. The parenthetical lists of datums and intervals are long but earn their place by telling the agent what to expect in the output; a single unbroken paragraph is the only structural weakness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations declaring safety, and 100% parameter coverage, the description fills the remaining gap: data-quality quirks, station-type variance, error codes, and pagination. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter. The description still adds value by tying datum/units to the returned heights and explaining that raising limit lets a decades-long record come back in one call, which is a practical hint the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Verified monthly means for a CO-OPS water-level station') and enumerates exactly what a row contains: highs/lows, datums, ranges, lunitidal intervals. This is clearly distinct from the sibling tools that return raw water levels, tide predictions, or currents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete before-call guidance: resolve the station with noaa_marine_find_stations and types=["water_level"], check the 73,000-day span limit, and watch for verified_data_lag on recent windows. It frames the use case (multi-decade trend reading) but never explicitly says when to prefer this over noaa_marine_get_water_level or noaa_marine_get_tide_predictions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
noaa_marine_get_ocean_observationsGet Ocean ObservationsARead-onlyInspect
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 | Required | Description | Default |
|---|---|---|---|
| station_id | Yes | NDBC station ID (mostly 5-character alphanumeric codes, e.g. "44033" or "TIBC1"; some are 7-digit numbers). Obtain from noaa_marine_find_stations with source="ndbc" and types=["water_quality"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| source | No | Data source — always "ndbc" for this tool. |
| latitude | No | 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. |
| readings | No | Per-depth readings sharing the most recent observation timestamp, in NDBC source order. |
| longitude | No | Station longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list. |
| station_id | No | Station ID echoed from the request — for chaining. |
| observed_at | No | 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. |
| station_name | No | Station name from the NDBC active stations list. |
| reading_count | No | Number of per-depth readings in the latest observation (usually 1). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and openWorldHint, and the description goes well beyond them: it discloses that only the most recent observation is returned, one reading per reported depth, that sensor coverage is sparse, that unreported values come back null rather than zero, and that out-of-catalog stations yield null lat/lon. It also names the observations_not_found failure mode. It stops short of describing pagination/rate limits, but for a single-file reader that is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool returns, then the sibling contrast, then availability caveats — a sensible ordering. The third sentence is dense and packs several distinct caveats (nulls, lat/lon, catalog drift, error name) into one run-on, costing some readability, but little is genuinely redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and a fully documented single parameter, the description covers the remaining gaps an agent needs: data shape (one reading per depth), sparsity, null semantics, station discovery path, and the failure mode. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the pattern and sourcing instructions already present, so baseline would be 3. The description adds real selection semantics: the water_quality catalog flag and actual file availability can disagree, so the agent should expect the tool to read any station that serves the file regardless of the flag — information the schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Live sub-surface oceanographic observations from an NDBC station's water-quality sensors') and immediately enumerates the measured quantities, so the agent knows exactly what data comes back. It explicitly contrasts itself with noaa_marine_get_conditions ('the water-column counterpart'), making sibling disambiguation unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: use this for what the water is doing below the surface, and get_conditions for weather and sea state. It also tells the agent how to obtain a valid station (noaa_marine_find_stations with source="ndbc" and types=["water_quality"]) and warns that the catalog flag drifts from actual .ocean availability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
noaa_marine_get_tide_predictionsGet Tide PredictionsARead-onlyIdempotentInspect
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. Each call returns up to limit predictions starting at offset; when the range matched more, rows_matched, rows_returned, and next_offset 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 | Required | Description | Default |
|---|---|---|---|
| datum | No | 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 level) are the other tidal planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and is the plane that works where no tidal datum exists. CRD applies at Columbia River stations only. A datum this station does not carry comes back as datum_unavailable, whose hint names a datum to retry with. | MLLW |
| limit | No | Prediction rows to return on this page. Default 50; a larger value returns at most 1,000 and says so. | |
| units | No | Unit system for heights: english = feet; metric = meters. | english |
| offset | No | Row offset into the matched prediction series, for reading a range longer than one page. 0 (default) starts at the first row; pass the next_offset from a previous call to continue. An offset past the last row returns an empty page rather than an error. | |
| end_date | Yes | End date (inclusive), YYYYMMDD or YYYY-MM-DD, e.g. "20240607" or "2024-06-07". | |
| interval | No | 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 station has no 6-minute curve. | hilo |
| time_zone | No | Time zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round. | lst_ldt |
| begin_date | Yes | Start date, YYYYMMDD or YYYY-MM-DD, e.g. "20240601" or "2024-06-01". | |
| station_id | Yes | CO-OPS tide station ID (numeric, e.g. "9447130" for Seattle). Obtain from noaa_marine_find_stations with types=["tide"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| datum | No | Tidal datum used (e.g. MLLW) — echoed for correct interpretation of heights. |
| error | No | Present when the call failed. Absent on success. |
| units | No | Height units: "english" (feet) or "metric" (meters). |
| notice | No | What this page of the prediction series covers and how to reach the next one, opening with the requested and applied values when limit was clamped to its cap. Present when the response is a page rather than the whole matched series, or limit was clamped. |
| truncated | No | 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. |
| station_id | No | Station ID echoed from the request — for chaining. |
| next_offset | No | 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. |
| page_offset | No | Row offset this page starts at, echoed from the request. Absent when the whole matched series was returned. |
| predictions | No | Tide predictions for the requested date range — up to limit rows starting at offset, and the whole series when it fits one page. rows_matched and next_offset report what a page left behind. |
| rows_matched | No | Prediction rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned. |
| station_name | No | Station name as returned by CO-OPS — confirms the correct station was queried. |
| rows_returned | No | Prediction rows this page carries — the length of predictions. Absent when the whole matched series was returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so safety is covered; the description adds real behavioral context: a 1-year range cap, the subordinate_no_6min and datum_unavailable error shapes, and the offset-walking pagination contract. However, return format and pagination fields are largely restated rather than expanded, so it is useful but not exceptional beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then failure modes, then pagination, then the prerequisite sibling call. It is a dense single block with some redundancy against the schema (the MLLW/datum explanation appears in both), but nearly every sentence carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, yet it still covers the pagination fields an agent must act on (rows_matched, rows_returned, next_offset). Combined with the prerequisite call, range cap, and error codes, an agent has everything needed to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds marginal value by explaining that a year of events should be read by walking offset rather than splitting the range, and by tying interval choice to station type. Much of the datum and interval explanation duplicates the schema's own descriptions, so it does not substantially exceed the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: high/low tide predictions for a CO-OPS tide station over a date range. It immediately distinguishes the two modes (hilo events vs 6-minute curve) and is clearly separable from siblings like noaa_marine_get_water_level or noaa_marine_find_stations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use noaa_marine_find_stations first to resolve a station name or location to a numeric station ID,' and names the alternative to consult (prediction_class on a find_stations tide row) before choosing interval=6min. It also states the fallback path when a subordinate station returns subordinate_no_6min.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
noaa_marine_get_water_levelGet Water LevelARead-onlyIdempotentInspect
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. Each call returns up to limit observations from offset, with the predictions in their time span; a range of at most limit observations returns whole, and a longer one reports rows_matched, rows_returned, and next_offset, the offset that reaches the rest. Use noaa_marine_find_stations first to resolve a station name or location to a valid station ID.
| Name | Required | Description | Default |
|---|---|---|---|
| datum | No | 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 planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and is the plane that works where no tidal datum exists. IGLD and LWD apply at Great Lakes stations only, CRD at Columbia River stations only, and LWI and HWI are lunitidal intervals rather than heights. A datum this station does not carry comes back as datum_unavailable, whose hint names a datum to retry with, and a station with no water-level gauge at all as no_gauge. | MLLW |
| limit | No | Observation rows to return on this page; predictions cover the same time span. Default 50; a larger value returns at most 1,000 and says so. | |
| units | No | Unit system: english = feet; metric = meters. | english |
| offset | No | Row offset into the matched observation series, for reading a range longer than one page. 0 (default) starts at the first row; pass the next_offset from a previous call to continue. An offset past the last row returns an empty page rather than an error. | |
| end_date | Yes | End date (inclusive), YYYYMMDD or YYYY-MM-DD, e.g. "20240601" or "2024-06-01". | |
| interval | No | 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 hourly prediction series. high_low is the observed high and low waters with their H/HH/L/LL classification, 365 days per request, and reports no residual because observed extremes do not fall on predicted extreme times. daily_mean is the daily mean water level, 3655 days per request, published at Great Lakes stations only and with no paired prediction series; a coastal station comes back as great_lakes_only. | 6min |
| time_zone | No | 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 in local standard time only and otherwise stamps every row a day off. | lst_ldt |
| begin_date | Yes | Start date, YYYYMMDD or YYYY-MM-DD, e.g. "20240601" or "2024-06-01". | |
| station_id | Yes | CO-OPS water-level station ID (numeric, e.g. "9447130" for Seattle). Obtain from noaa_marine_find_stations with types=["water_level"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| datum | No | Tidal datum used — echoed for correct interpretation of water heights. |
| error | No | Present when the call failed. Absent on success. |
| units | No | Height units: "english" (feet) or "metric" (meters). |
| notice | No | That limit was clamped to its cap, 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 string in that order. |
| interval | No | 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. |
| truncated | No | 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 returned. |
| station_id | No | Station ID echoed from the request — for chaining. |
| next_offset | No | 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. |
| page_offset | No | Observation row offset this page starts at, echoed from the request. Absent when the whole matched series was returned. |
| predictions | No | Paired tide predictions covering the same period as the returned observations, at the interval matching the observed cadence. Every prediction in the page span is included and none repeats across pages, so a page whose span crosses a sensor outage carries more predictions than observations. Always empty on the daily_mean interval, which has no paired series. Otherwise empty when CO-OPS returned no predictions for this station and range, or when the prediction fetch failed — predictions_status says which. |
| gaps_dropped | No | 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 has this many missing slots, and rows_matched counts only the slots that carry a value. |
| observations | No | Observed water level readings at the requested cadence — the whole matched series when it holds at most limit rows, otherwise the page of up to limit rows starting at offset. rows_matched and next_offset report what a page left behind. |
| rows_matched | No | Observation rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned. |
| station_name | No | Station name as returned by CO-OPS. |
| rows_returned | No | Observation rows this page carries — the length of observations. Absent when the whole matched series was returned. |
| residual_summary | No | 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 the range. Present only on the 6min and hourly intervals, and only when both series are available; the notice says why it is absent on high_low and daily_mean. |
| predictions_status | No | 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 fetch failed, so no comparison series could be retrieved and the absence says nothing about the station. Absent when predictions were returned, and on the daily_mean interval, which has no paired series to report on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent/open-world annotations, the description discloses many behavioral traits: per-interval CO-OPS range ceilings, local rejection before the call, independent observation and prediction fetches, prediction-status reporting, dropped sensor gaps, residual availability rules, and pagination behavior. It also names specific error outcomes such as great_lakes_only, datum_unavailable, and no_gauge.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then layers in interval behavior, range ceilings, residual rules, gaps, and pagination. It is dense and long, but nearly every sentence carries operational information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema, output schema, and annotations, the description is complete enough for correct invocation. It covers prerequisites, interval tradeoffs, range ceilings, residual limitations, error cases, and pagination, leaving little an agent would need to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all nine parameters in detail. The description reinforces interval, limit/offset pagination, time-zone override, and datum behavior, but much of that repeats the schema rather than adding new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: observed water level for a CO-OPS station, paired with tide predictions so the residual is available. It also states the temporal scope (real-time or historical) and distinguishes the tool's unique value from a predictions-only sibling by emphasizing observed-plus-predicted residual analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational guidance: use noaa_marine_find_stations first, choose interval based on cadence and range ceiling, and expect residual only for 6min and hourly. It does not explicitly name noaa_marine_get_tide_predictions as the alternative for predictions-only use, which is the main remaining gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
- Changed
noaa_marine_find_stations10 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of stations to return. Defaults to 20."New value: +"Stations to return on this page. Default 20; a larger value returns at most 200 and says so." - removed
Input schema / properties / limit / maximumRemoved value: -200 - added
Input schema / properties / limit / multipleOfAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"integer"New value: +"number" - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Index of the first match to return, for reading a result larger than one page. 0 (default) starts at the first match; pass the next_offset from a previous call to continue. An offset past the last match returns an empty page rather than an error.", + "minimum": 0, + "multipleOf": 1, + "type": "number" +} - added
Output schema / properties / next_offsetAdded value: +{ + "description": "Offset to pass as offset for the next page. Present only while matches remain past this page.", + "type": "number" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance about the result set: why a search matched nothing, which catalog did not answer, or that the list was capped."New value: +"Guidance about the result set: why a search matched nothing, which catalog did not answer, that limit was clamped to its cap, or which matches this page carries and the offset that reaches the rest." - changed
Output schema / properties / stations / descriptionPrevious value: -"Stations matching the search criteria, sorted by distance (if lat/lon provided) or by exact ID match then name. Empty when nothing matched."New value: +"The page of matching stations starting at offset, sorted by distance (if lat/lon provided) or by exact ID match then name, with ties ordered by source and then station ID so every call orders the matches the same way. Empty when nothing matched or offset is past the last match." - changed
Output schema / properties / total_found / descriptionPrevious value: -"Total stations matching the filters before the limit was applied. Zero when nothing matched."New value: +"Total stations matching the filters, across every page. Zero when nothing matched." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when total_found exceeds the limit and not all matching stations are returned. Increase limit or narrow filters to see more."New value: +"True when matches remain past this page; next_offset reaches them. Absent on the last page."
- Changed
noaa_marine_get_conditions5 fields changed- changed
Input schema / properties / station_id / descriptionPrevious value: -"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\"]."New value: +"NDBC station ID (e.g. \"46041\" for Cape Elizabeth). Obtain from noaa_marine_find_stations with source=\"ndbc\" and types=[\"met\"]. A 7-digit CO-OPS station ID (e.g. \"8654467\") also works when NDBC relays that gauge's met sensors under a station ID of its own." - added
Output schema / properties / coops_station_idAdded value: +{ + "description": "The CO-OPS station ID that was requested, present only when it was read through the NDBC relay in station_id. Use it with the CO-OPS tools (tides, water level, currents); use station_id for NDBC reads. Absent when station_id is the ID requested.", + "type": "string" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `buoy_not_found`: NDBC returned 404 for the station ID. `no_sensor_data`: Buoy file exists but all sensor fields are MM (missing) — buoy offline or sensor failure. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `buoy_not_found`: NDBC has no observation file for the station ID and no NDBC station relays it as a CO-OPS gauge; the NDBC station relaying the CO-OPS ID has no observation file either; or several NDBC stations relay it and the met flag does not single one out. `no_sensor_data`: Buoy file exists but all sensor fields are MM (missing) — buoy offline or sensor failure. Also raised for the NDBC relay of a CO-OPS station ID, naming both IDs. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / notice / descriptionPrevious value: -"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 block outside the wave columns came from the newest row."New value: +"Present when a CO-OPS station ID was read through its NDBC relay (naming both IDs), 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), or both, in one string. Absent for a station read under its own ID whose blocks outside the wave columns all came from the newest row." - changed
Output schema / properties / station_id / descriptionPrevious value: -"Station ID echoed from the request — for chaining."New value: +"ID of the NDBC station these observations come from: the requested ID, uppercased, or — when a CO-OPS station ID was requested — the NDBC station that relays that gauge's met sensors."
- Changed
noaa_marine_get_current_profile1 field changed- changed
Input schema / properties / station_id / descriptionPrevious value: -"NDBC station ID (5-character alphanumeric, e.g. \"44033\"). Obtain from noaa_marine_find_stations with source=\"ndbc\" and types=[\"current_profile\"]."New value: +"NDBC station ID (mostly 5-character alphanumeric codes, e.g. \"44033\"; some are 7-digit numbers). Obtain from noaa_marine_find_stations with source=\"ndbc\" and types=[\"current_profile\"]."
- Changed
noaa_marine_get_currents12 fields changed- added
Input schema / properties / limit / defaultAdded value: +50 - changed
Input schema / properties / limit / descriptionPrevious value: -"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 largest page that fits; a value larger than the budget allows does not widen the page."New value: +"Prediction rows to return on this page — max/slack events or 6-minute rows, whichever the interval selects. Default 50; a larger value returns at most 1,000 and says so." - removed
Input schema / properties / limit / maximumRemoved value: -9007199254740991 - added
Input schema / properties / limit / multipleOfAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"integer"New value: +"number" - changed
Input schema / properties / offset / descriptionPrevious value: -"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 at the first row; pass the next_offset from a previous call to continue. An offset past the last row returns an empty page rather than an error."New value: +"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 longer than one page. 0 (default) starts at the first row; pass the next_offset from a previous call to continue. An offset past the last row returns an empty page rather than an error." - removed
Input schema / properties / offset / maximumRemoved value: -9007199254740991 - added
Input schema / properties / offset / multipleOfAdded value: +1 - changed
Input schema / properties / offset / typePrevious value: -"integer"New value: +"number" - changed
Output schema / properties / events / descriptionPrevious value: -"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 answered with a statement instead of events — read notice for its wording."New value: +"Max flood, max ebb, and slack events — up to limit events starting at offset, and the whole matched series when it fits one page. Present for MAX_SLACK interval, and empty when CO-OPS answered with a statement instead of events — read notice for its wording." - changed
Output schema / properties / notice / descriptionPrevious value: -"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 the next one."New value: +"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 the next one. Opens with the requested and applied values when limit was clamped to its cap." - changed
Output schema / properties / predictions / descriptionPrevious value: -"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 statement instead of a curve — read notice for its wording."New value: +"6-minute continuous current predictions — up to limit rows starting at offset, and the whole curve when it fits one page. Present for 6min interval, and empty when CO-OPS answered with a statement instead of a curve — read notice for its wording."
- Changed
noaa_marine_get_monthly_means14 fields changed- changed
Input schema / properties / datum / descriptionPrevious value: -"Datum the monthly heights are referenced to. MLLW (default) is the US nautical chart datum; MHHW, MHW, MTL, MSL, and MLW are the other tidal planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and reads any station. IGLD and LWD apply at Great Lakes stations only, which carry no tidal datum, and CRD at Columbia River stations only. A datum this station does not carry comes back as datum_unavailable."New value: +"Datum the monthly heights are referenced to. MLLW (default) is the US nautical chart datum; MHHW, MHW, MTL, MSL, and MLW are the other tidal planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and reads any station. IGLD and LWD apply at Great Lakes stations only, which carry no tidal datum, and CRD at Columbia River stations only. A datum this station does not carry comes back as datum_unavailable, whose hint names a datum to retry with, and a station with no water-level gauge at all as no_gauge." - added
Input schema / properties / limit / defaultAdded value: +24 - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum months 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 widen the page."New value: +"Months to return on this page. Default 24; a larger value returns at most 1,000 and says so." - removed
Input schema / properties / limit / maximumRemoved value: -9007199254740991 - added
Input schema / properties / limit / multipleOfAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"integer"New value: +"number" - changed
Input schema / properties / offset / descriptionPrevious value: -"Month offset into the matched series, for reading a range whose months do not fit one response. 0 (default) starts at the first month; pass the next_offset from a previous call to continue. An offset past the last month returns an empty page rather than an error."New value: +"Month offset into the matched series, for reading a range longer than one page. 0 (default) starts at the first month; pass the next_offset from a previous call to continue. An offset past the last month returns an empty page rather than an error." - removed
Input schema / properties / offset / maximumRemoved value: -9007199254740991 - added
Input schema / properties / offset / multipleOfAdded value: +1 - changed
Input schema / properties / offset / typePrevious value: -"integer"New value: +"number" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: begin_date or end_date is not a real calendar date, or the range starts after it ends. `date_range_exceeded`: The requested range spans more than 73,000 days, the CO-OPS limit for monthly means. `station_not_found`: CO-OPS rejected the station ID as not a valid station. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and IGLD and LWD apply at Great Lakes stations only. `verified_data_lag`: CO-OPS returned no months for a window ending on or after the first day of the prior month, which it may not have verified yet. `no_data`: CO-OPS returned no months for a window ending before the prior month — the station has no monthly means for it. `upstream_throttled`: CO-OPS answered the monthly-mean request with HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: begin_date or end_date is not a real calendar date, or the range starts after it ends. `date_range_exceeded`: The requested range spans more than 73,000 days, the CO-OPS limit for monthly means. `station_not_found`: CO-OPS rejected the station ID as not a valid station. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and IGLD and LWD apply at Great Lakes stations only. `no_gauge`: CO-OPS rejected the datum at a station that is in neither its active nor its historic water-level station list, so the station has never had a water-level gauge and publishes no monthly means at any datum. `verified_data_lag`: CO-OPS returned no months for a window ending on or after the first day of the prior month, which it may not have verified yet. `no_data`: CO-OPS returned no months for a window ending before the prior month — the station has no monthly means for it. `upstream_throttled`: CO-OPS answered the monthly-mean request with HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_date_range", - "date_range_exceeded", - "station_not_found", - "datum_unavailable", - "verified_data_lag", - "no_data", - "upstream_throttled" -]New value: +[ + "invalid_date_range", + "date_range_exceeded", + "station_not_found", + "datum_unavailable", + "no_gauge", + "verified_data_lag", + "no_data", + "upstream_throttled" +] - changed
Output schema / properties / months / descriptionPrevious value: -"One row per station-month in the requested range, oldest first — 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 left behind."New value: +"One row per station-month in the requested range, oldest first — the whole matched series when it holds at most limit months, otherwise the page of up to limit months starting at offset. rows_matched and next_offset report what a page left behind." - changed
Output schema / properties / notice / descriptionPrevious value: -"What this page of the monthly series covers and how to reach the next page."New value: +"That limit was clamped to its cap, then what this page of the monthly series covers and how to reach the next page — whichever apply, composed into one string."
- Changed
noaa_marine_get_ocean_observations1 field changed- changed
Input schema / properties / station_id / descriptionPrevious value: -"NDBC station ID (5-character alphanumeric, e.g. \"44033\" or \"TIBC1\"). Obtain from noaa_marine_find_stations with source=\"ndbc\" and types=[\"water_quality\"]."New value: +"NDBC station ID (mostly 5-character alphanumeric codes, e.g. \"44033\" or \"TIBC1\"; some are 7-digit numbers). Obtain from noaa_marine_find_stations with source=\"ndbc\" and types=[\"water_quality\"]."
- Changed
noaa_marine_get_tide_predictions12 fields changed- changed
Input schema / properties / datum / descriptionPrevious value: -"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 level) are the other tidal planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and is the plane that works where no tidal datum exists. CRD applies at Columbia River stations only. A datum this station does not carry comes back as datum_unavailable naming the ones it does."New value: +"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 level) are the other tidal planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and is the plane that works where no tidal datum exists. CRD applies at Columbia River stations only. A datum this station does not carry comes back as datum_unavailable, whose hint names a datum to retry with." - added
Input schema / properties / limit / defaultAdded value: +50 - changed
Input schema / properties / limit / descriptionPrevious value: -"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 widen the page."New value: +"Prediction rows to return on this page. Default 50; a larger value returns at most 1,000 and says so." - removed
Input schema / properties / limit / maximumRemoved value: -9007199254740991 - added
Input schema / properties / limit / multipleOfAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"integer"New value: +"number" - changed
Input schema / properties / offset / descriptionPrevious value: -"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 offset past the last row returns an empty page rather than an error."New value: +"Row offset into the matched prediction series, for reading a range longer than one page. 0 (default) starts at the first row; pass the next_offset from a previous call to continue. An offset past the last row returns an empty page rather than an error." - removed
Input schema / properties / offset / maximumRemoved value: -9007199254740991 - added
Input schema / properties / offset / multipleOfAdded value: +1 - changed
Input schema / properties / offset / typePrevious value: -"integer"New value: +"number" - changed
Output schema / properties / notice / descriptionPrevious value: -"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."New value: +"What this page of the prediction series covers and how to reach the next one, opening with the requested and applied values when limit was clamped to its cap. Present when the response is a page rather than the whole matched series, or limit was clamped." - changed
Output schema / properties / predictions / descriptionPrevious value: -"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."New value: +"Tide predictions for the requested date range — up to limit rows starting at offset, and the whole series when it fits one page. rows_matched and next_offset report what a page left behind."
- Changed
noaa_marine_get_water_level15 fields changed- changed
Input schema / properties / datum / descriptionPrevious value: -"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 planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and is the plane that works where no tidal datum exists. IGLD and LWD apply at Great Lakes stations only, CRD at Columbia River stations only, and LWI and HWI are lunitidal intervals rather than heights. A datum this station does not carry comes back as datum_unavailable naming the ones it does."New value: +"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 planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and is the plane that works where no tidal datum exists. IGLD and LWD apply at Great Lakes stations only, CRD at Columbia River stations only, and LWI and HWI are lunitidal intervals rather than heights. A datum this station does not carry comes back as datum_unavailable, whose hint names a datum to retry with, and a station with no water-level gauge at all as no_gauge." - added
Input schema / properties / limit / defaultAdded value: +50 - changed
Input schema / properties / limit / descriptionPrevious value: -"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 widen the page."New value: +"Observation rows to return on this page; predictions cover the same time span. Default 50; a larger value returns at most 1,000 and says so." - removed
Input schema / properties / limit / maximumRemoved value: -9007199254740991 - added
Input schema / properties / limit / multipleOfAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"integer"New value: +"number" - changed
Input schema / properties / offset / descriptionPrevious value: -"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 offset past the last row returns an empty page rather than an error."New value: +"Row offset into the matched observation series, for reading a range longer than one page. 0 (default) starts at the first row; pass the next_offset from a previous call to continue. An offset past the last row returns an empty page rather than an error." - removed
Input schema / properties / offset / maximumRemoved value: -9007199254740991 - added
Input schema / properties / offset / multipleOfAdded value: +1 - changed
Input schema / properties / offset / typePrevious value: -"integer"New value: +"number" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID. `invalid_date_range`: begin_date or end_date is not a real calendar date, or the range starts after it ends. `date_range_exceeded`: Requested date range exceeds the selected interval's CO-OPS limit — 31 days for 6min, 365 for hourly and high_low, 3655 for daily_mean. `no_data`: Station exists but no observed water-level data for the date range — including an hourly, high_low, or daily_mean window ending before the prior month, which is not a verification lag. `great_lakes_only`: interval=\"daily_mean\" was requested for a coastal station — CO-OPS publishes water-level daily means at Great Lakes stations only. `verified_data_lag`: The hourly, high_low, or daily_mean product returned no rows for a window ending on or after the first day of the prior month, which CO-OPS may not have verified yet. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and NAVD reads only where the station has an NAVD88 tie. `upstream_throttled`: CO-OPS answered the observed-series request with HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID. `invalid_date_range`: begin_date or end_date is not a real calendar date, or the range starts after it ends. `date_range_exceeded`: Requested date range exceeds the selected interval's CO-OPS limit — 31 days for 6min, 365 for hourly and high_low, 3655 for daily_mean. `no_data`: Station exists but no observed water-level data for the date range — including an hourly, high_low, or daily_mean window ending before the prior month, which is not a verification lag. `future_window`: begin_date is after the station's current date in the zone CO-OPS reads the dates in — the UTC date under time_zone gmt, the station's local date under lst and lst_ldt and on interval daily_mean — so no observation in the window exists yet. `no_gauge`: CO-OPS rejected the datum at a station that is in neither its active nor its historic water-level station list, so the station has never had a water-level gauge and holds no observed water levels at any datum. `great_lakes_only`: interval=\"daily_mean\" was requested for a coastal station — CO-OPS publishes water-level daily means at Great Lakes stations only. `verified_data_lag`: The hourly, high_low, or daily_mean product returned no rows for a window ending on or after the first day of the prior month, which CO-OPS may not have verified yet. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and NAVD reads only where the station has an NAVD88 tie. `upstream_throttled`: CO-OPS answered the observed-series request with HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "station_not_found", - "invalid_date_range", - "date_range_exceeded", - "no_data", - "great_lakes_only", - "verified_data_lag", - "datum_unavailable", - "upstream_throttled" -]New value: +[ + "station_not_found", + "invalid_date_range", + "date_range_exceeded", + "no_data", + "future_window", + "no_gauge", + "great_lakes_only", + "verified_data_lag", + "datum_unavailable", + "upstream_throttled" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"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 string."New value: +"That limit was clamped to its cap, 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 string in that order." - changed
Output schema / properties / observations / descriptionPrevious value: -"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 left behind."New value: +"Observed water level readings at the requested cadence — the whole matched series when it holds at most limit rows, otherwise the page of up to limit rows starting at offset. rows_matched and next_offset report what a page left behind." - changed
Output schema / properties / predictions / descriptionPrevious value: -"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. Otherwise empty when CO-OPS returned no predictions for this station and range, or when the prediction fetch failed — predictions_status says which."New value: +"Paired tide predictions covering the same period as the returned observations, at the interval matching the observed cadence. Every prediction in the page span is included and none repeats across pages, so a page whose span crosses a sensor outage carries more predictions than observations. Always empty on the daily_mean interval, which has no paired series. Otherwise empty when CO-OPS returned no predictions for this station and range, or when the prediction fetch failed — predictions_status says which."
4 tool updates
- Changed
noaa_marine_get_currents1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS rejected the station ID as unknown or invalid — current stations require alphanumeric IDs. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date. `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no current-prediction data for the requested date range. `predictions_unavailable`: The station is in the current-predictions catalog, but CO-OPS publishes no current predictions for it at any date. `bin_unavailable`: CO-OPS rejected the requested bin because the station publishes no predictions at that bin. `upstream_throttled`: CO-OPS answered HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS rejected the station ID as unknown or invalid — current stations require alphanumeric IDs. `invalid_date_range`: begin_date or end_date is not a real calendar date, or the range starts after it ends. `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no current-prediction data for the requested date range. `predictions_unavailable`: The station is in the current-predictions catalog, but CO-OPS publishes no current predictions for it at any date. `bin_unavailable`: CO-OPS rejected the requested bin because the station publishes no predictions at that bin. `upstream_throttled`: CO-OPS answered HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler."
- Changed
noaa_marine_get_monthly_means1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date. `date_range_exceeded`: The requested range spans more than 73,000 days, the CO-OPS limit for monthly means. `station_not_found`: CO-OPS rejected the station ID as not a valid station. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and IGLD and LWD apply at Great Lakes stations only. `verified_data_lag`: CO-OPS returned no months for a window ending on or after the first day of the prior month, which it may not have verified yet. `no_data`: CO-OPS returned no months for a window ending before the prior month — the station has no monthly means for it. `upstream_throttled`: CO-OPS answered the monthly-mean request with HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: begin_date or end_date is not a real calendar date, or the range starts after it ends. `date_range_exceeded`: The requested range spans more than 73,000 days, the CO-OPS limit for monthly means. `station_not_found`: CO-OPS rejected the station ID as not a valid station. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and IGLD and LWD apply at Great Lakes stations only. `verified_data_lag`: CO-OPS returned no months for a window ending on or after the first day of the prior month, which it may not have verified yet. `no_data`: CO-OPS returned no months for a window ending before the prior month — the station has no monthly means for it. `upstream_throttled`: CO-OPS answered the monthly-mean request with HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler."
- Changed
noaa_marine_get_tide_predictions1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID — likely wrong type or invalid ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date. `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no prediction data for the date range. `subordinate_no_6min`: interval=\"6min\" was requested for a subordinate station, whose predictions are high and low events derived from a reference station. `datum_unavailable`: The station does not carry the requested datum — NAVD reads only where the station has an NAVD88 tie, and CRD only on the Columbia River. `upstream_throttled`: CO-OPS answered HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID — likely wrong type or invalid ID. `invalid_date_range`: begin_date or end_date is not a real calendar date, or the range starts after it ends. `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no prediction data for the date range. `subordinate_no_6min`: interval=\"6min\" was requested for a subordinate station, whose predictions are high and low events derived from a reference station. `datum_unavailable`: The station does not carry the requested datum — NAVD reads only where the station has an NAVD88 tie, and CRD only on the Columbia River. `upstream_throttled`: CO-OPS answered HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler."
- Changed
noaa_marine_get_water_level1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date. `date_range_exceeded`: Requested date range exceeds the selected interval's CO-OPS limit — 31 days for 6min, 365 for hourly and high_low, 3655 for daily_mean. `no_data`: Station exists but no observed water-level data for the date range — including an hourly, high_low, or daily_mean window ending before the prior month, which is not a verification lag. `great_lakes_only`: interval=\"daily_mean\" was requested for a coastal station — CO-OPS publishes water-level daily means at Great Lakes stations only. `verified_data_lag`: The hourly, high_low, or daily_mean product returned no rows for a window ending on or after the first day of the prior month, which CO-OPS may not have verified yet. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and NAVD reads only where the station has an NAVD88 tie. `upstream_throttled`: CO-OPS answered the observed-series request with HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID. `invalid_date_range`: begin_date or end_date is not a real calendar date, or the range starts after it ends. `date_range_exceeded`: Requested date range exceeds the selected interval's CO-OPS limit — 31 days for 6min, 365 for hourly and high_low, 3655 for daily_mean. `no_data`: Station exists but no observed water-level data for the date range — including an hourly, high_low, or daily_mean window ending before the prior month, which is not a verification lag. `great_lakes_only`: interval=\"daily_mean\" was requested for a coastal station — CO-OPS publishes water-level daily means at Great Lakes stations only. `verified_data_lag`: The hourly, high_low, or daily_mean product returned no rows for a window ending on or after the first day of the prior month, which CO-OPS may not have verified yet. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and NAVD reads only where the station has an NAVD88 tie. `upstream_throttled`: CO-OPS answered the observed-series request with HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler."
3 tool updates
- Changed
noaa_marine_find_stations1 field changed- changed
Input schema / properties / types / items / descriptionPrevious value: -"Filter value. Six are data capabilities, matched against a station's capabilities list: tide (CO-OPS tide predictions → noaa_marine_get_tide_predictions), current (CO-OPS tidal-current predictions → noaa_marine_get_currents), water_level (CO-OPS observed water levels → noaa_marine_get_water_level), met (NDBC meteorological → noaa_marine_get_conditions), current_profile (NDBC observed ocean-current depth profile → noaa_marine_get_current_profile; note this is a different data product and source than CO-OPS `current`), water_quality (NDBC sub-surface water-column sensors → noaa_marine_get_ocean_observations). The seventh, buoy, is a physical-platform filter (NDBC platform class equals buoy), not a data capability — use it to select buoy-class platforms regardless of what data they serve."New value: +"Filter value. Six are data capabilities, matched against a station's capabilities list: tide (CO-OPS tide predictions → noaa_marine_get_tide_predictions), current (CO-OPS tidal-current predictions → noaa_marine_get_currents), water_level (CO-OPS observed water levels → noaa_marine_get_water_level, and their verified monthly means → noaa_marine_get_monthly_means), met (NDBC meteorological → noaa_marine_get_conditions), current_profile (NDBC observed ocean-current depth profile → noaa_marine_get_current_profile; note this is a different data product and source than CO-OPS `current`), water_quality (NDBC sub-surface water-column sensors → noaa_marine_get_ocean_observations). The seventh, buoy, is a physical-platform filter (NDBC platform class equals buoy), not a data capability — use it to select buoy-class platforms regardless of what data they serve."
- Added
noaa_marine_get_monthly_means - Changed
noaa_marine_get_water_level1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date. `date_range_exceeded`: Requested date range exceeds the selected interval's CO-OPS limit — 31 days for 6min, 365 for hourly and high_low, 3655 for daily_mean. `no_data`: Station exists but no observed water-level data for the date range. `great_lakes_only`: interval=\"daily_mean\" was requested for a coastal station — CO-OPS publishes water-level daily means at Great Lakes stations only. `verified_data_lag`: The hourly, high_low, or daily_mean product returned no rows for the window, which CO-OPS has not published yet. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and NAVD reads only where the station has an NAVD88 tie. `upstream_throttled`: CO-OPS answered the observed-series request with HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date. `date_range_exceeded`: Requested date range exceeds the selected interval's CO-OPS limit — 31 days for 6min, 365 for hourly and high_low, 3655 for daily_mean. `no_data`: Station exists but no observed water-level data for the date range — including an hourly, high_low, or daily_mean window ending before the prior month, which is not a verification lag. `great_lakes_only`: interval=\"daily_mean\" was requested for a coastal station — CO-OPS publishes water-level daily means at Great Lakes stations only. `verified_data_lag`: The hourly, high_low, or daily_mean product returned no rows for a window ending on or after the first day of the prior month, which CO-OPS may not have verified yet. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and NAVD reads only where the station has an NAVD88 tie. `upstream_throttled`: CO-OPS answered the observed-series request with HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler."
1 tool update
- Changed
noaa_marine_find_stations4 fields changed- changed
Input schema / properties / state / descriptionPrevious value: -"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\"."New value: +"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). A station matches on its own catalog code, or — when its catalog rows carry none, as with every current station — on the state of the nearest state-bearing CO-OPS tide or water-level station within 25 km, which can be wrong on waters shared across a state or national border. E.g. \"WA\", \"CA\", \"PR\"." - changed
Output schema / properties / applied_search / properties / state / descriptionPrevious value: -"The state filter applied. Restricts results to CO-OPS and excludes NDBC."New value: +"The state filter applied, matched against each station's resolved state: its own catalog code, or for a station publishing none the state of the nearest state-bearing CO-OPS tide or water-level station within 25 km. Restricts results to CO-OPS and excludes NDBC." - changed
Output schema / properties / stations / items / properties / state / descriptionPrevious value: -"US state or territory code (CO-OPS stations only)."New value: +"US state or territory code (CO-OPS stations only): the station's own catalog code, or — when its catalog rows carry none, as with every current station — the state of the nearest state-bearing CO-OPS tide or water-level station within 25 km, marked by state_derived. A derived state can be wrong on waters shared across a state or national border. When neither applies, the station's own non-code catalog value (e.g. FM) is shown as published and unmarked — no state filter returns such a station, since the filter takes codes only. Omitted when the station publishes nothing at all and no state-bearing station is that close." - added
Output schema / properties / stations / items / properties / state_derivedAdded value: +{ + "description": "True when state was derived from the nearest state-bearing CO-OPS tide or water-level station within 25 km, because the station's own catalog rows carry no state code. Omitted when state is the station's own.", + "type": "boolean" +}
3 tool updates
- Changed
noaa_marine_get_currents6 fields changed- changed
Input schema / properties / begin_date / descriptionPrevious value: -"Start date in YYYYMMDD format, e.g. \"20240601\"."New value: +"Start date, YYYYMMDD or YYYY-MM-DD, e.g. \"20240601\" or \"2024-06-01\"." - changed
Input schema / properties / begin_date / patternPrevious value: -"^\\d{8}$"New value: +"^(\\d{8}|\\d{4}-\\d{2}-\\d{2})$" - changed
Input schema / properties / end_date / descriptionPrevious value: -"End date in YYYYMMDD format (inclusive), e.g. \"20240607\"."New value: +"End date (inclusive), YYYYMMDD or YYYY-MM-DD, e.g. \"20240607\" or \"2024-06-07\"." - changed
Input schema / properties / end_date / patternPrevious value: -"^\\d{8}$"New value: +"^(\\d{8}|\\d{4}-\\d{2}-\\d{2})$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS rejected the station ID as unknown or invalid — current stations require alphanumeric IDs. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no current-prediction data for the requested date range. `predictions_unavailable`: The station is in the current-predictions catalog, but CO-OPS publishes no current predictions for it at any date. `bin_unavailable`: CO-OPS rejected the requested bin because the station publishes no predictions at that bin. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS rejected the station ID as unknown or invalid — current stations require alphanumeric IDs. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date. `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no current-prediction data for the requested date range. `predictions_unavailable`: The station is in the current-predictions catalog, but CO-OPS publishes no current predictions for it at any date. `bin_unavailable`: CO-OPS rejected the requested bin because the station publishes no predictions at that bin. `upstream_throttled`: CO-OPS answered HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "station_not_found", - "invalid_date_range", - "date_range_exceeded", - "no_predictions", - "predictions_unavailable", - "bin_unavailable" -]New value: +[ + "station_not_found", + "invalid_date_range", + "date_range_exceeded", + "no_predictions", + "predictions_unavailable", + "bin_unavailable", + "upstream_throttled" +]
- Changed
noaa_marine_get_tide_predictions6 fields changed- changed
Input schema / properties / begin_date / descriptionPrevious value: -"Start date in YYYYMMDD format, e.g. \"20240601\"."New value: +"Start date, YYYYMMDD or YYYY-MM-DD, e.g. \"20240601\" or \"2024-06-01\"." - changed
Input schema / properties / begin_date / patternPrevious value: -"^\\d{8}$"New value: +"^(\\d{8}|\\d{4}-\\d{2}-\\d{2})$" - changed
Input schema / properties / end_date / descriptionPrevious value: -"End date in YYYYMMDD format (inclusive), e.g. \"20240607\"."New value: +"End date (inclusive), YYYYMMDD or YYYY-MM-DD, e.g. \"20240607\" or \"2024-06-07\"." - changed
Input schema / properties / end_date / patternPrevious value: -"^\\d{8}$"New value: +"^(\\d{8}|\\d{4}-\\d{2}-\\d{2})$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID — likely wrong type or invalid ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no prediction data for the date range. `subordinate_no_6min`: interval=\"6min\" was requested for a subordinate station, whose predictions are high and low events derived from a reference station. `datum_unavailable`: The station does not carry the requested datum — NAVD reads only where the station has an NAVD88 tie, and CRD only on the Columbia River. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID — likely wrong type or invalid ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date. `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no prediction data for the date range. `subordinate_no_6min`: interval=\"6min\" was requested for a subordinate station, whose predictions are high and low events derived from a reference station. `datum_unavailable`: The station does not carry the requested datum — NAVD reads only where the station has an NAVD88 tie, and CRD only on the Columbia River. `upstream_throttled`: CO-OPS answered HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "station_not_found", - "invalid_date_range", - "date_range_exceeded", - "no_predictions", - "subordinate_no_6min", - "datum_unavailable" -]New value: +[ + "station_not_found", + "invalid_date_range", + "date_range_exceeded", + "no_predictions", + "subordinate_no_6min", + "datum_unavailable", + "upstream_throttled" +]
- Changed
noaa_marine_get_water_level8 fields changed- changed
Input schema / properties / begin_date / descriptionPrevious value: -"Start date in YYYYMMDD format, e.g. \"20240601\"."New value: +"Start date, YYYYMMDD or YYYY-MM-DD, e.g. \"20240601\" or \"2024-06-01\"." - changed
Input schema / properties / begin_date / patternPrevious value: -"^\\d{8}$"New value: +"^(\\d{8}|\\d{4}-\\d{2}-\\d{2})$" - changed
Input schema / properties / end_date / descriptionPrevious value: -"End date in YYYYMMDD format (inclusive), e.g. \"20240601\"."New value: +"End date (inclusive), YYYYMMDD or YYYY-MM-DD, e.g. \"20240601\" or \"2024-06-01\"." - changed
Input schema / properties / end_date / patternPrevious value: -"^\\d{8}$"New value: +"^(\\d{8}|\\d{4}-\\d{2}-\\d{2})$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date `date_range_exceeded`: Requested date range exceeds the selected interval's CO-OPS limit — 31 days for 6min, 365 for hourly and high_low, 3655 for daily_mean. `no_data`: Station exists but no observed water-level data for the date range. `great_lakes_only`: interval=\"daily_mean\" was requested for a coastal station — CO-OPS publishes water-level daily means at Great Lakes stations only. `verified_data_lag`: The hourly, high_low, or daily_mean product returned no rows for the window, which CO-OPS has not published yet. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and NAVD reads only where the station has an NAVD88 tie. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date. `date_range_exceeded`: Requested date range exceeds the selected interval's CO-OPS limit — 31 days for 6min, 365 for hourly and high_low, 3655 for daily_mean. `no_data`: Station exists but no observed water-level data for the date range. `great_lakes_only`: interval=\"daily_mean\" was requested for a coastal station — CO-OPS publishes water-level daily means at Great Lakes stations only. `verified_data_lag`: The hourly, high_low, or daily_mean product returned no rows for the window, which CO-OPS has not published yet. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and NAVD reads only where the station has an NAVD88 tie. `upstream_throttled`: CO-OPS answered the observed-series request with HTTP 403, which it returns for about two minutes while it throttles a burst of requests from one address. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "station_not_found", - "invalid_date_range", - "date_range_exceeded", - "no_data", - "great_lakes_only", - "verified_data_lag", - "datum_unavailable" -]New value: +[ + "station_not_found", + "invalid_date_range", + "date_range_exceeded", + "no_data", + "great_lakes_only", + "verified_data_lag", + "datum_unavailable", + "upstream_throttled" +] - changed
Output schema / properties / residual_summary / properties / max_drawdown / descriptionPrevious value: -"Maximum negative residual magnitude in the requested units (feet for english, meters for metric) — anomalous drawdown indicator."New value: +"Maximum negative residual magnitude in the requested units (feet for english, meters for metric) — anomalous drawdown indicator. 0 when the observed level never fell below prediction in the range." - changed
Output schema / properties / residual_summary / properties / max_surge / descriptionPrevious value: -"Maximum positive residual (observed − predicted) in the requested units (feet for english, meters for metric) — storm surge indicator."New value: +"Maximum positive residual (observed − predicted) in the requested units (feet for english, meters for metric) — storm surge indicator. 0 when the observed level never rose above prediction in the range."
4 tool updates
- Changed
noaa_marine_find_stations3 fields changed- added
Output schema / properties / stations / items / properties / binsAdded value: +{ + "description": "Depth bins this current station publishes predictions for, in the order CO-OPS publishes them. Each bin has its own depth and prediction class, and its bin number is what noaa_marine_get_currents takes as bin. Omitted for a station with no current-prediction rows.", + "items": { + "additionalProperties": false, + "description": "One depth bin CO-OPS publishes current predictions for at this station, with its depth and prediction class.", + "properties": { + "bin": { + "description": "CO-OPS bin number — pass it as the bin input of noaa_marine_get_currents. Omitting bin there selects the shallowest bin.", + "type": "number" + }, + "depth": { + "description": "Bin depth in FEET. The catalog publishes one figure with no unit switch, unlike the depth noaa_marine_get_currents echoes, which follows that call's units. Null when CO-OPS publishes no depth for the bin, which is usual where depth_type is U.", + "type": [ + "number", + "null" + ] + }, + "depth_type": { + "description": "CO-OPS depth-reference code as published: B, S, or U. A U bin usually carries no depth. Omitted when the catalog row has none.", + "type": "string" + }, + "prediction_class": { + "description": "CO-OPS prediction class for this bin: harmonic (predicted from the bin's own harmonic analysis) or subordinate (derived by offsets from a reference station) both serve the normal flood/ebb/slack series, while weak_and_variable may instead answer noaa_marine_get_currents with a coverage statement and no events, or report that no predictions are published at all. The class is per bin because one station can mix classes across its bins. An unrecognized catalog code is passed through verbatim.", + "type": "string" + } + }, + "required": [ + "bin", + "depth" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / stations / items / properties / prediction_classAdded value: +{ + "description": "CO-OPS TIDE-prediction class: reference (predicted from the station's own harmonic analysis, serving both hilo and the 6-minute curve) or subordinate (high and low events derived as offsets from a reference station, hilo only — noaa_marine_get_tide_predictions rejects interval=\"6min\" for it). A third axis beside type/capabilities (data products) and platform (NDBC physical class). Omitted for a station with no tide-prediction row; a current station carries its class per bin in bins[], where subordinate means something different. An unrecognized catalog code is passed through verbatim.", + "type": "string" +} - added
Output schema / properties / stations / items / properties / reference_idAdded value: +{ + "description": "The reference station a subordinate tide station derives its offsets from — the station to request a 6-minute curve from. Omitted for a reference station and for any station with no tide-prediction row.", + "type": "string" +}
- Changed
noaa_marine_get_currents24 fields changed- added
Input schema / properties / binAdded value: +{ + "description": "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 station does not publish comes back as bin_unavailable naming the bins it does.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Input schema / properties / limitAdded value: +{ + "description": "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 largest page that fits; a value larger than the budget allows does not widen the page.", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "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 at the first row; pass the next_offset from a previous call to continue. An offset past the last row returns an empty page rather than an error.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / units / descriptionPrevious value: -"Unit system: english = knots; metric = m/s."New value: +"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." - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "station_id", - "station_name", - "units" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "station_id", + "station_name", + "units", + "bin", + "depth" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / binAdded value: +{ + "description": "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.", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / depthAdded value: +{ + "description": "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 feet. Null when CO-OPS publishes no depth for the bin, or when the response carried no prediction rows.", + "type": [ + "number", + "null" + ] +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID — current stations require alphanumeric IDs. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no current-prediction data for the date range. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS rejected the station ID as unknown or invalid — current stations require alphanumeric IDs. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no current-prediction data for the requested date range. `predictions_unavailable`: The station is in the current-predictions catalog, but CO-OPS publishes no current predictions for it at any date. `bin_unavailable`: CO-OPS rejected the requested bin because the station publishes no predictions at that bin. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "station_not_found", - "invalid_date_range", - "date_range_exceeded", - "no_predictions" -]New value: +[ + "station_not_found", + "invalid_date_range", + "date_range_exceeded", + "no_predictions", + "predictions_unavailable", + "bin_unavailable" +] - changed
Output schema / properties / events / descriptionPrevious value: -"Max flood, max ebb, and slack events. Present for MAX_SLACK interval."New value: +"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 answered with a statement instead of events — read notice for its wording." - changed
Output schema / properties / events / items / properties / direction / descriptionPrevious value: -"True bearing direction in degrees (0–360). Absent for slack events."New value: +"The station's mean flood direction on a flood event and its mean ebb direction on an ebb event, as a true bearing in degrees (0–360). A station constant, not an instantaneous heading. Absent for slack events and wherever CO-OPS reports no mean direction." - changed
Output schema / properties / events / items / properties / speed / descriptionPrevious value: -"Current speed in the requested units. Absent for slack events."New value: +"Peak speed as a non-negative magnitude, in the requested units. Absent when CO-OPS reports no speed for the event, which is the usual case at slack water — though a slack event can carry a small residual speed under metric units." - added
Output schema / properties / next_offsetAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "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." +} - added
Output schema / properties / noticeAdded value: +{ + "description": "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 the next one.", + "type": "string" +} - added
Output schema / properties / page_offsetAdded value: +{ + "description": "Row offset this page starts at, echoed from the request. Absent when the whole matched series was returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / predictions / descriptionPrevious value: -"6-minute continuous current predictions. Present for 6min interval."New value: +"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 statement instead of a curve — read notice for its wording." - changed
Output schema / properties / predictions / items / properties / direction / descriptionPrevious value: -"True bearing direction in degrees (0–360). Null when CO-OPS does not report direction for this station type."New value: +"The station's mean flood direction on a flood row and its mean ebb direction on an ebb row, as a true bearing in degrees (0–360). A station constant, not an instantaneous heading. Null on a slack row and wherever CO-OPS reports no mean direction." - changed
Output schema / properties / predictions / items / properties / speed / descriptionPrevious value: -"Current speed in the requested units."New value: +"Current speed as a non-negative magnitude, in the requested units." - added
Output schema / properties / predictions / items / properties / typeAdded value: +{ + "description": "Flow sense at this row, from the sign of the speed CO-OPS predicts: flood (inbound), ebb (outbound), or slack (zero). speed is a non-negative magnitude, so this is what carries which way the water is moving.", + "enum": [ + "flood", + "ebb", + "slack" + ], + "type": "string" +} - changed
Output schema / properties / predictions / items / requiredPrevious value: -[ - "time", - "speed", - "direction" -]New value: +[ + "time", + "type", + "speed", + "direction" +] - added
Output schema / properties / rows_matchedAdded value: +{ + "description": "Prediction rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / rows_returnedAdded value: +{ + "description": "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.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "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.", + "type": "boolean" +} - changed
Output schema / properties / units / descriptionPrevious value: -"Speed units: \"english\" (knots) or \"metric\" (m/s)."New value: +"Unit system these values are in: \"english\" (speed in knots, depth in feet) or \"metric\" (speed in cm/s, depth in meters)."
- Changed
noaa_marine_get_tide_predictions14 fields changed- changed
Input schema / properties / datum / descriptionPrevious value: -"Tidal datum reference plane. MLLW (default) is the US nautical chart datum. MSL = mean sea level; MHHW = mean higher high water (flooding reference)."New value: +"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 level) are the other tidal planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and is the plane that works where no tidal datum exists. CRD applies at Columbia River stations only. A datum this station does not carry comes back as datum_unavailable naming the ones it does." - changed
Input schema / properties / datum / enumPrevious value: -[ - "MLLW", - "MHHW", - "MSL", - "MTL", - "MHW", - "MLW", - "CD", - "STND" -]New value: +[ + "MLLW", + "MHHW", + "MHW", + "MTL", + "MSL", + "MLW", + "DTL", + "NAVD", + "STND", + "CRD" +] - changed
Input schema / properties / interval / descriptionPrevious value: -"Prediction interval: hilo (default) returns only high and low tide events; 6min returns a continuous prediction curve at 6-minute intervals."New value: +"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 station has no 6-minute curve." - added
Input schema / properties / limitAdded value: +{ + "description": "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 widen the page.", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "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 offset past the last row returns an empty page rather than an error.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID — likely wrong type or invalid ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no prediction data for the date range. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID — likely wrong type or invalid ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no prediction data for the date range. `subordinate_no_6min`: interval=\"6min\" was requested for a subordinate station, whose predictions are high and low events derived from a reference station. `datum_unavailable`: The station does not carry the requested datum — NAVD reads only where the station has an NAVD88 tie, and CRD only on the Columbia River. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "station_not_found", - "invalid_date_range", - "date_range_exceeded", - "no_predictions" -]New value: +[ + "station_not_found", + "invalid_date_range", + "date_range_exceeded", + "no_predictions", + "subordinate_no_6min", + "datum_unavailable" +] - added
Output schema / properties / next_offsetAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "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." +} - added
Output schema / properties / noticeAdded value: +{ + "description": "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.", + "type": "string" +} - added
Output schema / properties / page_offsetAdded value: +{ + "description": "Row offset this page starts at, echoed from the request. Absent when the whole matched series was returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / predictions / descriptionPrevious value: -"Tide predictions for the requested date range."New value: +"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." - added
Output schema / properties / rows_matchedAdded value: +{ + "description": "Prediction rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / rows_returnedAdded value: +{ + "description": "Prediction rows this page carries — the length of predictions. Absent when the whole matched series was returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "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.", + "type": "boolean" +}
- Changed
noaa_marine_get_water_level28 fields changed- changed
Input schema / properties / datum / descriptionPrevious value: -"Tidal datum reference plane. MLLW (default) is the US nautical chart datum. MSL = mean sea level; MHHW = mean higher high water (flooding reference)."New value: +"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 planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and is the plane that works where no tidal datum exists. IGLD and LWD apply at Great Lakes stations only, CRD at Columbia River stations only, and LWI and HWI are lunitidal intervals rather than heights. A datum this station does not carry comes back as datum_unavailable naming the ones it does." - changed
Input schema / properties / datum / enumPrevious value: -[ - "MLLW", - "MHHW", - "MSL", - "MTL", - "MHW", - "MLW", - "CD", - "STND" -]New value: +[ + "MLLW", + "MHHW", + "MHW", + "MTL", + "MSL", + "MLW", + "NAVD", + "STND", + "IGLD", + "LWD", + "CRD", + "LWI", + "HWI" +] - added
Input schema / properties / intervalAdded value: +{ + "default": "6min", + "description": "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 hourly prediction series. high_low is the observed high and low waters with their H/HH/L/LL classification, 365 days per request, and reports no residual because observed extremes do not fall on predicted extreme times. daily_mean is the daily mean water level, 3655 days per request, published at Great Lakes stations only and with no paired prediction series; a coastal station comes back as great_lakes_only.", + "enum": [ + "6min", + "hourly", + "high_low", + "daily_mean" + ], + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "description": "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 widen the page.", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "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 offset past the last row returns an empty page rather than an error.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / time_zone / descriptionPrevious value: -"Time zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round."New value: +"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 in local standard time only and otherwise stamps every row a day off." - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "station_id", - "station_name", - "datum", - "units", - "observations", - "predictions" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "station_id", + "station_name", + "datum", + "units", + "interval", + "observations", + "predictions" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date `date_range_exceeded`: Requested date range exceeds the 31-day CO-OPS limit for 6-minute water level data. `no_data`: Station exists but no observed water-level data for the date range. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date `date_range_exceeded`: Requested date range exceeds the selected interval's CO-OPS limit — 31 days for 6min, 365 for hourly and high_low, 3655 for daily_mean. `no_data`: Station exists but no observed water-level data for the date range. `great_lakes_only`: interval=\"daily_mean\" was requested for a coastal station — CO-OPS publishes water-level daily means at Great Lakes stations only. `verified_data_lag`: The hourly, high_low, or daily_mean product returned no rows for the window, which CO-OPS has not published yet. `datum_unavailable`: The station does not carry the requested datum — a Great Lakes station has no tidal datum, and NAVD reads only where the station has an NAVD88 tie. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "station_not_found", - "invalid_date_range", - "date_range_exceeded", - "no_data" -]New value: +[ + "station_not_found", + "invalid_date_range", + "date_range_exceeded", + "no_data", + "great_lakes_only", + "verified_data_lag", + "datum_unavailable" +] - added
Output schema / properties / gaps_droppedAdded value: +{ + "description": "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 has this many missing slots, and rows_matched counts only the slots that carry a value.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / intervalAdded value: +{ + "description": "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.", + "enum": [ + "6min", + "hourly", + "high_low", + "daily_mean" + ], + "type": "string" +} - added
Output schema / properties / next_offsetAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "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." +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Why the paired prediction series is missing, when it is missing."New value: +"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 string." - changed
Output schema / properties / observations / descriptionPrevious value: -"6-minute observed water level readings."New value: +"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 left behind." - changed
Output schema / properties / observations / items / descriptionPrevious value: -"A single 6-minute observed water level reading."New value: +"A single observed water level reading at the requested cadence." - changed
Output schema / properties / observations / items / properties / quality / descriptionPrevious value: -"Quality flag: p = preliminary, v = verified."New value: +"Quality flag: p = preliminary, v = verified. Present on the 6min interval only — CO-OPS sends no flag with the hourly, high_low, or daily_mean products, which are verified data, so the field is absent rather than defaulted to preliminary." - changed
Output schema / properties / observations / items / properties / sigma / descriptionPrevious value: -"Standard deviation of the water level sensor reading."New value: +"Standard deviation of the water level sensor reading. Present on the 6min and hourly intervals; CO-OPS sends none for high_low or daily_mean." - added
Output schema / properties / observations / items / properties / typeAdded value: +{ + "description": "Observed extreme classification on the high_low interval: H = high water, HH = higher high water, L = low water, LL = lower low water. Absent on every other interval.", + "enum": [ + "H", + "HH", + "L", + "LL" + ], + "type": "string" +} - changed
Output schema / properties / observations / items / requiredPrevious value: -[ - "time", - "value", - "quality" -]New value: +[ + "time", + "value" +] - added
Output schema / properties / page_offsetAdded value: +{ + "description": "Observation row offset this page starts at, echoed from the request. Absent when the whole matched series was returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / predictions / descriptionPrevious value: -"Paired 6-minute tide predictions for the same period. Empty when CO-OPS returned no predictions for this station and range, or when the prediction fetch failed — predictions_status says which."New value: +"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. Otherwise empty when CO-OPS returned no predictions for this station and range, or when the prediction fetch failed — predictions_status says which." - changed
Output schema / properties / predictions / items / descriptionPrevious value: -"A single 6-minute tide prediction."New value: +"A single tide prediction." - changed
Output schema / properties / predictions / items / properties / time / descriptionPrevious value: -"Prediction datetime matching the observation time step."New value: +"Prediction datetime in the requested time zone." - changed
Output schema / properties / predictions_status / descriptionPrevious value: -"Present only when predictions is empty. \"empty\" means CO-OPS returned no prediction rows for this station and date range; \"unavailable\" means the prediction fetch failed, so no comparison series could be retrieved and the absence says nothing about the station. Absent when predictions were returned."New value: +"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 fetch failed, so no comparison series could be retrieved and the absence says nothing about the station. Absent when predictions were returned, and on the daily_mean interval, which has no paired series to report on." - changed
Output schema / properties / residual_summary / descriptionPrevious value: -"Summary of observed-minus-predicted residuals in the requested units. Only present when both observations and predictions are available."New value: +"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 the range. Present only on the 6min and hourly intervals, and only when both series are available; the notice says why it is absent on high_low and daily_mean." - added
Output schema / properties / rows_matchedAdded value: +{ + "description": "Observation rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / rows_returnedAdded value: +{ + "description": "Observation rows this page carries — the length of observations. Absent when the whole matched series was returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "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 returned.", + "type": "boolean" +}
5 tool updates
- Changed
noaa_marine_find_stations11 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"Station name substring to match, case-insensitive. E.g. \"seattle\", \"puget sound\". NDBC rows also match on station ID. Blank or whitespace-only values are treated as omitted."New value: +"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 matches, unless latitude/longitude were supplied — a proximity search orders by distance instead. Blank or whitespace-only values are treated as omitted." - changed
Input schema / properties / types / items / descriptionPrevious value: -"Filter value. Five are data capabilities, matched against a station's capabilities list: tide (CO-OPS tide predictions → noaa_marine_get_tide_predictions), current (CO-OPS tidal-current predictions → noaa_marine_get_currents), water_level (CO-OPS observed water levels → noaa_marine_get_water_level), met (NDBC meteorological → noaa_marine_get_conditions), current_profile (NDBC observed ocean-current depth profile → noaa_marine_get_current_profile; note this is a different data product and source than CO-OPS `current`). The sixth, buoy, is a physical-platform filter (NDBC platform class equals buoy), not a data capability — use it to select buoy-class platforms regardless of what data they serve."New value: +"Filter value. Six are data capabilities, matched against a station's capabilities list: tide (CO-OPS tide predictions → noaa_marine_get_tide_predictions), current (CO-OPS tidal-current predictions → noaa_marine_get_currents), water_level (CO-OPS observed water levels → noaa_marine_get_water_level), met (NDBC meteorological → noaa_marine_get_conditions), current_profile (NDBC observed ocean-current depth profile → noaa_marine_get_current_profile; note this is a different data product and source than CO-OPS `current`), water_quality (NDBC sub-surface water-column sensors → noaa_marine_get_ocean_observations). The seventh, buoy, is a physical-platform filter (NDBC platform class equals buoy), not a data capability — use it to select buoy-class platforms regardless of what data they serve." - changed
Input schema / properties / types / items / enumPrevious value: -[ - "tide", - "current", - "water_level", - "met", - "current_profile", - "buoy" -]New value: +[ + "tide", + "current", + "water_level", + "met", + "current_profile", + "water_quality", + "buoy" +] - added
Output schema / properties / applied_searchAdded value: +{ + "additionalProperties": false, + "description": "The narrowing dimensions this search applied, echoed when nothing matched so the caller can see which filter emptied the result.", + "properties": { + "catalogs_read": { + "description": "Catalogs this search actually fetched. Empty when source and state cancelled each other out and no catalog was read.", + "items": { + "description": "Catalog name: coops or ndbc.", + "type": "string" + }, + "type": "array" + }, + "center": { + "additionalProperties": false, + "description": "Proximity-search center, present only when latitude and longitude were supplied.", + "properties": { + "latitude": { + "description": "Center latitude the proximity filter used.", + "type": "number" + }, + "longitude": { + "description": "Center longitude the proximity filter used.", + "type": "number" + } + }, + "required": [ + "latitude", + "longitude" + ], + "type": "object" + }, + "query": { + "description": "The name/ID substring as the server used it — trimmed and lowercased. Omitted when no query was supplied or it was blank.", + "type": "string" + }, + "radius_km": { + "description": "Radius bound in km, present only when a center was given. Applies whenever a center is present and defaults to 100 km.", + "type": "number" + }, + "source": { + "description": "The source filter applied: coops, ndbc, or all.", + "type": "string" + }, + "state": { + "description": "The state filter applied. Restricts results to CO-OPS and excludes NDBC.", + "type": "string" + }, + "types": { + "description": "The resolved types filter. Omitted when no types filter narrowed the search.", + "items": { + "description": "A requested capability or platform filter value.", + "type": "string" + }, + "type": "array" + }, + "types_by_source": { + "additionalProperties": false, + "description": "The requested types split by the source that can carry them — every value belongs to exactly one source, so a single-source types filter reduces the search to that source.", + "properties": { + "coops": { + "description": "Requested values only a CO-OPS row can carry.", + "items": { + "description": "CO-OPS-only filter value.", + "type": "string" + }, + "type": "array" + }, + "ndbc": { + "description": "Requested values only an NDBC row can carry.", + "items": { + "description": "NDBC-only filter value.", + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "coops", + "ndbc" + ], + "type": "object" + } + }, + "required": [ + "catalogs_read", + "source" + ], + "type": "object" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_results`: No stations match the query, location, or filters. `incomplete_coordinates`: Only one of latitude/longitude was supplied — proximity search needs the pair. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `incomplete_coordinates`: Only one of latitude/longitude was supplied — proximity search needs the pair. `sources_unavailable`: Every station catalog this search needed failed to load, so no station list could be searched. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_results", - "incomplete_coordinates" -]New value: +[ + "incomplete_coordinates", + "sources_unavailable" +] - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance about the result set: why a search matched nothing, which catalog did not answer, or that the list was capped.", + "type": "string" +} - added
Output schema / properties / sourcesAdded value: +{ + "additionalProperties": false, + "description": "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.", + "properties": { + "answered": { + "description": "Catalogs that returned a station list — the results cover these only.", + "items": { + "description": "Catalog name: coops or ndbc.", + "type": "string" + }, + "type": "array" + }, + "attempted": { + "description": "Catalogs this search needed, after source and state decided which to read.", + "items": { + "description": "Catalog name: coops or ndbc.", + "type": "string" + }, + "type": "array" + }, + "failed": { + "description": "Catalogs whose fetch rejected. A station served only by one of these is missing.", + "items": { + "description": "Catalog name: coops or ndbc.", + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "answered", + "attempted", + "failed" + ], + "type": "object" +} - changed
Output schema / properties / stations / descriptionPrevious value: -"Stations matching the search criteria, sorted by distance (if lat/lon provided) or name."New value: +"Stations matching the search criteria, sorted by distance (if lat/lon provided) or by exact ID match then name. Empty when nothing matched." - changed
Output schema / properties / stations / items / properties / capabilities / descriptionPrevious value: -"Data products available at this station: any of tide, current, water_level (CO-OPS) or met, current_profile (NDBC). Empty when the station reports no data capability — platform still identifies it."New value: +"Data products available at this station: any of tide, current, water_level (CO-OPS) or met, current_profile, water_quality (NDBC). Empty when the station reports no data capability — platform still identifies it." - changed
Output schema / properties / total_found / descriptionPrevious value: -"Total stations matching the filters before the limit was applied."New value: +"Total stations matching the filters before the limit was applied. Zero when nothing matched."
- Changed
noaa_marine_get_conditions8 fields changed- changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "station_id", - "station_name", - "latitude", - "longitude", - "observed_at", - "source", - "wind_direction_deg", - "wind_speed_ms", - "gust_speed_ms", - "wave_height_m", - "dominant_period_sec", - "average_period_sec", - "mean_wave_direction_deg", - "pressure_hpa", - "air_temp_c", - "water_temp_c", - "dew_point_c", - "visibility_nmi", - "tide_ft" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "station_id", + "station_name", + "latitude", + "longitude", + "observed_at", + "source", + "wind_direction_deg", + "wind_speed_ms", + "gust_speed_ms", + "wave_height_m", + "dominant_period_sec", + "average_period_sec", + "mean_wave_direction_deg", + "waves_observed_at", + "pressure_hpa", + "air_temp_c", + "water_temp_c", + "dew_point_c", + "visibility_nmi", + "tide_ft" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / latitude / descriptionPrevious value: -"Station latitude in decimal degrees."New value: +"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." - changed
Output schema / properties / latitude / typePrevious value: -"number"New value: +[ + "number", + "null" +] - changed
Output schema / properties / longitude / descriptionPrevious value: -"Station longitude in decimal degrees."New value: +"Station longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list." - changed
Output schema / properties / longitude / typePrevious value: -"number"New value: +[ + "number", + "null" +] - added
Output schema / properties / noticeAdded value: +{ + "description": "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 block outside the wave columns came from the newest row.", + "type": "string" +} - changed
Output schema / properties / observed_at / descriptionPrevious value: -"ISO 8601 UTC timestamp of the observation row used."New value: +"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 wrote on an earlier row was measured before this time: waves report theirs in waves_observed_at, and any other block is named with its own time in the notice." - added
Output schema / properties / waves_observed_atAdded value: +{ + "description": "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 fields, which are never sampled apart. Null when no wave sample falls inside the 90-minute look-back window, including when the buoy has no wave sensor.", + "type": [ + "string", + "null" + ] +}
- Changed
noaa_marine_get_current_profile1 field changed- changed
Output schema / properties / observed_at / descriptionPrevious value: -"ISO 8601 UTC timestamp of the observation."New value: +"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."
- Changed
noaa_marine_get_ocean_observations2 fields changed- changed
Input schema / properties / station_id / descriptionPrevious value: -"NDBC station ID (5-character alphanumeric, e.g. \"44033\" or \"TIBC1\"). Obtain candidate IDs from noaa_marine_find_stations with source=\"ndbc\" — ocean-sensor coverage is not flagged in the catalog, so this is a best-effort call on any NDBC station."New value: +"NDBC station ID (5-character alphanumeric, e.g. \"44033\" or \"TIBC1\"). Obtain from noaa_marine_find_stations with source=\"ndbc\" and types=[\"water_quality\"]." - changed
Output schema / properties / observed_at / descriptionPrevious value: -"ISO 8601 UTC timestamp of the observation."New value: +"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."
- Changed
noaa_marine_get_water_level3 fields changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Why the paired prediction series is missing, when it is missing.", + "type": "string" +} - changed
Output schema / properties / predictions / descriptionPrevious value: -"Paired 6-minute tide predictions for the same period. May be empty if CO-OPS predictions are unavailable for this station."New value: +"Paired 6-minute tide predictions for the same period. Empty when CO-OPS returned no predictions for this station and range, or when the prediction fetch failed — predictions_status says which." - added
Output schema / properties / predictions_statusAdded value: +{ + "description": "Present only when predictions is empty. \"empty\" means CO-OPS returned no prediction rows for this station and date range; \"unavailable\" means the prediction fetch failed, so no comparison series could be retrieved and the absence says nothing about the station. Absent when predictions were returned.", + "enum": [ + "empty", + "unavailable" + ], + "type": "string" +}
4 tool updates
- Changed
noaa_marine_get_conditions26 fields changed- removed
Output schema / properties / air_temp_c / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / air_temp_c / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / average_period_sec / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / average_period_sec / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / dew_point_c / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / dew_point_c / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / dominant_period_sec / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / dominant_period_sec / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / gust_speed_ms / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / gust_speed_ms / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / mean_wave_direction_deg / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / mean_wave_direction_deg / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / pressure_hpa / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / pressure_hpa / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / tide_ft / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / tide_ft / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / visibility_nmi / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / visibility_nmi / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / water_temp_c / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / water_temp_c / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / wave_height_m / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / wave_height_m / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / wind_direction_deg / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / wind_direction_deg / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / wind_speed_ms / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / wind_speed_ms / typeAdded value: +[ + "number", + "null" +]
- Changed
noaa_marine_get_current_profile8 fields changed- removed
Output schema / properties / bins / items / properties / direction_deg / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / bins / items / properties / direction_deg / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / bins / items / properties / speed_cm_s / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / bins / items / properties / speed_cm_s / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / latitude / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / latitude / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / longitude / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / longitude / typeAdded value: +[ + "number", + "null" +]
- Changed
noaa_marine_get_currents2 fields changed- removed
Output schema / properties / predictions / items / properties / direction / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / predictions / items / properties / direction / typeAdded value: +[ + "number", + "null" +]
- Changed
noaa_marine_get_ocean_observations22 fields changed- removed
Output schema / properties / latitude / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / latitude / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / longitude / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / longitude / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / readings / items / properties / chlorophyll_ug_l / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / readings / items / properties / chlorophyll_ug_l / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / readings / items / properties / conductivity_ms_cm / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / readings / items / properties / conductivity_ms_cm / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / readings / items / properties / oxygen_percent / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / readings / items / properties / oxygen_percent / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / readings / items / properties / oxygen_ppm / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / readings / items / properties / oxygen_ppm / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / readings / items / properties / ph / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / readings / items / properties / ph / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / readings / items / properties / redox_mv / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / readings / items / properties / redox_mv / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / readings / items / properties / salinity_psu / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / readings / items / properties / salinity_psu / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / readings / items / properties / turbidity_ftu / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / readings / items / properties / turbidity_ftu / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / readings / items / properties / water_temp_c / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / readings / items / properties / water_temp_c / typeAdded value: +[ + "number", + "null" +]
7 tool updates
- Changed
noaa_marine_find_stations6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "stations", + "total_found" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_results`: No stations match the query, location, or filters. `incomplete_coordinates`: Only one of latitude/longitude was supplied — proximity search needs the pair. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_results", + "incomplete_coordinates" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "stations", - "total_found" -]
- Changed
noaa_marine_get_conditions6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "station_id", + "station_name", + "latitude", + "longitude", + "observed_at", + "source", + "wind_direction_deg", + "wind_speed_ms", + "gust_speed_ms", + "wave_height_m", + "dominant_period_sec", + "average_period_sec", + "mean_wave_direction_deg", + "pressure_hpa", + "air_temp_c", + "water_temp_c", + "dew_point_c", + "visibility_nmi", + "tide_ft" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `buoy_not_found`: NDBC returned 404 for the station ID. `no_sensor_data`: Buoy file exists but all sensor fields are MM (missing) — buoy offline or sensor failure. Other values are possible when a failure originates below the handler.", + "examples": [ + "buoy_not_found", + "no_sensor_data" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "station_id", - "station_name", - "latitude", - "longitude", - "observed_at", - "source", - "wind_direction_deg", - "wind_speed_ms", - "gust_speed_ms", - "wave_height_m", - "dominant_period_sec", - "average_period_sec", - "mean_wave_direction_deg", - "pressure_hpa", - "air_temp_c", - "water_temp_c", - "dew_point_c", - "visibility_nmi", - "tide_ft" -]
- Changed
noaa_marine_get_current_profile6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "station_id", + "station_name", + "latitude", + "longitude", + "observed_at", + "source", + "bin_count", + "bins" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `profile_not_found`: NDBC returned 404 for the station — no ADCP current-profile file exists for it. `no_current_data`: The ADCP file exists but has no usable data rows — profiler offline or every bin missing. Other values are possible when a failure originates below the handler.", + "examples": [ + "profile_not_found", + "no_current_data" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "station_id", - "station_name", - "latitude", - "longitude", - "observed_at", - "source", - "bin_count", - "bins" -]
- Changed
noaa_marine_get_currents6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "station_id", + "station_name", + "units" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID — current stations require alphanumeric IDs. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no current-prediction data for the date range. Other values are possible when a failure originates below the handler.", + "examples": [ + "station_not_found", + "invalid_date_range", + "date_range_exceeded", + "no_predictions" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "station_id", - "station_name", - "units" -]
- Changed
noaa_marine_get_ocean_observations6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "station_id", + "station_name", + "latitude", + "longitude", + "observed_at", + "source", + "reading_count", + "readings" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `observations_not_found`: NDBC returned 404 for the station — no .ocean oceanographic file exists for it. `no_ocean_data`: The .ocean file exists but has no usable data rows — station offline or every depth row missing. Other values are possible when a failure originates below the handler.", + "examples": [ + "observations_not_found", + "no_ocean_data" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "station_id", - "station_name", - "latitude", - "longitude", - "observed_at", - "source", - "reading_count", - "readings" -]
- Changed
noaa_marine_get_tide_predictions6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "station_id", + "station_name", + "datum", + "units", + "predictions" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID — likely wrong type or invalid ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date `date_range_exceeded`: Requested date range exceeds the 1-year CO-OPS limit. `no_predictions`: Station exists but CO-OPS returned no prediction data for the date range. Other values are possible when a failure originates below the handler.", + "examples": [ + "station_not_found", + "invalid_date_range", + "date_range_exceeded", + "no_predictions" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "station_id", - "station_name", - "datum", - "units", - "predictions" -]
- Changed
noaa_marine_get_water_level6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "station_id", + "station_name", + "datum", + "units", + "observations", + "predictions" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `station_not_found`: CO-OPS returned an error for the station ID. `invalid_date_range`: begin_date/end_date is not a real calendar date or begin_date is after end_date `date_range_exceeded`: Requested date range exceeds the 31-day CO-OPS limit for 6-minute water level data. `no_data`: Station exists but no observed water-level data for the date range. Other values are possible when a failure originates below the handler.", + "examples": [ + "station_not_found", + "invalid_date_range", + "date_range_exceeded", + "no_data" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "station_id", - "station_name", - "datum", - "units", - "observations", - "predictions" -]
1 tool update
- Added
noaa_marine_get_ocean_observations
2 tool updates
- Changed
noaa_marine_find_stations7 fields changed- changed
Input schema / properties / types / descriptionPrevious value: -"Filter by station capability. Every returned station carries at least one of the requested values in its capabilities list. Omit to return all types. NDBC stations whose only capability is currents match none of these values — reach them with source=\"ndbc\" and no types filter, or by name/ID via query."New value: +"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. Omit to return all stations." - changed
Input schema / properties / types / items / descriptionPrevious value: -"Station capability, matched against the capabilities list of each station: tide (CO-OPS tide predictions), current (CO-OPS current predictions), water_level (CO-OPS observed water levels), met (NDBC meteorological — the stations noaa_marine_get_conditions reads), buoy (NDBC station reporting neither met nor currents)."New value: +"Filter value. Five are data capabilities, matched against a station's capabilities list: tide (CO-OPS tide predictions → noaa_marine_get_tide_predictions), current (CO-OPS tidal-current predictions → noaa_marine_get_currents), water_level (CO-OPS observed water levels → noaa_marine_get_water_level), met (NDBC meteorological → noaa_marine_get_conditions), current_profile (NDBC observed ocean-current depth profile → noaa_marine_get_current_profile; note this is a different data product and source than CO-OPS `current`). The sixth, buoy, is a physical-platform filter (NDBC platform class equals buoy), not a data capability — use it to select buoy-class platforms regardless of what data they serve." - changed
Input schema / properties / types / items / enumPrevious value: -[ - "tide", - "current", - "water_level", - "buoy", - "met" -]New value: +[ + "tide", + "current", + "water_level", + "met", + "current_profile", + "buoy" +] - changed
Output schema / properties / stations / items / properties / capabilities / descriptionPrevious value: -"List of data products available at this station."New value: +"Data products available at this station: any of tide, current, water_level (CO-OPS) or met, current_profile (NDBC). Empty when the station reports no data capability — platform still identifies it." - added
Output schema / properties / stations / items / properties / platformAdded value: +{ + "description": "NDBC physical platform class: buoy, fixed, oilrig, dart, tao, usv, or other. A different axis than type/capabilities (which describe data products). Omitted for CO-OPS stations — CO-OPS publishes no platform taxonomy.", + "type": "string" +} - changed
Output schema / properties / stations / items / properties / type / descriptionPrevious value: -"The capability this row leads with — always one of the values in capabilities. When a types filter is set this is the first requested capability the station has, so it never contradicts the filter; otherwise it is the first capability. This is a data-product capability, not the physical platform classification — for that, read the noaa-marine://station/{station_id} resource."New value: +"The data capability this row leads with — always one of the values in capabilities. When a types filter of capability values is set this is the first requested capability the station has, so it never contradicts the filter; otherwise it is the first capability. Omitted when the station has no data capability (e.g. a bare buoy/fixed platform matched only by a platform filter) — read platform for its identity. This is a data-product axis, never the physical platform class." - changed
Output schema / properties / stations / items / requiredPrevious value: -[ - "station_id", - "name", - "source", - "type", - "latitude", - "longitude", - "capabilities" -]New value: +[ + "station_id", + "name", + "source", + "latitude", + "longitude", + "capabilities" +]
- Added
noaa_marine_get_current_profile
2 tool updates
- Changed
noaa_marine_find_stations6 fields changed- changed
Input schema / properties / latitude / descriptionPrevious value: -"Center latitude in decimal degrees for proximity search. Pair with longitude and optionally radius_km."New value: +"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." - changed
Input schema / properties / longitude / descriptionPrevious value: -"Center longitude in decimal degrees for proximity search. Pair with latitude and optionally radius_km."New value: +"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." - changed
Input schema / properties / query / descriptionPrevious value: -"Station name substring to search (case-insensitive token match). E.g. \"seattle\", \"puget sound\"."New value: +"Station name substring to match, case-insensitive. E.g. \"seattle\", \"puget sound\". NDBC rows also match on station ID. Blank or whitespace-only values are treated as omitted." - changed
Input schema / properties / types / descriptionPrevious value: -"Filter by station type/capability. Omit to return all types."New value: +"Filter by station capability. Every returned station carries at least one of the requested values in its capabilities list. Omit to return all types. NDBC stations whose only capability is currents match none of these values — reach them with source=\"ndbc\" and no types filter, or by name/ID via query." - changed
Input schema / properties / types / items / descriptionPrevious value: -"Station capability type: tide (CO-OPS tide predictions), current (CO-OPS current predictions), water_level (CO-OPS observed water levels), buoy (NDBC buoy), met (NDBC meteorological)."New value: +"Station capability, matched against the capabilities list of each station: tide (CO-OPS tide predictions), current (CO-OPS current predictions), water_level (CO-OPS observed water levels), met (NDBC meteorological — the stations noaa_marine_get_conditions reads), buoy (NDBC station reporting neither met nor currents)." - changed
Output schema / properties / stations / items / properties / type / descriptionPrevious value: -"Station type/capability string, e.g. \"tide\", \"current\", \"water_level\", \"buoy\"."New value: +"The capability this row leads with — always one of the values in capabilities. When a types filter is set this is the first requested capability the station has, so it never contradicts the filter; otherwise it is the first capability. This is a data-product capability, not the physical platform classification — for that, read the noaa-marine://station/{station_id} resource."
- Changed
noaa_marine_get_conditions1 field changed- changed
Input schema / properties / station_id / descriptionPrevious value: -"NDBC buoy station ID (5-character alphanumeric, e.g. \"46041\" for Cape Elizabeth). Obtain from noaa_marine_find_stations with source=\"ndbc\"."New value: +"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\"]."
1 tool update
- Changed
noaa_marine_find_stations1 field changed- changed
Input schema / properties / state / descriptionPrevious value: -"Filter by 2-letter US state or territory code (CO-OPS stations only). E.g. \"WA\", \"CA\", \"PR\"."New value: +"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\"."
1 tool update
- Changed
noaa_marine_find_stations1 field changed- added
Output schema / properties / truncatedAdded value: +{ + "description": "True when total_found exceeds the limit and not all matching stations are returned. Increase limit or narrow filters to see more.", + "type": "boolean" +}
5 tool updates
- First observed
noaa_marine_find_stations - First observed
noaa_marine_get_conditions - First observed
noaa_marine_get_currents - First observed
noaa_marine_get_tide_predictions - First observed
noaa_marine_get_water_level
Related MCP Connectors
Search NOAA climate stations and datasets, fetch historical weather observations.
NOAA tides and currents: water levels, tide predictions, currents, met data, flooding, sun and moon
Tides, currents, marine forecasts and warnings for paddlers, anglers and small boats, 26 countries.
Tide times and heights for about 4,600 US and Canadian stations. Not for navigation.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceProvides NOAA tide predictions and observed water levels, allowing AI agents to query tide stations and current water level data.6 npmMIT
- FlicenseAqualityDmaintenanceProvides Canadian tide predictions from the IWLS API, enabling retrieval of 7-day tide forecasts and station listings for monitoring stations across Canada.4-
- AlicenseAqualityBmaintenanceProvides real-time water temperature and tide predictions for any lake, river, ocean, bay, or beach using NOAA, USGS, and other sources.124 PyPIMIT
- AlicenseNot gradedqualityBmaintenanceProvides access to NOAA National Data Buoy Center marine observations, including wave height, period, sea-surface temperature, wind, and pressure from active buoys and stations, with tools for station lookup, latest observations, and historical data.378 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.