Charter Boats API
AI Integrations

MCP Server

Connect AI assistants to Charter Boats via the Model Context Protocol

The Charter Boats MCP server lets Claude, ChatGPT, Cursor, and any MCP-compatible AI assistant search boats, locations, POIs, routes, trips, and content -- with rich HTML widgets for visual boat and destination cards.

Endpoint: https://charter.boats/mcp Install / quickstart page: open https://charter.boats/mcp in a browser. Transport: Streamable HTTP (JSON-RPC 2.0). Auth: None. Spec: MCP Apps 2026-01-26.

Deployment

The server is a Cloudflare Worker (workers/chatgpt-app/) routed at charter.boats/mcp. The Worker proxies tool calls to the Charter Boats AI API (https://charter.boats/api/ai/*) and serves two HTML widgets as MCP App resources.

AI assistant → https://charter.boats/mcp (CF Worker) → charter.boats/api/ai/*

A single /mcp URL handles three things:

  • GET with Accept: text/html → install / quickstart page (HTML)
  • GET with Accept: application/json → server info JSON
  • POST → MCP JSON-RPC

Tools

Ten read-only tools. All return structured JSON for widgets plus a text summary for the model.

ToolDescriptionWidget
search_boatsBoats by location, type, dates, capacity, budget. Returns up to 8 with prices, images, booking links.✓ boats
search_locationsMarinas, islands, cities. Up to 10 with boat counts.✓ locations
search_poisRestaurants, fuel, groceries, etc. near a destination. Up to 10.
search_routesSailing passages between destinations. Up to 5.
search_tripsMulti-day curated itineraries. Up to 5.
search_contentArticles, guides, FAQs. Up to 5.

Detail

ToolDescription
get_boat_detailsFull specs, 365-day availability + pricing ranges, required/optional fees, active discounts, cancellation policy, check-in/out times.
get_poi_detailsDescription, opening hours, rating, nearby marinas, special offers.
get_location_detailsDescription, amenities, boat count, nearby POIs, capacity.
get_trip_detailsDay-by-day stops, distances, activities, highlights, notes.

Full input schemas are exposed via tools/list -- view them in MCP Inspector by connecting to https://charter.boats/mcp.

Prompt presets

The server registers three prompts surfaced as one-click starters in supporting clients:

  • plan-sailing-trip -- destination + optional guests/dates/budget
  • find-charter-boat -- location + optional type/guests/dates
  • explore-destination -- single destination, surfaces marinas + POIs + routes

UI widgets

Two HTML widgets are served as MCP App resources:

WidgetURIUsed by
Boatsui://widget/boats.htmlsearch_boats
Locationsui://widget/locations.htmlsearch_locations

Both widgets:

  • Use the text/html;profile=mcp-app MIME type.
  • Declare CSP resourceDomains for charter.boats, *.r2.dev, *.cloudflare.com (boat images live on R2).
  • Implement the full MCP Apps handshake: sandbox-resource-readyui/initialize (with protocolVersion, appInfo, appCapabilities) → ui/notifications/initialized → render on ui/notifications/tool-result.
  • Report height via ui/notifications/size-changed, measured from body.scrollHeight / #app (the document element returns 0 inside Claude's sandbox).
  • Route link clicks through ui/open-link since sandboxed iframes block target="_blank".
  • Respect host theme: explicit theme: 'dark' | 'light' from host-context-changed overrides the prefers-color-scheme CSS fallback.

Install

For end users: open https://charter.boats/mcp in any browser -- the page has copy-paste install steps for Claude.ai, Claude Desktop, ChatGPT, Cursor, and MCP Inspector.

Quick reference

Claude.ai / Claude Desktop: Settings → Connectors → Add custom connector → https://charter.boats/mcp (Pro/Max/Team/Enterprise required).

ChatGPT: Settings → Apps → Create app → MCP Server → https://charter.boats/mcp. Widget rendering requires the ChatGPT Apps program; Developer mode shows tool calls as text only.

Cursor: add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "charter-boats": { "url": "https://charter.boats/mcp" }
  }
}

MCP Inspector: npx @modelcontextprotocol/inspector → Streamable HTTP → https://charter.boats/mcp.

Rate limits

SourceLimit
ChatGPT Custom GPT (legacy Actions)30 / 10 min
MCP (all hosts)60 / 10 min

Returns 429 Too Many Requests with Retry-After.

Local development

cd workers/chatgpt-app
npm install
npx wrangler dev

Defaults to http://localhost:8787/mcp. Override the upstream API with API_BASE=http://localhost:3000/api/ai npx wrangler dev to point at a local Nuxt dev server.

Deploy:

npx wrangler deploy --config ./wrangler.toml

Requires CLOUDFLARE_API_TOKEN (or wrangler login). The --config flag is needed because the repo root has a Nuxt build artifact at .wrangler/deploy/config.json that wrangler will otherwise prefer.

Key files

PathDescription
workers/chatgpt-app/src/index.tsServer implementation: tool definitions, handlers, widget HTML, install page.
workers/chatgpt-app/wrangler.tomlWorker config + charter.boats/mcp route.
server/api/ai/*Underlying read-only data endpoints the Worker proxies to.

Differences from the Custom GPT

Both integrations call the same /api/ai/* endpoints but expose them differently:

FeatureCustom GPT (Actions)MCP Server
ProtocolOpenAPI 3.1Model Context Protocol (Streamable HTTP)
Rich UINoYes -- boats + locations widgets
TransportHTTPSJSON-RPC over HTTP
Session stateGPT conversation IDStateless per request
Rate limit30 / 10 min60 / 10 min
HostsChatGPT onlyClaude, ChatGPT Apps, Cursor, Continue, any MCP client

On this page