Skip to main content
Glama

Get Marine Conditions

noaa_marine_get_conditions
Read-only

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.

Input Schema

TableJSON 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

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

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema 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"
      +  ]
      +}
  2. Changed26 schema 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"
      +]
  3. 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": [
      +      "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"
      -]
  4. Changed1 schema 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\"]."
  5. First observed

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.