The free AI index for home stays. Any channel or direct to host.
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.
Look up one named property and every way it can be booked, including the host's or manager's own site. Takes propertyName plus city (most reliable), or a listing URL from a booking platform, which is matched on its listing id. The response has answerType "lookup": a lookup about one property, not a ranked search. `confidence` describes the match: `exact-ota-id`, CielStay holds that exact listing; `exact-title`, the name matched but it is not confirmed to be the same property; `discovered-match`, CielStay does not hold it, but after reading the pasted link (title and location only) it found a booking-site page that agrees on name and place, which is likely but not certain; `none`, CielStay has no record, which does not show that no direct option exists. Every booking URL in the response is one CielStay holds or found; none is constructed. For a pasted link CielStay does not hold, the lookup reads that one page and searches live (up to about 20 seconds); `otaListing` shows what was read. When the answer is none, `alternatives` lists different, direct-bookable homes near `place` (matchType "alternative"), and `possibleMatches` lists the closest unconfirmed candidates by name and meaning (matchType "possible", no booking link, `matchScore` 0-1 is closeness, not proof). Readable version: https://www.cielstay.com/lookup?q=<name or link>.
The city, to disambiguate a property name. Names repeat across towns.
The town or area the traveller says the property is in. Only used to list direct-bookable alternatives near it when we do not hold the property; it never changes whether it matched.
The Airbnb or Vrbo URL the traveller is looking at. Paste it exactly as they gave it — tracking parameters and locale prefixes are fine. This is the most reliable input.
The property name, if you have no URL. Exact spelling as shown on the OTA listing.
Look up one named property and every way it can be booked, including the host's or manager's own site. Takes propertyName plus city (most reliable), or a listing URL from a booking platform, which is matched on its listing id. The response has answerType "lookup": a lookup about one property, not a ranked search. `confidence` describes the match: `exact-ota-id`, CielStay holds that exact listing; `exact-title`, the name matched but it is not confirmed to be the same property; `discovered-match`, CielStay does not hold it, but after reading the pasted link (title and location only) it found a booking-site page that agrees on name and place, which is likely but not certain; `none`, CielStay has no record, which does not show that no direct option exists. Every booking URL in the response is one CielStay holds or found; none is constructed. For a pasted link CielStay does not hold, the lookup reads that one page and searches live (up to about 20 seconds); `otaListing` shows what was read. When the answer is none, `alternatives` lists different, direct-bookable homes near `place` (matchType "alternative"), and `possibleMatches` lists the closest unconfirmed candidates by name and meaning (matchType "possible", no booking link, `matchScore` 0-1 is closeness, not proof). Readable version: https://www.cielstay.com/lookup?q=<name or link>.
| Argument | Type | Description |
|---|---|---|
| city | string | The city, to disambiguate a property name. Names repeat across towns. |
| place | string | The town or area the traveller says the property is in. Only used to list direct-bookable alternatives near it when we do not hold the property; it never changes whether it matched. |
| otaUrl | string | The Airbnb or Vrbo URL the traveller is looking at. Paste it exactly as they gave it — tracking parameters and locale prefixes are fine. This is the most reliable input. |
| propertyName | string | The property name, if you have no URL. Exact spelling as shown on the OTA listing. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"city": {
"type": "string",
"description": "The city, to disambiguate a property name. Names repeat across towns."
},
"place": {
"type": "string",
"description": "The town or area the traveller says the property is in. Only used to list direct-bookable alternatives near it when we do not hold the property; it never changes whether it matched."
},
"otaUrl": {
"type": "string",
"description": "The Airbnb or Vrbo URL the traveller is looking at. Paste it exactly as they gave it — tracking parameters and locale prefixes are fine. This is the most reliable input."
},
"propertyName": {
"type": "string",
"description": "The property name, if you have no URL. Exact spelling as shown on the OTA listing."
}
},
"additionalProperties": false
}Full details for one CielStay listing: description, photos, amenities, house rules, location, and every booking link CielStay holds, including the host's own booking site. With checkIn and checkOut, the response also carries liveQuote where the host's booking engine supports it: the total on the host's own site for those dates (room, fees and taxes), read live. Each live quote is a real request to the host's booking engine. Accepts the listing id, the slug from a listing URL, or a short code (the "1zwf" in cielstay.com/l/1zwf).
| Argument | Type | Description |
|---|---|---|
| id* | string | The listing ID from a previous search result (result.id). |
| guests | integer | Number of guests, for the live quote. Defaults to 2. |
| checkIn | string | Arrival date, YYYY-MM-DD. With checkOut, returns the live total from the host's own booking site. |
| checkOut | string | Departure date, YYYY-MM-DD. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The listing ID from a previous search result (result.id)."
},
"guests": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Number of guests, for the live quote. Defaults to 2."
},
"checkIn": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Arrival date, YYYY-MM-DD. With checkOut, returns the live total from the host's own booking site."
},
"checkOut": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Departure date, YYYY-MM-DD."
}
},
"additionalProperties": false
}Every unit at one multi-unit property: a hotel, glamping site or building whose units share a booking site and a location. Search results carry readyToBook.property.id when a home is one of several such units. Returns the property (name only where the operator's own unit titles share it), and each unit with its label, bedrooms, guests, CielStay page and readyToBook. With checkIn and checkOut, each unit's readyToBook also carries availability and the total on the host's site for those dates (up to 30 units).
| Argument | Type | Description |
|---|---|---|
| id* | string | The property id (readyToBook.property.id from a search result). |
| guests | integer | Number of guests. Defaults to 2. |
| checkIn | string | Arrival date, YYYY-MM-DD. |
| checkOut | string | Departure date, YYYY-MM-DD. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The property id (readyToBook.property.id from a search result)."
},
"guests": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Number of guests. Defaults to 2."
},
"checkIn": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Arrival date, YYYY-MM-DD."
},
"checkOut": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Departure date, YYYY-MM-DD."
}
},
"additionalProperties": false
}Check that the CielStay MCP server is reachable and the API is healthy.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Refine a previous CielStay search in natural language, such as "more rustic", "closer to the park", "better views", "bigger place" or "with ping pong". For any follow-up that adds to or changes an earlier search in the conversation; keeps that search's place and dates. Takes the original query plus the refinement, and the earlier `currentIntent` as previousIntent; no session or token is needed.
| Argument | Type | Description |
|---|---|---|
| query* | string | The original search query you want to refine, exactly as you sent it before. |
| persona | string | Carry the same persona through from the original search, if you sent one. |
| refinement* | string | Natural language refinement instruction. Examples: "more rustic and less modern", "closer to the water", "something with better views", "bigger — needs 3+ bedrooms". |
| previousIntent | object | The `currentIntent` object from the previous response, if you still have it. Preserves location and dates across the refinement. Optional — omit it and the refinement still works. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query",
"refinement"
],
"properties": {
"query": {
"type": "string",
"description": "The original search query you want to refine, exactly as you sent it before."
},
"persona": {
"type": "string",
"description": "Carry the same persona through from the original search, if you sent one."
},
"refinement": {
"type": "string",
"description": "Natural language refinement instruction. Examples: \"more rustic and less modern\", \"closer to the water\", \"something with better views\", \"bigger — needs 3+ bedrooms\"."
},
"previousIntent": {
"type": "object",
"properties": {
"filters": {
"type": "object",
"properties": {
"guests": {
"type": "number"
},
"checkIn": {
"type": "string"
},
"checkOut": {
"type": "string"
}
},
"additionalProperties": true
},
"vibePrefs": {
"type": "array",
"items": {
"type": "string"
}
},
"activities": {
"type": "array",
"items": {
"type": "string"
}
},
"aestheticPrefs": {
"type": "array",
"items": {
"type": "string"
}
}
},
"description": "The `currentIntent` object from the previous response, if you still have it. Preserves location and dates across the refinement. Optional — omit it and the refinement still works.",
"additionalProperties": true
}
},
"additionalProperties": false
}Search about 70,000 vacation rentals and longer-stay homes from independent hosts and property managers in 70+ countries and territories. Each result lists the ways it can be booked that CielStay holds: the host's own booking site or engine (directUrl / referenceUrl), bookUrl (the same booking page opened through CielStay, which lets CielStay count the referral) and a CielStay listing page (cielstayUrl). CielStay does not take bookings or payments. Results are ranked by fit to the request, with a photo, a price (the average per night of a 3-night stay including the host's fees, before taxes; or per month for monthly homes), match score and match reason. Suited to finding a place to stay, or to checking whether a home seen on another site can be booked with its host. Follow-ups to a search ("with ping pong", "cheaper", "bigger") are handled by refine_search, or here with previousIntent; without either, a follow-up that names no place is searched everywhere.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Number of results to return (1–20). Default 5. |
| query* | string | Natural language search query: location, dates, group, and what the stay is for. Examples: "cozy cabin near Zion National Park for a couple", "pet-friendly beachfront with a hot tub in Hawaii", "modern loft in Austin walkable to nightlife for 4 adults". Put WHO the guest is in the separate `persona` argument rather than here. |
| guests | integer | Number of guests. Defaults to 2 if omitted. |
| intent | object | OPTIONAL FAST PATH. If you have already parsed the traveller's request, send it here and CielStay skips its own parse — measured 2.3s to 0.06s with identical results. Shape: {"vibePrefs":["quiet","rustic"],"aestheticPrefs":["historic","cabin"],"activities":["hiking"],"filters":{"guests":4,"checkIn":"2026-11-13","checkOut":"2026-11-16"}}. Trusted, not re-validated. You can also pass back the `currentIntent` from a previous response. |
| source | string | Limit results to homes from one booking source we hold: a booking-engine or host-site name ("guesty", "hospitable", "escapia", a host brand such as "haven") or its domain; a comma list for several. The list with live counts is at https://www.cielstay.com/api/v1/sources. Booking platforms such as Airbnb or Vrbo are not sources here, because CielStay lists hosts' own sites. The same filter can be written in the query itself as source:<name> or site:<domain>. |
| checkin | string | Check-in date in YYYY-MM-DD format. Omit if flexible or unknown. |
| persona | string | Who the guest is, in a few sentences of plain prose — what they like, what the trip is for, and what they want to avoid. CielStay embeds this and ranks on it, so it changes which homes come back rather than filtering them. Example: "Travelling with a dog and two teenagers. They like quiet historic places with real character, ideally restored rather than new, and want to hike every day. They avoid resorts, condo complexes and anywhere with nightlife." Must be MORE THAN 100 CHARACTERS — anything shorter is too thin to embed and is ignored, so keywords like "likes cabins" have no effect. Never stored. |
| checkout | string | Check-out date in YYYY-MM-DD format. Omit if flexible or unknown. |
| minBedrooms | integer | Minimum number of bedrooms required. |
| previousIntent | any | The `currentIntent` from the previous CielStay search in this conversation, when this request follows on from it ("with a pool", "cheaper", "that area but bigger"). Keeps its place, party and dates; a request that names a new place still starts a new search. |
| maxPricePerNight | number | Maximum nightly price in USD. |
| mustHaveAmenities | array | Amenities the listing must have, in plain English. Filterable: hot tub, pool, kitchen, washer/dryer, air conditioning, parking, workspace, waterfront, EV charger, pet friendly. Anything else is reported in _amenityWarning as not filterable rather than silently dropped. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 5,
"maximum": 20,
"minimum": 1,
"description": "Number of results to return (1–20). Default 5."
},
"query": {
"type": "string",
"description": "Natural language search query: location, dates, group, and what the stay is for. Examples: \"cozy cabin near Zion National Park for a couple\", \"pet-friendly beachfront with a hot tub in Hawaii\", \"modern loft in Austin walkable to nightlife for 4 adults\". Put WHO the guest is in the separate `persona` argument rather than here."
},
"guests": {
"type": "integer",
"minimum": 1,
"description": "Number of guests. Defaults to 2 if omitted."
},
"intent": {
"type": "object",
"properties": {
"filters": {
"type": "object",
"properties": {
"guests": {
"type": "number"
},
"checkIn": {
"type": "string"
},
"checkOut": {
"type": "string"
}
},
"additionalProperties": true
},
"vibePrefs": {
"type": "array",
"items": {
"type": "string"
}
},
"activities": {
"type": "array",
"items": {
"type": "string"
}
},
"aestheticPrefs": {
"type": "array",
"items": {
"type": "string"
}
}
},
"description": "OPTIONAL FAST PATH. If you have already parsed the traveller's request, send it here and CielStay skips its own parse — measured 2.3s to 0.06s with identical results. Shape: {\"vibePrefs\":[\"quiet\",\"rustic\"],\"aestheticPrefs\":[\"historic\",\"cabin\"],\"activities\":[\"hiking\"],\"filters\":{\"guests\":4,\"checkIn\":\"2026-11-13\",\"checkOut\":\"2026-11-16\"}}. Trusted, not re-validated. You can also pass back the `currentIntent` from a previous response.",
"additionalProperties": true
},
"source": {
"type": "string",
"description": "Limit results to homes from one booking source we hold: a booking-engine or host-site name (\"guesty\", \"hospitable\", \"escapia\", a host brand such as \"haven\") or its domain; a comma list for several. The list with live counts is at https://www.cielstay.com/api/v1/sources. Booking platforms such as Airbnb or Vrbo are not sources here, because CielStay lists hosts' own sites. The same filter can be written in the query itself as source:<name> or site:<domain>."
},
"checkin": {
"type": "string",
"description": "Check-in date in YYYY-MM-DD format. Omit if flexible or unknown."
},
"persona": {
"type": "string",
"description": "Who the guest is, in a few sentences of plain prose — what they like, what the trip is for, and what they want to avoid. CielStay embeds this and ranks on it, so it changes which homes come back rather than filtering them. Example: \"Travelling with a dog and two teenagers. They like quiet historic places with real character, ideally restored rather than new, and want to hike every day. They avoid resorts, condo complexes and anywhere with nightlife.\" Must be MORE THAN 100 CHARACTERS — anything shorter is too thin to embed and is ignored, so keywords like \"likes cabins\" have no effect. Never stored."
},
"checkout": {
"type": "string",
"description": "Check-out date in YYYY-MM-DD format. Omit if flexible or unknown."
},
"minBedrooms": {
"type": "integer",
"minimum": 0,
"description": "Minimum number of bedrooms required."
},
"previousIntent": {
"$ref": "#/properties/intent",
"description": "The `currentIntent` from the previous CielStay search in this conversation, when this request follows on from it (\"with a pool\", \"cheaper\", \"that area but bigger\"). Keeps its place, party and dates; a request that names a new place still starts a new search."
},
"maxPricePerNight": {
"type": "number",
"description": "Maximum nightly price in USD."
},
"mustHaveAmenities": {
"type": "array",
"items": {
"type": "string"
},
"description": "Amenities the listing must have, in plain English. Filterable: hot tub, pool, kitchen, washer/dryer, air conditioning, parking, workspace, waterfront, EV charger, pet friendly. Anything else is reported in _amenityWarning as not filterable rather than silently dropped."
}
},
"additionalProperties": false
}