Charter Boats

Busca más de 14,000 barcos de alquiler con precios en vivo, además de marinas, fondeaderos, rutas e itinerarios. Once herramientas de solo lectura, sin autenticación.

Servidor MCP alojado

npx add-mcp 'https://charter.boats/mcp'

Se instala en Claude Code, Codex, Cursor y más

Documentación

Igual en la API v1.0 y v1.1

El servidor MCP de Charter Boats permite a Claude, ChatGPT, Cursor y cualquier asistente de IA compatible con MCP buscar barcos, ubicaciones, POIs, rutas, viajes y contenido, con widgets HTML enriquecidos para tarjetas visuales de barcos y destinos.

Endpoint: https://charter.boats/mcp Página de instalación / inicio rápido: abre https://charter.boats/mcp en un navegador. Transporte: HTTP Streamable (JSON-RPC 2.0). Autenticación: Ninguna. El servidor solo pasa la IP del llamante a la API, por lo que una clave de API enviada a /mcp no tiene efecto: las llamadas MCP no se atribuyen a una cuenta ni se etiquetan con afiliados. Consulta también Límites de velocidad. Especificación: MCP Apps 2026-01-26.

Implementación

El servidor es un Cloudflare Worker enrutado en charter.boats/mcp. Actúa como proxy de las llamadas de herramientas hacia la API de IA de Charter Boats (https://charter.boats/api/ai/*) y sirve dos widgets HTML como recursos de MCP Apps.

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

Una única URL /mcp maneja tres cosas:

  • GET con Accept: text/html → página de instalación / inicio rápido (HTML)
  • GET con Accept: application/json → JSON de información del servidor
  • POST → MCP JSON-RPC

Herramientas

Once herramientas de solo lectura. Cada una devuelve la respuesta subyacente de la API como structuredContent (que los widgets renderizan) más un breve resumen de texto para el modelo. Una búsqueda que no encuentra nada aún devuelve el bloque de resultados cero de la API — no_results (searched, why, try_next) y note — en structuredContent.

Búsqueda

HerramientaDescripciónWidget
search_boatsBarcos por ubicación, tipo, fechas, capacidad, presupuesto. Devuelve hasta 8 con precios, imágenes, enlaces de reserva.✓ barcos
search_locationsMarinas, puertos y fondeaderos de tres maneras: ver más abajo. Hasta 10, cada uno con su foto, número de barcos y tarifa diaria más barata, en un mapa numerado.✓ ubicaciones
search_poisRestaurantes, combustible, supermercados, etc. cerca de un destino. Hasta 10.—
search_routesTravesías a vela entre destinos. Hasta 5.—
search_tripsItinerarios seleccionados de varios días. Hasta 5.—
search_contentArtículos, guías, preguntas frecuentes (búsqueda semántica); type: "api" busca en esta documentación de la API. Hasta 5.—

search_locations responde tres preguntas diferentes, elegidas según qué entradas envíes:

  • Por nombre — q (mínimo 2 caracteres): "Lefkada", "Dubrovnik".
  • Por popularidad en un área — region (una región de navegación como la dicen los usuarios: Dalmacia, el Jónico, las Cícladas…), country, city, opcionalmente type (marina, harbour, anchorage, bay, mooring, spot — las mismas palabras que los resultados devuelven, siendo spot una parada no clasificada) y month (1-12, por defecto el mes actual). Clasificado por sort: popularity (por defecto — tráfico de embarcaciones observado para ese mes), boats (tamaño de la flota de chárter) o rating.
  • Por alcance desde un lugar — from (un id o slug de ubicación de un resultado anterior) más within_nm (10, 20, 35, 55 o 100; por defecto 35): los lugares donde se registró que los barcos navegaron desde allí, primero los más transitados, con distancia estimada y horas a 6 nudos.

Consulta Buscar ubicaciones para la respuesta de cada modo.

Detalle

HerramientaDescripción
get_boat_detailsEspecificaciones completas, disponibilidad de 365 días + rangos de precios, franjas de check-in/check-out reservables, tarifas obligatorias/opcionales, descuentos activos, política de cancelación, horarios de check-in/out.
get_boat_standoutsQué es mejor o peor de un barco en comparación con barcos similares durante una semana: cada pro y contra con su comparación; cualquier cosa no listada es normal para barcos como ese. compare_by elige barcos similares por precio (por defecto), huéspedes o eslora; cutoff_pct y fallback establecen cuánto se nombra. Consulta Qué destaca.
get_poi_detailsDescripción, horario de apertura, dirección, contacto, marinas cercanas, ofertas especiales. Los POIs no llevan calificación ni recuento de reseñas.
get_location_detailsDescripción, comodidades, contacto, número de barcos y tarifa diaria más barata, más información de AIS rastreado: qué tan concurrido está mes a mes (contra su propio pico, nunca otro lugar), cómo lo usan los barcos (proporción de visitas nocturnas, duración típica de la parada diurna, a qué hora se llena), si es una joya oculta, hacia dónde navegan los barcos desde allí (primero los más transitados, cada uno con su proporción de los viajes rastreados y un tiempo de navegación estimado a 6 nudos), y la base reservable más cercana.
get_trip_detailsParadas día a día, distancias, actividades, puntos destacados, notas.

Los esquemas completos de entrada se exponen a través de tools/list — míralos en MCP Inspector conectándote a https://charter.boats/mcp.

Ajustes preestablecidos de prompt

El servidor registra tres prompts que se muestran como iniciadores de un clic en clientes compatibles:

  • plan-sailing-trip — destino + huéspedes/fechas/presupuesto opcionales
  • find-charter-boat — ubicación + tipo/huéspedes/fechas opcionales
  • explore-destination — destino único, muestra marinas + POIs + rutas

Widgets de interfaz

Dos widgets HTML se sirven como recursos de MCP Apps:

WidgetURIUsado por
Barcosui://widget/boats-{hash}.htmlsearch_boats
Ubicacionesui://widget/locations-{hash}.htmlsearch_locations

El {hash} es un hash del HTML propio de ese widget, por lo que la URI cambia si y solo si el widget cambia. ChatGPT almacena en caché los recursos MCP por URI sin caducidad — una URI fija significa que un widget reimplementado nunca se vuelve a leer, sin importar cuántas veces se publique — y la guía de OpenAI es dar a la plantilla una nueva URI cuando cambia su HTML, JS o CSS. Lee los valores actuales de resources/list; nunca codifiques uno. Una lectura de una URI previamente publicada (incluido el ui://widget/boats.html original sin hash) aún devuelve el widget actual en lugar de un error, por lo que un host con una URI obsoleta degrada a metadatos antiguos pero marcado correcto en lugar de una tarjeta rota.

Ambos widgets:

  • Usan el tipo MIME text/html;profile=mcp-app.
  • Declaran su CSP de imágenes dos veces: _meta.ui.csp.resourceDomains (el estándar de MCP Apps, que Claude lee) y _meta["openai/widgetCSP"].resource_domains (la clave de compatibilidad snake_case, que es la única que ChatGPT lee — sin ella ChatGPT aplica un valor predeterminado bloqueado y cada foto de barco se renderiza como una imagen rota). _meta.ui.prefersBorder / openai/widgetPrefersBorder y _meta.ui.resourceUri / openai/outputTemplate están emparejados de la misma manera.
  • Listan orígenes exactos, nunca comodines — ChatGPT rechaza una entrada *.example.com y una entrada mala descarta toda la lista. El conjunto permitido es charter.boats, media.charter.boats, el origen directo de nuestro bucket de almacenamiento y wsrv.nl. Las fotos de barcos y ubicaciones se sirven desde media.charter.boats (listado explícitamente, ya que una fuente de host CSP coincide solo con ese host y charter.boats no cubre sus subdominios), y una foto de barco aún no copiada a nuestro almacenamiento se redimensiona a través de wsrv. El widget de ubicaciones también dibuja un mapa estático de sus resultados desde charter.boats/api/ai/map, con pines numerados como las tarjetas debajo — el token de Mapbox permanece en nuestro servidor, y search_pois no tiene widget — sus valores image_url se pasan tal como están almacenados (algunos en nuestro bucket de almacenamiento, muchos en la dirección propia de un sitio de terceros: un sitio de reseñas, el sitio web de un lugar, una guía local), y nada los renderiza dentro de un widget.
  • Implementan el protocolo de enlace completo de MCP Apps: sandbox-resource-ready → ui/initialize (con protocolVersion, appInfo, appCapabilities) → ui/notifications/initialized → renderizar en ui/notifications/tool-result.
  • Reportan altura a través de ui/notifications/size-changed, medida desde body.scrollHeight / #app (el elemento del documento devuelve 0 dentro del sandbox de Claude).
  • Enrutan los clics de enlaces a través de ui/open-link ya que los iframes en sandbox bloquean target="_blank".
  • Respetan el tema del host: theme: 'dark' | 'light' explícito de host-context-changed anula el respaldo CSS prefers-color-scheme.

Instalación

Para usuarios finales: abre https://charter.boats/mcp en cualquier navegador — la página tiene pasos de instalación de copiar y pegar para Claude.ai, Claude Desktop, ChatGPT, Cursor y MCP Inspector.

Referencia rápida

Claude.ai / Claude Desktop: Configuración → Conectores → Añadir conector personalizado → https://charter.boats/mcp (se requiere Pro/Max/Team/Enterprise).

ChatGPT: Configuración → Apps → Crear app → Servidor MCP → https://charter.boats/mcp. El renderizado de widgets requiere el programa ChatGPT Apps; el modo Desarrollador muestra las llamadas de herramientas solo como texto.

Cursor: añade a ~/.cursor/mcp.json:

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

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

Límites de velocidad

Las llamadas de herramientas están sujetas al límite de velocidad sin clave /api/ai/*, contado en la IP que llama a /mcp — el servidor reenvía esa dirección, por lo que cada llamante está limitado por su cuenta, no agrupado con todos los demás usuarios de MCP. Claude y ChatGPT, que llaman desde los rangos de direcciones publicados de Anthropic y OpenAI, se cuentan por plataforma en lugar de por IP (consulta Límites de velocidad). No reenvía ninguna clave. Una llamada limitada aparece como un error de herramienta (API 429) cuyo mensaje enlaza a la misma búsqueda en charter.boats.

Diferencias con el GPT personalizado

Ambas integraciones llaman a los mismos endpoints /api/ai/* pero los exponen de manera diferente:

CaracterísticaGPT personalizado (Acciones)Servidor MCP
ProtocoloOpenAPI 3.1Model Context Protocol (Streamable HTTP)
Interfaz enriquecidaNoSí — widgets de barcos + ubicaciones
TransporteHTTPSJSON-RPC sobre HTTP
Estado de sesiónID de conversación de GPTSin estado por solicitud
Límite de velocidadHasta 30 / 10 min por usuario de OpenAI, más el límite diario por IPPor IP llamante — consulta Límites de velocidad
HostsSolo ChatGPTClaude, ChatGPT Apps, Cursor, Continue, cualquier cliente MCP