Skip to main content
Glama

Find Marine Stations

noaa_marine_find_stations
Read-only

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.

Input Schema

TableJSON 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

TableJSON Schema
NameRequiredDescriptionDefault
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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema 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."
  2. Changed4 schema 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. Changed3 schema 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"
      +}
  4. Changed11 schema 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."
  5. Changed6 schema 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"
      -]
  6. Changed7 schema 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"
      +]
  7. Changed6 schema 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."
  8. Changed1 schema 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\"."
  9. Changed1 schema 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"
      +}
  10. First observed

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.