Search and book verified independent vacation rentals directly from hosts, with no guest fees.
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.
Send a question the property record and FAQ don't answer. The answer arrives later; tell the guest you'll follow up. Don't include the guest's contact details. Maps to POST /v1/properties/{id}/questions.
The guest's question, in plain words, up to 500 characters. The host's answer may be added to the listing's FAQ.
The property the question is about.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Send a question the property record and FAQ don't answer. The answer arrives later; tell the guest you'll follow up. Don't include the guest's contact details. Maps to POST /v1/properties/{id}/questions.
| Argument | Type | Description |
|---|---|---|
| question* | string | The guest's question, in plain words, up to 500 characters. The host's answer may be added to the listing's FAQ. |
| property_id* | string | The property the question is about. |
{
"type": "object",
"required": [
"property_id",
"question"
],
"properties": {
"question": {
"type": "string",
"maxLength": 500,
"description": "The guest's question, in plain words, up to 500 characters. The host's answer may be added to the listing's FAQ."
},
"property_id": {
"type": "string",
"description": "The property the question is about."
}
}
}Two-step. First call with confirm=false to see what the guest gets back if they cancel now (nothing changes). Tell the guest that refund and get their go-ahead, then call again with confirm=true and expected_refund_cents set to the refund amount from the first call. If the refund changed in between, the call fails with refund_changed instead of cancelling. Refunds go to the guest's card automatically. Pass guest_email (the email the booking was made with) unless you connect with an agent token.
| Argument | Type | Description |
|---|---|---|
| confirm* | boolean | False to preview the refund without changing anything; true to cancel. |
| booking_id* | string | The booking or request to cancel. |
| guest_email | string | The email the booking was made with. Needed unless you connect with an agent token. |
| expected_refund_cents | integer | Required when confirm is true: refund.amount from the confirm=false call. |
{
"type": "object",
"required": [
"booking_id",
"confirm"
],
"properties": {
"confirm": {
"type": "boolean",
"description": "False to preview the refund without changing anything; true to cancel."
},
"booking_id": {
"type": "string",
"description": "The booking or request to cancel."
},
"guest_email": {
"type": "string",
"format": "email",
"description": "The email the booking was made with. Needed unless you connect with an agent token."
},
"expected_refund_cents": {
"type": "integer",
"description": "Required when confirm is true: refund.amount from the confirm=false call."
}
}
}Day-by-day availability and indicative nightly prices for up to 180 days. Cached; use get_quote to confirm. Useful when the guest's dates are flexible. Maps to GET /v1/properties/{id}/availability.
| Argument | Type | Description |
|---|---|---|
| to* | string | Exclusive |
| from* | string | First night to check, YYYY-MM-DD. |
| property_id* | string | The property's id, from search_stays. |
{
"type": "object",
"required": [
"property_id",
"from",
"to"
],
"properties": {
"to": {
"type": "string",
"format": "date",
"description": "Exclusive"
},
"from": {
"type": "string",
"format": "date",
"description": "First night to check, YYYY-MM-DD."
},
"property_id": {
"type": "string",
"description": "The property's id, from search_stays."
}
}
}Status, amounts, refund schedule, guest ID verification link, and when arrival details will be sent. Maps to GET /v1/bookings/{id}. Pass guest_email (the email the booking was made with) unless you connect with an agent token.
| Argument | Type | Description |
|---|---|---|
| booking_id* | string | The booking's id, from request_booking (starts with bkg_). |
| guest_email | string | The email the booking was made with. Needed unless you connect with an agent token. |
{
"type": "object",
"required": [
"booking_id"
],
"properties": {
"booking_id": {
"type": "string",
"description": "The booking's id, from request_booking (starts with bkg_)."
},
"guest_email": {
"type": "string",
"format": "email",
"description": "The email the booking was made with. Needed unless you connect with an agent token."
}
}
}The conversation between the guest and the host about a booking, oldest first (including the guest's note with the request and the host's note when accepting or declining). Use it to relay the host's replies. Pass guest_email (the email the booking was made with) unless you connect with an agent token.
| Argument | Type | Description |
|---|---|---|
| booking_id* | string | The booking's id, from request_booking (starts with bkg_). |
| guest_email | string | The email the booking was made with. Needed unless you connect with an agent token. |
{
"type": "object",
"required": [
"booking_id"
],
"properties": {
"booking_id": {
"type": "string",
"description": "The booking's id, from request_booking (starts with bkg_)."
},
"guest_email": {
"type": "string",
"format": "email",
"description": "The email the booking was made with. Needed unless you connect with an agent token."
}
}
}Full record for one property: beds by room, amenities with details, access and stairs, rules, host FAQ, policies, and verification status. The location is approximate on purpose: the exact address and the host's direct contact details are not in the record and are sent to the guest after a confirmed booking, so if asked, say that rather than that they are missing. Maps to GET /v1/properties/{id}.
| Argument | Type | Description |
|---|---|---|
| property_id* | string | The property's id, from search_stays (starts with prop_). |
{
"type": "object",
"required": [
"property_id"
],
"properties": {
"property_id": {
"type": "string",
"description": "The property's id, from search_stays (starts with prop_)."
}
}
}Itemized, binding price for exact dates and party, after re-checking the host's live calendars. Valid 10 minutes. Returns house rules and an exact refund schedule to show the guest. Does not reserve the dates. Maps to POST /v1/properties/{id}/quotes.
| Argument | Type | Description |
|---|---|---|
| pets | integer | Number of pets. Default 0. Service animals don't count. |
| adults* | integer | Number of adults (at least 1). |
| infants | integer | Number of infants under 2. Default 0. |
| check_in* | string | Arrival date, YYYY-MM-DD. |
| children | integer | Number of children aged 2 to 12. Default 0. |
| check_out* | string | Departure date, YYYY-MM-DD. |
| property_id* | string | The property's id, from search_stays. |
{
"type": "object",
"required": [
"property_id",
"check_in",
"check_out",
"adults"
],
"properties": {
"pets": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Number of pets. Default 0. Service animals don't count."
},
"adults": {
"type": "integer",
"minimum": 1,
"description": "Number of adults (at least 1)."
},
"infants": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Number of infants under 2. Default 0."
},
"check_in": {
"type": "string",
"format": "date",
"description": "Arrival date, YYYY-MM-DD."
},
"children": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Number of children aged 2 to 12. Default 0."
},
"check_out": {
"type": "string",
"format": "date",
"description": "Departure date, YYYY-MM-DD."
},
"property_id": {
"type": "string",
"description": "The property's id, from search_stays."
}
}
}Request a stay from a quote. Set house_rules_accepted only after the guest has seen and agreed to the quote's house_rules. If the quote's payment.collected_by is "threshold", the booking starts as awaiting_payment and the response includes payment_url: the guest must open payment_url and add a card within 60 minutes, after which the host gets the request (status pending_host_confirmation). Otherwise the request goes to the host immediately and the host arranges payment after accepting. Returns the booking and a status link to give the guest; poll get_booking for changes.
| Argument | Type | Description |
|---|---|---|
| email* | string | The guest's email: confirmations, the payment link and the host's messages go there. |
| phone | string | The guest's phone number in international format, e.g. +15551234567. Optional. |
| quote_id* | string | The quote being booked, from get_quote (starts with quo_). |
| last_name* | string | The guest's last name. |
| first_name* | string | The guest's first name. |
| special_requests | string | Anything the guest wants the host to know, in their words (arrival time, a question). Optional, up to 500 characters. |
| house_rules_accepted |
Find verified independent vacation rentals. Filters are strict: every listed amenity must be present. With dates, results include a cached availability signal and an indicative all-in total (no guest service fee). Maps to GET /v1/search.
| Argument | Type | Description |
|---|---|---|
| pets | integer | Number of pets. Only places that allow that many are returned. Service animals don't count as pets. |
| limit | integer | Most results to return, 1 to 50. Default 8. |
| place | string | Town and state/country, e.g. 'Asheville, NC'. Use near_lat/near_lng instead when you have coordinates. |
| adults | integer | Number of adults. Default 2. |
| infants | integer | Number of infants under 2. |
| check_in | string | Arrival date, YYYY-MM-DD. With check_out, only places free for the whole stay are returned, with an indicative total. |
| children | integer | Number of children aged 2 to 12. |
| near_lat | number | Latitude to search around, with near_lng. Use instead of place when you have coordinates. |
Send a message to the host on the guest's behalf, e.g. a question about check-in or a late arrival. Only send what the guest asked you to say. The host is emailed and replies appear in get_messages. Open from the request until two weeks after check-out.
| Argument | Type | Description |
|---|---|---|
| body* | string | The message to the host, in the guest's words, up to 2,000 characters. |
| booking_id* | string | The booking the message is about. |
| guest_email | string | The email the booking was made with. Needed unless you connect with an agent token. |
{
"type": "object",
"required": [
"booking_id",
"body"
],
"properties": {
"body": {
"type": "string",
"maxLength": 2000,
"description": "The message to the host, in the guest's words, up to 2,000 characters."
},
"booking_id": {
"type": "string",
"description": "The booking the message is about."
},
"guest_email": {
"type": "string",
"format": "email",
"description": "The email the booking was made with. Needed unless you connect with an agent token."
}
}
}| boolean |
| True only after the guest has seen and agreed to the quote's house_rules. |
{
"type": "object",
"required": [
"quote_id",
"first_name",
"last_name",
"email",
"house_rules_accepted"
],
"properties": {
"email": {
"type": "string",
"format": "email",
"description": "The guest's email: confirmations, the payment link and the host's messages go there."
},
"phone": {
"type": "string",
"description": "The guest's phone number in international format, e.g. +15551234567. Optional."
},
"quote_id": {
"type": "string",
"description": "The quote being booked, from get_quote (starts with quo_)."
},
"last_name": {
"type": "string",
"description": "The guest's last name."
},
"first_name": {
"type": "string",
"description": "The guest's first name."
},
"special_requests": {
"type": "string",
"maxLength": 500,
"description": "Anything the guest wants the host to know, in their words (arrival time, a question). Optional, up to 500 characters."
},
"house_rules_accepted": {
"type": "boolean",
"description": "True only after the guest has seen and agreed to the quote's house_rules."
}
}
}| near_lng | number | Longitude to search around, with near_lat. |
| amenities | array | Amenity codes, e.g. hot_tub, wifi, ev_charger, dedicated_workspace, pool, fireplace_wood. |
| check_out | string | Departure date, YYYY-MM-DD (the morning the guests leave). |
| radius_km | number | How far from near_lat/near_lng to search, in kilometres. Default 30. |
| instant_only | boolean | True to return only places that confirm instantly, without waiting for the host. |
| min_bedrooms | integer | Fewest bedrooms the place must have. |
| max_total_usd | number | Maximum all-in total in dollars. Requires dates. |
| min_wifi_mbps | number | Lowest Wi-Fi download speed needed, in megabits per second. |
| step_free_entrance | boolean | True to return only places with a step-free way in. |
{
"type": "object",
"properties": {
"pets": {
"type": "integer",
"minimum": 0,
"description": "Number of pets. Only places that allow that many are returned. Service animals don't count as pets."
},
"limit": {
"type": "integer",
"default": 8,
"maximum": 20,
"description": "Most results to return, 1 to 50. Default 8."
},
"place": {
"type": "string",
"description": "Town and state/country, e.g. 'Asheville, NC'. Use near_lat/near_lng instead when you have coordinates."
},
"adults": {
"type": "integer",
"default": 2,
"minimum": 1,
"description": "Number of adults. Default 2."
},
"infants": {
"type": "integer",
"minimum": 0,
"description": "Number of infants under 2."
},
"check_in": {
"type": "string",
"format": "date",
"description": "Arrival date, YYYY-MM-DD. With check_out, only places free for the whole stay are returned, with an indicative total."
},
"children": {
"type": "integer",
"minimum": 0,
"description": "Number of children aged 2 to 12."
},
"near_lat": {
"type": "number",
"description": "Latitude to search around, with near_lng. Use instead of place when you have coordinates."
},
"near_lng": {
"type": "number",
"description": "Longitude to search around, with near_lat."
},
"amenities": {
"type": "array",
"items": {
"type": "string"
},
"description": "Amenity codes, e.g. hot_tub, wifi, ev_charger, dedicated_workspace, pool, fireplace_wood."
},
"check_out": {
"type": "string",
"format": "date",
"description": "Departure date, YYYY-MM-DD (the morning the guests leave)."
},
"radius_km": {
"type": "number",
"default": 30,
"description": "How far from near_lat/near_lng to search, in kilometres. Default 30."
},
"instant_only": {
"type": "boolean",
"description": "True to return only places that confirm instantly, without waiting for the host."
},
"min_bedrooms": {
"type": "integer",
"description": "Fewest bedrooms the place must have."
},
"max_total_usd": {
"type": "number",
"description": "Maximum all-in total in dollars. Requires dates."
},
"min_wifi_mbps": {
"type": "number",
"description": "Lowest Wi-Fi download speed needed, in megabits per second."
},
"step_free_entrance": {
"type": "boolean",
"description": "True to return only places with a step-free way in."
}
}
}