Connection check
verified live · 27h ago
getexperience
Search and book tours and travel experiences in 40+ countries via MCP.
Tools
7
GitHub stars
—
Installs / wk
—
Licence
—
Transport
sse
Last checked
27h ago
Tools & capabilities
7 toolsRead from the running server on 27h ago.
add_to_checkout
adultsbabiesstartAt*childrencurrencyisPrivate
+6
Add an experience to the cart. Requires a connected GetExperience account: without user authorization this call returns HTTP 401 — complete the OAuth connect flow and retry (B2B pa… Add an experience to the cart. Requires a connected GetExperience account: without user authorization this call returns HTTP 401 — complete the OAuth connect flow and retry (B2B partners authenticating with their partner API key (X-Api-Key header, or Authorization: Bearer) are exempt). 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 PRICE BREAKDOWN: catalog prices (search/details/schedule) are WITHOUT the service fee; the checkout total is WITH it. When the response includes the breakdown, it shows Subtotal (excl. service fee) + Service fee = Total — present all three lines to the user. If the response has only Total (older deployments / breakdown unavailable), show just the Total — NEVER invent or compute the split yourself. [GXP_STRUCTURED] block: data.sessionId, data.checkoutId, data.subTotalPrice(+Formatted), data.totalServiceFee(+Formatted), data.totalPrice(+Formatted).
create_order
can modify data
userapiKeycheckoutId*paymentTypepaymentSystemresponseFormat
+1
Requires a connected GetExperience account: without user authorization this call returns HTTP 401 — complete the OAuth connect flow and retry (B2B partners authenticating with thei… Requires a connected GetExperience account: without user authorization this call returns HTTP 401 — complete the OAuth connect flow and retry (B2B partners authenticating with their partner API key (X-Api-Key header, or Authorization: Bearer) are exempt). 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 user to complete payment by card. The user must be connected (OAuth); anonymous calls get 401. Do NOT ask for guest details and do NOT pass a user object: the booking is attributed to the connected GetExperience account automatically — name and e-mail come from the account, and GetExperience e-mails the confirmation and voucher to the account address (hosts never e-mail guests directly). The ONLY detail that can be missing is a phone number: if the account has none on file, the server rejects the order asking for user.tel — only then ask the user for their phone and retry with user: { tel: "+34...", countryCode: "ES" }. The number is saved to their account, so this happens at most once. Result: order created with status "new" + paymentPageUrl. Share the payment link with the user. 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.
get_checkout
read-only
sessionId*responseFormatincludeStructuredData
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_check… 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?" PRICE BREAKDOWN: catalog prices (search/details/schedule) are WITHOUT the service fee; the checkout total is WITH it. When the response includes the breakdown, it shows Subtotal (excl. service fee) + Service fee = Total — present all three lines to the user. If the response has only Total (older deployments / breakdown unavailable), show just the Total — NEVER invent or compute the split yourself. [GXP_STRUCTURED] block: data.checkoutId, data.items[], data.subTotalPrice(+Formatted), data.totalServiceFee(+Formatted), data.totalPrice(+Formatted), data.paymentOptions, data.totalPrepayPriceFormatted, data.payLaterPriceFormatted.
get_experience_details
read-only
id*langresponseFormatincludeStructuredData
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 availabil… 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. ━━━ HOW TO PRESENT THIS EXPERIENCE ━━━ DEFAULT PRESENTATION — a rich card, not a wall of text. The response carries a [GXP_STRUCTURED] block: lead with the photos (photos[] is the gallery, mainPhoto the hero image), then title, price, duration, rating, what's included, the cancellation line above, and a link/button to the "link" field. Photo URLs are public CDN links usable directly in <img> tags. Fall back to the markdown text only on text-only surfaces or when the user asks for plain text. The card format never removes a required disclosure: the cancellation policy and, when partial payment is available, the deposit option must still be stated (see the sections above). 💰 PARTIAL PAYMENT — PROACTIVE SUGGESTION: The response includes paymentOptions (["full"], ["part"] or ["full", "part"]). If "part" is present, you MUST proactively tell the user: "This experience offers partial payment — you can pay a deposit now and the rest on site." The deposit is in prepayPrice (display string) / prepayPriceCents (number) in the structured item — show it next to the total price. If paymentOptions is ["part"] only, full online payment is NOT available: pass paymentType: "part" to create_order (the API rejects "full" for such tours). When both options exist, ask the user: "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, prepayPrice(+Cents), features, onDemand. Parse: const match = text.match(/\[GXP_STRUCTURED\]([\s\S]*?)\[\/GXP_STRUCTURED\]/); const data = JSON.parse(match[1].trim());
get_experience_schedule
read-only
id*date*responseFormatincludeStructuredData
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… 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. Each slot exposes price per adult / child / private group in two formats: - numeric USD values: priceAdult, priceChild, pricePrivateGroup (for arithmetic — e.g. priceAdult * adults) - formatted display strings: priceAdultFormatted, priceChildFormatted, pricePrivateGroupFormatted (e.g. "US$45.00", for display) - partial payment: prepayPriceFrom (deposit, USD number) + prepayPricePublicFormatted / prepayPricePrivateGroupFormatted; null when the tour is full-payment only 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.
request_availability
telname*email*adults*babiescomment
+6
Send an availability request to the host of an ON-DEMAND experience. Call when: an experience is "available on request" (onDemand: true in search/details, or get_experience_schedu… Send an availability request to the host of an ON-DEMAND experience. Call when: an experience is "available on request" (onDemand: true in search/details, or get_experience_schedule says "available on request") and the user wants it for specific dates. On-demand experiences CANNOT be booked instantly — the host must confirm availability first. This tool sends the request; it does NOT create a booking or charge anyone. Do NOT call for instant-booking experiences (onDemand: false) — use get_experience_schedule → add_to_checkout → create_order instead. The tool rejects non-on-demand experiences with an error. BEFORE calling, collect from the user: preferred dates, number of guests, their NAME and EMAIL (required — the host's answer is delivered to this email and to the guest's account in the app where the request was made; without email the guest never learns the result). WHAT HAPPENS NEXT (tell the user): 1. The host reviews the request, usually within 24–48 hours. 2. The guest gets the answer by email and in their account. 3. If confirmed — the answer contains a booking link valid for 12 hours. 4. If declined — suggest other experiences nearby. There is no status-polling endpoint; the answer is delivered to the guest directly, not to this chat. ⚠️ Limit: up to 3 availability requests at a time per guest. [GXP_STRUCTURED] block: data.requestId, experienceId, dates, guests, hostResponseWindowHours, bookingWindowHoursAfterConfirm.
search_experiences
read-only
qlangpagetagsdateToperPage
+18