RoomExpert
Hotel verdicts on eight axes, with every quote cited to its outlet and url.
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": {
"hotels": {
"url": "https://mcp.roomexpert.com/mcp"
}
}
}Remote endpoints
https://mcp.roomexpert.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (5)
🟢search_hotels(query, destination, brand, sort_by_axis, limit)
Finds hotels by name, destination or brand and returns each one's RoomExpert score, slug and page url. The other tools take that slug, so this is the lookup when the slug is not already known. Can rank by a single axis: "quietest rooms in Tokyo" is destination "tokyo", sort_by_axis "noise". Returns a Markdown table of up to `limit` hotels (name, destination, score, axis score when sorting, loyalty program). An unknown destination returns suggested names; no match says the hotel is not covered.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Part of a hotel name, e.g. \"park hyatt\"."
},
"destination": {
"type": "string",
"description": "A destination name or slug, e.g. \"Kyoto\" or \"new-york\"."
},
"brand": {
"type": "string",
"description": "A brand, chain or loyalty program, e.g. \"Hyatt\", \"Autograph Collection\"."
},
"sort_by_axis": {
"type": "string",
"enum": [
"room",
"sleep",
"bathroom",
"noise",
"service",
"food",
"location",
"value"
],
"description": "Rank by this one axis instead of the overall score."
},
"limit": {
"type": "integer",
"description": "Default 10, max 50."
}
}
}🟢get_hotel(slug)
Returns the RoomExpert verdict for one hotel: overall score, the eight axis scores and what each is based on, how deep the coverage is, the loyalty program, and the award price where a real one exists. Answers "is this hotel any good" and "what is it strong at". Returns Markdown: a score table with one row per axis ("no evidence" where an axis has none), the award line, and the hotel page url. An unknown slug returns up to five near matches. The quotes behind the scores come from get_evidence.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The hotel slug, e.g. \"andaz-maui-at-wailea-resort\". Lowercase, hyphenated."
}
},
"required": [
"slug"
]
}🟢get_evidence(slug, category, limit)
Returns the cited quotes behind a hotel's scores. Each one carries the outlet that published it, what kind of document it was, and its url. Answers what a hotel is actually like: whether it is quiet, whether the beds are good, whether service holds up. Returns a Markdown list of up to `limit` quotes (default 12, max 40), spread across the axes unless narrowed to one, each with its outlet, document kind and url. Some hosts are returned as "a guest review" with no name or link. An unknown slug returns near matches; no evidence on an axis is stated as such.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The hotel slug."
},
"category": {
"type": "string",
"enum": [
"room",
"sleep",
"bathroom",
"noise",
"service",
"food",
"location",
"value"
],
"description": "Narrow to one axis. Omit for a spread across all of them, which is the right default for an open question."
},
"limit": {
"type": "integer",
"description": "Quotes to return. Default 12, max 40."
}
},
"required": [
"slug"
]
}🟢get_rates(slug, checkin, checkout, adults)
Returns live rooms and prices for one hotel and a stay window, with a booking link for each. It queries a metered rate supplier and is limited to 12 calls a minute per client, so it fits a traveler who has chosen a hotel rather than browsing several. Booking links are time-limited and expire within minutes. A link opens a checkout the traveler completes with their own details and card; this tool does not reserve, hold or confirm a room. Returns a Markdown table (room, nightly, total, refundability, link). Hotels the supplier does not carry, sold-out dates and bad dates each return a plain sentence saying which; an over-limit call says how many seconds to wait.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The hotel slug."
},
"checkin": {
"type": "string",
"description": "YYYY-MM-DD."
},
"checkout": {
"type": "string",
"description": "YYYY-MM-DD."
},
"adults": {
"type": "integer",
"description": "Default 2."
}
},
"required": [
"slug",
"checkin",
"checkout"
]
}🟢find_award_stays(program, points, destination, limit)
Lists hotels a given points balance can reach for one night, ranked by how good the redemption is against that program's own norm rather than a flat cents-per-point scale. Fits a traveler who says what they hold, e.g. "I have 300k Hyatt points". The balance is supplied by the caller and is not stored. Only published chart or sampled award prices count; nothing is estimated. Returns a Markdown table of up to `limit` hotels (name, destination, points, value grade, score), or a sentence saying nothing priced fits the budget.
Input Schema
{
"type": "object",
"properties": {
"program": {
"type": "string",
"description": "Loyalty program, e.g. \"World of Hyatt\", \"Hilton Honors\", \"Marriott Bonvoy\"."
},
"points": {
"type": "integer",
"description": "Points available for one night."
},
"destination": {
"type": "string",
"description": "Optional city slug, e.g. \"tokyo\"."
},
"limit": {
"type": "integer",
"description": "Default 10, max 25."
}
},
"required": [
"program",
"points"
]
}Community
Evidence