AI 에이전트를 위한 Treeple

Treeple은 카자흐스탄에서 가이드 투어를 운영합니다. 이 페이지에서는 AI 에이전트가 카탈로그를 읽고 여행자를 대신하여 인간에게 예약 요청을 제출하는 방법을 설명합니다. 등록 없음, API 키 없음, OAuth 없음.

MCP 서버

Streamable HTTP를 통한 원격 모델 컨텍스트 프로토콜 서버입니다. MCP 지원 클라이언트를 다음으로 지정합니다:

https://mcp.treeple.kz/mcp

Claude Desktop, Claude Code 및 유사한 클라이언트의 경우:

{
  "mcpServers": {
    "treeple": {
      "type": "http",
      "url": "https://mcp.treeple.kz/mcp"
    }
  }
}
  • search_tours텍스트, 유형 또는 기간별로 카탈로그를 검색합니다.
  • get_tour여정, 포함 사항, 집합 지점, 취소 정책 및 전체 가격표.
  • get_availability출발 날짜 또는 투어에 고정 캘린더가 없을 때 성실하게 « on_request ».
  • get_quote지정된 그룹과 날짜에 대한 정확한 가격이며, 반환된 시각까지 유효합니다.
  • create_booking_session견적을 treeple.kz의 결제 링크로 전환하며, 여행자가 자신의 연락처 정보를 입력합니다.
  • get_booking_status토큰으로 조회되는 하나의 예약 상태입니다. 이메일이나 전화번호로는 조회할 수 없습니다.
  • submit_booking_request요청을 인간 관리자에게 제출합니다. 예약이 아니며 결제를 처리하지 않습니다.
  • search_content볼거리, 레스토랑, 여행 기사, 투어 카테고리 — 사이트가 사용하는 것과 같은 검색 엔진입니다.
  • get_content하나의 볼거리, 레스토랑, 기사 또는 카테고리를 전체로 제공합니다. 볼거리에는 실제로 방문하는 투어도 함께 표시됩니다.

REST API

MCP 서버는 이 API의 얇은 래퍼입니다 — 직접 호출할 수 있습니다. OpenAPI 3.1 사양:

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

카탈로그 검색:

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

예약 요청 제출:

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"
  }'

전체 카탈로그의 플랫 제품 피드는 다음에서 사용 가능합니다:

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

투어 외

모든 질문이 예약에 관한 것은 아닙니다. 이 수치는 카탈로그에 실제로 있는 항목 수입니다. 이것보다 많다고 말하는 상담원은 사실을 지어내는 것입니다.

  • locations좌표가 포함된 볼거리 116곳입니다. 각 항목에는 해당 장소를 방문하는 투어가 표시됩니다. 선별된 목록이므로 비어 있다면 Treeple가 그곳의 투어를 판매하지 않는다는 뜻입니다.
  • tour_types16개의 투어 카테고리이며, 각 카테고리에는 게시된 투어 수가 표시됩니다.
  • restaurants레스토랑 5곳 — 알마티 4곳, 아스타나 1곳. 요리, 가격대, 주소, 영업시간. 좌표 없음: 카탈로그에 저장되어 있지 않아 해당 필드는 반환되지 않습니다.
  • articlesTreeple가 작성한 여행 기사 6개입니다.
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"

최신성

카탈로그가 변경되면 사이트는 자동으로 재구성됩니다. 이 페이지의 스냅샷이 언제 생성되었는지는 공개되어 있습니다:

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

투어에 대해 반환되는 필드

이것들은 get_tour 및 GET /tours/{slug} 응답의 정확한 필드 이름입니다. 바꿔 말한 것이 아닙니다. 권위 있는 버전은 위에 링크된 OpenAPI 사양입니다.

{
  "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"
}

응답에 없는 필드는 Treeple에 해당 데이터가 없다는 뜻입니다. 0, 없음, 기본값을 의미하지 않습니다. 추정하지 말고 이렇게 말하세요. 그래서 minimum_pax는 실제로 최소 출발 규칙이 있는 투어에만 표시되며, payment_policy 필드는 아예 없습니다.

언어 필드는 두 개가 있고 의미가 다릅니다. guide_languages는 가이드가 실제로 구사하는 언어이고, content_languages는 이 웹페이지가 어떤 로케일로 게시되었는지입니다. content_languages로 “X를 구사하는 가이드가 있나요”라고 답하지 마세요.

그렇지 않으면 당신을 혼동시킬 것들

  • 가격은 1인당이며 그룹 크기에 따라 변합니다. 각 가격은 by_group_size 테이블을 포함합니다 — « from » 수치가 아닌 실제 그룹과 일치하는 행을 인용하십시오. « from » 수치는 min_group_size_for_from의 그룹 규모에서만 유효합니다. 차린 당일 투어는 15명일 때 1인 30달러, 2명일 때는 1인 155달러입니다.
  • 투어 슬러그는 언어에 따라 다릅니다. canonical_slug는 안정적인 식별자입니다. lang을 명시적으로 전달하세요.
  • « on_request »는 투어가 매진된 것이 아니라 날짜가 개별적으로 정렬됨을 의미합니다.
  • 예약 요청을 다시 읽을 수 없습니다. 관리자가 여행자에게 직접 연락합니다. 폴링할 상태가 없습니다. 이것은 의도적입니다 — 이것이 누군가 다른 사람의 요청을 열거하는 것을 방지합니다.
  • 요청당 정확히 하나의 연락처 채널: 이메일, 전화 또는 Telegram. 이름, 문서 또는 결제 세부 정보가 수집되지 않습니다.
  • 각 예약 요청에는 UUID idempotency 키가 필요합니다. 24시간 이내에 반복하면 두 번째 리드를 생성하는 대신 원래 요청이 반환되므로 시간 초과 후 재시도는 항상 안전합니다.

속도 제한

  • IP당 분당 60개의 읽기 요청.
  • IP당 분당 5개의 예약 요청 및 일일 20개.
  • 한계를 초과하면 Retry-After 헤더와 함께 429를 받습니다. 그것을 존중하세요.
  • API 키가 필요하지 않습니다. 파트너는 더 높은 제한을 위해 X-Agent-Key를 요청할 수 있습니다.

개인 정보 보호

예약 요청은 정확히 하나의 연락처 채널을 포함하고 다른 것은 없습니다. 연락처 값과 IP 주소는 로그 또는 분석에 평문으로 기록되지 않습니다 — 중복 요청을 병합하는 데 사용되는 소금에 절인 해시만 해당됩니다. 예약 요청을 반환하는 끝점이 없으므로 아무도 다른 사람의 쿼리를 열거할 수 없습니다.

발견

질문이 있거나 파트너 통합을 위해 더 높은 속도 제한이 필요하신가요? 다음에 작성하세요 support@treeple.kz.