Search Best Western hotels worldwide: descriptions, addresses, contacts, amenities and photos.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Return the amenities of one hotel, or the chain's global amenity catalogue when hotel_id is omitted. Call it without hotel_id to discover the valid amenity IDs to use in search_hotels. No availability, rates or booking: this tool only returns descriptive information.
Hotel ID from search_hotels. If omitted, returns the chain's full amenity catalogue.
Language of the labels. Accepted values: fr, en, de, it, es. A text missing in the requested language is returned in French.
Restrict to one amenity ID, uppercase (e.g. POOL, WIFI_INTERNET, PARKING, RESTAURANT, FITNESS). Unknown IDs raise an error listing the valid ones; with hotel_id, an empty list means the hotel does not have this amenity.
Return the amenities of one hotel, or the chain's global amenity catalogue when hotel_id is omitted. Call it without hotel_id to discover the valid amenity IDs to use in search_hotels. No availability, rates or booking: this tool only returns descriptive information.
| Argument | Type | Description |
|---|---|---|
| hotel_id | any | Hotel ID from search_hotels. If omitted, returns the chain's full amenity catalogue. |
| language | string | Language of the labels. Accepted values: fr, en, de, it, es. A text missing in the requested language is returned in French. |
| amenity_id | any | Restrict to one amenity ID, uppercase (e.g. POOL, WIFI_INTERNET, PARKING, RESTAURANT, FITNESS). Unknown IDs raise an error listing the valid ones; with hotel_id, an empty list means the hotel does not have this amenity. |
{
"type": "object",
"title": "get_amenitiesArguments",
"properties": {
"hotel_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Hotel Id",
"default": null,
"description": "Hotel ID from search_hotels. If omitted, returns the chain's full amenity catalogue."
},
"language": {
"enum": [
"fr",
"en",
"de",
"it",
"es"
],
"type": "string",
"title": "Language",
"default": "fr",
"description": "Language of the labels. Accepted values: fr, en, de, it, es. A text missing in the requested language is returned in French."
},
"amenity_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Amenity Id",
"default": null,
"description": "Restrict to one amenity ID, uppercase (e.g. POOL, WIFI_INTERNET, PARKING, RESTAURANT, FITNESS). Unknown IDs raise an error listing the valid ones; with hotel_id, an empty list means the hotel does not have this amenity."
}
}
}Return the complete details of one hotel (descriptions, address, location, contacts, policies, page URL, amenity IDs). Requires a valid hotel_id: call search_hotels first if you only know the hotel name or city. No availability, rates or booking: for those, give the user the page_url or the contact details of the hotel.
| Argument | Type | Description |
|---|---|---|
| hotel_id* | string | Hotel ID as returned by search_hotels (e.g. PAR-87155) |
| language | string | Language of the texts. Accepted values: fr, en, de, it, es. A text missing in the requested language is returned in French. |
{
"type": "object",
"title": "get_hotel_detailsArguments",
"required": [
"hotel_id"
],
"properties": {
"hotel_id": {
"type": "string",
"title": "Hotel Id",
"description": "Hotel ID as returned by search_hotels (e.g. PAR-87155)"
},
"language": {
"enum": [
"fr",
"en",
"de",
"it",
"es"
],
"type": "string",
"title": "Language",
"default": "fr",
"description": "Language of the texts. Accepted values: fr, en, de, it, es. A text missing in the requested language is returned in French."
}
}
}Return the photo gallery of a hotel (URLs and captions), optionally limited to the cover photo. No availability, rates or booking: this tool only returns descriptive information.
| Argument | Type | Description |
|---|---|---|
| hotel_id* | string | Hotel ID as returned by search_hotels (e.g. PAR-87155) |
| language | string | Language of the captions. Accepted values: fr, en, de, it, es. A text missing in the requested language is returned in French. |
| cover_only | any | If true, return only the cover photo |
{
"type": "object",
"title": "get_hotel_photosArguments",
"required": [
"hotel_id"
],
"properties": {
"hotel_id": {
"type": "string",
"title": "Hotel Id",
"description": "Hotel ID as returned by search_hotels (e.g. PAR-87155)"
},
"language": {
"enum": [
"fr",
"en",
"de",
"it",
"es"
],
"type": "string",
"title": "Language",
"default": "fr",
"description": "Language of the captions. Accepted values: fr, en, de, it, es. A text missing in the requested language is returned in French."
},
"cover_only": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Cover Only",
"default": null,
"description": "If true, return only the cover photo"
}
}
}Search the chain's hotels (worldwide, several thousand) by location, stars, brand, status and amenities, with pagination. All filters are optional and combined with AND. Always pass `country` (ISO code, e.g. "FR") together with `city` when the country is known or implied: a search on "Paris" alone returns Paris (Kentucky, US) and Paris (Ontario, CA) before Paris (France). Returns {"language", "total", "offset", "limit", "count", "next_offset", "hotels"}: `total` is the number of matching hotels, `next_offset` is null on the last page. Each hotel is a summary (hotel_id, name, brand, city, country, state, stars, status, lat, lng, cover_photo); use get_hotel_details for the full record. Geographic search: give a center (lat + lng, or near_hotel_id) and radius_km. Results are then sorted by distance, each hotel gets a `distance_km` field and the response a `center` field. Coordinates you supply for a landmark are approximate, so prefer a generous radius. Hotels without coordinates are excluded. No availability, rates or booking: this tool only returns descriptive information.
| Argument | Type | Description |
|---|---|---|
| lat | any | Latitude of the search center (-90 to 90). Use with `lng` and `radius_km`. |
| lng | any | Longitude of the search center (-180 to 180). Use with `lat` and `radius_km`. |
| city | any | City name, partial match ignoring case, accents, hyphens and St/Ste abbreviations (e.g. 'Saint-Étienne' = 'saint etienne' = 'St Etienne'; 'Saint' matches every city containing 'Saint'). If no city matches, the response lists close city names in `city_suggestions`. City names are ambiguous worldwide: combine with `country` whenever the country is known. |
| brand |
| any |
| Partial match on the sub-brand, ignoring case and accents (e.g. 'Plus', 'Premier', 'Signature Collection') |
| limit | integer | Maximum number of hotels to return (1-100) |
| offset | integer | Number of matching hotels to skip, for pagination. Pass the `next_offset` value of the previous response. |
| status | any | Hotel status |
| country | any | ISO 3166-1 alpha-2 country code, uppercase (FR, US, CA, DE...). Strongly recommended together with `city` to avoid homonyms (Paris FR vs Paris US/CA). |
| language | string | Language of the multilingual fields of the results. Accepted values: fr, en, de, it, es. A text missing in the requested language is returned in French. |
| min_stars | any | Minimum star rating (1-5). Hotels without a star rating are excluded when set. For an exact rating, filter the results on their `stars` field. |
| radius_km | any | Search radius in kilometres (up to 200). Required with lat/lng or near_hotel_id. |
| near_hotel_id | any | Use this hotel's coordinates as the search center (instead of lat/lng) to find other hotels around it; the hotel itself is excluded. Use with `radius_km`. |
| required_amenities | array | Amenity IDs the hotel must ALL have, uppercase (e.g. ["POOL", "PARKING"]). Unknown IDs raise an error listing the valid ones; the catalogue is also available via get_amenities without hotel_id. |
{
"type": "object",
"title": "search_hotelsArguments",
"properties": {
"lat": {
"anyOf": [
{
"type": "number",
"maximum": 90,
"minimum": -90
},
{
"type": "null"
}
],
"title": "Lat",
"default": null,
"description": "Latitude of the search center (-90 to 90). Use with `lng` and `radius_km`."
},
"lng": {
"anyOf": [
{
"type": "number",
"maximum": 180,
"minimum": -180
},
{
"type": "null"
}
],
"title": "Lng",
"default": null,
"description": "Longitude of the search center (-180 to 180). Use with `lat` and `radius_km`."
},
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "City",
"default": null,
"description": "City name, partial match ignoring case, accents, hyphens and St/Ste abbreviations (e.g. 'Saint-Étienne' = 'saint etienne' = 'St Etienne'; 'Saint' matches every city containing 'Saint'). If no city matches, the response lists close city names in `city_suggestions`. City names are ambiguous worldwide: combine with `country` whenever the country is known."
},
"brand": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Brand",
"default": null,
"description": "Partial match on the sub-brand, ignoring case and accents (e.g. 'Plus', 'Premier', 'Signature Collection')"
},
"limit": {
"type": "integer",
"title": "Limit",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Maximum number of hotels to return (1-100)"
},
"offset": {
"type": "integer",
"title": "Offset",
"default": 0,
"minimum": 0,
"description": "Number of matching hotels to skip, for pagination. Pass the `next_offset` value of the previous response."
},
"status": {
"anyOf": [
{
"enum": [
"open",
"closed",
"renovation"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Status",
"default": null,
"description": "Hotel status"
},
"country": {
"anyOf": [
{
"type": "string",
"maxLength": 2,
"minLength": 2
},
{
"type": "null"
}
],
"title": "Country",
"default": null,
"description": "ISO 3166-1 alpha-2 country code, uppercase (FR, US, CA, DE...). Strongly recommended together with `city` to avoid homonyms (Paris FR vs Paris US/CA)."
},
"language": {
"enum": [
"fr",
"en",
"de",
"it",
"es"
],
"type": "string",
"title": "Language",
"default": "fr",
"description": "Language of the multilingual fields of the results. Accepted values: fr, en, de, it, es. A text missing in the requested language is returned in French."
},
"min_stars": {
"anyOf": [
{
"type": "integer",
"maximum": 5,
"minimum": 1
},
{
"type": "null"
}
],
"title": "Min Stars",
"default": null,
"description": "Minimum star rating (1-5). Hotels without a star rating are excluded when set. For an exact rating, filter the results on their `stars` field."
},
"radius_km": {
"anyOf": [
{
"type": "number",
"maximum": 200,
"exclusiveMinimum": 0
},
{
"type": "null"
}
],
"title": "Radius Km",
"default": null,
"description": "Search radius in kilometres (up to 200). Required with lat/lng or near_hotel_id."
},
"near_hotel_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Near Hotel Id",
"default": null,
"description": "Use this hotel's coordinates as the search center (instead of lat/lng) to find other hotels around it; the hotel itself is excluded. Use with `radius_km`."
},
"required_amenities": {
"type": "array",
"items": {
"type": "string"
},
"title": "Required Amenities",
"description": "Amenity IDs the hotel must ALL have, uppercase (e.g. [\"POOL\", \"PARKING\"]). Unknown IDs raise an error listing the valid ones; the catalogue is also available via get_amenities without hotel_id."
}
}
}