ATAbooking
ATAbooking lets your AI book hotels directly, for a 5% fee instead of the 15–20% the big booking sites take. Demo: sample hotels, no real bookings yet.
Hosted MCP Server
npx add-mcp 'https://atabooking.com/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
Endpoint Demo
| Address | https://atabooking.com/mcp |
|---|---|
| Transport | streamable-http |
| Sign-in | None needed |
| Tools | 5 |
Hotels marked demo: true are ATAbooking's fictional demo inventory: booking one reserves nothing, sends no email and takes no payment.
1 search_stays · find stays with a room free
2 get_stay · rooms, terms, a quote per room
3 check_availability · re-check, then confirm with the user
4 book_direct · 15-minute hold + emailed code
5 confirm_booking · the guest's code, or Confirm in the email
then the hotel confirms
Search stays
01 / 05 · search_stays
Find hotels with a room free for the dates and guests. Returns each stay's cheapest fitting room with a quote (price, ATA fee 5%, typical 15-20% OTA cut). Demo hotels are marked demo: true. Results come in pages: when more_results is true, call search_stays again with the same arguments plus cursor: next_cursor to get the rest. Nothing is left out.
| Input | Type | Notes |
|---|---|---|
| place Required | string | City, area, country or hotel name, e.g. 'Bangkok' or 'Gamla Stan'. up to 120 characters |
| check_in Required | date | Arrival date, YYYY-MM-DD |
| check_out Required | date | Departure date, YYYY-MM-DD |
| guests Required | integer | Number of guests in one room. 1–10 |
| max_price_per_night | number | Budget per night in the hotel's currency (EUR in the demo) |
| wants | list of string | Nice-to-haves, e.g. ['pool','beach','quiet']; ranks matches first |
| cursor | string | next_cursor from the previous page of this same search, to get the next page. up to 400 characters |
Paging
Every reply has more_results (true or false) and next_cursor (text, or null on the last page). While more_results is true, call search_stays again with the same arguments plus cursor: next_cursor. A page can hold fewer stays, even none, and still have more after it, so keep going until more_results is false. A cursor doesn't expire. One that didn't come from search_stays returns an error: run the search again without it.
search_stays({
place: "Bangkok",
check_in: "2026-12-12",
check_out: "2026-12-15",
guests: 2
})
Get stay details
02 / 05 · get_stay
Rooms, prices, what's included, check-in/out times and cancellation terms for one stay. Demo hotels are marked demo: true.
| Input | Type | Notes |
|---|---|---|
| stay_id Required | string | stay_id from search_stays. up to 100 characters |
| check_in | date | Optional: with check_out, adds availability and a quote per room. YYYY-MM-DD |
| check_out | date | Optional: with check_out, adds availability and a quote per room. YYYY-MM-DD |
| guests | integer | 1–10 |
get_stay({
stay_id: "<stay_id from search_stays>"
})
Check availability
03 / 05 · check_availability
Re-check one room for exact dates and guests right before booking. Returns available yes/no and the live quote. Demo hotels are marked demo: true.
| Input | Type | Notes |
|---|---|---|
| stay_id Required | string | up to 100 characters |
| room_id Required | string | up to 100 characters |
| check_in Required | date | YYYY-MM-DD |
| check_out Required | date | YYYY-MM-DD |
| guests Required | integer | 1–10 |
check_availability({
stay_id: "<stay_id from search_stays>",
room_id: "<room_id from get_stay>",
check_in: "2026-12-12",
check_out: "2026-12-15",
guests: 2
})
Book direct with the hotel
04 / 05 · book_direct
Places a 15-minute HOLD on the room and emails the guest a 6-digit code. Nothing is booked and nothing reaches the hotel until the guest confirms. After calling, tell the guest: check your email (the result shows the masked address), then either read the code back to you (call confirm_booking) or click Confirm in the email. Send an idempotency_key and reuse it if you retry. Confirm name, email, dates and price with the guest before calling. Demo hotels (demo: true) confirm at once and send no email.
| Input | Type | Notes |
|---|---|---|
| stay_id Required | string | up to 100 characters |
| room_id Required | string | up to 100 characters |
| check_in Required | date | YYYY-MM-DD |
| check_out Required | date | YYYY-MM-DD |
| guests Required | integer | 1–10 |
| guest_name Required | string | up to 120 characters |
| guest_email Required | up to 254 characters | |
| guest_phone | string | up to 40 characters |
| notes | string | Requests for the hotel, e.g. late arrival. up to 1000 characters |
| agent | string | Name of the AI agent/app placing the request. up to 120 characters |
| idempotency_key | string | One per booking attempt (8-128 of A-Z a-z 0-9 _ -). Reuse it on retries to get the same hold back.. up to 128 characters |
book_direct({
stay_id: "<stay_id from search_stays>",
room_id: "<room_id from get_stay>",
check_in: "2026-12-12",
check_out: "2026-12-15",
guests: 2,
guest_name: "Example Guest",
guest_email: "guest@example.com"
})
Confirm a held booking
05 / 05 · confirm_booking
Confirm a held booking with the 6-digit code the guest received by email. Only use a code the guest gave you. Five wrong codes cancel the hold. Confirming twice returns the same booking.
| Input | Type | Notes |
|---|---|---|
| hold_id Required | string | hold_id from book_direct. up to 40 characters |
| code Required | string | The 6-digit code from the guest's email. up to 20 characters |
confirm_booking({
hold_id: "<hold_id from book_direct>",
code: "<6-digit code from the guest>"
})