Guest connector (MCP)
The guest connector lets an AI agent act for a hotel guest. The agent can find Maison hotels, ask a hotel's own AI concierge questions, check live availability and rates, and book directly with the hotel. Answers come from each hotel's verified knowledge base and its property management system, never from a scraped page.
Endpoint
- Authentication: none. Do not send an API key or an OAuth token.
- Protocol: MCP over Streamable HTTP. The server identifies itself as
maison-guest-concierge. - Sessions: the server issues an
mcp-session-idoninitialize. Sessions expire when idle; if a request returns404, initialize again. The conversation itself is not lost (see Conversations). - Browser calls: requests that carry a browser
Originheader are refused. Call the endpoint from your agent's server, as MCP clients do.
Connecting
In any agent that supports custom or remote MCP connectors (for example Meta Muse custom connectors or ChatGPT developer mode), add a connector with the endpoint URL above and choose no authentication. For a client configured by file, the entry looks like this:
{
"mcpServers": {
"maison-guest": {
"type": "http",
"url": "<guest connector URL>"
}
}
}Every result is readable as plain text. Hosts that render MCP Apps widgets also get a hotel list and a hotel card; hosts that do not lose nothing, because each result's text content carries the same data as JSON.
Tools
Three tools. Start with search_hotels to get a hotel's clientId, then use ask_hotel for everything else about that hotel.
| Tool | What it does | Inputs | Behaviour |
|---|---|---|---|
| search_hotels Search hotels | Lists the participating hotels, optionally filtered by a name or city/address fragment. Returns each hotel's clientId and name. Call it once per hotel; an empty list is a normal answer. | query (optional) | Read-only |
| get_hotel_info Hotel details | Returns one hotel's public card: clientId, name, and website and address when the hotel has them. | client_id | Read-only |
| ask_hotel Ask the hotel | Sends the guest's message to that hotel's own AI concierge and returns its reply: questions, live availability and rates, new bookings, and changes to an existing booking after email verification. Returns JSON with reply and sessionToken. It can create a reservation, so it is neither read-only nor safe to repeat. | client_id, message, session_token (optional) | Can create a booking |
Each tool declares MCP annotations. The two lookups are read-only and safe to repeat. ask_hotel is marked neither read-only nor idempotent, because a turn can create a reservation: sending the same message twice can book twice.
Conversations
ask_hotel returns JSON with a reply to relay to the guest and an opaque sessionToken. Send that token back unchanged as session_token on the next ask_hotel call to continue the same conversation. Without it, the hotel may start over and ask the guest to repeat themselves or verify again. A conversation lasts up to 24 hours from its first message.
A turn that checks availability or makes a booking can take tens of seconds. While it runs, the server sends an MCP log notification every 10 seconds to keep the connection open.
ask_hotel call that timed out on your side. The hotel may still be completing the request, and a retry can create a second booking. Ask the guest, or check with the hotel in the same conversation, instead.Bookings and payments
- Browsing, questions and new bookings need no login. The guest supplies their own details to the hotel's concierge.
- Existing bookings (viewing, changing, cancelling or paying) are protected. The hotel emails a one-time code to the address on the reservation; the guest reads it back and the agent sends it as the next
message. No credential ever passes through the agent. - Payment never happens in the chat. The agent must never ask for card details. The hotel's property management system issues a secure payment link, and the hotel is the merchant of record.
Which hotels appear
Only hotels that have opted in to AI-agent access are listed, and only their guest-facing information is available. A hotel can withdraw at any time; it then disappears from search_hotels within about a minute. An empty list is a normal answer.
Limits and errors
The endpoint is rate-limited per session and per hotel so that one busy conversation cannot crowd out others. When a limit is reached, the tool returns a short "the hotel is busy" tool error; wait a moment and try again. Requests for a hotel that is not listed return the same neutral "unavailable" message whether the hotel is unknown or has opted out.