Search and book theatre, attractions, tours across 681 cities. 13,090+ products.
Search and book theatre, attractions, and tours across 681 cities globally.
Captured live from the server via tools/list.
search_experiences
Use this when the user names a city plus a category, query, or filter set and wants a ranked list of bookable experiences. Returns products each with a stable product_id, plus name, slug, city, category, price, rating, review count, and tags. To show the results as visual cards, pass the product_id values from these results into render_experience_cards (experience_ids). Pair with get_experience_details for richer fields.
Parameters (13)
citystring
City slug, e.g., "london", "new-york", "paris".
querystring
Free-text query matched against title, venue, and description.
Filter by experience tags. Multiple tags are AND-combined (every tag must match) so adding more tags narrows the result set. Use lowercase singular forms; matching is substring-based against the tag array. The canonical tag taxonomy in the catalogue, ordered by frequency, is: 'tour', 'attraction', 'historical', 'outdoor', 'museum', 'family', 'landmark', 'adventure', 'show', 'indoor', 'food & drink', 'transport', 'theatre', 'concert', 'theme park', 'cruise', 'nightlife', 'comedy', 'musical', 'city pass', 'sport', 'dance', 'aquarium', 'zoo', 'gallery', 'opera', 'wellness', 'water park', 'workshop', 'religious', 'festival'. Examples: ['museum'] for museums; ['family','indoor'] for indoor family attractions; ['outdoor','adventure'] for outdoor adventure activities. Other free-form values may match by substring but are not guaranteed.
indoor_outdoorstring
Setting filter. 'indoor' / 'outdoor' resolve via the products.tags column (~2,100 indoor and ~5,000 outdoor products are tagged in the catalogue). 'either' applies no filter.
min_review_countinteger
Minimum number of customer reviews. Use to filter out new or sparsely-reviewed products.
min_ratingnumber
Minimum aggregate rating on a 0-5 scale.
restrict_to_top_ratedboolean
DESTRUCTIVE FILTER. When true, hard-restricts results to products with rating >= 4.5 AND review_count >= 100. This is a WHERE clause, not a sort hint. Anything failing the floor is dropped from the result set entirely. Use only when the caller genuinely wants to exclude lower-rated or lesser-reviewed products. For ranking-by-popularity without exclusion, do not set this; results are already ordered by rating and review count.
popular_onlyboolean
DEPRECATED: use restrict_to_top_rated. Alias for the destructive top-rated filter (rating >= 4.5 AND review_count >= 100). The name implies a sort hint but it is a hard WHERE clause. Existing callers continue to work unchanged.
max_pricenumber
Maximum price per person in the listed currency. A positive value applies a cap; 0 (or unset) means no price cap (unbounded).
limitinteger
Number of results to return (1-50). Default 10.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
search_local_experiences
Use this when the user mentions a place, neighbourhood, landmark, or area but does not give exact coordinates. Examples: 'near the Louvre', 'in Trastevere', 'around Times Square', "walking distance from St Paul's Cathedral". Returns experiences matched first by exact venue/neighbourhood, then by city centre fallback. Do not use for general city-wide search; use search_experiences for that.
Parameters (10)
place_hintstringrequired
Free-text place reference: a landmark, neighbourhood, monument, station, or street name. E.g. 'Louvre Museum', 'Trastevere', 'Soho', 'Times Square'. Required.
citystring
City slug or name to disambiguate. Recommended for any place_hint that could exist in multiple cities.
neighbourhoodstring
Optional: a known neighbourhood within the city to narrow results.
radius_hintstring
Optional: how broadly to interpret the place_hint. 'walking' is ~1km, 'short_drive' is ~5km, 'city_wide' falls back to the whole city. Default 'walking'.
tagsarray
Filter by experience tags. Multiple tags are AND-combined (every tag must match) so adding more tags narrows the result set. Use lowercase singular forms; matching is substring-based against the tag array. The canonical tag taxonomy in the catalogue, ordered by frequency, is: 'tour', 'attraction', 'historical', 'outdoor', 'museum', 'family', 'landmark', 'adventure', 'show', 'indoor', 'food & drink', 'transport', 'theatre', 'concert', 'theme park', 'cruise', 'nightlife', 'comedy', 'musical', 'city pass', 'sport', 'dance', 'aquarium', 'zoo', 'gallery', 'opera', 'wellness', 'water park', 'workshop', 'religious', 'festival'. Examples: ['museum'] for museums; ['family','indoor'] for indoor family attractions; ['outdoor','adventure'] for outdoor adventure activities. Other free-form values may match by substring but are not guaranteed.
date_fromstring
date_tostring
limitinteger
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
find_nearby_experiences
Use this when a non-ChatGPT client supplies exact latitude and longitude and wants experiences near that coordinate. ChatGPT clients should use search_local_experiences instead because it accepts coarse place hints.
Parameters (7)
latitudenumberrequired
Latitude coordinate.
longitudenumberrequired
Longitude coordinate.
radius_kmnumber
Search radius in kilometres.
categorystring
Optional category slug.
limitinteger
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
whats_on_tonight
Use this when the user asks what is bookable in a city tonight. Returns experiences with start times tonight, sorted by soonest first; events that have already started are filtered out. Each row includes start_time, countdown_text, venue, and a short urgency hint.
Parameters (5)
citystringrequired
City slug.
categorystring
Optional category slug to narrow results.
max_resultsinteger
Default 10, max 30.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
get_last_minute
Use this when the user wants experiences starting within the next few hours. Returns rows with start_time, countdown_text, and seats_remaining hints, sorted by soonest first.
Parameters (6)
citystringrequired
City slug.
hoursinteger
How many hours ahead to look (1-12). Default 3.
latitudenumber
Optional latitude to bias toward nearby venues.
longitudenumber
Optional longitude to bias toward nearby venues.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
get_whats_on_this_week
Use this when the user wants a day-by-day weekly calendar for a city. Returns one entry per day for the next 7 days, each with morning, afternoon, and evening picks plus a daily highlight.
Parameters (3)
citystringrequired
City slug.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
recommend_experiences
Use this when the user describes what they want in natural language rather than naming a category. Parses the query for audience, mood, constraints, occasion, and time of day, then returns scored recommendations with a reason field explaining the match.
Parameters (7)
querystringrequired
Natural-language preference, e.g., "romantic evening in Paris under 100 euros" or "rainy day in Edinburgh with kids 8 and 12".
citystring
Optional city slug. If omitted, the city is parsed from the query.
datestring
Optional ISO date (YYYY-MM-DD) for availability-aware ranking.
paxinteger
Number of people. Default 2.
limitinteger
Number of recommendations to return (1-20). Default 5.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
get_city_guide
Use this when the user wants an orientation overview of a city for trip planning. Returns highlights, dominant categories, price band, best-for audience hints, seasonal notes, and a short list of local advice items.
Parameters (3)
citystringrequired
City slug.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
get_travel_tips
Use this when the user asks practical logistics questions about a city. Returns short tips grouped by topic (transport, money, safety, culture, food, weather, language, connectivity), plus emergency numbers and quick phrases where relevant.
Parameters (4)
citystringrequired
City slug.
topicstring
Optional topic filter. When omitted, returns a summary across all topics.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
compare_experiences
Use this when the user wants a side-by-side comparison of 2-5 specific products. Pass the slug for each. Returns a comparison table plus per-axis winners (value, rating, popularity, family-fit).
Parameters (3)
slugsarrayrequired
Product slugs from earlier search or recommend results.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
get_hidden_gems
Use this when the user wants less-popular experiences locals favour rather than top-of-list bestsellers. Returns rows tagged HiddenGem or with high ratings and lower review counts; explicitly excludes Bestseller, HopOnHopOff, and CityPass products.
Parameters (4)
citystringrequired
City slug.
max_resultsinteger
Default 5, max 20.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
get_family_day
Use this when the user wants a full-day plan for a family in one city. Returns a morning activity, lunch area suggestion, afternoon attraction, and optional evening stop. Uses age-aware filters and clusters venues by walking distance.
Parameters (6)
citystringrequired
City slug.
kids_agesarray
Children's ages. Drives age-suitability filtering on each slot.
datestring
Optional ISO date (YYYY-MM-DD).
budgetnumber
Optional max budget in the listed currency.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
get_date_night
Use this when the user wants an evening plan for two. Returns a pre-dinner activity, dinner area suggestion, evening show, post-show tip, and an estimated total cost. Filters out family-rated and high-physical-level venues.
Parameters (5)
citystringrequired
City slug.
datestring
Optional ISO date (YYYY-MM-DD).
budgetstring
Budget band. 'low' = under 100 per person, 'medium' = 100-200, 'high' = 200+. In the listed currency.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
plan_itinerary
Use this when the user wants a multi-day plan for a single city. Returns morning, afternoon, and evening slots per day, with geographic clustering, category diversity, and a running total cost.
Target audience. Currently 'family' is the strongest signal in the catalogue (resolves via the 'family' tag, ~3,200 products). Other values are best-effort and may be sparsely populated; for guaranteed family-suitable results prefer tags=['family'] in addition to or instead of this filter.
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
list_cities
Use this when the user wants to browse supported cities before searching. Returns city names, slugs, country codes, and product counts.
Parameters (4)
countrystring
Optional country code or country name filter.
limitinteger
Maximum number of cities to return (1-50). Defaults to 50 when omitted.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
get_experience_details
Use this when the user selects a specific experience from search results and needs richer product, location, supplier, and booking fields. Accepts either product_id or slug.
Parameters (4)
product_idstring
Stable product_id from a previous search result.
slugstring
Product slug from a previous search result.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
get_related_experiences
Use this when a non-ChatGPT widget or client has a selected product_id and needs related products to pair with it, do after it, find nearby, or find similar alternatives. Returns cached graph and semantic related products for trio-style widgets.
Parameters (5)
product_idstringrequired
Stable product_id or slug for the source experience.
contextstring
Relationship type: pair, after, nearby, or similar.
max_resultsinteger
Number of related products to return. Default 6, max 10.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
get_availability
Use this when the user is ready to check live bookable dates, times, prices, or remaining spaces for one selected product. This is the live supplier-check tool; pass product_id from search or slug plus city_slug.
Parameters (10)
product_idstring
Stable product_id from a search or details response. Preferred when available.
slugstring
Product slug. Use with city_slug when product_id is unavailable.
city_slugstring
City slug required when slug is used.
date_fromstring
Start date in YYYY-MM-DD. Defaults to today.
date_tostring
End date in YYYY-MM-DD. Defaults to 14 days after date_from and is capped to a 365-day window.
party_sizeinteger
Number of guests. Default 2.
preferred_timestring
Optional broad time preference such as morning, afternoon, or evening.
idempotency_keystring
Optional UUID. Reuse for identical responses within five minutes.
as_ofstring
Previous ISO timestamp from stale card data; returns delta only when data changed.
freshboolean
When true, bypasses the 60-second cache and performs a live supplier check, subject to rate limits.
check_availability
Use this when the user has picked a specific experience and asks whether it is available on one date, what it costs for a party, or wants a booking link. This is the legacy-compatible date-specific availability interface.
Parameters (5)
slugstringrequired
Product slug or legacy booking path, e.g. "london-dungeon-tickets" or "/london/london-dungeon-tickets".
datestringrequired
Date to check in YYYY-MM-DD format.
party_sizeinteger
Number of guests or tickets to price. Default 2.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
search_by_mood
Use this when the user describes the feeling or vibe they want rather than a category, such as romantic, relaxing, adventurous, family fun, foodie, luxury, or rainy day. Maps the mood to preset search filters and returns matching experiences.
Parameters (5)
citystringrequired
City name or slug, e.g. "london", "new-york", or "paris".
Maximum number of experiences to return (1-50). Defaults to the mood preset size when omitted.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
get_transfer_info
Use this when the user is arriving in a supported city and needs transfer guidance from an airport, station, or port to a hotel coordinate. Returns taxi, metro, bus, and train estimates with durations, costs, and directions.
Parameters (6)
citystringrequired
Supported city: London, Paris, New York, Amsterdam, Barcelona, Rome, or Tokyo.
from_typestringrequired
Arrival hub type.
to_latitudenumberrequired
Hotel latitude.
to_longitudenumberrequired
Hotel longitude.
languagestring
BCP-47 language code for human-readable fields (e.g., 'en', 'fr-FR'). Defaults to English when omitted.
formatstring
Response shape. 'json' returns structured records; 'text' returns the same content rendered as a short narrative paragraph for chat surfaces.
render_experience_cards
Use this immediately after ANY discovery or search tool (search_experiences, whats_on_tonight, get_last_minute, get_whats_on_this_week, recommend_experiences, search_by_mood, get_hidden_gems, get_family_day, get_date_night, search_local_experiences) returns results. It is the only tool that displays the visual experience cards, so always call it once for every result set you want shown. Take the experience_ids those tools provide and render them; pass the stable product IDs (the t_ ids) only, never full product rows. Only experience_ids and render_type are required. Optionally pass render_context.intent_summary (a short phrase describing what the user asked for, e.g. city, date, audience) to set the carousel heading. Call it exactly once per result set, and do not also re-list the experiences as text.
Parameters (4)
experience_idsarrayrequired
The stable product_id values from search_experiences results (the product_id field of each returned row). Pass IDs only, never full product rows.
render_typestringrequired
Visual layout requested for the widget.
render_contextobject
idempotency_keystring
Optional UUID. Reuse for identical card render responses within five minutes.
report_quality_signal
Use this to push a quality signal back to tickadoo about an experience or recommendation you previously surfaced. The bidirectional half of the Quality Ledger: turns the agent feedback loop from days of debate into a single recorded row. Examples: the availability you showed was stale at click time, the click-through did not land on a bookable page, the supplier was down, the description was misleading. Requires the original request_id returned by any previous tool call.
Parameters (3)
request_idstringrequired
The request_id from a prior tool result you are reporting a signal against. Format: rq_YYYY_MM_DD_HHMMSS_<6-hex>.
signal_typestringrequired
The kind of issue you are reporting. Use "other" only when none of the specific types fit, and always include notes.
notesstring
Optional free-text context. Required when signal_type is "other". Do not include PII.
@tickadoo/mcp-server is the local stdio entrypoint for tickadoo MCP. Since v2.0.0 it is a thin bridge to the canonical remote server at:
text
https://mcp.tickadoo.com/mcp
The package no longer defines tools, formats catalogue data, or calls a local tickadoo backend. It connects to the remote Streamable HTTP MCP server and proxies tools/list, tools/call, resources/list, resources/read, and ping. The live remote owns the tool list, schemas, results, and errors.
No API key is required.
Install
Use the hosted remote directly when your MCP client supports Streamable HTTP:
Set TICKADOO_LOG_LEVEL=none to silence bridge status logs on stderr.
Local Development
bash
npm install
npm run build
npm test
Run the built stdio bridge:
bash
node dist/index.js
Refresh the MCP registry metadata from the live remote:
bash
npm run sync:server-json
Run the optional live integration test:
bash
LIVE=1 npm test
Live Tools
The current tool list is served by the remote MCP server. Visit mcp.tickadoo.com or run npm run sync:server-json to refresh the registry metadata in this repo.