Booking Wolf connector for Muse
Booked a hotel on Booking.com, Agoda, Expedia, Hotels.com or Trip.com? Booking Wolf watches the price and rebooks the same room for less - you keep booking where you like. It can also find and book new stays. Endpoint: https://mcp.bookingwolf.com/muse/mcp (MCP over HTTP, JSON-RPC 2.0).
Setup and permissions
- Searching works without an account.
- Account tools use OAuth 2.1 (authorization code + PKCE S256). Meta gets a dedicated OAuth client; only that client is honoured by the connector, and only it can be given booking access. Protected-resource metadata:
https://mcp.bookingwolf.com/.well-known/oauth-protected-resource/muse/mcp. Scope:email. - The consent screen shows which address the user will be sent back to, and warns when the app is not one we recognise.
- The connector's token only works for the connector: it is refused by the rest of the Booking Wolf site and API.
- On the consent screen the user chooses Read only (see bookings, status and cancellation terms) or Book and cancel for me. Read-only connections cannot quote, book or cancel; a read-only call to those tools returns a normal tool error explaining how to allow booking. The choice can be changed later on the consent screen or under Account → Connected apps.
- Payments use the card the user saved on their Booking Wolf account. quote_booking says whether one is saved and links to add one (the quote stays valid). Banks may ask for a one-time confirmation (3-D Secure): book_hotel then returns
awaiting_bank_approvalwith a link that is valid until the payment is approved or 15 minutes pass (asking book_hotel again issues a new link and the old one stops working). The user signs in, sees the hotel, dates and amount, and approves; after 15 minutes the payment is cancelled and nothing is charged. The link carries no payment details. - book_hotel will not make a second booking for the same hotel, dates and room within 24 hours unless the user confirms (
confirm_duplicate: true). - Tool arguments are checked strictly: unknown or missing arguments return an error naming the expected ones.
- Only rates the connector can actually book are listed (currently our Dida-supplied rates; others are counted in
rates_not_bookable_here). Single-room bookings. - Times are shown in the hotel's local time when known, otherwise UTC.
- Users can disconnect at any time from their Booking Wolf account; the connection stops working immediately.
Tools
| Tool | Class | Needs | Input | Output | Side effects |
|---|---|---|---|---|---|
| search_hotels | Read | None | destination (required); country, checkin, checkout (YYYY-MM-DD), guests, currency | Hotels with name, location, star rating, photo, price_estimate (a search estimate in the requested currency) and credit_back (first-booking credit) where offered | None |
| get_hotel_rates | Read | None | hotel_id, checkin, checkout (required); guests, currency | Public prices on the major booking sites (competitors[].total) and the cheapest room actually bookable here (cheapest_bookable: room, meal, total, taxes, cancellation terms, rate_option_id). All amounts in the requested currency | None |
| get_room_options | Read | None (signed-in users see member prices) | hotel_id, checkin, checkout (required); adults (default 2), child_ages, currency (default USD) | Only rooms that can be booked here: meal, total price, which taxes are included or payable at the hotel (when the supplier does not say, a note that local city/tourist taxes may be payable at the hotel), refundable, free-cancellation deadline (hotel local time), rate_option_id | None |
| quote_booking | Write | Connected account with "Book and cancel for me" | rate_option_id, guest names | quote_id and the approval summary: hotel, room, guests, dates, total, taxes, payment timing, cancellation terms, payment_method_on_file (+ add_card_url if no card is saved) | Re-checks the live price with the hotel supplier and stores a quote valid for 15 minutes. Nothing is booked or charged. |
| book_hotel | Sensitive write | Connected account with "Book and cancel for me" + a saved card | quote_id, expected_total, currency (exactly as quoted); confirm_duplicate (only after the user confirms a second identical booking) | state confirmed (with confirmation id) / pending / payment_in_progress / awaiting_bank_approval (link) / payment_uncertain / failed / expired / not_booked (incl. possible_duplicate) | Charges the saved card the quoted total and books the room. Refused if the total or currency differs from the quote. One booking per quote; repeating the call never charges twice and returns the booking's current state. |
| list_my_bookings | Read | Connected account (read only is enough) | upcoming_only | Bookings in every state (incl. pending, awaiting bank approval, failed, refunded) with confirmation id, checkin / checkout, room, total paid, free-cancellation deadline | None |
| get_booking | Read | Connected account (read only is enough) | booking_id | One booking with its current state, checkin / checkout (same names as the search inputs); confirmation_id is set only once the hotel has confirmed. A quote_id is reported as "not a booking" | None |
| get_cancellation_terms | Read | Connected account (read only is enough) | booking_id | Fee if cancelled now (null = not stated by the policy), free-until time, expected refund | None |
| cancel_booking | Sensitive write | Connected account with "Book and cancel for me" | booking_id, max_fee, currency | state cancelled (fee, refund amount, refund pending) / not_cancelled / uncertain | Cancels the booking with the hotel and starts the refund minus any fee. Refused if the current fee is above max_fee; when the fee is unknown the user must accept up to the full amount paid. |
| sync_my_hotel_bookings | Read | Connected account (read only is enough) | sites: one entry per booking site (booking / agoda / expedia / hotels_com / trip_com) with the URL and visible text of each page Muse read in its own browser - the trips page and each upcoming hotel booking's page (up to 11 per site); or status needs_login / bot_wall | Per site: bookings read and how many are new, or what to do (sign in, robot check); then everything watched - live offers, rebooked stays, and for any original still to cancel: the site, booking number, link and free-cancellation deadline in hotel time (cancel_original) | Reads the bookings out of the pages (only pages on that site are used) and adds them to the user's own watch list - the same booking sent twice is kept once - then prices new ones straight away. A page that shows an original booking cancelled marks it cancelled. Nothing is booked, charged or cancelled. |
| watch_hotel_booking | Write | Connected account with "Book and cancel for me" | site (booking / agoda / expedia / hotels_com / trip_com), booking_reference, hotel_name, city, check_in, check_out, adults, room_name, meal, total_price, currency, free_cancellation_until (hotel local time); optional country, child_ages, manage_url | watch_id, status, and any live offer right away (saving amount + %, our price, optional same-room-with-free-meal option, offer_id) | Adds a booking the user holds on another site to their watch list and prices it now. We re-check every few hours and email the user when we can book the same room for less. Nothing is booked or charged. |
| list_rebook_offers | Read | Connected account (read only is enough) | none | Watched bookings with live offers (saving amount and %, our price, free-meal option, offer_id, expiry), rebooked stays, and originals the user still has to cancel | None |
| approve_rebook | Sensitive write | Connected account with "Book and cancel for me" + a saved card | offer_id, choice (same / free_meal), expected_total, currency (exactly as shown) | state rebooked (confirmation id, amount charged, the deadline to cancel the original and its link) / price_changed / needs_card / not rebooked | Re-checks the price, charges the saved card and books the same room with Booking Wolf. Refused if the total differs from what the user approved. The user's original booking stays until it is cancelled (free, before its deadline): the result says where, which booking and by when, so Muse can cancel it in its browser after the user confirms. We also email reminders. |
| confirm_original_cancelled | Write | Connected account with "Book and cancel for me" | watch_id; page_url + page_text of the booking site's page showing the cancellation (recommended) | state cancelled_verified (the page shows it cancelled) / told_us_cancelled (noted, confirmed on the next sync) / still_active (the page shows it still active; nothing recorded) | Records that the user cancelled their original booking. It is only marked cancelled when a page shows it cancelled - the claim alone just stops the reminders, and a later sync that still sees it active brings them back. Cancels and charges nothing itself. |
Booking flow
search_hotelsthenget_room_optionsfor the chosen hotel and dates.quote_bookingre-checks the live price and returns a summary. Show it to the user.- Only after the user approves:
book_hotelwith the quote_id, expected_total and currency from the quote. - If the result is
pending, checkget_booking- never report a booking as confirmed before it has a confirmation_id. - If the result is
awaiting_bank_approval, give the user the link. If it ispayment_uncertainor the call errored, never book again: callbook_hotelwith the same quote_id (same payment reference, so no double charge) or checklist_my_bookings. - To cancel:
get_cancellation_terms, show the fee, thencancel_bookingwith the approved max_fee and currency.
Rebooking a stay booked elsewhere
- The user signs in to Booking.com, Agoda, Expedia, Hotels.com and/or Trip.com once in Muse's browser (Muse keeps the password; we never see it).
sync_my_hotel_bookings: Muse opens each site's trips page and each upcoming hotel booking's page and sends us the text. We find the bookings - the same reader the Booking Wolf Chrome extension uses - and say straight away whether we can book the same room for less. Once a day is enough (a daily Muse scheduled task can do this where available). A single booking can also be added from its details withwatch_hotel_booking.- Any time later:
list_rebook_offers. An offer can come in two forms - the same room and meal for less, or the same room with a free better meal (e.g. breakfast) and still less. Show both and let the user choose. - Only after the user approves:
approve_rebookwith the offer_id, their choice and the exact total. Users who would rather not approve each one can turn on Auto-rebook at bookingwolf.com/account. - Until the original booking is cancelled the user holds two bookings. The result gives the site, booking number, link and free-cancellation deadline in hotel time: Muse confirms with the user, cancels it in its browser, then calls
confirm_original_cancelledwith the page that shows it cancelled. We only treat it as cancelled once a page shows it; otherwise we keep reminding the user. (If the user also uses our Chrome extension and has given us the separate permission to cancel originals for them, the extension may cancel it first; the next sync then shows it cancelled.)
Reviewer accounts: approve_rebook is simulated like book_hotel (result says TEST; nothing is charged or booked).
Status values
Bookings: confirmed, pending (paid, hotel not confirmed yet), payment_in_progress (the charge is running; after 2 minutes without a result it becomes payment_uncertain), awaiting_bank_approval, payment_uncertain, failed, expired, cancellation_pending, cancelled, refunded. Quotes expire after 15 minutes; an expired quote returns not_booked and nothing is charged. A used quote returns the state of the booking made from it.
Errors
- HTTP 401 with
WWW-Authenticate: the tool needs a connected account. - Connected read-only and calling a booking tool: a normal tool error (
needs_booking_permission) with the steps to allow booking. - HTTP 429: too many requests (see limits); retry after the
Retry-Afterseconds. - Tool results with
isError: trueexplain what happened and what to do next; nothing is charged unless the result says so. - Price changed / rate unavailable at quote time: get fresh options with
get_room_options. - If the hotel cannot confirm after payment, the payment is refunded automatically.
- Every booking result says whether money was taken (
charged: true / false / null when not yet known).
Limits
Signed-in requests: 60 per minute per connected account. Requests without an account: 1,200 per minute per IP address. Single-room bookings. Prices in the currency requested where the supplier supports it.
Testing without real charges
How to test rebooking as a reviewer
- Without a Booking.com account: ask Muse to watch this sample booking -
watch_hotel_bookingwith sitebooking, booking_referenceREVIEW-0001, hotel_nameHoliday Inn Resort Baruna Bali, cityKuta, countryIndonesia, check_in2027-02-10, check_out2027-02-11, adults2, room_nameKing Standard Garden View Balcony, mealnomeal, total_price2529732, currencyIDR, free_cancellation_until2027-01-10T23:59. Prices are live, so the saving can change; on 6 Oct 2026 it returned an offer to save about 13%. list_rebook_offersshows the offer;approve_rebookon a reviewer account is simulated (TEST - nothing is charged or booked) and returns the cancel-the-original instructions.- With a Booking.com (or Agoda, Expedia, Hotels.com, Trip.com) account that has an upcoming refundable hotel booking: sign in to it in Muse's browser and run
sync_my_hotel_bookings. Reading never changes or cancels anything.
Reviewer accounts we register are simulated for book_hotel and cancel_booking: no card is charged and no hotel is booked (results say TEST). Search, room options and quotes stay live. The lead guest's last name picks a scenario: Nocard (no saved card), Bankcheck (bank approval link), Supplierfail (hotel does not confirm), Declined (card declined); any other name books successfully.
Data and support
We use account data only to provide the connector (bookings, payments, support). We do not sell it or use it for advertising, profiling or to train AI models. When you disconnect, Muse loses access immediately and the unused quotes it created are deleted; quotes nobody booked are deleted after 30 days anyway. See our privacy policy and terms. Support: team@bookingwolf.com.