concierge
What this MCP does
Searches safari destinations and travel content, builds and prices day-by-day itineraries, and supports paid itinerary verification and booking services.
Tools
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['itinerary_id', 'day_id', 'slot', 'title'], 'properties': {'slot': {'enum': ['morning', 'afternoon', 'evening'], 'type': 'string'}, 'title': {'type': 'string', 'minLength': 1, 'description': 'Short title for the activity'}, 'day_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$', 'description': 'The day UUID to add the activity to'}, 'description': {'type': 'string'}, 'itinerary_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$', 'description': 'Parent itinerary UUID'}, 'wp_content_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Source content id'}, 'wp_content_type': {'enum': ['itinerary', 'activity', 'destination', 'post'], 'type': 'string', 'description': 'Content type to link'}, 'duration_minutes': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 5}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['itinerary_id'], 'properties': {'notes': {'type': 'string'}, 'title': {'type': 'string', 'description': "Optional day label, e.g. 'Drive to Hwange'"}, 'itinerary_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['title', 'num_days'], 'properties': {'title': {'type': 'string', 'minLength': 1, 'description': "Itinerary title, e.g. '7-Day Hwange Safari'"}, 'num_days': {'type': 'integer', 'maximum': 30, 'minimum': 1, 'description': 'Number of days'}, 'start_date': {'type': 'string', 'description': "Optional ISO date string for day 1, e.g. '2025-06-01'"}, 'description': {'type': 'string', 'description': 'Optional short description'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['activity_id'], 'properties': {'activity_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['itinerary_id'], 'properties': {'itinerary_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['title', 'places', 'num_days'], 'properties': {'title': {'type': 'string', 'minLength': 1, 'description': "Itinerary title, e.g. 'Highlights of Zimbabwe'"}, 'places': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'minItems': 3, 'description': "At least 3 place names, e.g. ['Victoria Falls', 'Hwange', 'Mana Pools']"}, 'language': {'enum': ['en', 'ru', 'zh'], 'type': 'string', 'description': "Language for day titles, notes, and activity text: 'en' (English), 'ru' (Russian), or 'zh' (Chinese). Defaults to English."}, 'num_days': {'type': 'integer', 'maximum': 30, 'minimum': 1, 'description': 'Number of days for the trip'}, 'preferences': {'type': 'string', 'description': 'Traveller preferences that should shape the plan: pace, interests, budget, travel style'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['type', 'id'], 'properties': {'id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Source content id (WordPress post id)'}, 'type': {'enum': ['itinerary', 'activity', 'destination', 'post'], 'type': 'string'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['identifier'], 'properties': {'identifier': {'type': 'string', 'description': 'Either a destination id or its URL slug'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['itinerary_id'], 'properties': {'itinerary_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$', 'description': 'The UUID of the itinerary'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['itinerary_id'], 'properties': {'itinerary_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['type', 'id'], 'properties': {'id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Source content id (WordPress post id)'}, 'type': {'enum': ['itinerary', 'activity', 'destination', 'post'], 'type': 'string'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 50, 'minimum': 1}, 'region': {'type': 'string', 'description': "Filter by region name, e.g. 'Matabeleland North'"}, 'category': {'type': 'string', 'description': "Filter by category, e.g. 'National Park'"}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['itinerary_id'], 'properties': {'nights': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': "Defaults to the cost model's reference length"}, 'tier_id': {'type': 'string', 'description': 'Defaults to the cheapest tier'}, 'option_ids': {'type': 'array', 'items': {'type': 'object', 'required': ['group_id', 'option_id'], 'properties': {'group_id': {'type': 'string'}, 'option_id': {'type': 'string'}}}, 'description': 'One entry per cost option group you want to choose in'}, 'travellers': {'type': 'integer', 'default': 1, 'maximum': 9007199254740991, 'minimum': 1}, 'itinerary_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['itinerary_id'], 'properties': {'notes': {'type': 'string'}, 'itinerary_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}, 'contact_email': {'type': 'string', 'format': 'email', 'pattern': "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['itinerary_id'], 'properties': {'notes': {'type': 'string'}, 'itinerary_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}, 'contact_email': {'type': 'string', 'format': 'email', 'pattern': "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['itinerary_id'], 'properties': {'notes': {'type': 'string', 'description': 'Anything the experts should know (dates, group size, budget)'}, 'itinerary_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}, 'contact_email': {'type': 'string', 'format': 'email', 'pattern': "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", 'description': 'Where to send the report + receipt'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['type'], 'properties': {'type': {'enum': ['itinerary', 'activity', 'destination', 'post'], 'type': 'string', 'description': 'Content type to search'}, 'search': {'type': 'string', 'description': 'Search keyword'}, 'per_page': {'type': 'integer', 'default': 10, 'maximum': 20, 'minimum': 1}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['type'], 'properties': {'type': {'enum': ['itinerary', 'activity', 'destination', 'post'], 'type': 'string', 'description': 'Content type to search'}, 'search': {'type': 'string', 'description': 'Search keyword'}, 'per_page': {'type': 'integer', 'default': 10, 'maximum': 20, 'minimum': 1}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['itinerary_id'], 'properties': {'legs': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'start_day', 'end_day'], 'properties': {'title': {'type': 'string', 'minLength': 1, 'description': 'Where this stretch is, in a word or two'}, 'end_day': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1}, 'summary': {'type': 'string', 'description': 'A sentence or two on what these nights are for'}, 'start_day': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1}}}, 'minItems': 1, 'description': "The route's chapters. Every day must belong to exactly one leg, and legs must not overlap."}, 'choices': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'options'], 'properties': {'title': {'type': 'string', 'minLength': 1, 'description': "'Pick your coast'"}, 'options': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'body'], 'properties': {'body': {'type': 'string', 'minLength': 1, 'description': 'What this option is actually like, and who should choose it'}, 'label': {'type': 'string', 'minLength': 1}, 'subtitle': {'type': 'string'}}}, 'minItems': 2}}}, 'minItems': 1, 'description': 'Either/ors deliberately left open for the traveller'}, 'countries': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'How many countries the route crosses'}, 'cost_model': {'type': 'object', 'required': ['currency', 'reference_nights', 'lines', 'tiers'], 'properties': {'lines': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'label', 'scales_with_length'], 'properties': {'key': {'type': 'string', 'minLength': 1, 'description': "Short stable key used by tiers and option groups â\x80\x94 'land', 'permits', 'park_fees', 'flights'"}, 'label': {'type': 'string', 'minLength': 1}, 'scales_with_length': {'type': 'boolean', 'description': 'True for nightly costs (camps, park fees), false for per-trip costs (permits, internal flights)'}}}, 'minItems': 1}, 'notes': {'type': 'string', 'description': 'What the figures exclude and how firm they are'}, 'tiers': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amounts'], 'properties': {'label': {'type': 'string', 'minLength': 1, 'description': "'Lean', 'Mid-range', 'Luxury'"}, 'amounts': {'type': 'array', 'items': {'type': 'object', 'required': ['line_key', 'amount'], 'properties': {'amount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Per person, in minor units â\x80\x94 620000 for $6,200'}, 'line_key': {'type': 'string'}}}, 'minItems': 1, 'description': 'One entry per cost line'}}}, 'minItems': 1}, 'currency': {'type': 'string', 'maxLength': 3, 'minLength': 3, 'description': "ISO 4217, lowercase â\x80\x94 'usd'"}, 'option_groups': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'line_key', 'options'], 'properties': {'label': {'type': 'string', 'minLength': 1}, 'options': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amount'], 'properties': {'label': {'type': 'string', 'minLength': 1}, 'amount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Per person, in minor units â\x80\x94 620000 for $6,200'}, 'is_default': {'type': 'boolean'}}}, 'minItems': 2}, 'line_key': {'type': 'string', 'minLength': 1, 'description': 'Which cost line this choice overrides'}}}}, 'length_options': {'type': 'array', 'items': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1}, 'description': 'Shorter or longer variants offered to the reader, in nights'}, 'reference_nights': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'The trip length the amounts are quoted at'}}, 'description': 'Per-person breakdown lines, amounts per comfort tier, and any per-line choices'}, 'field_notes': {'type': 'array', 'items': {'type': 'object', 'required': ['heading', 'body'], 'properties': {'body': {'type': 'string', 'minLength': 1}, 'heading': {'type': 'string', 'minLength': 1, 'description': "'Visas', 'Yellow fever', 'Luggage'"}}}, 'minItems': 1, 'description': 'Visas, certificates, luggage limits, kit'}, 'seasonality': {'type': 'object', 'required': ['rows', 'months', 'recommended_month'], 'properties': {'rows': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'scores'], 'properties': {'label': {'type': 'string', 'minLength': 1, 'description': 'What is being scored â\x80\x94 a wildlife event, a trail condition, a sea state'}, 'scores': {'type': 'array', 'items': {'type': 'integer', 'maximum': 3, 'minimum': 0}, 'maxItems': 12, 'minItems': 12, 'description': 'January first. 0 = avoid, 1 = poor, 2 = workable, 3 = peak'}}}, 'minItems': 1}, 'months': {'type': 'array', 'items': {'type': 'object', 'required': ['month', 'rank', 'verdict', 'tags'], 'properties': {'rank': {'enum': ['primary', 'alternative', 'workable', 'avoid'], 'type': 'string'}, 'tags': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 4, 'description': "Short labels: 'Peak crossings', 'Books out first', 'Avoid'"}, 'month': {'type': 'integer', 'maximum': 12, 'minimum': 1}, 'verdict': {'type': 'string', 'minLength': 1, 'description': "Why this month is or isn't the one, in two or three sentences"}}}, 'minItems': 1}, 'recommended_month': {'type': 'integer', 'maximum': 12, 'minimum': 1, 'description': 'The month this plan is actually built around'}}, 'description': 'One row per thing the trip is timed around, scored 0-3 across all twelve months, plus a verdict per month worth arguing about'}, 'itinerary_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}, 'booking_order': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'detail'], 'properties': {'title': {'type': 'string', 'minLength': 1}, 'detail': {'type': 'string', 'minLength': 1, 'description': 'Why it sits at this point in the order'}}}, 'minItems': 1, 'description': 'What to book, in the order it has to happen'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['itinerary_id'], 'properties': {'title': {'type': 'string'}, 'is_public': {'type': 'boolean', 'description': 'Set false to unpublish the shareable link'}, 'start_date': {'type': 'string'}, 'description': {'type': 'string'}, 'itinerary_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}}}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['itinerary_id', 'day_number', 'narrative'], 'properties': {'callouts': {'type': 'array', 'items': {'type': 'object', 'required': ['kind', 'title', 'body'], 'properties': {'body': {'type': 'string', 'minLength': 1}, 'kind': {'enum': ['alternative', 'swap', 'warning', 'note'], 'type': 'string'}, 'title': {'type': 'string', 'minLength': 1, 'description': "'Alternative', 'Swap worth considering'"}}}, 'maxItems': 3}, 'narrative': {'type': 'string', 'minLength': 1, 'description': 'Two or three short paragraphs, separated by blank lines. Plain text, no markup.'}, 'day_number': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1}, 'itinerary_id': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$'}}}
Recent tool changes
Similar MCP servers
MolTravel
Searches and provides details for flights, hotels, rental cars, ferries, airports, travel experiences, destinations, country info…
Wmata
Provides Washington Metro rail and bus routes, stops, stations, service incidents, route details, and real-time arrival predictio…
Openrouteservice
Provides geocoding, routing, travel-time matrices, isochrones, snapping, and elevation data using OpenStreetMap-based services.
Google_maps
Provides Google Maps geocoding, place search and details, directions, distance matrices, and elevation data.
SeaWeb
Searches and extracts web information about entities and travel locations, including restaurants, salons, tourist conditions, dis…
Aviationstack
Provides airline, airport, city, country, and flight directory data, including real-time and scheduled flight details.
Nps
Searches National Park Service data for parks, campgrounds, activities, alerts, visitor statistics, locations, fees, and operatin…
Tfl
Provides London transport journey planning, line status, disruptions, stop arrivals, and Santander Cycle availability.