Skip to main content
Glama

Search vacation rentals

search_vacation_rentals
Read-onlyIdempotent

Search about 90,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) and a match score. 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. Each result carries bookUrl (the host's booking page) and, where someone can receive a message about the home, messageHostUrl (its message form); for those, contact_host sends the traveller's first message, free, for questions or monthly stays.

Input Schema

NameRequiredDescriptionDefault
limitNoNumber of results to return (1–20). Default 5.
queryYesNatural 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.
guestsNoNumber of guests. Defaults to 2 if omitted.
intentNoOPTIONAL 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.
sourceNoLimit 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>.
checkinNoCheck-in date in YYYY-MM-DD format. Omit if flexible or unknown.
personaNoWho 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." Any length is used; a few sentences rank more precisely than keywords. `traveller` carries the same context as short fields. Never stored.
checkoutNoCheck-out date in YYYY-MM-DD format. Omit if flexible or unknown.
travellerNoWhat the traveller has said about who is going and what they want, in short fields (any subset). Preferences only, not names, contact details or health information. Used for ranking and never stored; echoed back in rankedFor.traveller.
minBedroomsNoMinimum number of bedrooms required.
previousIntentNoThe `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.
maxPricePerNightNoMaximum nightly price in USD.
mustHaveAmenitiesNoAmenities 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.

Output Schema

NameRequiredDescriptionDefault
noticeNo
hasMoreNo
resultsYes
rankedForNoWhat these results were ranked for: place, guests, dates, amenities, traveller
totalFoundNo
currentIntentNoPass to refine_search as previousIntent to keep place and dates
rankingQuestionNoPresent when nothing is known about the traveller: the question whose answer would most change this ranking. An answer can be sent as `traveller`

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • changedInput schema / properties / persona / description
      Previous value: -"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."New value: +"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.\" Any length is used; a few sentences rank more precisely than keywords. `traveller` carries the same context as short fields. Never stored."
    • removedInput schema / properties / previousIntent / $ref
      Removed value: -"#/properties/intent"
    • addedInput schema / properties / previousIntent / additionalProperties
      Added value: +true
    • addedInput schema / properties / previousIntent / properties
      Added value: +{
      +  "activities": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "aestheticPrefs": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "filters": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "checkIn": {
      +        "type": "string"
      +      },
      +      "checkOut": {
      +        "type": "string"
      +      },
      +      "guests": {
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "vibePrefs": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  }
      +}
    • addedInput schema / properties / previousIntent / type
      Added value: +"object"
    • addedInput schema / properties / traveller
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "What the traveller has said about who is going and what they want, in short fields (any subset). Preferences only, not names, contact details or health information. Used for ranking and never stored; echoed back in rankedFor.traveller.",
      +  "properties": {
      +    "avoid": {
      +      "description": "What they do not want",
      +      "type": "string"
      +    },
      +    "likes": {
      +      "description": "What they want in the home or stay",
      +      "type": "string"
      +    },
      +    "tripPurpose": {
      +      "description": "What the trip is for",
      +      "type": "string"
      +    },
      +    "whoIsGoing": {
      +      "description": "How many, ages, pets, as the traveller said it",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / rankedFor
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "What these results were ranked for: place, guests, dates, amenities, traveller",
      +  "properties": {},
      +  "type": "object"
      +}
    • addedOutput schema / properties / rankingQuestion
      Added value: +{
      +  "description": "Present when nothing is known about the traveller: the question whose answer would most change this ranking. An answer can be sent as `traveller`",
      +  "type": "string"
      +}
    • removedOutput schema / properties / results / items / properties / readyToBook / $ref
      Removed value: -"#/properties/currentIntent/anyOf/0"
    • addedOutput schema / properties / results / items / properties / readyToBook / additionalProperties
      Added value: +true
    • addedOutput schema / properties / results / items / properties / readyToBook / properties
      Added value: +{}
    • addedOutput schema / properties / results / items / properties / readyToBook / type
      Added value: +"object"
  2. Changed1 schema field changed
    • addedOutput schema / properties / results / items / properties / messageHostUrl
      Added value: +{
      +  "description": "Present only when someone can receive a message about this home: the listing page opened at its message form with the stay filled in (free)",
      +  "type": "string"
      +}
  3. Changed1 schema field changed
    • addedInput schema / properties / previousIntent
      Added value: +{
      +  "$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."
      +}
  4. Changed5 schema fields changed
    • addedInput schema / properties / intent / additionalProperties
      Added value: +true
    • addedInput schema / properties / intent / properties
      Added value: +{
      +  "activities": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "aestheticPrefs": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "filters": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "checkIn": {
      +        "type": "string"
      +      },
      +      "checkOut": {
      +        "type": "string"
      +      },
      +      "guests": {
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "vibePrefs": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  }
      +}
    • addedInput schema / properties / intent / type
      Added value: +"object"
    • addedOutput schema / properties / currentIntent / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {},
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / results / items / properties / readyToBook / $ref
      Added value: +"#/properties/currentIntent/anyOf/0"
  5. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": true,
      +  "properties": {
      +    "currentIntent": {
      +      "description": "Pass to refine_search as previousIntent to keep place and dates"
      +    },
      +    "hasMore": {
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "notice": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "results": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "bedrooms": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "bookUrl": {
      +            "description": "The host's booking page, opened through CielStay so the referral is counted",
      +            "type": "string"
      +          },
      +          "cielstayUrl": {
      +            "type": "string"
      +          },
      +          "directUrl": {
      +            "type": "string"
      +          },
      +          "id": {
      +            "type": "string"
      +          },
      +          "location": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "maxGuests": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "price": {
      +            "additionalProperties": true,
      +            "properties": {
      +              "amountUsd": {
      +                "type": "number"
      +              },
      +              "basis": {
      +                "description": "What the figure is: e.g. avg_night_incl_fees, avg_nightly_rate_excl_fees, host_set, monthly_rent",
      +                "type": "string"
      +              },
      +              "label": {
      +                "description": "The qualifier to show next to the price",
      +                "type": "string"
      +              },
      +              "per": {
      +                "description": "\"night\" or \"month\"",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "amountUsd",
      +              "per",
      +              "basis",
      +              "label"
      +            ],
      +            "type": "object"
      +          },
      +          "priceNote": {
      +            "type": "string"
      +          },
      +          "readyToBook": {
      +            "description": "Where to book; with dates, availability and the total on the host's site where it can be read"
      +          },
      +          "referenceUrl": {
      +            "type": "string"
      +          },
      +          "title": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "id"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "totalFound": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "results"
      +  ],
      +  "type": "object"
      +}
  6. Changed1 schema field changed
    • changedInput schema / properties / source / description
      Previous value: -"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."New value: +"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>."
  7. Changed2 schema fields changed
    • changedInput schema / properties / mustHaveAmenities / description
      Previous value: -"Amenities the listing must have. Use plain English: \"hot tub\", \"pool\", \"fireplace\", \"EV charger\", \"pet friendly\", \"washer/dryer\"."New value: +"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."
    • addedInput schema / properties / source
      Added value: +{
      +  "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.",
      +  "type": "string"
      +}
  8. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent/openWorld annotations it discloses that CielStay takes no bookings or payments, how results are ranked (fit to request), how price is computed (average per night of a 3-night stay, host fees included, taxes excluded, per-month for monthly homes), and what bookUrl vs. directUrl vs. cielstayUrl vs. messageHostUrl mean. That is behavior no structured field carries.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and scale are front-loaded and every paragraph carries operational content. It loses a point for restating bookUrl twice (once in the URL taxonomy, once in the closing contact_host pitch), which is avoidable repetition in an already dense description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter tool with nested objects and an output schema, the description covers the gaps structured fields don't: ranking model, pricing basis, URL semantics, follow-up handling and the no-payments boundary. An output schema exists, so the additional return-field detail is surplus rather than required, and nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds meaning on top by explaining the follow-up semantics of previousIntent and what happens when it is omitted. The fast-path intent/traveller distinction is already documented in the schema, so it isn't credited twice.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Search about 90,000 vacation rentals and longer-stay homes ... in 70+ countries" states a specific verb, resource, scale and scope. It also separates itself from siblings by naming refine_search for follow-ups and contact_host for messaging, so an agent can route without opening the schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives two explicit use cases (finding a place to stay; checking whether a home seen elsewhere can be booked direct) plus explicit routing for follow-ups (refine_search, or previousIntent here) and for making contact (contact_host). It also explains what happens when neither follow-up path is used, which is a real ambiguity an agent would otherwise hit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources