GetExperience MCP server

Search and book tours and experiences from any AI assistant. Version 0.7.13.

Connect

Server URLhttps://getexperience.com/mcp
TransportStreamable HTTP
ProtocolModel Context Protocol

Authentication

Browsing needs no account. Search, details, schedules and availability requests work anonymously — nothing to configure, nothing to sign.

Booking asks for a sign-in, at the moment it is needed. Call a booking tool without a token and the server answers 401 with a WWW-Authenticate header pointing at its resource metadata; the client then runs the OAuth flow, the person signs in and approves the scopes, and the call is retried. Bookings made this way belong to that account: they appear in the traveller's profile with their confirmations, and access can be revoked at any time under Settings → Connected applications.

Clients register themselves (RFC 7591) — no client id to paste by hand. The registration endpoint is published in the authorization-server metadata:

GET https://getexperience.com/.well-known/oauth-authorization-server
GET https://getexperience.com/.well-known/oauth-protected-resource

Clients are public and use PKCE (S256); there is no client secret. Scopes: experiences:read, checkout:write, bookings:write.

Business integrations that book on behalf of their own guests use an X-Api-Key header instead of a user sign-in. Ask [email protected] for a key.

Payments

The assistant never handles card details. An order is created unpaid and the traveller completes payment themselves on a secure checkout page; an unpaid order reserves nothing and notifies nobody. Cancellation and refund terms are the same as on the website.

Tools

search_experiences read-only

Search experiences

Search for tours and experiences on GetExperience.com. Works without an account or authentication. Returns list of matching experiences with id, title, price, location, duration, rating, payment type, photos, booking link.

ParameterTypeDescription
qstringoptionalFree-text search query (e.g. 'romantic sunset dinner', 'yacht party'). Searches in titles and descriptions. Can be combined with other filters.
locationstringoptionalCity, country, or region name. Use English for best results (e.g. 'Istanbul', 'Bali', 'Spain'). Non-Latin input supported but less reliable.
categoriesarrayoptionalFilter by activity type using category slugs. Categories have two levels:
minPricenumberoptionalMinimum price in USD (not cents). E.g. 50 = $50.
maxPricenumberoptionalMaximum price in USD (not cents). E.g. 200 = $200.
dateFromstringoptionalStart date in YYYY/MM/DD format (e.g. 2026/03/08).
dateTostringoptionalEnd date in YYYY/MM/DD format (e.g. 2026/03/15).
guestsCountnumberoptionalNumber of guests.
durationsarrayoptionalFilter by duration ranges in minutes. E.g. ['10-60'] for under 1 hour, ['60-180'] for 1-3 hours, ['180-480'] for half-day, ['480-1440'] for full day. Multiple ranges allowed.
privateGroupbooleanoptionaltrue = only experiences available as private tours.
publicGroupbooleanoptionaltrue = only experiences available as group tours.
tagsarrayoptionalFilter by experience tags.
perPagenumberoptionalResults per page (default: 25, max: 100).
pagenumberoptionalPage number for pagination (default: 1).
languagesarrayoptionalFilter by guide language — language the tour is conducted in (e.g. ['en'], ['en', 'es']). Supported: en, es, de, ru, fr, it, tr, ar, zh, ja, ko, pt.
langstringoptionalLanguage of response content (titles, descriptions). ALWAYS set this to the language the END USER wrote their request in — e.g. Russian query → 'ru', Turkish → 'tr', Arabic → 'ar', Spanish → 'es'. Set it regardless of the language used for other parameters (location is often in English). Supported: en, es, de, ru, cn, fr, ar, pl, it, pt, nl, tr, cs, th, gr. Falls back to 'en' if omitted or if the user's language is not in this list. Do NOT confuse with 'languages' (that filters tours by guide language).
responseFormatmarkdown | jsonoptionalmarkdown (default): chat-friendly text + [GXP_STRUCTURED] block for card rendering. json: pure JSON only, no markdown — for programmatic parsing. (default: markdown)
includeStructuredDatabooleanoptionalInclude [GXP_STRUCTURED] JSON block in markdown response (default: true). Set false for plain text only. (default: true)
paymentOptionsfull | partoptionalFilter by payment type. 'full' = only full payment, 'part' = only experiences with partial payment (pay deposit now, rest later).
featuresarrayoptionalFilter by what's included. Values: guide, transport, entranceFee, transfer, equipment, accommodation, meals, alcoholicDrinks, nonAlcoholicDrinks, insurance, gratuities, snacks.
onDemandbooleanoptionaltrue = only on-demand experiences (book by request). false = only scheduled experiences (fixed timetable).
peopleMinnumberoptionalYour group size. Filters out experiences that require more people. E.g. peopleMin=1 for solo traveler — hides tours with minimum 4 guests.
countryCodestringoptionalISO 3166-1 alpha-2 country code (e.g. 'TR' for Turkey, 'ES' for Spain). Filters by country directly.
standardCancellationbooleanoptionaltrue = only experiences with standard cancellation policy (free cancellation 24h before start).

get_experience_details read-only

Get experience details

Get full details of a specific experience by ID.

ParameterTypeDescription
idnumberrequiredExperience ID from search_experiences results.
langstringoptionalLanguage of response content (title, description, highlights, itinerary, etc.). ALWAYS set this to the language the END USER wrote in — the same value you used in search_experiences. Supported: en, es, de, ru, cn, fr, ar, pl, it, pt, nl, tr, cs, th, gr. Falls back to 'en' if omitted or if the user's language is not in this list.
responseFormatmarkdown | jsonoptionalmarkdown (default): text + [GXP_STRUCTURED]. json: pure JSON only. (default: markdown)
includeStructuredDatabooleanoptionalInclude [GXP_STRUCTURED] JSON block in markdown response (default: true). (default: true)

get_experience_schedule read-only

Get experience schedule

Get available time slots for a specific experience on a specific date. Required step before booking.

ParameterTypeDescription
idnumberrequiredExperience ID from search_experiences or get_experience_details.
datestringrequiredDate in YYYY/MM/DD or YYYY-MM-DD format (e.g. 2026/03/08). Must be a future date.
responseFormatmarkdown | jsonoptionalmarkdown (default): text + [GXP_STRUCTURED]. json: pure JSON only. (default: markdown)
includeStructuredDatabooleanoptionalInclude [GXP_STRUCTURED] JSON block in markdown response (default: true). (default: true)

get_checkout read-only

Get checkout

Get current cart contents by sessionId.

ParameterTypeDescription
sessionIdstringrequiredSession ID returned by add_to_checkout. Used to identify the cart.
responseFormatmarkdown | jsonoptionalmarkdown (default): text + [GXP_STRUCTURED]. json: pure JSON only. (default: markdown)
includeStructuredDatabooleanoptionalInclude [GXP_STRUCTURED] JSON block in markdown response (default: true). (default: true)

add_to_checkout writes data

Add to checkout

Add an experience to the cart. Requires a connected GetExperience account: without user authorization the call is answered with an OAuth sign-in challenge (HTTP 401, or a tool error carrying the challenge on clients that link accounts per tool) — connect the account 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.

ParameterTypeDescription
sessionIdstringoptionalSession ID. If omitted, a new session is created automatically — save the returned sessionId. Reuse to add more items to the same cart.
experienceIdnumberrequiredExperience ID from search_experiences or get_experience_details.
scheduleConfigIdnumberrequiredconfigId from get_experience_schedule slot. Copy the exact value — do not modify.
startAtstringrequiredstartAt from get_experience_schedule slot (ISO datetime). Copy the exact value — do not modify.
durationMinutesnumberoptionaldurationMinutes from the get_experience_schedule slot, if provided. Optional — omit if the slot's durationMinutes is null and the server will fall back to the experience's default duration.
adultsnumberoptionalNumber of adults (default: 1). (default: 1)
childrennumberoptionalNumber of children (default: 0). (default: 0)
babiesnumberoptionalNumber of babies (default: 0). (default: 0)
isPrivatebooleanoptionalPrivate group booking — higher price, exclusive slot (default: false). (default: false)
currencystringoptionalPricing currency: EUR, USD, etc. (default: USD). (default: USD)
responseFormatmarkdown | jsonoptionalmarkdown (default): text + [GXP_STRUCTURED]. json: pure JSON only. (default: markdown)
includeStructuredDatabooleanoptionalInclude [GXP_STRUCTURED] JSON block in markdown response (default: true). (default: true)

create_order writes data

Create order

Requires a connected GetExperience account: without user authorization the call is answered with an OAuth sign-in challenge (HTTP 401, or a tool error carrying the challenge on clients that link accounts per tool) — connect the account 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.

ParameterTypeDescription
checkoutIdnumberrequiredCheckout ID from add_to_checkout or get_checkout.
paymentSysteminternal | stripeoptionalUse 'internal' if you have an X-Api-Key (B2B instant booking, user data required). Use 'stripe' if no API key (B2C, returns payment link). If API key is present and you pass 'stripe', it will be switched to 'internal' automatically.
userobjectoptionalGuest contact details. B2B (X-Api-Key): REQUIRED — the guest you book for (firstName, lastName, email, tel, countryCode). End-user (OAuth-connected): OMIT — identity comes from the connected account; pass only { tel, countryCode } if the server reported the account has no phone on file.
paymentTypefull | partoptionalPayment type. 'full' (default) = pay entire amount now. 'part' = pay deposit now, rest on site. Must be allowed by the experience: the API rejects a type missing from paymentOptions (422) — including 'full' on part-only tours, where you MUST pass 'part'. Check paymentOptions in get_checkout or get_experience_details. (default: full)
apiKeystringoptionalX-Api-Key for B2B (internal) payment. Can be set once as a header at connection time, or passed here per request. Not required for stripe.
responseFormatmarkdown | jsonoptionalmarkdown (default): text + [GXP_STRUCTURED]. json: pure JSON only. (default: markdown)
includeStructuredDatabooleanoptionalInclude [GXP_STRUCTURED] JSON block in markdown response (default: true). (default: true)

request_availability writes data

Request availability

Send an availability request to the host of an ON-DEMAND experience.

ParameterTypeDescription
experienceIdnumberrequiredExperience ID from search_experiences / get_experience_details. Must be an on-demand experience.
periodStartstringrequiredPreferred start date, YYYY/MM/DD or YYYY-MM-DD (e.g. 2026/07/15). Must be in the future.
periodEndstringoptionalPreferred end date, YYYY/MM/DD or YYYY-MM-DD. Defaults to periodStart for a single-day request.
adultsnumberrequiredNumber of adults. At least one guest (adult or child) is required in total.
childrennumberoptionalNumber of children (default: 0).
babiesnumberoptionalNumber of babies (default: 0).
namestringrequiredGuest's name. REQUIRED — ask the user.
emailstringrequiredGuest's email. REQUIRED — the host's answer (confirm/decline + booking link) is delivered here and to the guest's account. Ask the user.
telstringoptionalGuest's phone (optional).
commentstringoptionalGuest's wishes / notes for the host (optional). E.g. preferred time of day, special requests.
responseFormatmarkdown | jsonoptionalmarkdown (default): text + [GXP_STRUCTURED]. json: pure JSON only. (default: markdown)
includeStructuredDatabooleanoptionalInclude [GXP_STRUCTURED] JSON block in markdown response (default: true). (default: true)

Support

Questions, API keys, anything else: [email protected] · getexperience.com