# GetExperience MCP server

Search and book tours and travel experiences in 40+ countries via MCP.

## Links
- Registry page: https://www.getdrio.com/mcp/io-github-skurakov-getexperience
- Repository: https://github.com/SKurakov/getexperience-mcp

## Install
- Endpoint: https://getexperience.com/mcp
- Auth: Not captured

## Setup notes
- Remote header: X-Api-Key (secret)
- Remote endpoint: https://getexperience.com/mcp
- Header: X-Api-Key

## Tools
- search_experiences - Search for tours and experiences on GetExperience.com. Returns list of matching experiences with id, title, price, location, duration, rating, payment type, photos, booking link.

BOOKING FLOW: search_experiences → get_experience_details → get_experience_schedule → add_to_checkout → create_order

EXAMPLES:
- "walking tour in Istanbul" → location: "Istanbul", categories: ["walking-tour"]
- "romantic dinner in Paris" → location: "Paris", categories: ["romantic", "food-and-drink"]
- "things to do in Bali" → location: "Bali"
- "водные виды спорта в Анталье" → location: "Antalya", categories: ["water-sports"]
- "short private tour with free cancellation" → privateGroup: true, standardCancellation: true, durations: ["10-60"]
- "tours with partial payment in Turkey" → countryCode: "TR", paymentOptions: "part"
- "yacht party" → q: "yacht party"
- "tours for solo traveler" → peopleMin: 1
- "tours with transport included" → features: ["transport"]

All prices are in USD.

SEARCH TIPS:
- location: use English name for best results (e.g. "Istanbul" not "Стамбул"). Non-Latin input is supported but English is more reliable.
- If location is not found, you'll get a clear error — not random results. Try a broader location (country instead of city).
- "languages" filters tours by guide language (["es"] = tours in Spanish)
- "lang" sets the language of titles and descriptions in the response
- All filters can be combined: location + categories + paymentOptions + durations + standardCancellation etc.
- "q" is a free-text search across titles and descriptions — use it for specific queries that don't fit into categories.

━━━ PAGINATION ━━━
Results are paginated (default 25 per page). The response always shows the total count and which results you're viewing (e.g. "showing 1–25 of 80"). If there are more results, ALWAYS offer the user to see the next page. Use page parameter to fetch subsequent pages.

━━━ HOW TO DISPLAY RESULTS AS CARDS ━━━
Every response includes a [GXP_STRUCTURED] block with structured JSON — use it to render rich experience cards in your UI instead of parsing markdown text.

Parse it with:
  const match = text.match(/\[GXP_STRUCTURED\]([\s\S]*?)\[\/GXP_STRUCTURED\]/);
  const data = match ? JSON.parse(match[1].trim()) : null;
  // → data.items[] — each item has: id, title, price, priceCents, location,
  //   durationMinutes, rating, reviewsCount, mainPhoto, photos[], paymentOptions, link

To get pure JSON without markdown: set responseFormat: "json" Endpoint: https://getexperience.com/mcp
- get_experience_details - Get full details of a specific experience by ID.

Call when: the user wants to learn more about a tour before booking, or to confirm full description, photos, pricing and availability options.
Call after search_experiences — use id from search results.

All prices are in USD.

RETURNS: full description, all photos, price breakdown, duration, guide languages, group size limits, categories, rating, cancellation policy, payment options, included features, booking link.

⚠️ CANCELLATION POLICY — MANDATORY DISCLOSURE:
The response includes cancellationPolicy field. You MUST clearly communicate it to the user when presenting experience details. Examples:
- Strict policy: "Please note: this experience has a strict cancellation policy — no refunds after booking."
- Flexible policy: "Good news — free cancellation up to 24 hours before the experience."
- If cancellationPolicy is null or empty: "Cancellation policy is not specified — we recommend contacting the host before booking."
Always present this BEFORE the user proceeds to booking.

💰 PARTIAL PAYMENT — PROACTIVE SUGGESTION:
The response includes paymentOptions field (["full"] or ["full", "part"]). If "part" is available, you MUST proactively tell the user: "This experience offers partial payment — you can pay a deposit now and the rest on site." Show the deposit amount (from prepay fields) vs the total price. When the user proceeds to booking, ask them: "Would you like to pay the full amount or just the deposit?"

[GXP_STRUCTURED] block: data.item — single experience object with all fields including cancellationPolicy, paymentOptions, features, onDemand.
Parse: const match = text.match(/\[GXP_STRUCTURED\]([\s\S]*?)\[\/GXP_STRUCTURED\]/); const data = JSON.parse(match[1].trim()); Endpoint: https://getexperience.com/mcp
- get_experience_schedule - Get available time slots for a specific experience on a specific date. Required step before booking.

CRITICAL: Copy configId and startAt EXACTLY from the chosen slot — pass these unchanged to add_to_checkout. Do not modify or recalculate these values. Copy durationMinutes when the slot provides it; if the slot returns durationMinutes as null (common for on-demand or flexible schedules), you may omit it from add_to_checkout — the server will fill it in from the experience's default duration.

All prices are in USD.

RETURNS: available slots with configId, startAt (ISO datetime), durationMinutes, price per adult / child / private group.

BOOKING FLOW: search_experiences → get_experience_schedule → add_to_checkout → create_order

[GXP_STRUCTURED] block: data.slots[] — array of available slots with all pricing details. Endpoint: https://getexperience.com/mcp
- get_checkout - Get current cart contents by sessionId.

Use when: you need to confirm what's in the cart before placing the order, or to retrieve checkoutId if it was not saved after add_to_checkout.

sessionId is returned by add_to_checkout — always save it.

RETURNS: checkoutId (required for create_order), list of items with titles and prices, total price, payment options.

💰 PARTIAL PAYMENT INFO:
If paymentOptions includes "part", the response shows:
- Total price (full amount)
- Pay now (deposit amount)
- Pay on site (remaining amount)
Present all three amounts to the user clearly. Before proceeding to create_order, ask: "Would you like to pay the full amount or just the deposit?"

[GXP_STRUCTURED] block: data.checkoutId, data.items[], data.totalPriceFormatted, data.paymentOptions, data.totalPrepayPriceFormatted, data.payLaterPriceFormatted. Endpoint: https://getexperience.com/mcp
- add_to_checkout - Add an experience to the cart. Call get_experience_schedule first and take configId, startAt from the chosen slot — pass them here EXACTLY as returned. Also pass durationMinutes when the slot provides it; if it is null, you may omit it and the server will substitute the experience's default duration.

RETURNS: sessionId, checkoutId, total price.
⚠️ SAVE sessionId — you will need it for get_checkout and create_order.
To add multiple experiences to the same cart: reuse the same sessionId in subsequent calls.

NEXT STEP: After adding to cart, call get_checkout to see full cart details including payment options. If partial payment is available, the checkout will show deposit amount vs total — present both to the user.

BOOKING FLOW: get_experience_schedule → add_to_checkout → get_checkout → create_order

[GXP_STRUCTURED] block: data.sessionId, data.checkoutId, data.totalPriceFormatted. Endpoint: https://getexperience.com/mcp
- create_order - Place the final booking order. Last step in the booking flow.

BOOKING FLOW: search → get_details → get_schedule → add_to_checkout → get_checkout → create_order

━━━ TWO PAYMENT MODES ━━━
The right one depends on whether you have an API key:

If you have an X-Api-Key (B2B partner integration):
  Use paymentSystem: "internal"
  Booking is confirmed instantly — no card payment needed.
  Payment is handled outside the platform (invoicing, prepaid balance, post-payment, etc.).
  You must provide guest details: user object with firstName, lastName, email, tel, countryCode.
  Result: order confirmed, host notified, booking is active immediately.

If you do NOT have an X-Api-Key (end-user booking):
  Use paymentSystem: "stripe"
  A payment link is generated — pass it to the guest to complete payment by card.
  You MUST provide guest details: user object with firstName, lastName, email, tel, countryCode.
  Result: order created with status "new" + paymentPageUrl. Share the payment link with the guest. The booking becomes active after payment. Link expires in 24 hours.

NOTE: If an X-Api-Key is present but you pass "stripe", the server will automatically switch to "internal" — B2B partners always go through internal payment.

⚠️ CANCELLATION POLICY REMINDER — MANDATORY BEFORE PAYMENT:
Before calling create_order, you MUST remind the user about the cancellation policy (from get_experience_details response). If the policy is strict (no refunds), explicitly warn: "Once you pay, this booking cannot be canceled or refunded." If flexible, reassure them. If unknown, advise checking with the host. Do NOT proceed to payment without this disclosure.

💰 PAYMENT TYPE CHOICE — ASK BEFORE ORDERING:
Check paymentOptions from get_checkout or get_experience_details. If "part" is available, you MUST ask the user before placing the order: "Would you like to pay the full amount ($X) or just the deposit ($Y) and pay the rest on site?" Then pass the chosen paymentType ("full" or "part") to create_order.
━━━━━━━━━━━━━━━━━━━━━━━━━

[GXP_STRUCTURED] block: data.orderId, data.status, data.priceFormatted, data.paymentType, data.paidAmountFormatted, data.link, data.paymentSystem, data.paymentPageUrl, data.paymentData. Endpoint: https://getexperience.com/mcp

## Resources
Not captured

## Prompts
Not captured

## Metadata
- Owner: io.github.SKurakov
- Version: 0.6.0
- Runtime: Sse
- Transports: HTTP
- License: Not captured
- Language: Not captured
- Stars: Not captured
- Updated: Mar 15, 2026
- Source: https://registry.modelcontextprotocol.io
