# `noaa_marine__noaa_marine_find_stations`

**Find Marine Stations**

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.

- 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_find_stations`
- 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

- `latitude` (number, optional): 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.
- `limit` (integer, optional): Maximum number of stations to return. Defaults to 20. Default: `20`.
- `longitude` (number, optional): 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.
- `query` (string, optional): 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 mat...
- `radius_km` (number, optional): Search radius in kilometers when latitude/longitude are provided. Defaults to 100 km. Default: `100`.
- `source` (string, optional): Data source to search: coops (tide/water-level/current stations), ndbc (buoys), or all (default). One of: `coops`, `ndbc`, `all`. Default: `all`.
- `state` (string, optional): 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". One of: `AL`, `AK`, `AZ`, `AR`, `CA`, `CO`, `CT`, `DE`, `FL`, `GA`, `HI`, `ID`, `IL`, `IN`, `IA`, `KS`, `KY`, `LA`, `ME`, `MD`, `MA`, `MI`, `MN`, `MS`, `MO`, `MT`, `NE`, `NV`, `NH`, `NJ`, `NM`, `NY`, `NC`, `ND`, `OH`, `OK`, `OR`, `PA`, `RI`, `SC`, `SD`, `TN`, `TX`, `UT`, `VT`, `VA`, `WA`, `WV`, `WI`, `WY`, `DC`, `PR`, `VI`, `GU`, `AS`, `MP`.
- `types` (array, optional): 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....

## 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_find_stations
```

```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": {
      "latitude": 1
    },
    "name": "noaa_marine__noaa_marine_find_stations"
  }
}
```

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": "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.",
  "inputSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "additionalProperties": false,
    "properties": {
      "latitude": {
        "description": "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.",
        "maximum": 90,
        "minimum": -90,
        "type": "number"
      },
      "limit": {
        "default": 20,
        "description": "Maximum number of stations to return. Defaults to 20.",
        "maximum": 200,
        "minimum": 1,
        "type": "integer"
      },
      "longitude": {
        "description": "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.",
        "maximum": 180,
        "minimum": -180,
        "type": "number"
      },
      "query": {
        "description": "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.",
        "type": "string"
      },
      "radius_km": {
        "default": 100,
        "description": "Search radius in kilometers when latitude/longitude are provided. Defaults to 100 km.",
        "maximum": 1000,
        "minimum": 1,
        "type": "number"
      },
      "source": {
        "default": "all",
        "description": "Data source to search: coops (tide/water-level/current stations), ndbc (buoys), or all (default).",
        "enum": [
          "coops",
          "ndbc",
          "all"
        ],
        "type": "string"
      },
      "state": {
        "description": "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\".",
        "enum": [
          "AL",
          "AK",
          "AZ",
          "AR",
          "CA",
          "CO",
          "CT",
          "DE",
          "FL",
          "GA",
          "HI",
          "ID",
          "IL",
          "IN",
          "IA",
          "KS",
          "KY",
          "LA",
          "ME",
          "MD",
          "MA",
          "MI",
          "MN",
          "MS",
          "MO",
          "MT",
          "NE",
          "NV",
          "NH",
          "NJ",
          "NM",
          "NY",
          "NC",
          "ND",
          "OH",
          "OK",
          "OR",
          "PA",
          "RI",
          "SC",
          "SD",
          "TN",
          "TX",
          "UT",
          "VT",
          "VA",
          "WA",
          "WV",
          "WI",
          "WY",
          "DC",
          "PR",
          "VI",
          "GU",
          "AS",
          "MP"
        ],
        "type": "string"
      },
      "types": {
        "description": "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.",
        "items": {
          "description": "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.",
          "enum": [
            "tide",
            "current",
            "water_level",
            "met",
            "current_profile",
            "water_quality",
            "buoy"
          ],
          "type": "string"
        },
        "type": "array"
      }
    },
    "type": "object"
  },
  "name": "noaa_marine__noaa_marine_find_stations",
  "outputSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "additionalProperties": false,
    "anyOf": [
      {
        "not": {
          "required": [
            "error"
          ]
        },
        "required": [
          "stations",
          "total_found"
        ]
      },
      {
        "required": [
          "error"
        ]
      }
    ],
    "properties": {
      "applied_search": {
        "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"
      },
      "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: `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.",
                "examples": [
                  "incomplete_coordinates",
                  "sources_unavailable"
                ],
                "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"
      },
      "notice": {
        "description": "Guidance about the result set: why a search matched nothing, which catalog did not answer, or that the list was capped.",
        "type": "string"
      },
      "sources": {
        "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"
      },
      "stations": {
        "description": "Stations matching the search criteria, sorted by distance (if lat/lon provided) or by exact ID match then name. Empty when nothing matched.",
        "items": {
          "additionalProperties": false,
          "description": "A single station matching the search criteria.",
          "properties": {
            "bins": {
              "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"
            },
            "capabilities": {
              "description": "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.",
              "items": {
                "description": "Capability identifier, e.g. \"tide\", \"water_level\".",
                "type": "string"
              },
              "type": "array"
            },
            "distance_km": {
              "description": "Distance in km from the search center (only present when lat/lon search was used).",
              "type": "number"
            },
            "latitude": {
              "description": "Station latitude in decimal degrees.",
              "type": "number"
            },
            "longitude": {
              "description": "Station longitude in decimal degrees.",
              "type": "number"
            },
            "name": {
              "description": "Station name.",
              "type": "string"
            },
            "platform": {
              "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"
            },
            "prediction_class": {
              "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"
            },
            "reference_id": {
              "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"
            },
            "source": {
              "description": "Data source: coops (CO-OPS) or ndbc (NDBC buoy).",
              "enum": [
                "coops",
                "ndbc"
              ],
              "type": "string"
            },
            "state": {
              "description": "US state or territory code (CO-OPS stations only).",
              "type": "string"
            },
            "station_id": {
              "description": "Station identifier — use this ID with data tools.",
              "type": "string"
            },
            "type": {
              "description": "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.",
              "type": "string"
            }
          },
          "required": [
            "station_id",
            "name",
            "source",
            "latitude",
            "longitude",
            "capabilities"
          ],
          "type": "object"
        },
        "type": "array"
      },
      "total_found": {
        "description": "Total stations matching the filters before the limit was applied. Zero when nothing matched.",
        "type": "number"
      },
      "truncated": {
        "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"
      }
    },
    "type": "object"
  },
  "title": "Find Marine Stations"
}
```
