Treeple para agentes de IA

Treeple organiza tours guiados en Kazajistán. Esta página describe cómo un agente de IA puede leer el catálogo y entregar una solicitud de reserva a un humano en nombre de un viajero. Sin registro, sin clave API, sin OAuth.

Servidor MCP

Un servidor remoto del Protocolo de Contexto de Modelo sobre HTTP Streamable. Apunte cualquier cliente compatible con MCP a:

https://mcp.treeple.kz/mcp

Para Claude Desktop, Claude Code y clientes similares:

{
  "mcpServers": {
    "treeple": {
      "type": "http",
      "url": "https://mcp.treeple.kz/mcp"
    }
  }
}
  • search_toursBusque el catálogo por texto, tipo o duración.
  • get_tourItinerario, inclusiones, punto de encuentro, política de cancelación y la tabla de precios completa.
  • get_availabilityFechas de salida, u honestamente «on_request» cuando un tour no tiene calendario fijo.
  • get_quoteUn precio exacto para un grupo y fecha concretos, válido hasta la marca de tiempo que devuelve.
  • create_booking_sessionConvierte una cotización en un enlace de pago en treeple.kz, donde el viajero introduce sus propios datos de contacto.
  • get_booking_statusEl estado de una reserva, consultado por su token. No hay consulta por correo electrónico ni por teléfono.
  • submit_booking_requestEntrega una solicitud a un gerente humano. No es una reserva y no realiza ningún pago.
  • search_contentLugares para visitar, restaurantes, artículos de viaje y categorías de tours: el mismo motor de búsqueda que usa el sitio.
  • get_contentUn lugar, restaurante, artículo o categoría completo. Un lugar también muestra los tours que realmente lo visitan.

API REST

El servidor MCP es un envoltura delgada sobre esta API — puede llamarla directamente. Especificación OpenAPI 3.1:

https://backend.treeple.kz/api/v1/agent/openapi.json

Busque el catálogo:

curl "https://backend.treeple.kz/api/v1/agent/tours?lang=en&q=canyon&limit=5"

Enviar solicitud de reserva:

curl -X POST "https://backend.treeple.kz/api/v1/agent/booking-requests" \
  -H "Content-Type: application/json" \
  -d '{
    "tour_slug": "charyn-canyon-tour-1-day",
    "date": "2026-09-15",
    "pax": { "adults": 2, "children": 0 },
    "lang": "en",
    "contact": { "email": "traveller@example.com" },
    "idempotency_key": "3f6d6d2e-4a1f-4c2b-9c3a-1a2b3c4d5e6f"
  }'

Un feed de productos plano de todo el catálogo está disponible en:

https://backend.treeple.kz/api/v1/agent/feed.json

Más allá de los tours

No todas las preguntas son sobre reservas. Estos conteos reflejan lo que realmente contiene el catálogo; un agente que prometa más está inventando.

  • locations116 lugares para visitar, todos con coordenadas. Cada uno muestra los tours que lo visitan; una lista seleccionada, así que una vacía significa que Treeple no vende tours allí.
  • tour_types16 categorías de tours, cada una con el número de tours publicados detrás.
  • restaurants5 restaurantes — cuatro en Almaty, uno en Astana. Cocina, rango de precios, dirección, horario de apertura. Sin coordenadas: el catálogo no las tiene, así que no se devuelve ningún campo.
  • articles6 artículos de viaje escritos por Treeple.
curl "https://backend.treeple.kz/api/v1/agent/content/locations?lang=en&q=Kolsai"
curl "https://backend.treeple.kz/api/v1/agent/content/locations/natspark-kolsay?lang=en"

Qué tan reciente es esto

El sitio se reconstruye automáticamente cuando cambia el catálogo. Cuándo se tomó la instantánea detrás de estas páginas es público:

https://treeple.kz/catalogue-status.json

Campos devueltos para un tour

Estos son los nombres exactos de los campos en la respuesta de get_tour y GET /tours/{slug} — no una paráfrasis. La versión autoritativa es la especificación OpenAPI enlazada arriba.

{
  "slug":              "localised, differs per language",
  "canonical_slug":    "stable identifier, same in every language",
  "title", "summary", "description", "url",
  "duration_days" | "duration_nights" | "duration_hours", "duration_label",
  "types":             ["trekking", "culture", ...],
  "price":             { "basis": "per_person", "currency", "from",
                         "by_group_size": [{ "pax", "price_per_person" }] },
  "itinerary":         [{ "day", "title", "description" }],
  "included":          ["what the price covers"],
  "excluded":          ["what it does not"],
  "meeting_place":     "text",
  "suitable_for", "not_suitable_for", "difficulty", "min_age", "max_age",
  "cancellation_policy": { "source": "tour" | "site_default",
                           "deadline_hours", "service_fee_percent",
                           "tiers": [{ "hours_before_start", "refund_percent" }] },

  "guide_languages":   { "live": [...], "audio": [...] },   // what the GUIDE speaks
  "content_languages": [...],                               // locales the PAGE is published in
  "confirmation_type": "instant" | "manual",
  "availability_type": "scheduled" | "on_request",
  "group":             { "type", "minimum_pax", "maximum_pax" },
  "operator":          "text"
}

Un campo ausente en la respuesta significa que Treeple no tiene datos para él. No significa cero, ninguno ni un valor predeterminado — indíquelo en lugar de asumirlo. Por eso minimum_pax aparece solo en los tours que realmente tienen una regla de salida mínima, y por eso no existe ningún campo payment_policy.

Existen dos campos de idioma y significan cosas distintas. guide_languages es lo que realmente habla el guía; content_languages solo indica en qué locales se publica esta página web. Nunca responda “¿hay un guía que hable X?” usando content_languages.

Cosas que de otra manera te confundirían

  • Los precios son por persona y cambian según el tamaño del grupo. Cada precio tiene una tabla by_group_size — cite la fila que coincida con el grupo real, no la cifra «from». La cifra «from» solo vale para el tamaño de grupo de min_group_size_for_from: en la excursión de un día a Charyn son $30 con quince viajeros, mientras que dos personas pagan $155 cada una.
  • Los slugs del tour difieren por idioma. canonical_slug es el identificador estable; pase lang explícitamente.
  • «on_request» significa que la fecha se acuerda individualmente, no que el tour esté agotado.
  • Las solicitudes de reserva no se pueden releer. Un gerente se pone en contacto con el viajero directamente; no hay estado para sondear. Esto es intencional — es lo que evita que nadie enumere las solicitudes de otras personas.
  • Exactamente un canal de contacto por solicitud: correo electrónico, teléfono o Telegram. No se recopilan nombres, documentos ni detalles de pago.
  • Cada solicitud de reserva necesita una clave de idempotencia UUID. Repetirla dentro de 24 horas devuelve la solicitud original en lugar de crear un segundo lead, por lo que un reintento después de un tiempo de espera siempre es seguro.

Límites de velocidad

  • 60 solicitudes de lectura por minuto por IP.
  • 5 solicitudes de reserva por minuto y 20 por día por IP.
  • Por encima del límite obtiene 429 con un encabezado Retry-After. Honralo.
  • No se requiere clave API. Los socios pueden solicitar un X-Agent-Key para límites más altos.

Privacidad

Una solicitud de reserva lleva exactamente un canal de contacto y nada más. Los valores de contacto y las direcciones IP nunca se escriben en registros o análisis en texto sin cifrar — solo hashes salados, utilizados para fusionar solicitudes duplicadas. No hay punto final que devuelva una solicitud de reserva, por lo que nadie puede enumerar las consultas de otras personas.

Descubrimiento

¿Preguntas o necesita límites de velocidad más altos para una integración de socio? Escribir a support@treeple.kz.