Skip to main content
Glama

Server Details

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

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 39 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

TDQS

A4.8/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct data product: station discovery, surface conditions, ADCP current profiles, tidal current predictions, monthly water-level means, subsurface water quality, tide predictions, and observed water levels. The only close pair, get_currents and get_current_profile, is explicitly differentiated as predictions versus observed profiles, with cross-references to guide selection.

Naming Consistency5/5

All tools share the noaa_marine_ prefix and follow a consistent verb_noun pattern: find_stations, get_conditions, get_current_profile, get_currents, get_monthly_means, get_ocean_observations, get_tide_predictions, get_water_level. No style mixing or arbitrary verb variation exists.

Tool Count5/5

Eight tools is a well-scoped size for this domain: one discovery tool plus seven data-retrieval tools covering the major NOAA marine observation and prediction products. There is no redundancy or bloat, and each tool earns its place.

Completeness5/5

The tool surface covers station discovery, live buoy conditions, water level, tide predictions, tidal currents, observed current profiles, monthly means, and subsurface ocean observations. Every data tool is reachable through find_stations, and the product coverage aligns with the stated NOAA marine scope with no dead ends.

Available Tools

8 tools
noaa_marine_find_stationsFind Marine StationsA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of stations to return. Defaults to 20.
queryNoStation 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.
stateNoFilter 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".
typesNoFilter 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.
sourceNoData source to search: coops (tide/water-level/current stations), ndbc (buoys), or all (default).all
latitudeNoCenter 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.
longitudeNoCenter 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_kmNoSearch radius in kilometers when latitude/longitude are provided. Defaults to 100 km.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance about the result set: why a search matched nothing, which catalog did not answer, or that the list was capped.
sourcesNoWhich 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.
stationsNoStations matching the search criteria, sorted by distance (if lat/lon provided) or by exact ID match then name. Empty when nothing matched.
truncatedNoTrue when total_found exceeds the limit and not all matching stations are returned. Increase limit or narrow filters to see more.
total_foundNoTotal stations matching the filters before the limit was applied. Zero when nothing matched.
applied_searchNoThe narrowing dimensions this search applied, echoed when nothing matched so the caller can see which filter emptied the result.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, openWorldHint), the description discloses that a no-match returns success with total_found: 0 and an echo of filters, that a partial catalog response names the missing source, and that CO-OPS prediction stations carry a prediction_class axis with detailed behavior for tide and current stations, including bin-specific semantics. This is extensive behavioral context not present in the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence carries informative content about search modes, axes, edge cases, and tool relationships. It is logically structured: it starts with the core purpose, then explains search variants, then dives into detailed behavioral nuances. It is not terse, but the verbosity is warranted given the tool's complexity, so it earns a 4 rather than a 3.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all relevant scenarios: no-match behavior, partial catalog failures, prediction_class distinctions, and relationships to sibling tools. It provides enough guidance for an agent to decide when to call and how to construct a valid request, including edge cases like weak_and_variable bins. With an output schema present, it still explains the total_found and filter echo, making it complete for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds substantial domain meaning to each parameter. For 'types', it distinguishes data capabilities from the 'buoy' physical-platform filter and maps each capability to its corresponding data tool. For 'state', it explains the CO-OPS-only restriction and the nearest-station fallback logic. For latitude/longitude, it emphasizes the required pairing. Even with 100% schema coverage, the description enriches all parameters with practical knowledge.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Find') and resource ('CO-OPS tide, water-level and current stations and NDBC buoys'), and enumerates the search modes (by location, name, ID). It explicitly frames the tool as the required first step for resolving place names, coordinates, or station numbers to IDs consumed by the sibling data tools, thereby distinguishing it from them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states clearly when to use this tool (as the first step before data retrieval) and how to search: via latitude/longitude proximity, name-or-ID substring, or state filter. It explains that filters combine, that exact ID matches lead (unless proximity orders by distance), and that the sibling tools handle actual data retrieval, leaving no ambiguity about its role.

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 ConditionsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
station_idYesNDBC buoy station ID (5-character alphanumeric, e.g. "46041" for Cape Elizabeth). Obtain from noaa_marine_find_stations with source="ndbc" and types=["met"].

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoPresent 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.
sourceNoData source — always "ndbc" for this tool.
tide_ftNoTide height in feet. NOTE: always in feet regardless of other unit settings. Rarely populated at offshore buoys. Null if not reported.
latitudeNoStation latitude in decimal degrees. Null when the station is absent from the NDBC active-stations list — the realtime feed carries observations but no coordinates.
longitudeNoStation longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list.
air_temp_cNoAir temperature in °C. Null if not reported.
station_idNoStation ID echoed from the request — for chaining.
dew_point_cNoDew point temperature in °C. Null if not reported.
observed_atNoISO 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_hpaNoAtmospheric pressure in hPa. Null if not reported.
station_nameNoStation name from the NDBC active stations list.
water_temp_cNoSea-surface temperature in °C. Null if not reported.
gust_speed_msNoWind gust speed in m/s. Null if not reported.
wave_height_mNoSignificant wave height in meters. Null if not reported.
wind_speed_msNoWind speed in m/s. Null if not reported.
visibility_nmiNoVisibility in nautical miles. NOTE: always in nautical miles regardless of other unit settings. Null if not reported.
waves_observed_atNoISO 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_secNoAverage wave period in seconds. Null if not reported.
wind_direction_degNoWind direction in degrees true (0–360). Null if not reported by the buoy.
dominant_period_secNoDominant wave period in seconds. Null if not reported.
mean_wave_direction_degNoMean wave direction in degrees true. Null if not reported.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even with readOnlyHint=true, the description adds substantial behavioral context: station cadence varies from 5 to 60 minutes, NDBC writes blocks on separate cycles up to 90 minutes old, numeric fields are null when sensors do not report, and tide/visibility use non-SI units. This goes well beyond the annotations and prepares the agent for stale or partially populated data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but unusually information-dense; every sentence communicates a caveat or semantic an agent needs to interpret readings correctly. It is front-loaded with the primary output and units, and there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single required parameter and an output schema, the description covers all non-obvious operational details: station discovery, units, null behavior, data freshness, wave timestamps, and response notices. Nothing an agent needs to call the tool correctly or interpret the result is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents station_id with a pattern and example, so the baseline is 3. The description adds value by explaining why 'met' station filtering matters, that many NDBC stations lack usable observation files, and how to interpret the values returned for a given station. This is useful context beyond the schema's parameter description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Live marine conditions from an NDBC buoy' and enumerates every measured quantity, making the tool's scope unmistakable. The explicit list of fields distinguishes it from sibling current, tide, and water-level tools without requiring the agent to inspect their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete guidance: use noaa_marine_find_stations with source='ndbc' and types=['met'] to obtain station IDs, and explains why met-flagged stations are most likely to serve live conditions. It does not explicitly state when to avoid this tool in favor of currents or tide tools, so it falls just short of a 5.

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 ProfileA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
station_idYesNDBC station ID (5-character alphanumeric, e.g. "44033"). Obtain from noaa_marine_find_stations with source="ndbc" and types=["current_profile"].

Output Schema

ParametersJSON Schema
NameRequiredDescription
binsNoDepth-binned current measurements, shallowest first (NDBC source order).
errorNoPresent when the call failed. Absent on success.
sourceNoData source — always "ndbc" for this tool.
latitudeNoStation 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_countNoNumber of depth bins in the profile.
longitudeNoStation longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list.
station_idNoStation ID echoed from the request — for chaining.
observed_atNoISO 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_nameNoStation name from the NDBC active stations list.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral detail: it returns the most recent measurement, reports a depth bin whenever NDBC provides one, and leaves direction or speed null when the sensor did not report that component. There is no contradiction with 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well structured: the first sentence establishes the resource, result type, and units; later sentences add sibling differentiation, null-value behavior, and station discovery guidance. Every sentence contributes operational information without repetition or padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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, the description is effectively complete. It specifies returned fields and units, the direction convention, missing-data behavior, data source, valid station ID discovery, and the key sibling tool to avoid. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents station_id with a pattern, an example, and sourcing guidance, so schema description coverage is 100%. The description reinforces that station IDs come from noaa_marine_find_stations, but it does not add meaning beyond what the schema already provides, which is the baseline case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: returns an observed ocean-current depth profile from an NDBC ADCP buoy, with depth, direction, and speed values. It explicitly distinguishes itself from noaa_marine_get_currents by contrasting observed acoustic-Doppler measurements with CO-OPS tidal predictions, so an agent can reliably tell them apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when not to use it: tidal-current predictions belong to noaa_marine_get_currents. It also routes station discovery through noaa_marine_find_stations with source='ndbc' and types=['current_profile'] and explains why this is necessary, since most NDBC stations serve no ADCP profile.

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 CurrentsA
Read-onlyIdempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
binNoDepth 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.
limitNoMaximum 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.
unitsNoUnit 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
offsetNoRow 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.
end_dateYesEnd date (inclusive), YYYYMMDD or YYYY-MM-DD, e.g. "20240607" or "2024-06-07".
intervalNoPrediction 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_zoneNoTime zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round.lst_ldt
begin_dateYesStart date, YYYYMMDD or YYYY-MM-DD, e.g. "20240601" or "2024-06-01".
station_idYesCO-OPS current station ID (alphanumeric, e.g. "ACT4176"). Obtain from noaa_marine_find_stations with types=["current"].

Output Schema

ParametersJSON Schema
NameRequiredDescription
binNoDepth 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.
depthNoDepth 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.
errorNoPresent when the call failed. Absent on success.
unitsNoUnit system these values are in: "english" (speed in knots, depth in feet) or "metric" (speed in cm/s, depth in meters).
eventsNoMax 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.
noticeNoCO-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.
truncatedNoTrue 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_idNoStation ID echoed from the request — for chaining.
next_offsetNoOffset 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_offsetNoRow offset this page starts at, echoed from the request. Absent when the whole matched series was returned.
predictionsNo6-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.
rows_matchedNoPrediction rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned.
station_nameNoStation name as returned by CO-OPS.
rows_returnedNoPrediction 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

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the description correctly avoids repeating those. It adds valuable behavioral details beyond annotations: the empty-list-with-notice behavior for non-discrete stations, pagination mechanics (rows_matched, rows_returned, next_offset), bin depth echoing, and the 1-year date limit. This is rich behavioral context that the annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence adds essential information. It is front-loaded with the core purpose, then systematically covers interval, bin, pagination, station IDs, and date limits. No filler or redundancy; each clause earns its place given the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for an agent to call the tool correctly: it covers purpose, parameters, edge cases (empty list, pagination, bin absence), and how to obtain required inputs. The presence of an output schema reduces the need to describe return structure, but the description still explains the pagination fields and bin echo, which is helpful. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description significantly enhances parameter understanding. For bin, it explains how to source it from find_stations and the bin_unavailable error. For limit, it clarifies the page-budget interaction. For offset, it explains next_offset chaining. For interval, it clarifies the two modes. For station_id, it reinforces alphanumeric format and acquisition method. These details go well beyond the schema's basic descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides tidal current predictions for a CO-OPS station, listing specific outputs (max flood/ebb speeds, slack times, mean bearings). It explicitly distinguishes itself from the sibling noaa_marine_get_current_profile, which returns observed NDBC measurements. This is a specific verb+resource with clear differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: it contrasts with noaa_marine_get_current_profile for observed currents, explains the MAX_SLACK vs 6min interval choice based on planning vs detailed analysis, and tells how to obtain a valid station ID via noaa_marine_find_stations with types=['current']. It also covers bin selection and date range limits. This is thorough when-to-use guidance with alternatives.

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 MeansA
Read-onlyIdempotent
Inspect

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. A range whose months fit the response budget is returned whole; a longer one returns the leading months, with rows_matched, rows_returned, and next_offset reporting how many matched and which offset reaches the rest. Use noaa_marine_find_stations with types=["water_level"] first to resolve a station name or location to a station ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
datumNoDatum 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.MLLW
limitNoMaximum 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.
unitsNoUnit system for the heights: english = feet; metric = meters. The lunitidal intervals are hours either way.english
offsetNoMonth 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.
end_dateYesEnd 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_dateYesStart date, YYYYMMDD or YYYY-MM-DD, e.g. "19750101" or "1975-01-01". The month it falls in is the first month returned.
station_idYesCO-OPS water-level station ID (numeric, e.g. "9447130" for Seattle). Obtain from noaa_marine_find_stations with types=["water_level"].

Output Schema

ParametersJSON Schema
NameRequiredDescription
datumNoDatum the heights are referenced to — echoed for correct interpretation.
errorNoPresent when the call failed. Absent on success.
unitsNoHeight units: "english" (feet) or "metric" (meters).
monthsNoOne 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.
noticeNoWhat this page of the monthly series covers and how to reach the next page.
end_dateNoEnd of the requested range as sent to CO-OPS, YYYYMMDD.
truncatedNoTrue 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_dateNoStart of the requested range as sent to CO-OPS, YYYYMMDD.
station_idNoStation ID echoed from the request — for chaining.
next_offsetNoOffset 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_offsetNoMonth offset this page starts at, echoed from the request. Absent when the whole matched series was returned.
rows_matchedNoMonths the requested range matched, before the page was cut. Absent when the whole matched series was returned.
station_nameNoStation name as returned by CO-OPS.
rows_returnedNoMonths this page carries — the length of months. Absent when the whole matched series was returned.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, so the safety profile is already known. The description adds substantial behavioral context beyond that: CO-OPS verifies monthly for the prior month so recent windows can fail with verified_data_lag; omitted values are omitted rather than zeroed; Great Lakes stations carry only highest/msl/lowest; ranges up to 73,000 days are checked before the call; pagination behavior with rows_matched/rows_returned/next_offset. This is rich, non-obvious behavior that an agent needs to know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place. It front-loads the core purpose and data shape, then covers edge cases (Great Lakes, omitted values, verified_data_lag), then pagination, then the prerequisite sibling call. No fluff, no repetition of schema content. It's long but appropriately so for a complex tool with 7 parameters and non-obvious behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 params, 3 required, 2 enums, output schema present), the description covers everything an agent needs: what the data is, how to get the station ID, what can fail, how pagination works, and how units/datums behave. The output schema exists so return values don't need to be spelled out. The only minor gap is not listing the exact output fields, but the output schema covers that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all 7 parameters thoroughly. The description adds value by explaining the datum semantics (heights relative to requested datum), the units (english=feet, metric=meters), and the pagination semantics (offset, next_offset). It also clarifies that a datum the station doesn't carry returns datum_unavailable. However, most parameter meaning is already in the schema, so the description's marginal contribution is moderate but real.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get monthly means'), a specific resource ('CO-OPS water-level station'), and the exact data shape ('one row per station-month... highest and lowest water, tidal datums...'). It clearly distinguishes this from siblings like noaa_marine_get_water_level (which presumably returns raw water level readings) and noaa_marine_get_tide_predictions (predictions vs verified means). The phrase 'Verified monthly means' and 'the record a sea-level or tidal-range trend over years to decades is read from' makes the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use noaa_marine_find_stations with types=["water_level"] first to resolve a station name to a station ID. It also explains when the tool will fail (verified_data_lag for windows ending on/after the first day of the prior month) and how pagination works (rows_matched, rows_returned, next_offset). This is explicit when-to-use guidance with a named alternative.

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 ObservationsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
station_idYesNDBC station ID (5-character alphanumeric, e.g. "44033" or "TIBC1"). Obtain from noaa_marine_find_stations with source="ndbc" and types=["water_quality"].

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
sourceNoData source — always "ndbc" for this tool.
latitudeNoStation latitude in decimal degrees. Null when the station is absent from the NDBC active-stations list — the .ocean feed carries observations but no coordinates.
readingsNoPer-depth readings sharing the most recent observation timestamp, in NDBC source order.
longitudeNoStation longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list.
station_idNoStation ID echoed from the request — for chaining.
observed_atNoISO 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_nameNoStation name from the NDBC active stations list.
reading_countNoNumber of per-depth readings in the latest observation (usually 1).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and openWorldHint annotations, the description discloses important behavioral traits: it returns one reading per reported depth, most stations report a single depth, sensor coverage is sparse, missing values come back as null rather than fabricated zeros, and latitude/longitude may be null for stations absent from the active-stations list. It also states that the tool reads any station serving the file and returns observations_not_found otherwise, which is valuable operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded with the core purpose, then the sibling distinction, then behavioral details and station-selection guidance. It is long but every sentence carries meaningful information; the main weakness is that it is one sprawling paragraph rather than broken into scannable sections, but for a complex domain this is acceptable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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, the description is remarkably complete. It covers the data variables, depth behavior, sparse coverage, null handling, station discovery, catalog drift, and the observations_not_found failure mode. Nothing an agent needs to select and call this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single station_id parameter, so the baseline is 3. The description adds practical value by explaining how to discover suitable station IDs, clarifying that station IDs are 5-character alphanumeric strings from NDBC, and warning that the water-quality catalog flag can drift from actual data availability. This goes beyond the schema's basic parameter description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (NDBC station water-quality sensors), a specific action (get live sub-surface oceanographic observations), and enumerates the returned variables. It also explicitly distinguishes itself from noaa_marine_get_conditions, so an agent can immediately tell which tool applies to water-column data versus surface weather and waves.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool versus noaa_marine_get_conditions: use this for what the water is doing below the surface, that one for weather and sea state at the buoy. It also instructs the agent to find stations with noaa_marine_find_stations using source='ndbc' and types=['water_quality'], and warns about the drift between the catalog flag and 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 PredictionsA
Read-onlyIdempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
datumNoDatum 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.MLLW
limitNoMaximum 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.
unitsNoUnit system for heights: english = feet; metric = meters.english
offsetNoRow 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.
end_dateYesEnd date (inclusive), YYYYMMDD or YYYY-MM-DD, e.g. "20240607" or "2024-06-07".
intervalNoPrediction 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_zoneNoTime zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round.lst_ldt
begin_dateYesStart date, YYYYMMDD or YYYY-MM-DD, e.g. "20240601" or "2024-06-01".
station_idYesCO-OPS tide station ID (numeric, e.g. "9447130" for Seattle). Obtain from noaa_marine_find_stations with types=["tide"].

Output Schema

ParametersJSON Schema
NameRequiredDescription
datumNoTidal datum used (e.g. MLLW) — echoed for correct interpretation of heights.
errorNoPresent when the call failed. Absent on success.
unitsNoHeight units: "english" (feet) or "metric" (meters).
noticeNoWhat 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.
truncatedNoTrue 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_idNoStation ID echoed from the request — for chaining.
next_offsetNoOffset 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_offsetNoRow offset this page starts at, echoed from the request. Absent when the whole matched series was returned.
predictionsNoTide predictions for the requested date range — the whole series when it fits one response, otherwise the leading page starting at offset. rows_matched and next_offset report what a page left behind.
rows_matchedNoPrediction rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned.
station_nameNoStation name as returned by CO-OPS — confirms the correct station was queried.
rows_returnedNoPrediction rows this page carries — the length of predictions. Absent when the whole matched series was returned.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though the annotations already declare readOnly, idempotent, and openWorld hints, the description adds substantial behavioral context: subordinate_no_6min fallback naming the reference station, datum_unavailable responses for unsupported datums, the 1-year date-range cap, and response-budget pagination with rows_matched/rows_returned/next_offset. This goes far beyond what the structured annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place: core purpose, hilo vs. 6min behavior, subordinate-station exception, datum default, range limit, pagination behavior, and the find_stations prerequisite. It is front-loaded with the main purpose and then layers edge cases in a logical order without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with a rich schema and output schema, the description covers the non-obvious operational details an agent needs: how to reach reference vs. subordinate stations, how to page through long ranges, which datums are broadly usable, and how to obtain a station ID. The output schema handles return-field details, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds operational meaning beyond the schema: it explains that 6min only reaches reference stations, that MLLW is the nautical-chart standard, that the date range is capped at one year, and that offset walking is the intended pagination strategy. Some parameters like units and time_zone are left to the schema, but the schema already documents them well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific resource and action: 'High and low tide predictions for a CO-OPS tide station over a date range.' It immediately clarifies the two modes (hilo events vs. 6-minute curve) and the tide-type vocabulary (H/L), so an agent knows exactly what this tool returns and how it differs from observation-style sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit guidance to call noaa_marine_find_stations first to resolve a station ID, and clearly explains that interval='6min' only works for reference stations while subordinate stations must be queried at the named reference station. It does not explicitly contrast this tool with noaa_marine_get_water_level or noaa_marine_get_conditions, but the prediction-focused context and station prerequisite provide solid usage direction.

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 LevelA
Read-onlyIdempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
datumNoDatum 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.MLLW
limitNoMaximum 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.
unitsNoUnit system: english = feet; metric = meters.english
offsetNoRow 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.
end_dateYesEnd date (inclusive), YYYYMMDD or YYYY-MM-DD, e.g. "20240601" or "2024-06-01".
intervalNoObserved 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_zoneNoTime 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_dateYesStart date, YYYYMMDD or YYYY-MM-DD, e.g. "20240601" or "2024-06-01".
station_idYesCO-OPS water-level station ID (numeric, e.g. "9447130" for Seattle). Obtain from noaa_marine_find_stations with types=["water_level"].

Output Schema

ParametersJSON Schema
NameRequiredDescription
datumNoTidal datum used — echoed for correct interpretation of water heights.
errorNoPresent when the call failed. Absent on success.
unitsNoHeight units: "english" (feet) or "metric" (meters).
noticeNoWhy 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.
intervalNoObserved cadence echoed from the request — the CO-OPS product these rows came from, and what decides whether quality, type, and residual_summary are populated.
truncatedNoTrue 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_idNoStation ID echoed from the request — for chaining.
next_offsetNoOffset 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_offsetNoObservation row offset this page starts at, echoed from the request. Absent when the whole matched series was returned.
predictionsNoPaired 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.
gaps_droppedNoNumber 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.
observationsNoObserved 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.
rows_matchedNoObservation rows the requested date range matched, before the page was cut. Absent when the whole matched series was returned.
station_nameNoStation name as returned by CO-OPS.
rows_returnedNoObservation rows this page carries — the length of observations. Absent when the whole matched series was returned.
residual_summaryNoSummary 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_statusNoPresent 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

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered; the description then adds substantial behavior beyond that: independent fetching of observations and predictions, predictions_status semantics on empty series, gaps_dropped behavior for sensor outages, local rejection of range ceilings, datum_unavailable and great_lakes_only failure modes, and offset-based pagination with rows_matched/rows_returned/next_offset. No contradiction with the annotations — this is a pure read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in sentence one, and every subsequent sentence carries distinct operational information about cadence, limits, gaps, or paging — no filler. It is a long block for the agent to parse, and the interval sentence partially overlaps with the schema's interval enum description, but for a 9-parameter tool with subtle boundary semantics the length is mostly earned.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value details are covered elsewhere; the description supplies everything else an agent needs to call correctly: the station-resolution prerequisite, per-interval range ceilings with local validation, residual availability rules, gap handling, pagination continuation, and the edge-case responses (datum_unavailable, great_lakes_only, predictions_status). Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the individual parameter descriptions are unusually rich (datum planes explained, interval residuals per cadence, time-zone override on daily_mean). The description still adds meaning beyond the schema by tying parameters together: the range-ceiling ceiling per interval, which intervals support the residual join, and how limit/offset connect to the paginated response fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource: observed water level for a CO-OPS station paired with tide predictions, with residual defined as observed minus predicted. The storm-surge/drawdown framing makes the tool's reason for existing concrete, and it is clearly distinguishable from siblings like noaa_marine_get_tide_predictions (predictions only) and noaa_marine_get_monthly_means.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent to run noaa_marine_find_stations first to resolve a station ID, and gives rich selection guidance per interval (daily_mean for Great Lakes only, 6min for the full curve, hourly/high_low for long ranges). However, it never explicitly states when-not-to-use this tool versus siblings such as noaa_marine_get_tide_predictions for prediction-only needs — that contrast is implied rather than named.

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.

  1. 3 tool updates
    • Changednoaa_marine_find_stations1 field changed
      • changedInput schema / properties / types / items / description
        Previous 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."
    • Addednoaa_marine_get_monthly_means
    • Changednoaa_marine_get_water_level1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
  2. 1 tool update
    • Changednoaa_marine_find_stations4 fields changed
      • changedInput schema / properties / state / description
        Previous 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\"."
      • changedOutput schema / properties / applied_search / properties / state / description
        Previous 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."
      • changedOutput schema / properties / stations / items / properties / state / description
        Previous 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."
      • addedOutput schema / properties / stations / items / properties / state_derived
        Added 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. 3 tool updates
    • Changednoaa_marine_get_currents6 fields changed
      • changedInput schema / properties / begin_date / description
        Previous 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\"."
      • changedInput schema / properties / begin_date / pattern
        Previous value: -"^\\d{8}$"New value: +"^(\\d{8}|\\d{4}-\\d{2}-\\d{2})$"
      • changedInput schema / properties / end_date / description
        Previous 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\"."
      • changedInput schema / properties / end_date / pattern
        Previous value: -"^\\d{8}$"New value: +"^(\\d{8}|\\d{4}-\\d{2}-\\d{2})$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changednoaa_marine_get_tide_predictions6 fields changed
      • changedInput schema / properties / begin_date / description
        Previous 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\"."
      • changedInput schema / properties / begin_date / pattern
        Previous value: -"^\\d{8}$"New value: +"^(\\d{8}|\\d{4}-\\d{2}-\\d{2})$"
      • changedInput schema / properties / end_date / description
        Previous 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\"."
      • changedInput schema / properties / end_date / pattern
        Previous value: -"^\\d{8}$"New value: +"^(\\d{8}|\\d{4}-\\d{2}-\\d{2})$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changednoaa_marine_get_water_level8 fields changed
      • changedInput schema / properties / begin_date / description
        Previous 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\"."
      • changedInput schema / properties / begin_date / pattern
        Previous value: -"^\\d{8}$"New value: +"^(\\d{8}|\\d{4}-\\d{2}-\\d{2})$"
      • changedInput schema / properties / end_date / description
        Previous 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\"."
      • changedInput schema / properties / end_date / pattern
        Previous value: -"^\\d{8}$"New value: +"^(\\d{8}|\\d{4}-\\d{2}-\\d{2})$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / residual_summary / properties / max_drawdown / description
        Previous 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."
      • changedOutput schema / properties / residual_summary / properties / max_surge / description
        Previous 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. 4 tool updates
    • Changednoaa_marine_find_stations3 fields changed
      • addedOutput schema / properties / stations / items / properties / bins
        Added 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"
        +}
      • addedOutput schema / properties / stations / items / properties / prediction_class
        Added 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"
        +}
      • addedOutput schema / properties / stations / items / properties / reference_id
        Added 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"
        +}
    • Changednoaa_marine_get_currents24 fields changed
      • addedInput schema / properties / bin
        Added 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"
        +}
      • addedInput schema / properties / limit
        Added 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"
        +}
      • addedInput schema / properties / offset
        Added 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"
        +}
      • changedInput schema / properties / units / description
        Previous 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."
      • changedOutput schema / anyOf
        Previous 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"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / bin
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / depth
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / events / description
        Previous 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."
      • changedOutput schema / properties / events / items / properties / direction / description
        Previous 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."
      • changedOutput schema / properties / events / items / properties / speed / description
        Previous 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."
      • addedOutput schema / properties / next_offset
        Added 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."
        +}
      • addedOutput schema / properties / notice
        Added 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"
        +}
      • addedOutput schema / properties / page_offset
        Added 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"
        +}
      • changedOutput schema / properties / predictions / description
        Previous 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."
      • changedOutput schema / properties / predictions / items / properties / direction / description
        Previous 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."
      • changedOutput schema / properties / predictions / items / properties / speed / description
        Previous value: -"Current speed in the requested units."New value: +"Current speed as a non-negative magnitude, in the requested units."
      • addedOutput schema / properties / predictions / items / properties / type
        Added 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"
        +}
      • changedOutput schema / properties / predictions / items / required
        Previous value: -[
        -  "time",
        -  "speed",
        -  "direction"
        -]New value: +[
        +  "time",
        +  "type",
        +  "speed",
        +  "direction"
        +]
      • addedOutput schema / properties / rows_matched
        Added 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"
        +}
      • addedOutput schema / properties / rows_returned
        Added 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"
        +}
      • addedOutput schema / properties / truncated
        Added 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"
        +}
      • changedOutput schema / properties / units / description
        Previous 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)."
    • Changednoaa_marine_get_tide_predictions14 fields changed
      • changedInput schema / properties / datum / description
        Previous 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."
      • changedInput schema / properties / datum / enum
        Previous value: -[
        -  "MLLW",
        -  "MHHW",
        -  "MSL",
        -  "MTL",
        -  "MHW",
        -  "MLW",
        -  "CD",
        -  "STND"
        -]New value: +[
        +  "MLLW",
        +  "MHHW",
        +  "MHW",
        +  "MTL",
        +  "MSL",
        +  "MLW",
        +  "DTL",
        +  "NAVD",
        +  "STND",
        +  "CRD"
        +]
      • changedInput schema / properties / interval / description
        Previous 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."
      • addedInput schema / properties / limit
        Added 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"
        +}
      • addedInput schema / properties / offset
        Added 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"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • addedOutput schema / properties / next_offset
        Added 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."
        +}
      • addedOutput schema / properties / notice
        Added 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"
        +}
      • addedOutput schema / properties / page_offset
        Added 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"
        +}
      • changedOutput schema / properties / predictions / description
        Previous 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."
      • addedOutput schema / properties / rows_matched
        Added 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"
        +}
      • addedOutput schema / properties / rows_returned
        Added 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"
        +}
      • addedOutput schema / properties / truncated
        Added 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"
        +}
    • Changednoaa_marine_get_water_level28 fields changed
      • changedInput schema / properties / datum / description
        Previous 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."
      • changedInput schema / properties / datum / enum
        Previous value: -[
        -  "MLLW",
        -  "MHHW",
        -  "MSL",
        -  "MTL",
        -  "MHW",
        -  "MLW",
        -  "CD",
        -  "STND"
        -]New value: +[
        +  "MLLW",
        +  "MHHW",
        +  "MHW",
        +  "MTL",
        +  "MSL",
        +  "MLW",
        +  "NAVD",
        +  "STND",
        +  "IGLD",
        +  "LWD",
        +  "CRD",
        +  "LWI",
        +  "HWI"
        +]
      • addedInput schema / properties / interval
        Added 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"
        +}
      • addedInput schema / properties / limit
        Added 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"
        +}
      • addedInput schema / properties / offset
        Added 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"
        +}
      • changedInput schema / properties / time_zone / description
        Previous 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."
      • changedOutput schema / anyOf
        Previous 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"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • addedOutput schema / properties / gaps_dropped
        Added 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"
        +}
      • addedOutput schema / properties / interval
        Added 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"
        +}
      • addedOutput schema / properties / next_offset
        Added 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."
        +}
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / observations / description
        Previous 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."
      • changedOutput schema / properties / observations / items / description
        Previous value: -"A single 6-minute observed water level reading."New value: +"A single observed water level reading at the requested cadence."
      • changedOutput schema / properties / observations / items / properties / quality / description
        Previous 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."
      • changedOutput schema / properties / observations / items / properties / sigma / description
        Previous 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."
      • addedOutput schema / properties / observations / items / properties / type
        Added 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"
        +}
      • changedOutput schema / properties / observations / items / required
        Previous value: -[
        -  "time",
        -  "value",
        -  "quality"
        -]New value: +[
        +  "time",
        +  "value"
        +]
      • addedOutput schema / properties / page_offset
        Added 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"
        +}
      • changedOutput schema / properties / predictions / description
        Previous 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."
      • changedOutput schema / properties / predictions / items / description
        Previous value: -"A single 6-minute tide prediction."New value: +"A single tide prediction."
      • changedOutput schema / properties / predictions / items / properties / time / description
        Previous value: -"Prediction datetime matching the observation time step."New value: +"Prediction datetime in the requested time zone."
      • changedOutput schema / properties / predictions_status / description
        Previous 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."
      • changedOutput schema / properties / residual_summary / description
        Previous 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."
      • addedOutput schema / properties / rows_matched
        Added 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"
        +}
      • addedOutput schema / properties / rows_returned
        Added 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"
        +}
      • addedOutput schema / properties / truncated
        Added 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. 5 tool updates
    • Changednoaa_marine_find_stations11 fields changed
      • changedInput schema / properties / query / description
        Previous 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."
      • changedInput schema / properties / types / items / description
        Previous 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."
      • changedInput schema / properties / types / items / enum
        Previous value: -[
        -  "tide",
        -  "current",
        -  "water_level",
        -  "met",
        -  "current_profile",
        -  "buoy"
        -]New value: +[
        +  "tide",
        +  "current",
        +  "water_level",
        +  "met",
        +  "current_profile",
        +  "water_quality",
        +  "buoy"
        +]
      • addedOutput schema / properties / applied_search
        Added 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"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "no_results",
        -  "incomplete_coordinates"
        -]New value: +[
        +  "incomplete_coordinates",
        +  "sources_unavailable"
        +]
      • addedOutput schema / properties / notice
        Added 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"
        +}
      • addedOutput schema / properties / sources
        Added 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"
        +}
      • changedOutput schema / properties / stations / description
        Previous 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."
      • changedOutput schema / properties / stations / items / properties / capabilities / description
        Previous 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."
      • changedOutput schema / properties / total_found / description
        Previous 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."
    • Changednoaa_marine_get_conditions8 fields changed
      • changedOutput schema / anyOf
        Previous 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"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / latitude / description
        Previous 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."
      • changedOutput schema / properties / latitude / type
        Previous value: -"number"New value: +[
        +  "number",
        +  "null"
        +]
      • changedOutput schema / properties / longitude / description
        Previous 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."
      • changedOutput schema / properties / longitude / type
        Previous value: -"number"New value: +[
        +  "number",
        +  "null"
        +]
      • addedOutput schema / properties / notice
        Added 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"
        +}
      • changedOutput schema / properties / observed_at / description
        Previous 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."
      • addedOutput schema / properties / waves_observed_at
        Added 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"
        +  ]
        +}
    • Changednoaa_marine_get_current_profile1 field changed
      • changedOutput schema / properties / observed_at / description
        Previous 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."
    • Changednoaa_marine_get_ocean_observations2 fields changed
      • changedInput schema / properties / station_id / description
        Previous 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\"]."
      • changedOutput schema / properties / observed_at / description
        Previous 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."
    • Changednoaa_marine_get_water_level3 fields changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Why the paired prediction series is missing, when it is missing.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / predictions / description
        Previous 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."
      • addedOutput schema / properties / predictions_status
        Added 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"
        +}
  6. 4 tool updates
    • Changednoaa_marine_get_conditions26 fields changed
      • removedOutput schema / properties / air_temp_c / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / air_temp_c / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / average_period_sec / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / average_period_sec / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / dew_point_c / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / dew_point_c / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / dominant_period_sec / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / dominant_period_sec / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / gust_speed_ms / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / gust_speed_ms / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / mean_wave_direction_deg / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mean_wave_direction_deg / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / pressure_hpa / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pressure_hpa / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / tide_ft / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / tide_ft / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / visibility_nmi / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / visibility_nmi / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / water_temp_c / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / water_temp_c / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / wave_height_m / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / wave_height_m / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / wind_direction_deg / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / wind_direction_deg / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / wind_speed_ms / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / wind_speed_ms / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changednoaa_marine_get_current_profile8 fields changed
      • removedOutput schema / properties / bins / items / properties / direction_deg / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / bins / items / properties / direction_deg / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / bins / items / properties / speed_cm_s / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / bins / items / properties / speed_cm_s / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / latitude / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / latitude / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / longitude / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / longitude / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changednoaa_marine_get_currents2 fields changed
      • removedOutput schema / properties / predictions / items / properties / direction / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / predictions / items / properties / direction / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changednoaa_marine_get_ocean_observations22 fields changed
      • removedOutput schema / properties / latitude / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / latitude / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / longitude / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / longitude / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / readings / items / properties / chlorophyll_ug_l / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / readings / items / properties / chlorophyll_ug_l / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / readings / items / properties / conductivity_ms_cm / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / readings / items / properties / conductivity_ms_cm / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / readings / items / properties / oxygen_percent / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / readings / items / properties / oxygen_percent / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / readings / items / properties / oxygen_ppm / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / readings / items / properties / oxygen_ppm / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / readings / items / properties / ph / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / readings / items / properties / ph / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / readings / items / properties / redox_mv / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / readings / items / properties / redox_mv / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / readings / items / properties / salinity_psu / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / readings / items / properties / salinity_psu / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / readings / items / properties / turbidity_ftu / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / readings / items / properties / turbidity_ftu / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / readings / items / properties / water_temp_c / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / readings / items / properties / water_temp_c / type
        Added value: +[
        +  "number",
        +  "null"
        +]
  7. 7 tool updates
    • Changednoaa_marine_find_stations6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "stations",
        +      "total_found"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "stations",
        -  "total_found"
        -]
    • Changednoaa_marine_get_conditions6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added 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"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed 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"
        -]
    • Changednoaa_marine_get_current_profile6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "station_id",
        +      "station_name",
        +      "latitude",
        +      "longitude",
        +      "observed_at",
        +      "source",
        +      "bin_count",
        +      "bins"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "station_id",
        -  "station_name",
        -  "latitude",
        -  "longitude",
        -  "observed_at",
        -  "source",
        -  "bin_count",
        -  "bins"
        -]
    • Changednoaa_marine_get_currents6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "station_id",
        +      "station_name",
        +      "units"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "station_id",
        -  "station_name",
        -  "units"
        -]
    • Changednoaa_marine_get_ocean_observations6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "station_id",
        +      "station_name",
        +      "latitude",
        +      "longitude",
        +      "observed_at",
        +      "source",
        +      "reading_count",
        +      "readings"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "station_id",
        -  "station_name",
        -  "latitude",
        -  "longitude",
        -  "observed_at",
        -  "source",
        -  "reading_count",
        -  "readings"
        -]
    • Changednoaa_marine_get_tide_predictions6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "station_id",
        +      "station_name",
        +      "datum",
        +      "units",
        +      "predictions"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "station_id",
        -  "station_name",
        -  "datum",
        -  "units",
        -  "predictions"
        -]
    • Changednoaa_marine_get_water_level6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "station_id",
        +      "station_name",
        +      "datum",
        +      "units",
        +      "observations",
        +      "predictions"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "station_id",
        -  "station_name",
        -  "datum",
        -  "units",
        -  "observations",
        -  "predictions"
        -]
  8. 1 tool update
    • Addednoaa_marine_get_ocean_observations
  9. 2 tool updates
    • Changednoaa_marine_find_stations7 fields changed
      • changedInput schema / properties / types / description
        Previous 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."
      • changedInput schema / properties / types / items / description
        Previous 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."
      • changedInput schema / properties / types / items / enum
        Previous value: -[
        -  "tide",
        -  "current",
        -  "water_level",
        -  "buoy",
        -  "met"
        -]New value: +[
        +  "tide",
        +  "current",
        +  "water_level",
        +  "met",
        +  "current_profile",
        +  "buoy"
        +]
      • changedOutput schema / properties / stations / items / properties / capabilities / description
        Previous 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."
      • addedOutput schema / properties / stations / items / properties / platform
        Added 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"
        +}
      • changedOutput schema / properties / stations / items / properties / type / description
        Previous 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."
      • changedOutput schema / properties / stations / items / required
        Previous value: -[
        -  "station_id",
        -  "name",
        -  "source",
        -  "type",
        -  "latitude",
        -  "longitude",
        -  "capabilities"
        -]New value: +[
        +  "station_id",
        +  "name",
        +  "source",
        +  "latitude",
        +  "longitude",
        +  "capabilities"
        +]
    • Addednoaa_marine_get_current_profile
  10. 2 tool updates
    • Changednoaa_marine_find_stations6 fields changed
      • changedInput schema / properties / latitude / description
        Previous 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."
      • changedInput schema / properties / longitude / description
        Previous 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."
      • changedInput schema / properties / query / description
        Previous 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."
      • changedInput schema / properties / types / description
        Previous 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."
      • changedInput schema / properties / types / items / description
        Previous 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)."
      • changedOutput schema / properties / stations / items / properties / type / description
        Previous 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."
    • Changednoaa_marine_get_conditions1 field changed
      • changedInput schema / properties / station_id / description
        Previous 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\"]."
  11. 1 tool update
    • Changednoaa_marine_find_stations1 field changed
      • changedInput schema / properties / state / description
        Previous 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\"."
  12. 1 tool update
    • Changednoaa_marine_find_stations1 field changed
      • addedOutput schema / properties / truncated
        Added 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"
        +}
  13. 5 tool updates
    • First observednoaa_marine_find_stations
    • First observednoaa_marine_get_conditions
    • First observednoaa_marine_get_currents
    • First observednoaa_marine_get_tide_predictions
    • First observednoaa_marine_get_water_level

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.