Charter Boats
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