Déstaire
A curated guide to exceptional hotels and private stays, with editorial content and city guides.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"destaire": {
"url": "https://destaire.com/mcp"
}
}
}Remote endpoints
https://destaire.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (9)
🟢search_stays(query, country, destination, collection, amenities, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"query": {
"description": "What the reader wants, in plain words: \"quiet hotel on Lake Como with a spa\". Stays that match more words come first.",
"type": "string",
"maxLength": 200
},
"country": {
"description": "Only this country: a name or an ISO code, such as \"France\" or \"FR\".",
"type": "string",
"maxLength": 60
},
"destination": {
"description": "Only this destination: a name or a slug, such as \"Provence\".",
"type": "string",
"maxLength": 60
},
"collection": {
"description": "Only this collection: a name or a slug, such as \"Coast\". list_destinations lists them.",
"type": "string",
"maxLength": 60
},
"amenities": {
"description": "Only stays that have each of these, by word: \"spa\", \"pool\", \"beach\", \"tennis\".",
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"maxLength": 40
}
},
"max_rate": {
"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.",
"type": "number",
"exclusiveMinimum": 0
},
"sort": {
"default": "relevance",
"description": "\"relevance\" (best match first) or \"rate\" (lowest rate first).",
"type": "string",
"enum": [
"relevance",
"rate"
]
},
"limit": {
"default": 10,
"description": "The most stays to give.",
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"stays": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"kind": {
"type": "string",
"enum": [
"hotel",
"private stay"
],
"description": "A hotel, or a private stay: a whole house or estate that one party rents."
},
"town": {
"type": "string"
},
"destination": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"slug": {
"type": "string"
}
},
"required": [
"name",
"url",
"slug"
],
"additionalProperties": false
},
"country": {
"type": "string"
},
"lede": {
"type": "string"
},
"rate": {
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "As the site shows it: \"from €950/night\", or \"Price on request\"."
},
"amount": {
"description": "The \"from\" rate in euros, rounded to 10.",
"type": [
"number",
"null"
]
},
"currency": {
"anyOf": [
{
"type": "string",
"const": "EUR"
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"enum": [
"night",
"week"
]
},
{
"type": "null"
}
]
}
},
"required": [
"text",
"amount",
"currency",
"per"
],
"additionalProperties": false,
"description": "The \"from\" rate: the lowest nightly price over the next six months, checked each week."
},
"photo": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "A card-size photo of the stay (3:2)."
}
},
"required": [
"name",
"slug",
"url",
"kind",
"town",
"destination",
"country",
"lede",
"rate",
"photo"
],
"additionalProperties": false
}
},
"note": {
"type": "string"
}
},
"required": [
"total",
"stays"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢get_stay(slug)
One stay as its page shows it: description, address, location, website, "from" rate, amenities, collections, and photo URLs.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"maxLength": 120,
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
"description": "The stay's slug, the last part of its URL."
}
},
"required": [
"slug"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"kind": {
"type": "string",
"enum": [
"hotel",
"private stay"
],
"description": "A hotel, or a private stay: a whole house or estate that one party rents."
},
"lede": {
"type": "string"
},
"description": {
"type": "string"
},
"town": {
"type": "string"
},
"destination": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"name",
"url"
],
"additionalProperties": false
},
"country": {
"type": "string"
},
"address": {
"type": "string"
},
"location": {
"type": "object",
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
}
},
"required": [
"latitude",
"longitude"
],
"additionalProperties": false
},
"website": {
"type": "string",
"format": "uri"
},
"rate": {
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "As the site shows it: \"from €950/night\", or \"Price on request\"."
},
"amount": {
"description": "The \"from\" rate in euros, rounded to 10.",
"type": [
"number",
"null"
]
},
"currency": {
"anyOf": [
{
"type": "string",
"const": "EUR"
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"enum": [
"night",
"week"
]
},
{
"type": "null"
}
]
}
},
"required": [
"text",
"amount",
"currency",
"per"
],
"additionalProperties": false,
"description": "The \"from\" rate: the lowest nightly price over the next six months, checked each week."
},
"amenities": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"description": {
"type": "string"
}
},
"required": [
"name",
"description"
],
"additionalProperties": false
}
},
"collections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"name",
"url"
],
"additionalProperties": false
}
},
"hero": {
"type": "string",
"format": "uri",
"description": "The main photo at 2:1."
},
"photos": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
}
}
},
"required": [
"name",
"url",
"kind",
"lede",
"description",
"town",
"destination",
"country",
"address",
"location",
"website",
"rate",
"amenities",
"collections",
"hero",
"photos"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢list_destinations(country)
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.
Input Schema
{
"type": "object",
"properties": {
"country": {
"description": "Only this country: a name or an ISO code.",
"type": "string",
"maxLength": 60
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"countries": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"code": {
"type": "string"
},
"destinations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"slug": {
"type": "string"
},
"stays": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"name",
"url",
"slug",
"stays"
],
"additionalProperties": false
}
}
},
"required": [
"name",
"url",
"code",
"destinations"
],
"additionalProperties": false
}
},
"collections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"slug": {
"type": "string"
},
"stays": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"name",
"url",
"slug",
"stays"
],
"additionalProperties": false
}
}
},
"required": [
"countries",
"collections"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢get_destination(slug, country, detail)
One destination and its stays: the first 10 and the total, or all of them with detail "full".
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"maxLength": 120,
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
"description": "The destination's slug, the last part of its URL."
},
"country": {
"description": "The country, when two destinations share a slug.",
"type": "string",
"maxLength": 60
},
"detail": {
"default": "concise",
"description": "\"concise\" (the default): the start of the answer and a count, to save context; \"full\": all of it.",
"type": "string",
"enum": [
"concise",
"full"
]
}
},
"required": [
"slug"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"country": {
"type": "string"
},
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"stays": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"kind": {
"type": "string",
"enum": [
"hotel",
"private stay"
],
"description": "A hotel, or a private stay: a whole house or estate that one party rents."
},
"town": {
"type": "string"
},
"destination": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"slug": {
"type": "string"
}
},
"required": [
"name",
"url",
"slug"
],
"additionalProperties": false
},
"country": {
"type": "string"
},
"lede": {
"type": "string"
},
"rate": {
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "As the site shows it: \"from €950/night\", or \"Price on request\"."
},
"amount": {
"description": "The \"from\" rate in euros, rounded to 10.",
"type": [
"number",
"null"
]
},
"currency": {
"anyOf": [
{
"type": "string",
"const": "EUR"
},
{
"type": "null"
}
]
},
"per": {
"anyOf": [
{
"type": "string",
"enum": [
"night",
"week"
]
},
{
"type": "null"
}
]
}
},
"required": [
"text",
"amount",
"currency",
"per"
],
"additionalProperties": false,
"description": "The \"from\" rate: the lowest nightly price over the next six months, checked each week."
},
"photo": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "A card-size photo of the stay (3:2)."
}
},
"required": [
"name",
"slug",
"url",
"kind",
"town",
"destination",
"country",
"lede",
"rate",
"photo"
],
"additionalProperties": false
}
},
"note": {
"type": "string"
}
},
"required": [
"name",
"url",
"country",
"total",
"stays"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢list_articles(category, limit)
The travel writing, newest first: title, standfirst, author, category, date, and page URL.
Input Schema
{
"type": "object",
"properties": {
"category": {
"description": "Only this category.",
"type": "string",
"maxLength": 60
},
"limit": {
"default": 20,
"description": "The most articles to give.",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"articles": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"slug": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"standfirst": {
"type": "string"
},
"author": {
"type": "string"
},
"category": {
"type": "string"
},
"published": {
"type": "string"
}
},
"required": [
"title",
"slug",
"url",
"standfirst",
"author",
"category",
"published"
],
"additionalProperties": false
}
}
},
"required": [
"total",
"articles"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢get_article(slug, detail)
One article: its opening paragraphs, or with detail "full" its whole text with every list of places.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"maxLength": 120,
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
"description": "The article's slug, the last part of its URL."
},
"detail": {
"default": "concise",
"description": "\"concise\" (the default): the start of the answer and a count, to save context; \"full\": all of it.",
"type": "string",
"enum": [
"concise",
"full"
]
}
},
"required": [
"slug"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"standfirst": {
"type": "string"
},
"author": {
"type": "string"
},
"category": {
"type": "string"
},
"published": {
"type": "string"
},
"photo": {
"type": "string",
"format": "uri"
},
"text": {
"type": "string"
},
"truncated": {
"type": "boolean"
},
"note": {
"type": "string"
}
},
"required": [
"title",
"url",
"standfirst",
"author",
"category",
"published",
"photo",
"text",
"truncated"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢list_guides
The city guides on sale: city, standfirst, price, and the URL of the page where a reader can buy the guide.
Input Schema
{
"type": "object",
"properties": {}
}Output Schema
{
"type": "object",
"properties": {
"guides": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"slug": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"city": {
"type": "string"
},
"country": {
"type": "string"
},
"standfirst": {
"type": "string"
},
"price": {
"type": "string"
}
},
"required": [
"title",
"slug",
"url",
"city",
"country",
"standfirst",
"price"
],
"additionalProperties": false
}
}
},
"required": [
"guides"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢get_guide(slug)
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.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"maxLength": 120,
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
"description": "The guide's slug, the last part of its URL."
}
},
"required": [
"slug"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"city": {
"type": "string"
},
"country": {
"type": "string"
},
"standfirst": {
"type": "string"
},
"onSale": {
"type": "boolean"
},
"price": {
"type": "string"
},
"sections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"text": {
"type": "string"
}
},
"required": [
"title",
"text"
],
"additionalProperties": false
}
},
"cover": {
"type": "string",
"format": "uri",
"description": "The cover at 4:5."
},
"buyInChat": {
"type": "boolean",
"description": "True when buy_guide can buy this guide in this conversation."
},
"photos": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
}
}
},
"required": [
"title",
"url",
"city",
"country",
"standfirst",
"onSale",
"price",
"sections",
"cover",
"buyInChat",
"photos"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}⚪buy_guide(slug, email)
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.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"maxLength": 120,
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
"description": "The guide's slug, the last part of its URL."
},
"email": {
"type": "string",
"maxLength": 254,
"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,}$",
"description": "The user's email address: the guide goes to this Déstaire account."
}
},
"required": [
"slug",
"email"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"paymentLink": {
"type": "string",
"format": "uri"
},
"guide": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"city": {
"type": "string"
},
"country": {
"type": "string"
},
"cover": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
}
},
"required": [
"title",
"url",
"city",
"country",
"cover"
],
"additionalProperties": false
},
"price": {
"type": "string"
},
"email": {
"type": "string"
},
"instructions": {
"type": "object",
"properties": {
"beforePaying": {
"type": "string"
},
"agent": {
"type": "string"
},
"afterPaying": {
"type": "string"
},
"browser": {
"type": "string"
}
},
"required": [
"beforePaying",
"agent",
"afterPaying",
"browser"
],
"additionalProperties": false
}
},
"required": [
"paymentLink",
"guide",
"price",
"email",
"instructions"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}Community
Evidence