Déstaire

A curated guide to exceptional hotels and private stays, with editorial content and city guides.

Should I use this

Quality & Safety

A
Description quality
96%
Schema completeness
89%
Naming quality
98%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,098Tokens (tool definitions)
~4.5 KBTypical response size
Significant attention impact (3.20% of 128k context)

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-http

What it can do

Tool inventory

Tools (9)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded9 tools