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

Addresshttps://atabooking.com/mcp
Transportstreamable-http
Sign-inNone needed
Tools5

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.

InputTypeNotes
place RequiredstringCity, area, country or hotel name, e.g. 'Bangkok' or 'Gamla Stan'. up to 120 characters
check_in RequireddateArrival date, YYYY-MM-DD
check_out RequireddateDeparture date, YYYY-MM-DD
guests RequiredintegerNumber of guests in one room. 1–10
max_price_per_nightnumberBudget per night in the hotel's currency (EUR in the demo)
wantslist of stringNice-to-haves, e.g. ['pool','beach','quiet']; ranks matches first
cursorstringnext_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.

InputTypeNotes
stay_id Requiredstringstay_id from search_stays. up to 100 characters
check_indateOptional: with check_out, adds availability and a quote per room. YYYY-MM-DD
check_outdateOptional: with check_out, adds availability and a quote per room. YYYY-MM-DD
guestsinteger1–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.

InputTypeNotes
stay_id Requiredstringup to 100 characters
room_id Requiredstringup to 100 characters
check_in RequireddateYYYY-MM-DD
check_out RequireddateYYYY-MM-DD
guests Requiredinteger1–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.

InputTypeNotes
stay_id Requiredstringup to 100 characters
room_id Requiredstringup to 100 characters
check_in RequireddateYYYY-MM-DD
check_out RequireddateYYYY-MM-DD
guests Requiredinteger1–10
guest_name Requiredstringup to 120 characters
guest_email Requiredemailup to 254 characters
guest_phonestringup to 40 characters
notesstringRequests for the hotel, e.g. late arrival. up to 1000 characters
agentstringName of the AI agent/app placing the request. up to 120 characters
idempotency_keystringOne 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.

InputTypeNotes
hold_id Requiredstringhold_id from book_direct. up to 40 characters
code RequiredstringThe 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>"
})