Requires the pricewin MCP server. This skill issues no network calls of its own.
Price Comparison
MCP server: pricewin. Compares live rates across Booking.com, Agoda, Traveloka (crawled) plus OpenTravel (direct API).
Comparison is something you do over the returned sources — there is no server-side compare call. Pick the entry point by what the user gave you:
| User gave you |
Tool |
| A city — "compare hotel prices in Da Nang" |
searchhotelslive → pollsearchresults |
| A named hotel — "is Mercure Danang cheaper on Agoda or Booking?" |
getotahotel_detail |
A hotel already known to be OpenTravel direct (source: "OPENTRAVEL_DIRECT", has propertyId) |
gethoteldetail |
City-wide comparison
searchhotelslive returns IMMEDIATELY with a sessionId — it does not return hotels.
searchhotelslive — required: city, checkIn, checkOut (YYYY-MM-DD). Optional: adults (default 2), rooms, area, hotelName, priceMin, priceMax, language
- Wait 5s →
pollsearchresults(sessionId, nights)
- While
status is pending or partial: wait 5s and poll again — up to 18 times (90s)
- Present as soon as
status == "partial" with hotels; keep polling silently and refine
Then compare per hotel across its sources. See [pricewin-hotel-search](../pricewin-hotel-search/SKILL.md) for the full dedupe + presentation contract — do not restate it differently here.
Single named hotel
getotahotel_detail — for one specific Booking.com/Agoda hotel the user named.
- Required:
checkIn, checkOut. Pass hotelName + city + queryText (verbatim user text) whenever known
- Do NOT call
searchhotelslive for a named hotel — that returns a whole-city list
- Live crawl, ~20–60s. Say nothing about "loading" until it actually returns
- Speed-up: if a prior search already gave you
prices.booking.url, pass it as propertyUrl to skip name resolution
- If it returns not-found under load, retry once
Returns rooms, prices, facilities, photos, reviews for that property.
OpenTravel direct properties
gethoteldetail — only for results with source: "OPENTRAVEL_DIRECT".
- Pass
propertyId (UUID from opentravelResults[].propertyId) when available
hotelName + city is a fallback only for a property already confirmed as OpenTravel direct
- Required:
checkIn, checkOut. Optional: adults, children, language
- Returns room types with
roomTypeId and ratePlanId — these are what make a property bookable
⚠️ Router rule: have a propertyId → gethoteldetail. Name only → getotahotel_detail.
Cancellation terms
For OpenTravel rate plans only: getcancellationpolicy(propertyId, ratePlanId, checkInDate) → non-refundable flag, free-cancellation window, refund %, and the computed deadline.
ratePlanId comes from gethoteldetail → roomTypes[].ratePlanId. Pass checkInDate or you get no deadline. OTA hotels have no structured policy — quote whatever the crawl returned.
Presenting a comparison
- Rank purely by price. No source gets priority, OpenTravel included
- Show the cheapest source first, then the others underneath:
Agoda $X · Booking $Y · OpenTravel $Z
- Savings vs the next-cheapest source:
(next - cheapest) / next * 100 → "Save Z%"
- When the gap is small, prefer the free-cancellation option and say why
- All prices USD unless the tool says otherwise. No conversion
Tool inputs and response fields: [reference.md](reference.md).
Security & data handling
Documentation only — no code, no dependencies, no network calls of its own. The only data sent is the comparison query (city or hotel name, dates, guests, plus queryText — the user's message verbatim), to PriceWin's hosted MCP server https://mcp.price.win/mcp (no credentials, no account). No PII, and this skill cannot book or pay for anything. Full disclosure — operator, backend provenance, exact fields per tool — in [SECURITY.md](./SECURITY.md).