MCP Server

Déstaire

com.destaire/destaire
Travel & Hospitality Public & reachable MCP 2025-11-25

What this MCP does

Searches and provides information about luxury hotels, private stays, travel articles, destinations, and city guides in Europe, with paid guide purchasing.

buy_guide
Buy a city guide
Buy a city guide for the user, paid inside this conversation. Gives a pay link that takes an MPP payment (a Stripe Shared Payment Token from your wallet, such as Link). Confirm the user's email first: the guide goes to that account, and the purchase is final.
Open world Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['slug', 'email'], 'properties': {'slug': {'type': 'string', 'pattern': '^[a-z0-9]+(-[a-z0-9]+)*$', 'maxLength': 120, 'description': "The guide's slug, the last part of its URL."}, 'email': {'type': 'string', 'format': 'email', 'pattern': "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", 'maxLength': 254, 'description': "The user's email address: the guide goes to this Déstaire account."}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['paymentLink', 'guide', 'price', 'email', 'instructions'], 'properties': {'email': {'type': 'string'}, 'guide': {'type': 'object', 'required': ['title', 'url', 'city', 'country', 'cover'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'city': {'type': 'string'}, 'cover': {'anyOf': [{'type': 'string', 'format': 'uri'}, {'type': 'null'}]}, 'title': {'type': 'string'}, 'country': {'type': 'string'}}, 'additionalProperties': {}}, 'price': {'type': 'string'}, 'paymentLink': {'type': 'string', 'format': 'uri'}, 'instructions': {'type': 'object', 'required': ['beforePaying', 'agent', 'afterPaying', 'browser'], 'properties': {'agent': {'type': 'string'}, 'browser': {'type': 'string'}, 'afterPaying': {'type': 'string'}, 'beforePaying': {'type': 'string'}}, 'additionalProperties': {}}}, 'additionalProperties': {}}
get_article
Get an article
One article: its opening paragraphs, or with detail "full" its whole text with every list of places.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'pattern': '^[a-z0-9]+(-[a-z0-9]+)*$', 'maxLength': 120, 'description': "The article's slug, the last part of its URL."}, 'detail': {'enum': ['concise', 'full'], 'type': 'string', 'default': 'concise', 'description': '"concise" (the default): the start of the answer and a count, to save context; "full": all of it.'}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['title', 'url', 'standfirst', 'author', 'category', 'published', 'photo', 'text', 'truncated'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'note': {'type': 'string'}, 'text': {'type': 'string'}, 'photo': {'type': 'string', 'format': 'uri'}, 'title': {'type': 'string'}, 'author': {'type': 'string'}, 'category': {'type': 'string'}, 'published': {'type': 'string'}, 'truncated': {'type': 'boolean'}, 'standfirst': {'type': 'string'}}, 'additionalProperties': {}}
get_destination
Get a destination
One destination and its stays: the first 10 and the total, or all of them with detail "full".
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'pattern': '^[a-z0-9]+(-[a-z0-9]+)*$', 'maxLength': 120, 'description': "The destination's slug, the last part of its URL."}, 'detail': {'enum': ['concise', 'full'], 'type': 'string', 'default': 'concise', 'description': '"concise" (the default): the start of the answer and a count, to save context; "full": all of it.'}, 'country': {'type': 'string', 'maxLength': 60, 'description': 'The country, when two destinations share a slug.'}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'url', 'country', 'total', 'stays'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'name': {'type': 'string'}, 'note': {'type': 'string'}, 'stays': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'slug', 'url', 'kind', 'town', 'destination', 'country', 'lede', 'rate', 'photo'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'kind': {'enum': ['hotel', 'private stay'], 'type': 'string', 'description': 'A hotel, or a private stay: a whole house or estate that one party rents.'}, 'lede': {'type': 'string'}, 'name': {'type': 'string'}, 'rate': {'type': 'object', 'required': ['text', 'amount', 'currency', 'per', 'checked'], 'properties': {'per': {'anyOf': [{'enum': ['night', 'week'], 'type': 'string'}, {'type': 'null'}]}, 'text': {'type': 'string', 'description': 'As the site shows it: "from â\x82¬950/night", or "Price on request".'}, 'amount': {'type': ['number', 'null'], 'description': 'The "from" rate in euros, rounded to 10.'}, 'checked': {'anyOf': [{'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$'}, {'type': 'null'}], 'description': "The day the rate was last read on the hotel's own booking engine (YYYY-MM-DD). Null when no date is recorded."}, 'currency': {'anyOf': [{'type': 'string', 'const': 'EUR'}, {'type': 'null'}]}}, 'description': 'The "from" rate: the lowest nightly price over the next six months, checked each week.', 'additionalProperties': {}}, 'slug': {'type': 'string'}, 'town': {'type': 'string'}, 'photo': {'anyOf': [{'type': 'string', 'format': 'uri'}, {'type': 'null'}], 'description': 'A card-size photo of the stay (3:2).'}, 'country': {'type': 'string'}, 'destination': {'type': 'object', 'required': ['name', 'url', 'slug'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'name': {'type': 'string'}, 'slug': {'type': 'string'}}, 'additionalProperties': {}}}, 'additionalProperties': {}}}, 'total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, 'country': {'type': 'string'}}, 'additionalProperties': {}}
get_guide
Get a city guide
One city guide's public shop page: its standfirst, what it holds, its price, and photo URLs. The guide itself is sold on its page.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'pattern': '^[a-z0-9]+(-[a-z0-9]+)*$', 'maxLength': 120, 'description': "The guide's slug, the last part of its URL."}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['title', 'url', 'city', 'country', 'standfirst', 'onSale', 'price', 'sections', 'cover', 'buyInChat', 'photos'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'city': {'type': 'string'}, 'cover': {'type': 'string', 'format': 'uri', 'description': 'The cover at 4:5.'}, 'price': {'type': 'string'}, 'title': {'type': 'string'}, 'onSale': {'type': 'boolean'}, 'photos': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}}, 'country': {'type': 'string'}, 'sections': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'text'], 'properties': {'text': {'type': 'string'}, 'title': {'type': 'string'}}, 'additionalProperties': {}}}, 'buyInChat': {'type': 'boolean', 'description': 'True when buy_guide can buy this guide in this conversation.'}, 'standfirst': {'type': 'string'}}, 'additionalProperties': {}}
get_stay
Get a stay
One stay as its page shows it: description, address, location, website, "from" rate, amenities, collections, and photo URLs.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'pattern': '^[a-z0-9]+(-[a-z0-9]+)*$', 'maxLength': 120, 'description': "The stay's slug, the last part of its URL."}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'url', 'kind', 'lede', 'description', 'town', 'destination', 'country', 'address', 'location', 'website', 'rate', 'amenities', 'collections', 'hero', 'photos'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'hero': {'type': 'string', 'format': 'uri', 'description': 'The main photo at 2:1.'}, 'kind': {'enum': ['hotel', 'private stay'], 'type': 'string', 'description': 'A hotel, or a private stay: a whole house or estate that one party rents.'}, 'lede': {'type': 'string'}, 'name': {'type': 'string'}, 'rate': {'type': 'object', 'required': ['text', 'amount', 'currency', 'per', 'checked'], 'properties': {'per': {'anyOf': [{'enum': ['night', 'week'], 'type': 'string'}, {'type': 'null'}]}, 'text': {'type': 'string', 'description': 'As the site shows it: "from â\x82¬950/night", or "Price on request".'}, 'amount': {'type': ['number', 'null'], 'description': 'The "from" rate in euros, rounded to 10.'}, 'checked': {'anyOf': [{'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$'}, {'type': 'null'}], 'description': "The day the rate was last read on the hotel's own booking engine (YYYY-MM-DD). Null when no date is recorded."}, 'currency': {'anyOf': [{'type': 'string', 'const': 'EUR'}, {'type': 'null'}]}}, 'description': 'The "from" rate: the lowest nightly price over the next six months, checked each week.', 'additionalProperties': {}}, 'town': {'type': 'string'}, 'photos': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}}, 'address': {'type': 'string'}, 'country': {'type': 'string'}, 'website': {'type': 'string', 'format': 'uri'}, 'location': {'type': 'object', 'required': ['latitude', 'longitude'], 'properties': {'latitude': {'type': 'number'}, 'longitude': {'type': 'number'}}, 'additionalProperties': {}}, 'amenities': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'description'], 'properties': {'name': {'type': 'string'}, 'description': {'type': 'string'}}, 'additionalProperties': {}}}, 'collections': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'url'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'name': {'type': 'string'}}, 'additionalProperties': {}}}, 'description': {'type': 'string'}, 'destination': {'type': 'object', 'required': ['name', 'url'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'name': {'type': 'string'}}, 'additionalProperties': {}}}, 'additionalProperties': {}}
list_articles
List articles
The travel writing, newest first: title, standfirst, author, category, date, and page URL.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'The most articles to give.'}, 'category': {'type': 'string', 'maxLength': 60, 'description': 'Only this category.'}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['total', 'articles'], 'properties': {'total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, 'articles': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'slug', 'url', 'standfirst', 'author', 'category', 'published'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'slug': {'type': 'string'}, 'title': {'type': 'string'}, 'author': {'type': 'string'}, 'category': {'type': 'string'}, 'published': {'type': 'string'}, 'standfirst': {'type': 'string'}}, 'additionalProperties': {}}}}, 'additionalProperties': {}}
list_destinations
List destinations and collections
The countries and destinations that have stays, and the collections (Coast, City, Mountain…), each with its number of stays. Their names and slugs are the filters of search_stays.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'country': {'type': 'string', 'maxLength': 60, 'description': 'Only this country: a name or an ISO code.'}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['countries', 'collections'], 'properties': {'countries': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'url', 'code', 'destinations'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'code': {'type': 'string'}, 'name': {'type': 'string'}, 'destinations': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'url', 'slug', 'stays'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'name': {'type': 'string'}, 'slug': {'type': 'string'}, 'stays': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}}, 'additionalProperties': {}}}}, 'additionalProperties': {}}}, 'collections': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'url', 'slug', 'stays'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'name': {'type': 'string'}, 'slug': {'type': 'string'}, 'stays': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}}, 'additionalProperties': {}}}}, 'additionalProperties': {}}
list_guides
List city guides
The city guides on sale: city, standfirst, price, and the URL of the page where a reader can buy the guide.
Read only Idempotent
Input schema
{'type': 'object', 'properties': {}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['guides'], 'properties': {'guides': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'slug', 'url', 'city', 'country', 'standfirst', 'price'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'city': {'type': 'string'}, 'slug': {'type': 'string'}, 'price': {'type': 'string'}, 'title': {'type': 'string'}, 'country': {'type': 'string'}, 'standfirst': {'type': 'string'}}, 'additionalProperties': {}}}}, 'additionalProperties': {}}
search_stays
Search stays
Find hotels and private stays by plain words, with optional filters for country, destination, collection, amenities, and a nightly budget in euros. Best matches first. Gives each stay's page URL, place, short description, and "from" rate.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'sort': {'enum': ['relevance', 'rate'], 'type': 'string', 'default': 'relevance', 'description': '"relevance" (best match first) or "rate" (lowest rate first).'}, 'limit': {'type': 'integer', 'default': 10, 'maximum': 50, 'minimum': 1, 'description': 'The most stays to give.'}, 'query': {'type': 'string', 'maxLength': 200, 'description': 'What the reader wants, in plain words: "quiet hotel on Lake Como with a spa". Stays that match more words come first.'}, 'country': {'type': 'string', 'maxLength': 60, 'description': 'Only this country: a name or an ISO code, such as "France" or "FR".'}, 'max_rate': {'type': 'number', 'description': 'Only stays whose "from" rate is at most this many euros a night (a week rate counts a seventh). Stays with no rate are left out.', 'exclusiveMinimum': 0}, 'amenities': {'type': 'array', 'items': {'type': 'string', 'maxLength': 40}, 'maxItems': 5, 'description': 'Only stays that have each of these, by word: "spa", "pool", "beach", "tennis".'}, 'collection': {'type': 'string', 'maxLength': 60, 'description': 'Only this collection: a name or a slug, such as "Coast". list_destinations lists them.'}, 'destination': {'type': 'string', 'maxLength': 60, 'description': 'Only this destination: a name or a slug, such as "Provence".'}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['total', 'stays'], 'properties': {'note': {'type': 'string'}, 'stays': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'slug', 'url', 'kind', 'town', 'destination', 'country', 'lede', 'rate', 'photo'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'kind': {'enum': ['hotel', 'private stay'], 'type': 'string', 'description': 'A hotel, or a private stay: a whole house or estate that one party rents.'}, 'lede': {'type': 'string'}, 'name': {'type': 'string'}, 'rate': {'type': 'object', 'required': ['text', 'amount', 'currency', 'per', 'checked'], 'properties': {'per': {'anyOf': [{'enum': ['night', 'week'], 'type': 'string'}, {'type': 'null'}]}, 'text': {'type': 'string', 'description': 'As the site shows it: "from â\x82¬950/night", or "Price on request".'}, 'amount': {'type': ['number', 'null'], 'description': 'The "from" rate in euros, rounded to 10.'}, 'checked': {'anyOf': [{'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$'}, {'type': 'null'}], 'description': "The day the rate was last read on the hotel's own booking engine (YYYY-MM-DD). Null when no date is recorded."}, 'currency': {'anyOf': [{'type': 'string', 'const': 'EUR'}, {'type': 'null'}]}}, 'description': 'The "from" rate: the lowest nightly price over the next six months, checked each week.', 'additionalProperties': {}}, 'slug': {'type': 'string'}, 'town': {'type': 'string'}, 'photo': {'anyOf': [{'type': 'string', 'format': 'uri'}, {'type': 'null'}], 'description': 'A card-size photo of the stay (3:2).'}, 'country': {'type': 'string'}, 'destination': {'type': 'object', 'required': ['name', 'url', 'slug'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'name': {'type': 'string'}, 'slug': {'type': 'string'}}, 'additionalProperties': {}}}, 'additionalProperties': {}}}, 'total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}}, 'additionalProperties': {}}
Changed
buy_guide
Oct. 1, 2026, 2:42 a.m.
Changed
get_guide
Oct. 1, 2026, 2:42 a.m.
Changed
list_guides
Oct. 1, 2026, 2:42 a.m.
Changed
get_article
Oct. 1, 2026, 2:42 a.m.
Changed
list_articles
Oct. 1, 2026, 2:42 a.m.
Changed
get_destination
Oct. 1, 2026, 2:42 a.m.
Changed
list_destinations
Oct. 1, 2026, 2:42 a.m.
Changed
get_stay
Oct. 1, 2026, 2:42 a.m.
Changed
search_stays
Oct. 1, 2026, 2:42 a.m.
Changed
buy_guide
Sept. 29, 2026, 2:48 a.m.
Changed
get_guide
Sept. 29, 2026, 2:48 a.m.
Changed
list_guides
Sept. 29, 2026, 2:48 a.m.
Changed
get_article
Sept. 29, 2026, 2:48 a.m.
Changed
list_articles
Sept. 29, 2026, 2:48 a.m.
Changed
get_destination
Sept. 29, 2026, 2:48 a.m.
Changed
list_destinations
Sept. 29, 2026, 2:48 a.m.
Changed
get_stay
Sept. 29, 2026, 2:48 a.m.
Changed
search_stays
Sept. 29, 2026, 2:48 a.m.
Changed
buy_guide
Sept. 27, 2026, 2:40 a.m.
Changed
get_guide
Sept. 27, 2026, 2:40 a.m.
Changed
get_destination
Sept. 27, 2026, 2:40 a.m.
Changed
get_stay
Sept. 27, 2026, 2:40 a.m.
Changed
search_stays
Sept. 27, 2026, 2:40 a.m.
Added
buy_guide
Sept. 25, 2026, 2:40 a.m.
Added
get_guide
Sept. 25, 2026, 2:40 a.m.
Added
list_guides
Sept. 25, 2026, 2:40 a.m.
Added
get_article
Sept. 25, 2026, 2:40 a.m.
Added
list_articles
Sept. 25, 2026, 2:40 a.m.
Added
get_destination
Sept. 25, 2026, 2:40 a.m.
Added
list_destinations
Sept. 25, 2026, 2:40 a.m.