# `noaa_marine__noaa_marine_get_ocean_observations`

**Get Ocean Observations**

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.

- Server: [NOAA Tides & Currents](https://gateway.mcpharbor.dev/docs/servers/noaa_marine) (`dev.mcpharbor.gateway/noaa_marine`)
- Price per call: $0.0001 (100 micro-USD); only tools/call is charged
- Endpoint: `https://gateway.mcpharbor.dev/mcp` or `https://gateway.mcpharbor.dev/mcp/noaa_marine`
- Upstream tool: exposed by the provider; called through this gateway as `noaa_marine__noaa_marine_get_ocean_observations`
- Provider terms: <https://tidesandcurrents.noaa.gov/disclaimers.html> (verified 2026-09-19)
- Upstream API documentation: <https://api.tidesandcurrents.noaa.gov/api/prod/>
- Rate limit: 300 requests per minute
- Attribution required: NOS requests attribution whenever its material is reproduced and re-disseminated; content must not be modified and presented as official government material; predictions are forecast guidance, not for navigation reliance. The optional 'application' parameter should identify the gateway.

## Parameters

- `station_id` (string, required): NDBC station ID (5-character alphanumeric, e.g. "44033" or "TIBC1"). Obtain from noaa_marine_find_stations with source="ndbc" and types=\["water_quality"\].

## Example call

Request headers and body:

```http
POST /mcp HTTP/1.1
Host: gateway.mcpharbor.dev
Authorization: Bearer <your gateway API key>
Content-Type: application/json
Accept: application/json, text/event-stream
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: noaa_marine__noaa_marine_get_ocean_observations
```

```json
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "_meta": {
      "io.modelcontextprotocol/clientCapabilities": {},
      "io.modelcontextprotocol/clientInfo": {
        "name": "example-agent",
        "version": "1.0.0"
      },
      "io.modelcontextprotocol/protocolVersion": "2026-07-28"
    },
    "arguments": {
      "station_id": "example"
    },
    "name": "noaa_marine__noaa_marine_get_ocean_observations"
  }
}
```

A successful response:

```json
{
  "id": 1,
  "jsonrpc": "2.0",
  "result": {
    "_meta": {
      "dev.mcpharbor.gateway/call": {
        "chargedMicroUsd": 100,
        "id": "<the id of this charge>"
      }
    },
    "content": [
      {
        "text": "<whatever the upstream tool returned>",
        "type": "text"
      }
    ],
    "resultType": "complete"
  }
}
```

This call costs $0.0001 (100 micro-USD). Reading this page and listing the tool cost nothing.
The `dev.mcpharbor.gateway/call` record in the result is the receipt for that charge. Each
POST is metered separately, so sending the same call again buys another one: see
[agent.txt](https://gateway.mcpharbor.dev/agent.txt), section 7, before retrying.

## Attribution

This provider requires the attribution below wherever you use results from its tools.
Reproduce it verbatim:

> NOS requests attribution whenever its material is reproduced and re-disseminated; content must not be modified and presented as official government material; predictions are forecast guidance, not ...

## Tool definition

Exactly as `tools/list` returns it (free):

```json
{
  "_meta": {
    "dev.mcpharbor.gateway/pricing": {
      "currency": "USD",
      "pricePerCallMicroUsd": 100
    }
  },
  "annotations": {
    "openWorldHint": true,
    "readOnlyHint": true
  },
  "description": "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.",
  "inputSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "additionalProperties": false,
    "properties": {
      "station_id": {
        "description": "NDBC station ID (5-character alphanumeric, e.g. \"44033\" or \"TIBC1\"). Obtain from noaa_marine_find_stations with source=\"ndbc\" and types=[\"water_quality\"].",
        "pattern": "^[A-Za-z0-9_-]{1,20}$",
        "type": "string"
      }
    },
    "required": [
      "station_id"
    ],
    "type": "object"
  },
  "name": "noaa_marine__noaa_marine_get_ocean_observations",
  "outputSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "additionalProperties": false,
    "anyOf": [
      {
        "not": {
          "required": [
            "error"
          ]
        },
        "required": [
          "station_id",
          "station_name",
          "latitude",
          "longitude",
          "observed_at",
          "source",
          "reading_count",
          "readings"
        ]
      },
      {
        "required": [
          "error"
        ]
      }
    ],
    "properties": {
      "error": {
        "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"
      },
      "latitude": {
        "description": "Station latitude in decimal degrees. Null when the station is absent from the NDBC active-stations list — the .ocean feed carries observations but no coordinates.",
        "type": [
          "number",
          "null"
        ]
      },
      "longitude": {
        "description": "Station longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list.",
        "type": [
          "number",
          "null"
        ]
      },
      "observed_at": {
        "description": "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.",
        "type": "string"
      },
      "reading_count": {
        "description": "Number of per-depth readings in the latest observation (usually 1).",
        "type": "number"
      },
      "readings": {
        "description": "Per-depth readings sharing the most recent observation timestamp, in NDBC source order.",
        "items": {
          "additionalProperties": false,
          "description": "Water-column sensor readings at a single depth.",
          "properties": {
            "chlorophyll_ug_l": {
              "description": "Chlorophyll concentration in µg/l (CLCON). Null when the station did not report it.",
              "type": [
                "number",
                "null"
              ]
            },
            "conductivity_ms_cm": {
              "description": "Conductivity in mS/cm (COND). Null when the station did not report it.",
              "type": [
                "number",
                "null"
              ]
            },
            "depth_m": {
              "description": "Measurement depth below the surface in meters (DEPTH).",
              "type": "number"
            },
            "oxygen_percent": {
              "description": "Dissolved-oxygen saturation in percent (O2%). Null when the station did not report it.",
              "type": [
                "number",
                "null"
              ]
            },
            "oxygen_ppm": {
              "description": "Dissolved-oxygen concentration in ppm (O2PPM). Null when the station did not report it.",
              "type": [
                "number",
                "null"
              ]
            },
            "ph": {
              "description": "pH, dimensionless (PH). Null when the station did not report it.",
              "type": [
                "number",
                "null"
              ]
            },
            "redox_mv": {
              "description": "Oxidation-reduction (redox) potential in mV (EH). Null when the station did not report it.",
              "type": [
                "number",
                "null"
              ]
            },
            "salinity_psu": {
              "description": "Salinity in practical salinity units (SAL). Null when the station did not report it.",
              "type": [
                "number",
                "null"
              ]
            },
            "turbidity_ftu": {
              "description": "Turbidity in Formazin Turbidity Units (TURB). Null when the station did not report it.",
              "type": [
                "number",
                "null"
              ]
            },
            "water_temp_c": {
              "description": "Water temperature in °C (OTMP). Null when the station did not report it.",
              "type": [
                "number",
                "null"
              ]
            }
          },
          "required": [
            "depth_m",
            "water_temp_c",
            "conductivity_ms_cm",
            "salinity_psu",
            "oxygen_percent",
            "oxygen_ppm",
            "chlorophyll_ug_l",
            "turbidity_ftu",
            "ph",
            "redox_mv"
          ],
          "type": "object"
        },
        "type": "array"
      },
      "source": {
        "description": "Data source — always \"ndbc\" for this tool.",
        "type": "string"
      },
      "station_id": {
        "description": "Station ID echoed from the request — for chaining.",
        "type": "string"
      },
      "station_name": {
        "description": "Station name from the NDBC active stations list.",
        "type": "string"
      }
    },
    "type": "object"
  },
  "title": "Get Ocean Observations"
}
```
