Search and book tours and experiences from any AI assistant. Version 0.7.13.
| Server URL | https://getexperience.com/mcp |
| Transport | Streamable HTTP |
| Protocol | Model Context Protocol |
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.
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.
search_experiences read-onlySearch 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.
| Parameter | Type | Description | |
|---|---|---|---|
q | string | optional | Free-text search query (e.g. 'romantic sunset dinner', 'yacht party'). Searches in titles and descriptions. Can be combined with other filters. |
location | string | optional | City, country, or region name. Use English for best results (e.g. 'Istanbul', 'Bali', 'Spain'). Non-Latin input supported but less reliable. |
categories | array | optional | Filter by activity type using category slugs. Categories have two levels: |
minPrice | number | optional | Minimum price in USD (not cents). E.g. 50 = $50. |
maxPrice | number | optional | Maximum price in USD (not cents). E.g. 200 = $200. |
dateFrom | string | optional | Start date in YYYY/MM/DD format (e.g. 2026/03/08). |
dateTo | string | optional | End date in YYYY/MM/DD format (e.g. 2026/03/15). |
guestsCount | number | optional | Number of guests. |
durations | array | optional | Filter 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. |
privateGroup | boolean | optional | true = only experiences available as private tours. |
publicGroup | boolean | optional | true = only experiences available as group tours. |
tags | array | optional | Filter by experience tags. |
perPage | number | optional | Results per page (default: 25, max: 100). |
page | number | optional | Page number for pagination (default: 1). |
languages | array | optional | Filter 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. |
lang | string | optional | Language 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). |
responseFormat | markdown | json | optional | markdown (default): chat-friendly text + [GXP_STRUCTURED] block for card rendering. json: pure JSON only, no markdown — for programmatic parsing. (default: markdown) |
includeStructuredData | boolean | optional | Include [GXP_STRUCTURED] JSON block in markdown response (default: true). Set false for plain text only. (default: true) |
paymentOptions | full | part | optional | Filter by payment type. 'full' = only full payment, 'part' = only experiences with partial payment (pay deposit now, rest later). |
features | array | optional | Filter by what's included. Values: guide, transport, entranceFee, transfer, equipment, accommodation, meals, alcoholicDrinks, nonAlcoholicDrinks, insurance, gratuities, snacks. |
onDemand | boolean | optional | true = only on-demand experiences (book by request). false = only scheduled experiences (fixed timetable). |
peopleMin | number | optional | Your group size. Filters out experiences that require more people. E.g. peopleMin=1 for solo traveler — hides tours with minimum 4 guests. |
countryCode | string | optional | ISO 3166-1 alpha-2 country code (e.g. 'TR' for Turkey, 'ES' for Spain). Filters by country directly. |
standardCancellation | boolean | optional | true = only experiences with standard cancellation policy (free cancellation 24h before start). |
get_experience_details read-onlyGet experience details
Get full details of a specific experience by ID.
| Parameter | Type | Description | |
|---|---|---|---|
id | number | required | Experience ID from search_experiences results. |
lang | string | optional | Language 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. |
responseFormat | markdown | json | optional | markdown (default): text + [GXP_STRUCTURED]. json: pure JSON only. (default: markdown) |
includeStructuredData | boolean | optional | Include [GXP_STRUCTURED] JSON block in markdown response (default: true). (default: true) |
get_experience_schedule read-onlyGet experience schedule
Get available time slots for a specific experience on a specific date. Required step before booking.
| Parameter | Type | Description | |
|---|---|---|---|
id | number | required | Experience ID from search_experiences or get_experience_details. |
date | string | required | Date in YYYY/MM/DD or YYYY-MM-DD format (e.g. 2026/03/08). Must be a future date. |
responseFormat | markdown | json | optional | markdown (default): text + [GXP_STRUCTURED]. json: pure JSON only. (default: markdown) |
includeStructuredData | boolean | optional | Include [GXP_STRUCTURED] JSON block in markdown response (default: true). (default: true) |
get_checkout read-onlyGet checkout
Get current cart contents by sessionId.
| Parameter | Type | Description | |
|---|---|---|---|
sessionId | string | required | Session ID returned by add_to_checkout. Used to identify the cart. |
responseFormat | markdown | json | optional | markdown (default): text + [GXP_STRUCTURED]. json: pure JSON only. (default: markdown) |
includeStructuredData | boolean | optional | Include [GXP_STRUCTURED] JSON block in markdown response (default: true). (default: true) |
add_to_checkout writes dataAdd 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.
| Parameter | Type | Description | |
|---|---|---|---|
sessionId | string | optional | Session ID. If omitted, a new session is created automatically — save the returned sessionId. Reuse to add more items to the same cart. |
experienceId | number | required | Experience ID from search_experiences or get_experience_details. |
scheduleConfigId | number | required | configId from get_experience_schedule slot. Copy the exact value — do not modify. |
startAt | string | required | startAt from get_experience_schedule slot (ISO datetime). Copy the exact value — do not modify. |
durationMinutes | number | optional | durationMinutes 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. |
adults | number | optional | Number of adults (default: 1). (default: 1) |
children | number | optional | Number of children (default: 0). (default: 0) |
babies | number | optional | Number of babies (default: 0). (default: 0) |
isPrivate | boolean | optional | Private group booking — higher price, exclusive slot (default: false). (default: false) |
currency | string | optional | Pricing currency: EUR, USD, etc. (default: USD). (default: USD) |
responseFormat | markdown | json | optional | markdown (default): text + [GXP_STRUCTURED]. json: pure JSON only. (default: markdown) |
includeStructuredData | boolean | optional | Include [GXP_STRUCTURED] JSON block in markdown response (default: true). (default: true) |
create_order writes dataCreate 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.
| Parameter | Type | Description | |
|---|---|---|---|
checkoutId | number | required | Checkout ID from add_to_checkout or get_checkout. |
paymentSystem | internal | stripe | optional | Use '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. |
user | object | optional | Guest 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. |
paymentType | full | part | optional | Payment 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) |
apiKey | string | optional | X-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. |
responseFormat | markdown | json | optional | markdown (default): text + [GXP_STRUCTURED]. json: pure JSON only. (default: markdown) |
includeStructuredData | boolean | optional | Include [GXP_STRUCTURED] JSON block in markdown response (default: true). (default: true) |
request_availability writes dataRequest availability
Send an availability request to the host of an ON-DEMAND experience.
| Parameter | Type | Description | |
|---|---|---|---|
experienceId | number | required | Experience ID from search_experiences / get_experience_details. Must be an on-demand experience. |
periodStart | string | required | Preferred start date, YYYY/MM/DD or YYYY-MM-DD (e.g. 2026/07/15). Must be in the future. |
periodEnd | string | optional | Preferred end date, YYYY/MM/DD or YYYY-MM-DD. Defaults to periodStart for a single-day request. |
adults | number | required | Number of adults. At least one guest (adult or child) is required in total. |
children | number | optional | Number of children (default: 0). |
babies | number | optional | Number of babies (default: 0). |
name | string | required | Guest's name. REQUIRED — ask the user. |
email | string | required | Guest's email. REQUIRED — the host's answer (confirm/decline + booking link) is delivered here and to the guest's account. Ask the user. |
tel | string | optional | Guest's phone (optional). |
comment | string | optional | Guest's wishes / notes for the host (optional). E.g. preferred time of day, special requests. |
responseFormat | markdown | json | optional | markdown (default): text + [GXP_STRUCTURED]. json: pure JSON only. (default: markdown) |
includeStructuredData | boolean | optional | Include [GXP_STRUCTURED] JSON block in markdown response (default: true). (default: true) |
Questions, API keys, anything else: [email protected] · getexperience.com