The Distribution Partner API exposes a Model Context Protocol (MCP) server
for AI agents. It wraps the /api/v1/* REST contract documented in the
API reference and uses the same schemas, business logic,
pricing, and usage rules. Each tool behaves like the corresponding REST call.
Transport & auth
The server is a remote MCP server reachable over streamable HTTP at:
https://ari.console.adrasis.com/mcp
An agent session uses the same authentication as a REST client: it carries the
partner's OAuth 2.0 Bearer token (Authorization: Bearer <token>) obtained
from the client-credentials flow. The authenticated partner account and scope
claims are forwarded unchanged on every tool call. See
Authentication for how to obtain the token.
Profile-scoped tools accept an optional MCP-only profile_public_id field.
Omit it to use the account's stable Default profile; provide it to select
another profile owned by the same account. The facade sends this value as the
REST profile-selector header, never in the REST JSON body. A successful
structured tool result includes the exact resolved profile_public_id beside
the REST response.
Tool catalogue
Each tool maps to a REST operation and uses the same request and response schemas. See the API reference for its parameters.
Accommodation
| Tool | Maps to | Scope | Purpose |
|---|---|---|---|
search_property_availability |
POST /properties/availability |
distribution:read |
Exact top-1 availability for each of 1..200 unique properties; requires country_code and allocation_strategy (strict or flexible). |
search_place_availability |
POST /places/availability |
distribution:read |
Exact top-1 availability for a place: one catalogue-order page, or with sort and filters the whole place priced once and paged in your order, with page.matched and optional facets. Send exactly one of place_id and near, plus currency_code, traveler POS country_code, stay dates, occupancy and allocation_strategy. |
list_countries |
GET /countries |
distribution:read |
Countries by ISO code, the id every place field takes for a country, with localized names. |
list_place_types |
GET /reference/place-types |
distribution:read |
All eight place types with country-specific available and searchable flags. |
list_currencies |
GET /reference/currencies |
distribution:read |
The currencies a search can be priced in, by ISO 4217 code; choose currency_code from it. |
list_places |
GET /places |
distribution:read |
Canonical destination hierarchy by country, type, parent, or localized-name search; each place carries its Adrasis place id. |
list_properties |
GET /properties |
distribution:read |
Price-free content lookup from the selected profile's explicit Channel Portfolio; optionally accepts place_id and never takes point of sale. |
get_property |
GET /properties/{public_id} |
distribution:read |
Full property content from the same profile-scoped Channel Portfolio. |
prebook |
POST /prebook |
distribution:booking |
Re-price the exact slots sealed by selection_token and return a prebook_token, match status, and policy snapshot. |
book |
POST /book |
distribution:booking |
Finalize a reservation from a prebook_token; requires an idempotency_key for safe retries. |
get_booking |
GET /bookings/{public_id} |
distribution:booking |
Read a booking by public_id; also the poll tool for pending reservations. |
list_bookings |
GET /bookings |
distribution:booking |
Account-wide, PII-free reconciliation by exact agency_reference, bounded creation/check-in window, or updated_since, with opaque cursors and an optional originating-profile filter. |
cancellation_quote |
POST /bookings/{public_id}/cancellation-quote |
distribution:booking |
Preview the cancellation fee with no side effects. |
cancel |
POST /bookings/{public_id}/cancel |
distribution:booking |
Cancel a booking and realise the penalty; idempotent on an already-cancelled booking. |
Hotel fields use the Adrasis hotel id as a decimal string, including a
property's public_id and search property_ids. Place fields use the Adrasis
place id, and a country its ISO code, and are named for it: place_id,
parent_place_id and place_ids. Other resources keep their opaque identifiers. See
Hotel id and
Place id.
The property metadata catalogue contains only published accommodation
properties explicitly opened in the selected profile's Channel Portfolio.
Enrollment, source market, destination rules, rates, inventory, and
availability neither expand nor narrow list_properties or get_property;
only the availability tools take traveler point of sale and decide
sellability. Property-list continuations are POS-free cursors bound to the
partner account, resolved profile, place, language, delta filter, and profile
catalogue revision.
profile_public_id has different semantics on list_bookings: it is an
optional account-wide reporting filter for the immutable profile that
originated each booking. It does not select a catalogue for that read, and it
can identify a profile disabled after the booking was created.
The single-property
POST /properties/{property_public_id}/offers/search route is REST-only in this
contract. It returns best_allocation and complete room_offers; there is no
MCP detail tool. POST /prebook also accepts one to nine one-room proofs as
selection_tokens; the MCP prebook tool takes one selection_token, so a
room-by-room basket is prebooked over REST. search_property_availability never accepts max_offers, limit, or
alternative breadth fields. Page size and opaque continuation belong only to
search_place_availability; continue with page.next_cursor alone or with unchanged
fields (a changed field is INVALID_CURSOR, an expired cursor is SEARCH_EXPIRED).
The cursor preserves a server-resolved request_time, so a continuation may omit
that field; an explicitly repeated value must match the first response. A
sorted or filtered place search, or a near search, answers PLACE_TOO_BROAD
when it exceeds 10,000 visible properties or 1,000 properties still requiring
a price after unavailable ones are ruled out. Property-level filters can
narrow that set; see Search a whole place.
Transfer, tour & flight
Every vertical operation follows the same search → prebook → book shape as
accommodation, and each requires distribution:booking.
| Tool | Maps to | Scope | Purpose |
|---|---|---|---|
search_transfers |
POST /transfer/search |
distribution:booking |
Search transfer offers between two zones for a service date and party. |
prebook_transfer |
POST /transfer/prebook |
distribution:booking |
Re-price a transfer offer and return a prebook_token and cancellation snapshot. |
book_transfer |
POST /transfer/book |
distribution:booking |
Finalize a transfer from a prebook_token; requires an idempotency_key. |
search_tours |
POST /tour/search |
distribution:booking |
Search tour offers for a tour/modality on a departure date and party. |
prebook_tour |
POST /tour/prebook |
distribution:booking |
Re-price a tour offer and return a prebook_token and cancellation snapshot. |
book_tour |
POST /tour/book |
distribution:booking |
Finalize a tour from a prebook_token; requires an idempotency_key. |
search_flights |
POST /flight/search |
distribution:booking |
Search charter flight offers for a departure date and pax mix. |
prebook_flight |
POST /flight/prebook |
distribution:booking |
Re-price a flight offer and return a prebook_token and cancellation snapshot. |
book_flight |
POST /flight/book |
distribution:booking |
Finalize a flight from a prebook_token; requires an idempotency_key. |
Packages
An atomic package is composed, revalidated and finalized through its own three
tools; it is then read and cancelled with the get_booking,
cancellation_quote and cancel tools listed above. Those last two accept an
optional item_public_ids array to target individual package services instead
of the whole booking.
| Tool | Maps to | Scope | Purpose |
|---|---|---|---|
search_packages |
POST /package/search |
distribution:booking |
Compose 2-5 already-selected component allocations spanning at least two product types into one inclusive-price offer; returns a package_allocation_id valid 15 minutes. |
prebook_package |
POST /package/prebook |
distribution:booking |
Re-evaluate every component of a stored package offer; returns the match status, the compliance disclosure, and a prebook_token valid 30 minutes. |
book_package |
POST /package/book |
distribution:booking |
Atomically finalize the package from a prebook_token; requires an idempotency_key. |
Trip grouping
| Tool | Maps to | Scope | Purpose |
|---|---|---|---|
create_trip |
POST /trip |
distribution:booking |
Group bookings that are already confirmed into one money-free trip. The link_type records the regulatory relationship only; it does not create an atomic package. |
get_trip |
GET /trip/{public_id} |
distribution:booking |
Read a trip, including members and per-currency combined totals. |
add_trip_member |
POST /trip/{public_id}/members |
distribution:booking |
Add an existing booking to a trip. |
remove_trip_member |
DELETE /trip/{public_id}/members/{booking_public_id} |
distribution:booking |
Remove a booking from a trip. |
cancel_trip |
POST /trip/{public_id}/cancel |
distribution:booking |
Cancel every member booking of a trip; returns a per-member outcome list. |
Read tools require distribution:read; booking and vertical tools require
distribution:booking. A tool call without the required scope is rejected for
insufficient scope. Grant only the scopes an agent needs.
A typical agent flow
list_countries→list_place_types→list_places: Resolve canonical geography and searchable place kinds.list_properties/get_property: Build price-free context from the selected profile's Channel Portfolio without a point-of-sale input.search_property_availability, orsearch_place_availabilitywhen walking a geography: request exact top-1 winners with explicitstrictorflexibleallocation intent; choose a returned allocation and keep its opaqueselection_tokenserver-side.prebook: Pass thatselection_tokento re-price the sealed slots and mint a token. Read the match status and cancellation policy, then confirm with the user. Inventory remains unheld untilbook.book: Finalize with guest and contact details and a uniqueidempotency_key.get_booking: Poll until a terminal status if the booking came back pending.list_bookings: Reconcile account-wide by the caller's exactagency_referenceor a bounded date/delta window; addprofile_public_idonly to narrow reporting to one originating profile.cancellation_quote→cancel: Preview the fee, then cancel if the user confirms.
Consuming the contract directly
An agent can also call the REST surface directly from the published contract:
- The published site serves an LLM-readable index of this portal as plain text
at
/llms.txt. - The full machine-readable contract is rendered on the API reference page.