Koskamo

Stay Perks MCP

An MCP server enabling AI agents to search a catalog of 2,000+ Virtuoso luxury hotels, retrieve specific property details and perks, and initiate booking quote requests with a human advisor. It supports theme-based searches and provides access to curated lists for safaris, wellness, and adventures.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Stay Perks MCP logo, by Geisel PowerVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Geisel Power
MCP endpoint (Streamable HTTP)
https://staysperks.com/mcp
Vendor documentation

What you can do with it

  • Search for luxury hotels by city, brand, or theme
  • Retrieve specific hotel perks and room details
  • Initiate a booking quote request with an advisor
  • Access curated hotel lists for specific travel styles

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
Stay Perks 1.0.0
MCP protocol
2025-06-18
Tools
14 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Tools

14 advertised

search_trips
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search 2,000+ Virtuoso hotels, plus packages, cruises and private experiences, by place, brand or kind of stay. Results show whether Virtuoso perks apply, a trip_id for get_trip_details, and how to book. No live rates: the advisor quotes them.

search_trips input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "description": "Results per page, up to 50 (default 10)"
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "description": "Results to skip, for the next page"
    },
    "check_in": {
      "type": "string",
      "description": "Check-in date (ISO 8601)"
    },
    "check_out": {
      "type": "string",
      "description": "Check-out date (ISO 8601)"
    },
    "trip_type": {
      "enum": [
        "hotel_only",
        "fixed_package",
        "cruise",
        "service",
        "custom_itinerary"
      ],
      "type": "string",
      "description": "hotel_only (the default), fixed_package, cruise, service (private experiences) or custom_itinerary"
    },
    "budget_usd": {
      "type": "number",
      "description": "Max budget in USD"
    },
    "destination": {
      "type": "string",
      "description": "A city, region or country (\"Paris\", \"Tuscany\", \"Caribbean\"), a hotel or brand (\"Four Seasons\"), both (\"Four Seasons Paris\"), or a kind of stay (\"beach\", \"safari\")"
    }
  },
  "additionalProperties": false
}
search_trips annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_trip_details
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the details of a hotel, package, cruise or private experience from search_trips, with a hotel's Virtuoso perks. Virtuoso records carry no published rate or availability; the advisor quotes those in writing within 24 hours.

get_trip_details input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "trip_id"
  ],
  "properties": {
    "trip_id": {
      "type": "string",
      "description": "trip_id from search_trips, or a hotel's virtuoso_property_id"
    }
  },
  "additionalProperties": false
}
get_trip_details annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
check_complexity
Advertised by the server during the last successful anonymous check.
Advertised read-only

Check whether a request goes straight to Geisel Power, the Virtuoso advisor, for a quote (hotel stays always do).

check_complexity input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "trip_id"
  ],
  "properties": {
    "trip_id": {
      "type": "string"
    },
    "num_nights": {
      "type": "number",
      "default": 1
    },
    "num_travelers": {
      "type": "number",
      "default": 1
    }
  },
  "additionalProperties": false
}
check_complexity annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
create_booking
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the steps to book a hotel, cruise or experience found with search_trips. Geisel Power, the Virtuoso advisor, quotes it in writing within 24 hours (rate, taxes, the hotel's cancellation policy and the perks) and books only after the traveler approves. This tool sends nothing itself (request_sent: false). Hotel bookings carry no fee and nothing is charged by Stay Perks: the traveler pays the hotel directly.

create_booking input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "trip_id",
    "traveler_info"
  ],
  "properties": {
    "trip_id": {
      "type": "string"
    },
    "num_nights": {
      "type": "number",
      "default": 1
    },
    "traveler_info": {
      "type": "object",
      "required": [
        "full_name",
        "email",
        "num_travelers"
      ],
      "properties": {
        "email": {
          "type": "string",
          "format": "email"
        },
        "phone": {
          "type": "string"
        },
        "full_name": {
          "type": "string"
        },
        "agent_note": {
          "type": "string"
        },
        "num_travelers": {
          "type": "integer",
          "minimum": 1
        },
        "special_requests": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
  },
  "additionalProperties": false
}
create_booking annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_booking_status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Check the status of an existing booking

get_booking_status input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "booking_id"
  ],
  "properties": {
    "booking_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_booking_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
cancel_booking
Advertised by the server during the last successful anonymous check.

Cancel a booking request. A confirmed hotel reservation is cancelled with the hotel under its own cancellation policy, which comes with the quote and the confirmation.

cancel_booking input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "booking_id"
  ],
  "properties": {
    "reason": {
      "type": "string",
      "description": "Reason for cancellation"
    },
    "booking_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
request_itinerary
Advertised by the server during the last successful anonymous check.
Open-world

WRITE. Send Geisel Power, the Virtuoso advisor, the traveler's request for a Journey (Journeys by Geisel Power: a whole trip she plans, books and confirms, usually from about $15,000 to $20,000) or a hotel stay (Stay Perks Reserve, no minimum). Call it only after the traveler has agreed to share their name, email and trip details with Geisel Power, and set traveler_consented to true. Returns a reference and what happens next: Geisel replies to a Journeys request the same day, with the full proposal after a discovery call, and to a hotel request in writing within 24 hours; some requests also get a link to book a 30-minute call with her (call_url). Nothing is booked or charged. Hotel bookings carry no fee and the traveler pays the hotel directly; a Journey carries a planning fee, which depends on the trip's length and complexity and which Geisel explains on the discovery call.

request_itinerary input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name",
    "email",
    "traveler_consented"
  ],
  "properties": {
    "kind": {
      "enum": [
        "journey",
        "hotel"
      ],
      "type": "string",
      "description": "journey (the default): a whole trip Geisel designs; hotel: a hotel stay only"
    },
    "name": {
      "type": "string",
      "description": "The traveler's full name"
    },
    "email": {
      "type": "string",
      "format": "email",
      "description": "The traveler's email: Geisel replies there"
    },
    "notes": {
      "type": "string",
      "description": "Anything else the traveler wants Geisel to know"
    },
    "occasion": {
      "enum": [
        "anniversary",
        "birthday",
        "family",
        "celebration",
        "business",
        "escape"
      ],
      "type": "string",
      "description": "What the trip is for: anniversary (Anniversary or honeymoon), birthday (A milestone birthday), family (Family or multigenerational trip), celebration (Another celebration), business (Business with some leisure), escape (Simply time away)"
    },
    "travelers": {
      "type": "string",
      "description": "Who is traveling (\"2 adults, 1 child\")"
    },
    "flexibility": {
      "enum": [
        "exact",
        "few-days",
        "month",
        "open"
      ],
      "type": "string",
      "description": "How flexible the dates are: exact (Exact dates), few-days (A few days either way), month (Any time in a month), open (Open, advise me)"
    },
    "trip_budget": {
      "enum": [
        "under-15k",
        "15k-20k",
        "20k-50k",
        "50k-plus"
      ],
      "type": "string",
      "description": "The whole trip's budget in USD, for a Journey: under-15k (Under $15,000), 15k-20k ($15,000 to $20,000), 20k-50k ($20,000 to $50,000), 50k-plus ($50,000 or more). No budget is needed for a hotel stay"
    },
    "destinations": {
      "type": "string",
      "description": "Where: places, regions or hotels (\"Amalfi Coast, Lake Como\")"
    },
    "travel_dates": {
      "type": "string",
      "description": "When (\"10 to 20 May 2027\", \"late spring\")"
    },
    "traveler_consented": {
      "type": "boolean",
      "const": true,
      "description": "true, and only once the traveler has agreed to share these details with Geisel Power"
    }
  },
  "additionalProperties": false
}
request_itinerary annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
search_availability — Request a stay quote (Virtuoso perks)
Advertised by the server during the last successful anonymous check.
Open-world

WRITE. Ask Geisel Power, the Virtuoso advisor, to price a stay at a Virtuoso hotel (property_id from search_trips). Virtuoso data carries no live rates, so pricing is asynchronous: this returns a quote id with status "pending" and a quote_due_by time (within 24 hours); poll get_availability_quote. A firm offer includes the full total, taxes and fees, the hotel's cancellation policy, and the Virtuoso amenities (e.g. breakfast for two, a hotel credit, an upgrade, subject to availability). Nothing is reserved or charged by this call, and hotel bookings carry no fee.

search_availability input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "property_id",
    "start_date",
    "end_date",
    "adults"
  ],
  "properties": {
    "adults": {
      "type": "integer",
      "minimum": 1,
      "description": "Number of adults"
    },
    "children": {
      "type": "integer",
      "minimum": 0,
      "description": "Number of children"
    },
    "end_date": {
      "type": "string",
      "description": "Check-out date, YYYY-MM-DD"
    },
    "start_date": {
      "type": "string",
      "description": "Check-in date, YYYY-MM-DD"
    },
    "property_id": {
      "type": "string",
      "description": "Virtuoso property id (virtuoso_property_id) from search_trips"
    }
  },
  "additionalProperties": false
}
search_availability annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_availability_quote — Check a stay quote
Advertised by the server during the last successful anonymous check.
Advertised read-only

READ. Returns the status of a quote from search_availability: "pending" (try again later), "quoted" (offers with stay_id, full total, cancellation terms), "unavailable", or "expired". Use an offer's stay_id with create_booking_session.

get_availability_quote input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "quote_id"
  ],
  "properties": {
    "quote_id": {
      "type": "string",
      "description": "Quote id returned by search_availability"
    }
  },
  "additionalProperties": false
}
get_availability_quote annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
create_booking_session — Start a booking (UCP lodging)
Advertised by the server during the last successful anonymous check.

WRITE. Opens a UCP lodging booking session from a quoted offer (stay_id from get_availability_quote). Returns the authoritative total, the cancellation policy (show it to the traveler), the Virtuoso amenities, the payment term (pay at the hotel) and evidence. Nothing is charged; the session is held until the quote expires.

create_booking_session input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "property_id",
    "stay_id"
  ],
  "properties": {
    "adults": {
      "type": "integer",
      "minimum": 1
    },
    "booker": {
      "type": "object",
      "required": [
        "first_name",
        "last_name",
        "email"
      ],
      "properties": {
        "email": {
          "type": "string"
        },
        "last_name": {
          "type": "string"
        },
        "first_name": {
          "type": "string"
        },
        "phone_number": {
          "type": "string"
        }
      },
      "description": "Lead traveler (legal name + email). Without it the session stays \"incomplete\".",
      "additionalProperties": false
    },
    "stay_id": {
      "type": "string",
      "description": "stay_id of a quoted offer"
    },
    "children": {
      "type": "integer",
      "minimum": 0
    },
    "property_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
create_booking_session annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_booking_session — Check a booking
Advertised by the server during the last successful anonymous check.
Advertised read-only

READ. Current state of a booking session: ready_for_complete (awaiting the traveler's approval), complete_in_progress (the advisor is placing the reservation), completed (includes the hotel's own confirmation number; the traveler is also emailed), or canceled.

get_booking_session input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "session_id"
  ],
  "properties": {
    "session_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_booking_session annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
update_booking_session — Update a booking before payment
Advertised by the server during the last successful anonymous check.

WRITE. Change occupancy (within the quote) or set the booker before completing. Not allowed after completion.

update_booking_session input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "session_id"
  ],
  "properties": {
    "adults": {
      "type": "integer",
      "minimum": 1
    },
    "booker": {
      "type": "object",
      "required": [
        "first_name",
        "last_name",
        "email"
      ],
      "properties": {
        "email": {
          "type": "string"
        },
        "last_name": {
          "type": "string"
        },
        "first_name": {
          "type": "string"
        },
        "phone_number": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "children": {
      "type": "integer",
      "minimum": 0
    },
    "session_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
update_booking_session annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
complete_booking_session — Book it (requires the traveler's approval)
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

SENSITIVE WRITE — get the traveler's explicit approval of the full total and the hotel's cancellation policy first. Asks Geisel Power to place the reservation. No payment is taken: the traveler pays the hotel directly under its own terms, and hotel bookings carry no fee. Returns complete_in_progress with a confirmation deadline (within 24 hours); poll get_booking_session for the hotel's confirmation number, which is also emailed to the traveler.

complete_booking_session input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "session_id",
    "booker"
  ],
  "properties": {
    "booker": {
      "type": "object",
      "required": [
        "first_name",
        "last_name",
        "email"
      ],
      "properties": {
        "email": {
          "type": "string"
        },
        "last_name": {
          "type": "string"
        },
        "first_name": {
          "type": "string"
        },
        "phone_number": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "session_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
complete_booking_session annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
cancel_booking_session — Cancel a booking before hotel confirmation
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

SENSITIVE WRITE. Withdraws a booking before the hotel confirms it (the advisor is told). Confirmed reservations are cancelled with the hotel under its cancellation policy, through the advisor.

cancel_booking_session input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "session_id"
  ],
  "properties": {
    "session_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
cancel_booking_session annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
411 ms
95th percentile latency
411 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 411 ms · metadata changed · 14 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http stay-perks-mcp https://staysperks.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add stay-perks-mcp --url https://staysperks.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable stay-perks-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "stay-perks-mcp": {
      "url": "https://staysperks.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "stay-perks-mcp": {
      "type": "streamableHttp",
      "url": "https://staysperks.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start stay-perks-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "stay-perks-mcp": {
      "type": "http",
      "url": "https://staysperks.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http stay-perks-mcp https://staysperks.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "stay-perks-mcp": {
      "url": "https://staysperks.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "stay-perks-mcp": {
      "serverUrl": "https://staysperks.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Stay Perks MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Stay Perks MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing