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.
A single /mcp URL handles three things:
GETwithAccept: text/html→ install / quickstart page (HTML)GETwithAccept: application/json→ server info JSONPOST→ MCP JSON-RPC
Tools
Ten read-only tools. All return structured JSON for widgets plus a text summary for the model.
Search
| Tool | Description | Widget |
|---|---|---|
search_boats | Boats by location, type, dates, capacity, budget. Returns up to 8 with prices, images, booking links. | ✓ boats |
search_locations | Marinas, islands, cities. Up to 10 with boat counts. | ✓ locations |
search_pois | Restaurants, fuel, groceries, etc. near a destination. Up to 10. | — |
search_routes | Sailing passages between destinations. Up to 5. | — |
search_trips | Multi-day curated itineraries. Up to 5. | — |
search_content | Articles, guides, FAQs. Up to 5. | — |
Detail
| Tool | Description |
|---|---|
get_boat_details | Full specs, 365-day availability + pricing ranges, required/optional fees, active discounts, cancellation policy, check-in/out times. |
get_poi_details | Description, opening hours, rating, nearby marinas, special offers. |
get_location_details | Description, amenities, boat count, nearby POIs, capacity. |
get_trip_details | Day-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/budgetfind-charter-boat-- location + optional type/guests/datesexplore-destination-- single destination, surfaces marinas + POIs + routes
UI widgets
Two HTML widgets are served as MCP App resources:
| Widget | URI | Used by |
|---|---|---|
| Boats | ui://widget/boats.html | search_boats |
| Locations | ui://widget/locations.html | search_locations |
Both widgets:
- Use the
text/html;profile=mcp-appMIME type. - Declare CSP
resourceDomainsforcharter.boats,*.r2.dev,*.cloudflare.com(boat images live on R2). - Implement the full MCP Apps handshake:
sandbox-resource-ready→ui/initialize(withprotocolVersion,appInfo,appCapabilities) →ui/notifications/initialized→ render onui/notifications/tool-result. - Report height via
ui/notifications/size-changed, measured frombody.scrollHeight/#app(the document element returns 0 inside Claude's sandbox). - Route link clicks through
ui/open-linksince sandboxed iframes blocktarget="_blank". - Respect host theme: explicit
theme: 'dark' | 'light'fromhost-context-changedoverrides theprefers-color-schemeCSS 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:
MCP Inspector: npx @modelcontextprotocol/inspector → Streamable HTTP → https://charter.boats/mcp.
Rate limits
| Source | Limit |
|---|---|
| ChatGPT Custom GPT (legacy Actions) | 30 / 10 min |
| MCP (all hosts) | 60 / 10 min |
Returns 429 Too Many Requests with Retry-After.
Local development
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:
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
| Path | Description |
|---|---|
workers/chatgpt-app/src/index.ts | Server implementation: tool definitions, handlers, widget HTML, install page. |
workers/chatgpt-app/wrangler.toml | Worker 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:
| Feature | Custom GPT (Actions) | MCP Server |
|---|---|---|
| Protocol | OpenAPI 3.1 | Model Context Protocol (Streamable HTTP) |
| Rich UI | No | Yes -- boats + locations widgets |
| Transport | HTTPS | JSON-RPC over HTTP |
| Session state | GPT conversation ID | Stateless per request |
| Rate limit | 30 / 10 min | 60 / 10 min |
| Hosts | ChatGPT only | Claude, ChatGPT Apps, Cursor, Continue, any MCP client |