Connection setup

Gillby / MCP reference

Every tool. Every input.

34 tools in the local MCP catalog. This reference is generated from the same operation registry and access filter used by the remote MCP server, so names and input schemas follow the implementation.

Using the tools

The remote endpoint is /mcp on your Gillby deployment, using Streamable HTTP. Copy the full server URL from the setup page. Follow the assistant setup guide. The client discovers tools through tools/list and invokes them through tools/call. Availability can differ between hosted and local installations; the connected server’s tool list is authoritative.

Arguments are nested under query, path or body, exactly as shown below. Required fields, enums, units, bounds and defaults are included in each expandable JSON schema. Start with list_spots to resolve a named location, then get_conditions with view: "summary" before requesting extra detail.

{
  "name": "get_conditions",
  "arguments": {
    "query": {
      "spot": "boca-inlet",
      "view": "summary"
    }
  }
}

Public coastal reads normally need no Gillby account. Personal tools require explicit OAuth account consent; write tools can change or delete your records. Keep the same requestId when retrying a save. Account tools in the selected catalog are listed separately below. The hosted catalog is the default; switch to Local catalog for the local server’s smaller toolset.

Clients supporting MCP Apps can render Gillby’s embedded coastal panel for supported results; other clients receive structured results. Map rendering is a client/panel capability, not a promise that every client exposes a separate map tool. Camera links may show older frames or unavailable imagery.

Public coastal tools

geocode

Read only · Public

Worldwide place search (OSM Nominatim) returning name, area and lat/lon. Use to turn 'Hillsboro Inlet' or 'Bimini Bay' into coordinates for point tools.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "q": {
          "type": "string",
          "minLength": 3,
          "maxLength": 120
        }
      },
      "required": [
        "q"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}

get_boat

Read only · Public

A single boat record from the library.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "path": {
      "type": "object",
      "properties": {
        "boatId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$"
        }
      },
      "required": [
        "boatId"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "path"
  ],
  "additionalProperties": false
}

get_bridge

Read only · Public

A single bridge Feature with live clearance at `time` (default now).

Inputs & required fields
{
  "type": "object",
  "properties": {
    "path": {
      "type": "object",
      "properties": {
        "bridgeId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$"
        }
      },
      "required": [
        "bridgeId"
      ],
      "additionalProperties": false
    },
    "query": {
      "type": "object",
      "properties": {
        "time": {
          "type": "string",
          "format": "date-time",
          "description": "time for live bridge clearance (default now)"
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [
    "path"
  ],
  "additionalProperties": false
}

get_briefing

Read only · Public

A short headline + <=60-word body written from the live data (numbers validated against the fact sheet; falls back to a template when no model is available). source says claude/openai/template. Rate limited: may call an LLM on a cold cache.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "path": {
      "type": "object",
      "properties": {
        "spotId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$",
          "description": "Spot id, e.g. boca-inlet"
        }
      },
      "required": [
        "spotId"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "path"
  ],
  "additionalProperties": false
}

get_chop_history

Read only · Public

Gillby's native 0–10 chop algorithm, recorded versus reconstructed provenance, daily summaries, coverage and weekly trends. Missing hours remain gaps. Maximum 31 days.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "spot": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$"
        },
        "from": {
          "type": "string",
          "format": "date-time"
        },
        "to": {
          "type": "string",
          "format": "date-time"
        }
      },
      "required": [
        "spot"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}

get_conditions

Read only · Public

The full conditions bundle for a named spot: current waves (ft, s, deg FROM), wind (kt), tide (ft MLLW), water temp (F), activity scores with reasons, 7-day hourly forecast, hi/lo tides, best windows, NWS alerts, rip/red tide/bacteria hazards, lightning and an AI briefing. Kitesurf: kiteboarding contains rider-specific weather screening and unverified launch status; supply kiteStyle, kiteExperience, kiteMinWindKt and kiteMaxWindKt. No overall kite score or verified launch is implied. Activities: kite, surf, skim (flatland), skim-wave (wave riding), paddle (flatwater paddleboard), sup-surf (SUP surf). Skim scores are absent without shoreline observations; do not substitute other activity scores. Prefer view=summary unless you need every hour. boat=<id> adds boat-specific chop comfort. For an arbitrary lat/lon use get_point_conditions.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "spot": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$",
          "description": "Spot id, e.g. boca-inlet"
        },
        "view": {
          "type": "string",
          "enum": [
            "full",
            "summary"
          ],
          "default": "full",
          "description": "summary = compact (~10 KB) for LLMs and widgets; full = every hourly point (~250 KB)"
        },
        "boat": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$",
          "description": "Boat id from GET /api/v1/boats (adds boat-specific chop comfort), or 'custom' with loa/beam/draft/deadrise/hull/cat/name"
        },
        "loa": {
          "type": "number",
          "minimum": 1,
          "maximum": 200,
          "description": "custom boat length overall, ft"
        },
        "beam": {
          "type": "number",
          "minimum": 1,
          "maximum": 60,
          "description": "custom boat beam, ft"
        },
        "draft": {
          "type": "number",
          "minimum": 0.1,
          "maximum": 30,
          "description": "custom boat draft, ft"
        },
        "deadrise": {
          "type": "number",
          "minimum": 1,
          "maximum": 40,
          "description": "custom boat deadrise at transom, deg"
        },
        "weight": {
          "type": "number",
          "minimum": 1,
          "maximum": 200000,
          "description": "custom boat weight, lb"
        },
        "cruise": {
          "type": "number",
          "minimum": 1,
          "maximum": 80,
          "description": "custom boat cruise speed, kt"
        },
        "hull": {
          "type": "string",
          "maxLength": 40,
          "description": "custom boat hull type"
        },
        "cat": {
          "type": "string",
          "maxLength": 40,
          "description": "custom boat category"
        },
        "name": {
          "type": "string",
          "maxLength": 60,
          "description": "custom boat name"
        },
        "kiteStyle": {
          "type": "string",
          "enum": [
            "freeride",
            "waves",
            "foil"
          ],
          "default": "freeride"
        },
        "kiteExperience": {
          "type": "string",
          "enum": [
            "beginner",
            "independent",
            "advanced"
          ]
        },
        "kiteMinWindKt": {
          "type": "number",
          "minimum": 1,
          "maximum": 60,
          "description": "Rider-supplied equipment wind minimum; never infer"
        },
        "kiteMaxWindKt": {
          "type": "number",
          "minimum": 1,
          "maximum": 60,
          "description": "Rider-supplied equipment wind maximum; must exceed minimum"
        }
      },
      "required": [
        "spot"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}

get_dataset

Read only · Public

The latest payload of one dataset from list_datasets, including sharks and jellyfish. These marine-life records are dated observations, not live beach warnings; no records does not imply absence. bbox filters list datasets; category filters USCG notices (e.g. bridge,hazard); homeZone=true limits discharges to the home zone; geometry=true includes MPA polygons. 503 when the dataset has never loaded.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "path": {
      "type": "object",
      "properties": {
        "datasetId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$"
        }
      },
      "required": [
        "datasetId"
      ],
      "additionalProperties": false
    },
    "query": {
      "type": "object",
      "properties": {
        "bbox": {
          "type": "string",
          "pattern": "^-?\\d+(\\.\\d+)?(,-?\\d+(\\.\\d+)?){3}$",
          "description": "w,s,e,n in decimal degrees"
        },
        "category": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 40
          }
        },
        "homeZone": {
          "type": "boolean"
        },
        "geometry": {
          "type": "boolean"
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [
    "path"
  ],
  "additionalProperties": false
}

get_depth

Read only · Public

Charted depth below MLLW (ft) at lat/lon with its source (ENC band or DEM), whether it is land, a dredged channel, nearby charted hazards (rocks, obstructions, wrecks) and motor-restricted zones. Add the tide from get_tides for depth now.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "lat": {
          "type": "number",
          "minimum": -90,
          "maximum": 90,
          "description": "Latitude, decimal degrees (WGS84)"
        },
        "lon": {
          "type": "number",
          "minimum": -180,
          "maximum": 180,
          "description": "Longitude, decimal degrees (WGS84)"
        }
      },
      "required": [
        "lat",
        "lon"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}

get_forecast

Read only · Public

Hourly forecast for a spot (or lat+lon) starting at `time` (default now) for `hours` hours: waves, swell/wind-wave split, wind, gusts, tide, current, precip/thunder chance, and go/caution/nogo scores with reasons per activity. Also returns 7 daily score rows and best windows. Units: ft, s, kt, deg FROM, F.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "spot": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$",
          "description": "Spot id from GET /api/v1/spots, e.g. boca-inlet. Use this or lat+lon."
        },
        "lat": {
          "type": "number",
          "minimum": -90,
          "maximum": 90,
          "description": "Latitude, decimal degrees (WGS84)"
        },
        "lon": {
          "type": "number",
          "minimum": -180,
          "maximum": 180,
          "description": "Longitude, decimal degrees (WGS84)"
        },
        "kiteStyle": {
          "type": "string",
          "enum": [
            "freeride",
            "waves",
            "foil"
          ],
          "default": "freeride"
        },
        "kiteExperience": {
          "type": "string",
          "enum": [
            "beginner",
            "independent",
            "advanced"
          ]
        },
        "kiteMinWindKt": {
          "type": "number",
          "minimum": 1,
          "maximum": 60,
          "description": "Rider-supplied equipment wind minimum; never infer"
        },
        "kiteMaxWindKt": {
          "type": "number",
          "minimum": 1,
          "maximum": 60,
          "description": "Rider-supplied equipment wind maximum; must exceed minimum"
        },
        "time": {
          "type": "string",
          "format": "date-time",
          "description": "window start, ISO with offset (default now)"
        },
        "hours": {
          "type": "integer",
          "minimum": 1,
          "maximum": 168,
          "default": 48
        },
        "boat": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$",
          "description": "Boat id from GET /api/v1/boats (adds boat-specific chop comfort), or 'custom' with loa/beam/draft/deadrise/hull/cat/name"
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

get_forecast_skill

Read only · Public

Mean absolute error and bias of the raw wave/wind model vs the app's MOS-corrected forecast, by lead time, against the spot's buoy over the last `days` days, plus the paired series.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "path": {
      "type": "object",
      "properties": {
        "spotId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$",
          "description": "Spot id, e.g. boca-inlet"
        }
      },
      "required": [
        "spotId"
      ],
      "additionalProperties": false
    },
    "query": {
      "type": "object",
      "properties": {
        "var": {
          "type": "string",
          "enum": [
            "wave_ht_ft",
            "wind_kt"
          ],
          "default": "wave_ht_ft"
        },
        "days": {
          "type": "integer",
          "minimum": 1,
          "maximum": 90,
          "default": 30
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [
    "path"
  ],
  "additionalProperties": false
}

get_hazards

Read only · Public

Active NWS marine/coastal alerts (small craft, rip current, high surf, special marine, waterspout...) plus water hazards for a spot or lat+lon: rip current risk, red tide (FWC samples), bacteria (FDOH), sargassum, water clarity, king tide, Gulf Stream distance, lightning. Use before recommending swimming, diving or running an inlet.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "spot": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$",
          "description": "Spot id from GET /api/v1/spots, e.g. boca-inlet. Use this or lat+lon."
        },
        "lat": {
          "type": "number",
          "minimum": -90,
          "maximum": 90,
          "description": "Latitude, decimal degrees (WGS84)"
        },
        "lon": {
          "type": "number",
          "minimum": -180,
          "maximum": 180,
          "description": "Longitude, decimal degrees (WGS84)"
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

get_health

Read only · Public

Rolls up whether the ingest worker is running, which feed families (ndbc, coops, nws, openmeteo, goes19, coastwatch...) have stale sources, government dataset status and the GLM lightning feed. status is ok | degraded | down; HTTP 503 only when down. Check this before trusting 'no data' from other tools. detail=true lists every source.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "detail": {
          "type": "boolean",
          "default": false
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

get_history

Read only · Public

Time series from the local archive for one source + variable, e.g. source=ndbc:41122 var=wave_ht_ft, or source=forecast:gfswave016 with spot=. Default window: last 30 days. Points are downsampled to maxPoints.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "source": {
          "type": "string",
          "minLength": 3,
          "maxLength": 80,
          "description": "ingest source, e.g. ndbc:41122, coops:8722956, forecast:gfswave016"
        },
        "var": {
          "type": "string",
          "minLength": 2,
          "maxLength": 40,
          "description": "variable, e.g. wave_ht_ft, wind_kt, water_temp_f, water_level_ft"
        },
        "from": {
          "type": "string",
          "format": "date-time"
        },
        "to": {
          "type": "string",
          "format": "date-time"
        },
        "spot": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$"
        },
        "maxPoints": {
          "type": "integer",
          "minimum": 10,
          "maximum": 20000,
          "default": 5000
        }
      },
      "required": [
        "source",
        "var"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}

get_insights

Read only · Public

3-8 insights about a spot computed from SQL aggregates (waves vs last year, model error by forecast day, lightning by hour, bacteria, inlet Stay-in share), each citing stat ids from stats[]. Generated daily; a cold spot takes 5-15 s. Rate limited.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "path": {
      "type": "object",
      "properties": {
        "spotId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$",
          "description": "Spot id, e.g. boca-inlet"
        }
      },
      "required": [
        "spotId"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "path"
  ],
  "additionalProperties": false
}

get_jellyfish_observations

Read only · Public

Published Florida jellyfish, box jellyfish and man-of-war observations from OBIS and iNaturalist, with observation dates, uncertainty, observer credits and licenses. Includes official Boca Raton/Fort Lauderdale lifeguard-report links. Community records are not live beach warnings; no sightings does not establish absence. Man-of-war are siphonophores. Use bbox to narrow the sample; limit defaults to 20 (maximum 100).

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "bbox": {
          "type": "string",
          "pattern": "^-?\\d+(\\.\\d+)?(,-?\\d+(\\.\\d+)?){3}$",
          "description": "w,s,e,n in decimal degrees"
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

get_lightning

Read only · Public

GOES-19 GLM lightning. With lat+lon: level (clear | watch 10-25 mi | danger < 10 mi in the last 5 min), nearest strike distance (mi) and time, strikes in 15 min, all-clear time (30 min after the last strike within 10 mi), SPC thunder outlook, and the last 30 min of flashes. Without lat/lon: status per spot. When the feed is stale, status is null and unavailableReason explains why (never a false 'clear').

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "lat": {
          "type": "number",
          "minimum": -90,
          "maximum": 90,
          "description": "Latitude, decimal degrees (WGS84)"
        },
        "lon": {
          "type": "number",
          "minimum": -180,
          "maximum": 180,
          "description": "Longitude, decimal degrees (WGS84)"
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

get_lightning_climatology

Read only · Public

Count of GLM flashes within radiusMi of a spot by local (America/New_York) hour of day over the last `days` days. recordStart is the first flash on record, so short records undercount.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "spot": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$"
        },
        "days": {
          "type": "integer",
          "minimum": 1,
          "maximum": 3650,
          "default": 30
        },
        "radiusMi": {
          "type": "number",
          "minimum": 1,
          "maximum": 40,
          "default": 10
        }
      },
      "required": [
        "spot"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}

get_lightning_flashes

Read only · Public

GLM flashes from the last `minutes` minutes as a GeoJSON FeatureCollection (properties: t ISO, age_s, energy, area, qf).

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "minutes": {
          "type": "integer",
          "minimum": 1,
          "maximum": 180,
          "default": 30
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

get_poi

Read only · Public

A single POI GeoJSON Feature (properties vary by category: phone, amenities, fuel, bridge clearance/openings, regulation, sourceUrl).

Inputs & required fields
{
  "type": "object",
  "properties": {
    "path": {
      "type": "object",
      "properties": {
        "poiId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$"
        }
      },
      "required": [
        "poiId"
      ],
      "additionalProperties": false
    },
    "query": {
      "type": "object",
      "properties": {
        "time": {
          "type": "string",
          "format": "date-time",
          "description": "time for live bridge clearance (default now)"
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [
    "path"
  ],
  "additionalProperties": false
}

get_poi_details

Read only · Public

Facility details gathered from FWC, OSM, Wikimedia Commons and the facility's own site: hours, fees, slips, fuel, photos, parking, amenities, with a source per field. 404 for categories without details.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "path": {
      "type": "object",
      "properties": {
        "poiId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$"
        }
      },
      "required": [
        "poiId"
      ],
      "additionalProperties": false
    },
    "query": {
      "type": "object",
      "properties": {
        "refresh": {
          "type": "boolean",
          "default": false,
          "description": "refetch now instead of the cached copy"
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [
    "path"
  ],
  "additionalProperties": false
}

get_point_conditions

Read only · Public

Same bundle as get_conditions for an arbitrary point inside the South Florida box, rounded to 0.02 deg; stations and zones come from the nearest spot. Returns 422 unprocessable when the point is on land (details.nearestSpot suggests a spot). Slower on a cold point (up to ~10 s). Rate limited.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "lat": {
          "type": "number",
          "minimum": -90,
          "maximum": 90,
          "description": "Latitude, decimal degrees (WGS84)"
        },
        "lon": {
          "type": "number",
          "minimum": -180,
          "maximum": 180,
          "description": "Longitude, decimal degrees (WGS84)"
        },
        "view": {
          "type": "string",
          "enum": [
            "full",
            "summary"
          ],
          "default": "full",
          "description": "summary = compact (~10 KB) for LLMs and widgets; full = every hourly point (~250 KB)"
        },
        "kiteStyle": {
          "type": "string",
          "enum": [
            "freeride",
            "waves",
            "foil"
          ],
          "default": "freeride"
        },
        "kiteExperience": {
          "type": "string",
          "enum": [
            "beginner",
            "independent",
            "advanced"
          ]
        },
        "kiteMinWindKt": {
          "type": "number",
          "minimum": 1,
          "maximum": 60,
          "description": "Rider-supplied equipment wind minimum; never infer"
        },
        "kiteMaxWindKt": {
          "type": "number",
          "minimum": 1,
          "maximum": 60,
          "description": "Rider-supplied equipment wind maximum; must exceed minimum"
        },
        "briefing": {
          "type": "boolean",
          "default": false,
          "description": "also generate an AI briefing (slower)"
        }
      },
      "required": [
        "lat",
        "lon"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}

get_shark_research

Read only · Public

Published Florida shark research occurrences with observation dates, location uncertainty, source credits and licenses. Historical acoustic detections and tag releases, not live shark tracking or beach warnings. No records does not mean sharks are absent. Use bbox to narrow the published sample; limit defaults to 20 (maximum 100).

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "bbox": {
          "type": "string",
          "pattern": "^-?\\d+(\\.\\d+)?(,-?\\d+(\\.\\d+)?){3}$",
          "description": "w,s,e,n in decimal degrees"
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

get_spot

Read only · Public

A single spot record plus now.scores (go/caution/nogo per activity for the current hour) when the worker has scored it.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "path": {
      "type": "object",
      "properties": {
        "spotId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$",
          "description": "Spot id, e.g. boca-inlet"
        }
      },
      "required": [
        "spotId"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "path"
  ],
  "additionalProperties": false
}

get_tides

Read only · Public

Predicted high and low tides (ft above MLLW, NOAA CO-OPS) for the next `days` days at a spot or lat+lon, the hourly tide height curve and inlet current (kt, + flood / - ebb), plus sunrise/sunset and moon phase. Times are ISO with the Eastern offset.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "spot": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$",
          "description": "Spot id from GET /api/v1/spots, e.g. boca-inlet. Use this or lat+lon."
        },
        "lat": {
          "type": "number",
          "minimum": -90,
          "maximum": 90,
          "description": "Latitude, decimal degrees (WGS84)"
        },
        "lon": {
          "type": "number",
          "minimum": -180,
          "maximum": 180,
          "description": "Longitude, decimal degrees (WGS84)"
        },
        "days": {
          "type": "integer",
          "minimum": 1,
          "maximum": 7,
          "default": 3
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

get_zones_at

Read only · Public

Every restriction zone containing lat/lon, with the rules in force at `time` (inForce[] lists only active ones, with plain text like 'Idle speed, no wake, Nov 15 - Mar 31'). Use before advising speed through an area.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "lat": {
          "type": "number",
          "minimum": -90,
          "maximum": 90,
          "description": "Latitude, decimal degrees (WGS84)"
        },
        "lon": {
          "type": "number",
          "minimum": -180,
          "maximum": 180,
          "description": "Longitude, decimal degrees (WGS84)"
        },
        "time": {
          "type": "string",
          "format": "date-time",
          "description": "when to evaluate seasonal / weekend / time-of-day rules (default now)"
        },
        "length": {
          "type": "number",
          "minimum": 1,
          "maximum": 2000,
          "description": "vessel length, ft (some rules depend on it)"
        }
      },
      "required": [
        "lat",
        "lon"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}

list_boats

Read only · Public

Boats with published specs (LOA, beam, draft, deadrise, weight, hull type, fuel, cruise speed) and their sources. Pass a boat id to conditions/forecast/routes for boat-specific comfort and draft. The user's boat is contender-21-open-2008.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "q": {
          "type": "string",
          "minLength": 2,
          "maxLength": 60,
          "description": "make/model search"
        },
        "category": {
          "type": "string",
          "maxLength": 40
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

list_bridges

Read only · Public

Bridges (POI category bridge) as GeoJSON: charted clearance, live clearance (ft) at `time` from the predicted tide + gauge residual, the tide station used, opening schedule (33 CFR) when regulated. Use to check whether a boat of a given air draft fits under at a time.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "bbox": {
          "type": "string",
          "pattern": "^-?\\d+(\\.\\d+)?(,-?\\d+(\\.\\d+)?){3}$",
          "description": "w,s,e,n, e.g. -80.12,26.30,-80.05,26.40"
        },
        "q": {
          "type": "string",
          "minLength": 2,
          "maxLength": 80,
          "description": "name search, all words must match"
        },
        "ids": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "pattern": "^[A-Za-z0-9:._-]+$"
          },
          "maxItems": 200,
          "description": "comma-separated POI ids"
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 5000
        },
        "time": {
          "type": "string",
          "format": "date-time",
          "description": "time for live bridge clearance (default now)"
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

list_cams

Read only · Public

Public webcams within 15 mi, nearest first: live page URL, embed type, credit, the latest stored snapshot and the snapshot history. Use get_cam_frame for a fresh JPEG.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "spot": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$"
        },
        "lat": {
          "type": "number",
          "minimum": -90,
          "maximum": 90,
          "description": "Latitude, decimal degrees (WGS84)"
        },
        "lon": {
          "type": "number",
          "minimum": -180,
          "maximum": 180,
          "description": "Longitude, decimal degrees (WGS84)"
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

list_datasets

Read only · Public

Index of government datasets (SFWMD discharges, Lake O, USGS, CoastWatch chlorophyll / SST fronts, coral heat, USCG notices, derelicts, MPAs, algae, fish kills, shark research and jellyfish/man-of-war observations) with ok/stale/unavailable status and last-good time.

Inputs & required fields
{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}

list_sandbars

Read only · Public

Known sandbars (Boca Lake, Hillsboro, Haulover, Stiltsville...) as GeoJSON points with descriptions and sources. Pair with get_tides for exposure at low tide.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "bbox": {
          "type": "string",
          "pattern": "^-?\\d+(\\.\\d+)?(,-?\\d+(\\.\\d+)?){3}$",
          "description": "w,s,e,n in decimal degrees"
        },
        "q": {
          "type": "string",
          "minLength": 2,
          "maxLength": 80
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

list_spots

Read only · Public

Every named South Florida spot the app scores, with its lat/lon, kind, region and the NOAA stations used for it. Use the returned id with conditions, forecast, tides, hazards and briefing tools. include=status adds the current-hour go/caution/nogo band per activity.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "include": {
          "type": "string",
          "enum": [
            "status"
          ],
          "description": "status = add now.scores per activity"
        },
        "region": {
          "type": "string",
          "enum": [
            "palm-beach",
            "broward",
            "miami-dade",
            "keys"
          ]
        },
        "homeZone": {
          "type": "boolean",
          "description": "only the Deerfield/Boca/Pompano home zone"
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

list_zones

Read only · Public

Regulatory zones as GeoJSON with whether each is in force at `time` (activeNow: active, restriction, speed limit, until, plain-language text). types filters by restriction: idle-no-wake, slow-minimum-wake, speed-limit, no-motor, no-entry, no-anchoring, pole-troll, caution, other. active=true returns only zones in force. Not a substitute for posted signs.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "bbox": {
          "type": "string",
          "pattern": "^-?\\d+(\\.\\d+)?(,-?\\d+(\\.\\d+)?){3}$",
          "description": "w,s,e,n in decimal degrees"
        },
        "types": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "idle-no-wake",
              "slow-minimum-wake",
              "speed-limit",
              "no-motor",
              "no-entry",
              "no-anchoring",
              "pole-troll",
              "caution",
              "other"
            ]
          }
        },
        "active": {
          "type": "boolean",
          "default": false
        },
        "time": {
          "type": "string",
          "format": "date-time",
          "description": "when to evaluate seasonal / weekend / time-of-day rules (default now)"
        },
        "length": {
          "type": "number",
          "minimum": 1,
          "maximum": 2000,
          "description": "vessel length, ft (some rules depend on it)"
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

plan_route

Read only · Public / optional OAuth vessel

Plans a water route between two places for a boat's draft at a departure time, using NOAA ENC charted depths (DEM fallback) plus the predicted tide along the way. Returns the line (GeoJSON), distance (nm), ETA (min), minimum under-keel margin (ft) and where it occurs, per-leg warnings (shoals, hazards, restricted zones), tide stations used and, when no safe route exists now, the earliest safe departure in the next 24 h. Planning aid only, not for navigation. Can take 5-60 s; rate limited.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "from": {
          "type": "string",
          "minLength": 2,
          "maxLength": 60,
          "pattern": "^(-?\\d+(\\.\\d+)?,-?\\d+(\\.\\d+)?|[a-z0-9-]+)$",
          "description": "spot id (e.g. hillsboro-inlet) or 'lat,lon'"
        },
        "to": {
          "type": "string",
          "minLength": 2,
          "maxLength": 60,
          "pattern": "^(-?\\d+(\\.\\d+)?,-?\\d+(\\.\\d+)?|[a-z0-9-]+)$",
          "description": "spot id (e.g. hillsboro-inlet) or 'lat,lon'"
        },
        "via": {
          "type": "string",
          "maxLength": 400,
          "pattern": "^-?\\d+(\\.\\d+)?,-?\\d+(\\.\\d+)?(;-?\\d+(\\.\\d+)?,-?\\d+(\\.\\d+)?)*$",
          "description": "waypoints 'lat,lon;lat,lon'"
        },
        "time": {
          "type": "string",
          "format": "date-time",
          "description": "departure, ISO with offset (default now)"
        },
        "boat": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "pattern": "^[A-Za-z0-9:._-]+$",
          "description": "boat id; draft and speed default from it"
        },
        "draft": {
          "type": "number",
          "minimum": 0,
          "maximum": 30,
          "description": "draft, ft (overrides the boat's)"
        },
        "ukc": {
          "type": "number",
          "minimum": 0,
          "maximum": 20,
          "description": "under-keel clearance to keep, ft"
        },
        "speed": {
          "type": "number",
          "minimum": 1,
          "maximum": 80,
          "description": "planning speed, kt"
        }
      },
      "required": [
        "from",
        "to"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}

search_pois

Read only · Public

Map POIs as a GeoJSON FeatureCollection. Filter by bbox, categories (cats), name (q) or ids. Categories: marina, fuel, ramp, restaurant, bridge, inlet, wreck, reef, dive, fishing, pier, sandbar, anchorage, no-wake, manatee, protected, beach, navaid, derelict. Bridges include live vertical clearance at `time` (charted clearance adjusted for the predicted tide + gauge residual). Fuel docks include fuel types and an as-of date.

Inputs & required fields
{
  "type": "object",
  "properties": {
    "query": {
      "type": "object",
      "properties": {
        "bbox": {
          "type": "string",
          "pattern": "^-?\\d+(\\.\\d+)?(,-?\\d+(\\.\\d+)?){3}$",
          "description": "w,s,e,n, e.g. -80.12,26.30,-80.05,26.40"
        },
        "q": {
          "type": "string",
          "minLength": 2,
          "maxLength": 80,
          "description": "name search, all words must match"
        },
        "ids": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "pattern": "^[A-Za-z0-9:._-]+$"
          },
          "maxItems": 200,
          "description": "comma-separated POI ids"
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 5000
        },
        "time": {
          "type": "string",
          "format": "date-time",
          "description": "time for live bridge clearance (default now)"
        },
        "cats": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "marina",
              "fuel",
              "ramp",
              "restaurant",
              "bridge",
              "inlet",
              "wreck",
              "reef",
              "dive",
              "fishing",
              "pier",
              "sandbar",
              "anchorage",
              "no-wake",
              "manatee",
              "protected",
              "beach",
              "navaid",
              "derelict"
            ]
          },
          "description": "comma-separated categories"
        }
      },
      "required": [],
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

Personal account tools

No tools in this category are exposed by this deployment.

Sources & limitations

Preserve returned source names, timestamps, stale flags and unavailable/QC-failed states. A recent response does not mean every upstream source is available. Missing readings are unknown, never zero.

Local model waves and official NWS marine-zone seas cover different areas and can differ substantially. Show both with their scope and time; do not silently replace official guidance with a lower local value. Sea-model wave height is also different from breaking surf height. Choppiness describes modeled ride conditions, not a safety clearance.

Bridge charted clearance and tide-adjusted estimates are distinct. Check datum, water level, vessel air draft, margin and opening restrictions. A point depth cannot establish route clearance. Routes and saved trips do not guarantee safe navigation.

Beach camera photos are source frames, not a guarantee of a live view. Report frame time when known, retrieval time separately, and unverified freshness when the source time is missing. Place listings do not confirm current hours, fuel stock or access.

For response contracts and underlying HTTP endpoints, see the OpenAPI schema. The MCP tools return structured data and errors; assistants must keep source caveats visible in their answers.

MCP tool reference · Gillby