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" |
search_hotels_live → poll_search_results |
| A named hotel — "is Mercure Danang cheaper on Agoda or Booking?" |
get_ota_hotel_detail |
A hotel already known to be OpenTravel direct (source: "OPENTRAVEL_DIRECT", has propertyId) |
get_hotel_detail |
City-wide comparison
search_hotels_live returns IMMEDIATELY with a sessionId — it does not return hotels.
search_hotels_live — required: city, checkIn, checkOut (YYYY-MM-DD). Optional: adults (default 2), rooms, area, hotelName, priceMin, priceMax, language
- Wait 5s →
poll_search_results(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
for the full dedupe + presentation contract — do not restate it differently here.
Single named hotel
get_ota_hotel_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
search_hotels_live 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
get_hotel_detail — 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 → get_hotel_detail. Name only → get_ota_hotel_detail.
Cancellation terms
For OpenTravel rate plans only: get_cancellation_policy(propertyId, ratePlanId, checkInDate)
→ non-refundable flag, free-cancellation window, refund %, and the computed deadline.
ratePlanId comes from get_hotel_detail → 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.
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.
1---
2name: pricewin-price-comparison
3description: Compare live hotel room rates across Booking.com, Agoda, Traveloka, and OpenTravel for specific dates — which OTA is cheapest for the same property, per-room prices, and free-cancellation terms. Use when comparing hotel prices, checking room rates for a named hotel, asking which site is cheaper, or finding the best rate for given check-in/check-out dates.
4version: 1.0.3
5author: PriceWin
6platforms: [linux, macos, windows]
7tags: [price-comparison, compare-hotel-prices, hotel-price-comparison, room-rates, cheapest-hotel, best-hotel-rates, booking-vs-agoda, ota-comparison, cancellation-policy, free-cancellation, agoda, booking-com, traveloka, opentravel, mcp, hotel, travel]
8metadata:
9 openclaw:
10 emoji: "⚖️"
11 homepage: https://github.com/Price-Win/pricewin-skills-hub
12---1314
15> Requires the `pricewin` MCP server. This skill issues no network calls of its own.
16
17# Price Comparison
18
19**MCP server:** `pricewin`. Compares live rates across **Booking.com, Agoda, Traveloka** (crawled) plus **OpenTravel** (direct API).
20
21Comparison is something you do **over the returned sources** — there is no server-side
22compare call. Pick the entry point by what the user gave you:
23
24| User gave you | Tool |
25|---|---|
26| A **city** — "compare hotel prices in Da Nang" | `search_hotels_live` → `poll_search_results` |
27| A **named hotel** — "is Mercure Danang cheaper on Agoda or Booking?" | `get_ota_hotel_detail` |
28| A hotel already known to be **OpenTravel direct** (`source: "OPENTRAVEL_DIRECT"`, has `propertyId`) | `get_hotel_detail` |
29
30## City-wide comparison
31
32`search_hotels_live` returns IMMEDIATELY with a `sessionId` — it does **not** return hotels.
33
341. `search_hotels_live` — required: `city`, `checkIn`, `checkOut` (YYYY-MM-DD). Optional: `adults` (default 2), `rooms`, `area`, `hotelName`, `priceMin`, `priceMax`, `language`
352. Wait 5s → `poll_search_results(sessionId, nights)`
363. While `status` is `pending` or `partial`: wait 5s and poll again — up to 18 times (90s)
374. Present as soon as `status == "partial"` with hotels; keep polling silently and refine
38
39Then compare per hotel across its sources. See [`pricewin-hotel-search`](../pricewin-hotel-search/SKILL.md)
40for the full dedupe + presentation contract — do not restate it differently here.
41
42## Single named hotel
43
44`get_ota_hotel_detail` — for one specific Booking.com/Agoda hotel the user named.
45
46- Required: `checkIn`, `checkOut`. Pass `hotelName` + `city` + `queryText` (verbatim user text) whenever known
47- **Do NOT call `search_hotels_live` for a named hotel** — that returns a whole-city list
48- Live crawl, **~20–60s**. Say nothing about "loading" until it actually returns
49- Speed-up: if a prior search already gave you `prices.booking.url`, pass it as `propertyUrl` to skip name resolution
50- If it returns not-found under load, retry **once**
51
52Returns rooms, prices, facilities, photos, reviews for that property.
53
54## OpenTravel direct properties
55
56`get_hotel_detail` — only for results with `source: "OPENTRAVEL_DIRECT"`.
57
58- Pass `propertyId` (UUID from `opentravelResults[].propertyId`) when available
59- `hotelName` + `city` is a fallback **only** for a property already confirmed as OpenTravel direct
60- Required: `checkIn`, `checkOut`. Optional: `adults`, `children`, `language`
61- Returns room types with `roomTypeId` and `ratePlanId` — these are what make a property bookable
62
63⚠️ Router rule: **have a `propertyId` → `get_hotel_detail`. Name only → `get_ota_hotel_detail`.**
64
65## Cancellation terms
66
67For OpenTravel rate plans only: `get_cancellation_policy(propertyId, ratePlanId, checkInDate)`
68→ non-refundable flag, free-cancellation window, refund %, and the computed deadline.
69
70`ratePlanId` comes from `get_hotel_detail` → `roomTypes[].ratePlanId`. Pass `checkInDate`
71or you get no deadline. OTA hotels have no structured policy — quote whatever the crawl returned.
72
73## Presenting a comparison
74
75- Rank **purely by price**. No source gets priority, OpenTravel included
76- Show the cheapest source first, then the others underneath:
77 `Agoda $X · Booking $Y · OpenTravel $Z`
78- Savings vs the next-cheapest source: `(next - cheapest) / next * 100` → "Save Z%"
79- When the gap is small, prefer the free-cancellation option and say why
80- All prices USD unless the tool says otherwise. No conversion
81
82Tool inputs and response fields: [reference.md](reference.md).
83
84## Security & data handling
85
86Documentation only — no code, no dependencies, no network calls of its own. The
87only data sent is the comparison query (city or hotel name, dates, guests, plus
88`queryText` — the user's message verbatim), to PriceWin's hosted MCP server
89`https://mcp.price.win/mcp` (no credentials, no account). No PII, and this skill
90cannot book or pay for anything. Full disclosure — operator, backend provenance,
91exact fields per tool — in [`SECURITY.md`](./SECURITY.md).