FlyBest Travel — Hotel Booking with Advisor Benefits
Server Details
Travel: live hotel rates with advisor benefits (breakfast, credit, upgrade), booked via a US agency.
- Status
- Healthy
- Uptime
- 99.4% over 20 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- Repository
- flybestorg-cyber/flybest-connector
- GitHub Stars
- 2
- Server Listing
- org.flybest/travel-hotels
TDQS
Scored across 8 tools
Each tool has a fairly distinct purpose: search vs. content vs. rates vs. payment link vs. trip management. The main overlap risk is my_trip (single booking detail) vs. my_trips (list of bookings), which differ only by plurality, though the descriptions do clarify their roles.
The sabre_* tools follow a loose namespace pattern (sabre_hotel_search, sabre_hotel_content, sabre_hotel_card_link), but the trip-management tools (my_trip, my_trips, cancel_my_trip) lack verbs and are inconsistently styled, and sabre_hotel_rates_coded is an odd suffix. Mixed conventions remain readable but are not predictable.
Eight tools is well-scoped for a hotel booking workflow covering search, detail, rates, payment, history, and cancellation. No redundant or filler tools appear, staying comfortably in the reasonable range.
The surface covers the core lifecycle from search through rates and content to payment-link booking, plus listing, viewing, and cancelling trips, which is strong coverage. A gap exists around modifying/amending an existing booking rather than only cancelling it, but that is a manageable limitation.
Available Tools
8 toolscancel_my_tripCancel my bookingADestructiveIdempotentInspect
Cancels one of the connected user's own bookings, by the number shown in my_trips. Two steps: the first call with confirm=false returns the current cancellation preview and cancels nothing; a second call with confirm=true within 30 minutes of that preview performs the cancellation. When those terms carry a penalty or are non-refundable, the cancellation also needs accept_penalty=true, which records that the traveller accepted the current charge. Changed or expired terms return a fresh preview for agreement. Missing fee information needs advisor verification and a new preview; a verified penalty does not prevent cancellation after agreement. An unknown result needs booking-status verification before any retry. Not reversible.
| Name | Required | Description | Default |
|---|---|---|---|
| trip | Yes | number from my_trips | |
| confirm | Yes | second step: cancels when the terms were previewed within the last 30 minutes; otherwise the call returns the preview | |
| accept_penalty | No | records that the traveller accepted the penalty shown in the preview; required when the terms carry a penalty or are non-refundable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true, but the description goes well beyond them: it discloses the irreversibility ('Not reversible'), the 30-minute preview validity window, the two-step consent model, the penalty-acceptance record, and the required human verification paths. No contradiction with the annotations — the repeated confirm calls are consistent with idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and the two-step mechanic before the edge cases. Dense but each sentence carries a distinct rule (penalty, expired terms, missing fees, unknown result), though the penalty/fee/verification clauses could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by explaining what a preview call returns and how the sequential flow resolves. For a destructive, stateful, non-reversible operation, the error and verification paths are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so trip, confirm, and accept_penalty are already documented in the schema with essentially the same semantics (preview window, penalty acceptance). The description adds only light relational framing (accept_penalty records acceptance of 'the current charge'), so the baseline 3 for high schema coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Cancels one of the connected user's own bookings') and anchors the identifier to a sibling ('the number shown in my_trips'), cleanly separating it from my_trips/my_trip which only list. An agent can pick this tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes the two-call protocol (confirm=false previews, confirm=true within 30 minutes cancels) and the conditional requirement for accept_penalty when terms carry a penalty or are non-refundable. It also prescribes what to do in failure modes: changed/expired terms return a fresh preview, missing fee information needs advisor verification, and an unknown result needs booking-status verification before retry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_tripShow one of my bookingsARead-onlyIdempotentInspect
Details of one of the connected user's own bookings, by the number shown in my_trips.
| Name | Required | Description | Default |
|---|---|---|---|
| trip | Yes | number from my_trips |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds only the scoping fact that the booking must belong to the connected user, which is modest added value; nothing is said about errors for unknown numbers or what the returned detail contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the resource and the lookup key front-loaded. Nothing is padded or repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with a full annotation safety profile this is nearly adequate, but with no output schema the description never indicates what details the booking detail object contains or how a missing/invalid trip number is surfaced, leaving a small but real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, and the schema already states 'number from my_trips'. The description merely restates that same origin, adding no format, range, or validity detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (one of the connected user's own bookings) and the retrieval key (the number shown in my_trips), which cleanly separates it from the list-style sibling my_trips. It is clear, though the singular-vs-list distinction from my_trips is only implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by the number shown in my_trips' implies the agent must call my_trips first to obtain a valid trip number, which is useful workflow context. However, there is no explicit when-to-use statement, no exclusion of cancel_my_trip or the hotel/currency siblings, and no note about what happens with an invalid number.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_tripsList my bookingsARead-onlyIdempotentInspect
The bookings made through this connection — only the connected user's own. The number printed beside each one identifies it for my_trip and cancel_my_trip.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real context beyond that: the result is scoped to the connected user only and each entry carries an identifier. It does not mention pagination or ordering, keeping it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the scope constraint and followed by the only other fact an agent needs (the identifying number). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema and a trivial read operation, the description covers what the tool returns and how its results feed sibling tools. Only the return ordering/pagination is unaddressed, a minor gap for a zero-arg list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. It correctly avoids inventing filter syntax that does not exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific resource (bookings) and a key scope qualifier ('only the connected user's own'), which meaningfully distinguishes it from the other lookup siblings. It never uses an explicit verb like 'list', leaning on the title to supply that, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent forward by explaining that each booking's printed number 'identifies it for my_trip and cancel_my_trip', effectively telling the agent this is the source of the IDs the other two tools need. There is no explicit when/when-not phrasing, so it stops at clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sabre_currency_convertConvert currencyARead-onlyIdempotentInspect
Converts an amount between currencies at the reservation system's banker's selling rate. For estimates only: hotel bookings are made in the rate's own currency. on_date (DDMMMYY) selects a past day's rate.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | e.g. 1780.00 | |
| on_date | No | DDMMMYY - the rate in force that day, max 400 days back | |
| via_nation | No | 2-letter country, to convert through a third currency | |
| to_currency | No | 3-letter code; omit for local currency | |
| from_currency | Yes | 3-letter code, e.g. EUR |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds genuinely useful behavior: which rate is applied (banker's selling rate), that results are estimates only, and that on_date selects a historical rate. It stops short of describing rounding, precision, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and rate type, then the estimate caveat, then the date parameter. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param, no-output-schema read tool, the description covers the essential agent-facing facts: what conversion rate is used, that output is an estimate, and how historical dates work. Missing only minor details like output precision or failure modes for invalid currency codes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented with format and examples. The description reinforces on_date semantics (DDMMMYY, past day's rate) but adds little beyond what the schema states, including the 400-day limit. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (converts) and resource (amount between currencies) and pins down the exact rate used ('banker's selling rate'). Siblings are hotel/trip tools, so no direct sibling confusion exists, but the description does not need to differentiate against an alternative converter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage caveat: 'For estimates only: hotel bookings are made in the rate's own currency', which tells the agent not to treat the result as a bookable amount. It also explains when on_date matters. It does not name alternatives or exclusions, but none are obviously relevant here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sabre_hotel_card_linkCreate hotel payment linkADestructiveInspect
Creates a one-time payment page for one rate. Inputs: the rate_key, rooms and adults (per room) from sabre_hotel_rates_coded, the guest's name as on their ID, and the expected_total and currency copied from that rate row. e-mail and phone are optional: without an e-mail, the address this connection signed up with is filled in, and the payer confirms or changes it on the page. The page is open for about ten minutes from when it is created; if it closes before the card is submitted, nothing is booked or charged and a new page can be created for the same option. A rate_key priced for a different number of adults is refused before any page is created. The booking and payment page use the rate's own currency; converted figures are estimates. The page shows the room and beds, the price, deposit and cancellation terms; the guest accepts them and enters their card there, and the booking is made when they submit and the hotel confirms. Card details are entered only on that page; this tool takes none. loyalty_id is the guest's own number with the hotel's loyalty programme, not an advisor's number; it is filed on the booking. A rate found with loyalty_id in sabre_hotel_rates_coded carries that number and books only with the same loyalty_id; a members-only rate books only from a search made with the guest's number. Points and elite nights are credited as usual. Status benefits apply on top of the partner benefits. With children, family_mode=direct (the default) books the actual adults, children and child_ages using the chosen verified family rate_key and that row's family_quote_token. The occupancy is rechecked before booking; the rate's deposit, prepayment or non-refundable terms are offered through the normal payer-consent flow. Missing or unverified family occupancy needs Jay's help at jay@flybest.org, with hotel, dates, room/rate preference, adult count and children's ages. Only the traveller's explicit choice of family_mode=adult_pending uses an adults-only key with free cancellation and no deposit or prepayment; children and child_ages stay recorded for advisor follow-up, and that adult booking leaves the family unconfirmed. No automatic switch to adults only takes place. Sending an e-mail requires an explicit request. allow_deposit / allow_nonrefundable permit the selected direct rate to be offered; these flags do not override adult_pending restrictions. The page then asks the guest for consent. Creating the page sends the guest and stay details to FlyBest's booking service and the reservation system; nothing is booked until the guest submits the page and the hotel confirms. For the same room, dates and currency, changed totals, deposits or cancellation penalties are displayed on the existing page for fresh agreement before continuing. A different room, date or currency needs a newly selected quote. A connection keeps up to three payment pages open: asking again for the same stay returns the page already open. At that limit, a new page closes that connection's oldest page with no payment in progress. If shared capacity is full, it may also close the oldest public page that has never been opened or submitted. Closing a page invalidates its previous payment link; pages with a payment in progress are never closed. Nothing is booked or charged by closing a page. The booking then appears in my_trips.
| Name | Required | Description | Default |
|---|---|---|---|
| No | The guest's own e-mail address, required: the hotel sends its confirmation and any later change to it, so without it the property cannot reach the traveller. | ||
| phone | No | ||
| rooms | No | Rooms in ONE segment, all for the same guest and the same room type and guest arrangement per room. Different arrangements need separate one-room quotes and links. The rate_key comes from sabre_hotel_rates_coded with the same rooms=N: a two-room key and a one-room key are entirely different keys and only the two-room one sells two rooms, and its total is already the whole stay. Rooms sold together share one segment and CANNOT be cancelled individually. Different room types cannot share a sell — for that, book the first room and then mint a second link with add_to_pnr set to the locator it returned. LIVE on production since 2026-09-11 (certified on CERT: one segment carrying NumberOfUnits=2). | |
| adults | No | Adults per room — the same number used in sabre_hotel_rates_coded for this rate_key (default 1). A rate_key priced for a different party is refused before any link is created. | |
| surname | Yes | ||
| check_in | Yes | YYYY-MM-DD | |
| children | No | Actual number of children in the party. direct books this occupancy; only explicit adult_pending retains them for advisor follow-up instead of booking them. | |
| currency | Yes | REQUIRED. The currency of expected_total, copied from the SAME rate row — the hotel's own currency, not a converted estimate. A changed currency requires a newly selected quote. | |
| rate_key | Yes | from sabre_hotel_rates_coded | |
| check_out | Yes | YYYY-MM-DD | |
| add_to_pnr | No | An EXISTING Sabre locator this room should JOIN instead of creating a new PNR. THIS is how one guest gets a king AND a suite on one record: Sabre refuses to put two room types in one sell, so book the first room normally, then mint a second link with this set to the locator it returned. Each segment keeps its OWN rate, its own deposit and its own cancellation policy, and they can be cancelled separately. Leave it out for an ordinary booking. | |
| chain_code | No | ||
| child_ages | No | Actual children's ages, matching the selected family quote. adult_pending retains them for advisor confirmation even though only the adults are initially booked. | |
| given_name | Yes | ||
| hotel_code | Yes | Sabre property code | |
| hotel_name | No | ||
| loyalty_id | No | the guest's own programme number with the hotel's chain (not an advisor ID), filed on the segment when the room is booked. A rate_key found by sabre_hotel_rates_coded WITH loyalty_id carries that number into the booking: pass the same number here (a different one is refused before anything is sent; none adopts the searched one), and a row marked members-only books only from a search made with the guest's number. | |
| family_mode | No | direct: book the actual adults and children from a rate verified for that party. adult_pending: only after the traveller explicitly chooses adults first, use an adults-only free-cancellation key with no deposit or prepayment and keep children/ages for advisor follow-up. | direct |
| allow_deposit | No | no longer needed (2026-10-15): the page shows the live deposit and its timing and the payer's tick authorises it; accepted for compatibility | |
| expected_total | Yes | the all-in total of the chosen rate row, e.g. 288.09 - for the same room, dates and currency, changed totals or cancellation terms are displayed on the existing page for the payer to agree again and continue. 80 and 80.00 represent the same amount. | |
| expected_deposit | No | the deposit figure from the rates row (deposit_amount) as shown to the payer, when known. A changed deposit is displayed on the existing page for fresh agreement before continuing; this input is not consent to a higher charge. | |
| family_quote_token | No | Opaque family quote proof copied unchanged from the SAME selected rate row as rate_key; tied to its real adults, children and ages. It is not interchangeable across rows or parties. | |
| allow_nonrefundable | No | no longer needed (2026-10-15): the page shows the live cancellation terms and the payer's tick authorises them; accepted for compatibility |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already flagging destructive/openWorld/non-idempotent, the description discloses far more: the page's ~10-minute lifetime, that nothing is booked or charged until the guest submits and the hotel confirms, that card details never pass through this tool, that up to three pages are kept per connection and the oldest inactive one is closed, and that closing invalidates the prior link but never a page with payment in progress. It also states guest/stay details are transmitted to external booking and reservation systems, which is the key side effect for a write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is a single undifferentiated wall of text that re-states the same guarantees repeatedly ('nothing is booked or charged', 'nothing is booked until the guest submits and the hotel confirms', 'Nothing is booked or charged by closing a page'). Several sentences do not earn their place, and the absence of paragraphing or grouping makes it slow to scan for the one branch an agent actually needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 23-parameter mutation tool with no output schema, the description covers the full lifecycle: prerequisites (rate_key must match party size), refusal conditions, consent/re-display flow for changed totals, multi-room and add_to_pnr bridging, quota behaviour, and where the result surfaces (my_trips). Nothing an agent needs to invoke it safely appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 78%, so the baseline is 3, and the description largely restates parameter meaning already present in the schema (loyalty_id, expected_total, family_mode, add_to_pnr). It adds one genuinely new behavioural detail — that a missing e-mail causes the connection's own signup address to be pre-filled and confirmed on the page — but that directly conflicts with the schema's own note that email is 'required', creating ambiguity rather than resolving it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and artifact: 'Creates a one-time payment page for one rate.' It positions the tool against siblings by naming sabre_hotel_rates_coded as the source of rate_key, rooms, adults and totals, and by stating the eventual booking appears in my_trips. An agent can distinguish this from the search/rates/content tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use conditions for the non-obvious branches: family_mode=direct is the default and books actual occupancy, adult_pending only applies after the traveller explicitly chooses adults first, and 'No automatic switch to adults only takes place.' It also routes quota/limit cases ('asking again for the same stay returns the page already open') and escalates missing family occupancy to a named contact with a required data list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sabre_hotel_contentGet hotel detailsARead-onlyIdempotentInspect
Details for one hotel: address, description, amenities, check-in and check-out times, room count and a gallery of photos by category. No prices; rates come from sabre_hotel_rates_coded.
| Name | Required | Description | Default |
|---|---|---|---|
| hotel_code | Yes | Sabre hotel code from sabre_hotel_search | |
| image_size | No | thumb | medium (default) | large | original |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds genuine value beyond that by scoping the payload (content only, no prices) and pointing to the rates tool, though it says nothing about auth requirements, rate limits, or failure modes for invalid hotel codes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The content inventory is front-loaded and the pricing exclusion/routing follows immediately, so the agent gets the scope and the boundary in one pass.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values, and it lists the returned fields explicitly. Combined with 100% schema coverage and annotations covering safety, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (hotel_code, image_size) are already documented in the schema. The description mentions a photo gallery by category, which loosely relates to image_size, but adds no format or constraint detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and enumerates exactly what is returned (address, description, amenities, check-in/out times, room count, photo gallery). It also names the sibling it is not (rates come from sabre_hotel_rates_coded), so an agent can distinguish it from sabre_hotel_rates_coded without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence explicitly routes pricing lookups to sabre_hotel_rates_coded, and the schema notes the hotel_code comes from sabre_hotel_search, implying the correct call ordering. It stops short of an explicit when-to-use statement or exclusions for the other siblings, but the alternative is named clearly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sabre_hotel_rates_codedGet hotel ratesBRead-onlyIdempotentInspect
The authoritative rate list for one hotel through the agency's reservation access: returned rates with room and bed type, the stay total in the hotel's currency (total_after_tax is the amount quoted; total_after_tax_excl_fees excludes fees), what is included (breakfast), excluded or unknown mandatory fees where stated, the cancellation deadline and penalty in words, deposit or prepayment terms, and the benefits attached to preferred-partner rates (daily breakfast, property credit where offered, upgrade on arrival subject to availability, early check-in / late check-out). hotel_name and chain_code come from the search result and select the partner rates; a call without either is refused before anything is sent. loyalty_id is the guest's own number with the hotel's loyalty programme (IHG One Rewards, Hilton Honors, World of Hyatt, I Prefer, Marriott Bonvoy): it is sent to the hotel with the search so any member offer the hotel makes this guest can come back (no discount is guaranteed), and a rate found this way carries the number and books only with the same loyalty_id. Hilton Honors, World of Hyatt, IHG One Rewards, I Prefer and Marriott Bonvoy member rates are listed without a number; Marriott Bonvoy member rates come back at some Marriott properties (about 2% under the public rate where measured). Rows marked members-only book only from a search made with the guest's number. rooms=2 prices two rooms and the returned rate_key then covers both. Rooms with different guest arrangements need separate one-room quotes and payment links before booking; the combined rate key cannot be reused. Family rate searches use the actual adults, children and child_ages. A chosen row that reads "Family occupancy verified for this rate" has verified occupancy for the party on its "Requested family for this rate" line; other rows in the list may still be unverified. The selected row's family_quote_token travels unchanged with its own rate_key into the payment-link request. The direct family booking preserves the quoted party. Deposits, prepayment and non-refundable rates follow the normal payment and cancellation consent flow. Unverified occupancy or no suitable family rate needs Jay's help at jay@flybest.org. An adults-only search is an alternative only when the traveller explicitly chooses an adults-first booking: free cancellation and no deposit or prepayment, with children and their charges still pending advisor confirmation. It is not an automatic substitute for a family quote. A comparison uses the same room/product, rate plan, dates, currency, benefits and cancellation/payment terms; the difference between the lists' lowest prices is not a child surcharge. An unchanged matching total does not establish that every child extra is free. Child policy, maximum occupancy and extra-person or extra-bed charges appear only where the rate text states them. An advisor request includes hotel, dates, room/rate preference, adult count and children's ages; sending an e-mail requires the traveller's explicit request. Results start with a note for the traveller about booking in this conversation and end with a short reminder. The traveller can confirm their chosen option in this chat to receive its secure payment page. A membership question appears near the start when the hotel has a known loyalty programme and no number was supplied.
| Name | Required | Description | Default |
|---|---|---|---|
| rooms | No | how many rooms at this property for these dates. Totals cover ALL of them for the whole stay; per_room_total is on each row beside it. adults/children/child_ages then describe EVERY room. | |
| adults | No | ||
| check_in | Yes | YYYY-MM-DD | |
| children | No | number of children, sent together with child_ages of the same length (the call is refused otherwise — Sabre answers children-without-ages with 200 and zero rates, which is indistinguishable from sold out. Omitting children means every price returned is an ADULTS-ONLY price. | |
| currency | No | 3-letter code for the DISPLAY conversion shown beside each rate (default USD). The hotel's OWN currency is always what is quoted and what gets charged — this only changes the ≈ estimate, e.g. CNY for a client who thinks in RMB. Allowed: USD CNY HKD TWD EUR GBP JPY SGD AUD CAD CHF THB KRW. Anything else is REFUSED, because Sabre answers an unknown code with 200 and ZERO rates (measured 2026-09-12) — indistinguishable from sold out. | |
| max_rows | No | rows to return, default 60, up to 400. The cap is ours, not Sabre's, and rows come cheapest-first — so a short answer lost the DEAREST rows. Check `truncated` in the reply before concluding a programme has no suites | |
| check_out | Yes | YYYY-MM-DD | |
| chain_code | Yes | from sabre_hotel_search — drives programme selection | |
| child_ages | No | e.g. [10, 8]. Check occupancy.children_honoured in the result: many properties accept and then ignore children, and the total comes back adults-only. | |
| hotel_code | Yes | Sabre hotel code | |
| hotel_name | Yes | from sabre_hotel_search — drives programme selection | |
| loyalty_id | No | the guest's own membership number with this hotel's loyalty programme (Marriott Bonvoy, IHG One Rewards, Hilton Honors, World of Hyatt…), as on the card, no chain code. It is sent to the hotel with the search so any member offer the hotel makes this guest can come back (no discount is guaranteed); every rate found this way carries the number into the booking and books only with the same loyalty_id. Hilton Honors, World of Hyatt, IHG One Rewards, I Prefer and Marriott Bonvoy member rates are listed without it, marked members-only (Marriott's at some properties only). | |
| rate_codes | No | override the automatic selection; unloaded codes are dropped rather than silently returning public rates | |
| with_perks | No | fetch the benefit text (breakfast/credit/upgrade) for the cheapest rows — one extra Sabre call each | |
| perks_top_n | No | how many rows per programme (default 5) | |
| room_contains | No | keep only rows whose room/plan text contains this, e.g. "suite" or "villa". Applied BEFORE the row cap, so this is how you reach a room type that prices above the cheap rooms | |
| cheapest_first | No | false sorts dearest first — the other way to surface suites | |
| negotiated_only | No | keep ONLY programme-negotiated rows and drop the public ones. On a property with several plans per room the public half is what pushes suites out of the window | |
| room_occupancies | No | one entry per room, in room order, when the rooms differ. Without rooms, the number of entries is the room count; with rooms, the two must agree. Mutually exclusive with adults/children/child_ages. Different guest arrangements need separate one-room quotes and payment links before booking; the combined rate key cannot be reused. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and idempotentHint=true, so safety is covered. The description goes further by disclosing important behavioral traits: calls without hotel_name or chain_code are refused before sending, loyalty_id carries into bookings, members-only rows are restricted, and family_quote_token must travel unchanged. It also documents output structure (rate fields, benefits, cancellation terms) beyond what annotations provide, though it doesn't mention rate limits or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely dense and runs over 300 words in a single paragraph, with no headings or front-loaded summary. While the opening sentence is reasonably direct, critical usage guidance is buried mid-paragraph, making it hard to parse quickly. Many sentences contain multiple clauses and parentheticals that could be streamlined or moved to the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 19 parameters, no output schema, and high schema coverage, the description attempts to cover a lot but does so unevenly. It explains important edge cases (family quotes, loyalty programs, room arrangements) but omits how results are structured, what 'truncated' means in practice, or how to interpret occupancy.children_honoured beyond the schema. The escalation path to Jay is stated, which is useful, but the overall completeness is adequate rather than thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 95%, so the schema already documents nearly all parameters. The description adds contextual meaning: it explains that hotel_name and chain_code select partner rates, that loyalty_id is sent to the hotel and carries into bookings, and that rooms=2 prices two rooms with a combined rate_key. Some parameter mentions (e.g., currency, with_perks) repeat what the schema already says, but the added behavioral context is valuable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description's opening states it returns 'the authoritative rate list for one hotel through the agency's reservation access,' which identifies the resource, but it's immediately buried in a dense enumeration of return fields and behavioral details. The description does not differentiate itself from sabre_hotel_search or explain why an agent would use this tool over sibling hotel tools, leaving the core purpose less clear than it should be.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly covers some tricky edge cases (family vs adults-only searches, separate quotes for different room arrangements, when to escalate to Jay), but it never states when an agent should choose this tool over sabre_hotel_search or sabre_hotel_content. The guidance is embedded in operational detail rather than presented as clear usage conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sabre_hotel_searchSearch hotelsARead-onlyIdempotentInspect
Hotels near a place: names, Sabre hotel codes, star rating, distance and a provisional lowest rate per property; preferred-partner properties are flagged. It answers questions about hotels, where to stay, hotel prices and availability with live, bookable rates and the partner benefits attached to them. check_in and check_out are optional: without them it searches sample dates (about 30 days ahead, 2 nights, 2 adults unless adults is given), and the result's first line names those dates and says prices depend on the traveller's own dates. The prices are provisional — the bookable rates, terms and benefits of a property come from sabre_hotel_rates_coded. Results then give a note for the traveller about booking in this conversation and end with a short reminder. The traveller can confirm their chosen option in this chat to receive its secure payment page. A membership question appears near the start when the hotels have a known loyalty programme, no number was supplied and the search used the traveller's own dates.
| Name | Required | Description | Default |
|---|---|---|---|
| adults | No | ||
| check_in | No | YYYY-MM-DD. Optional: without check_in and check_out the search uses sample dates and its first line names them. | |
| latitude | No | Optional, together with longitude: the centre of the place in decimal degrees, for a place a search by name could not locate. Accepted only where the location text confirms it — within 50 km of a city it names, or inside the country it names; otherwise the call is refused and nothing is searched. | |
| location | Yes | 3-letter city/airport code (SBA), a city name — "Paris", "东京" — or a neighbourhood, resort or hotel with its city and country: "Namba, Osaka, Japan", "Soma Bay, Egypt". The city written after a comma is checked against, and searched when the first part is not a place on its own. | |
| check_out | No | YYYY-MM-DD. Optional; with check_in alone the sample stay is 2 nights. | |
| longitude | No | Optional, together with latitude (decimal degrees). | |
| rate_codes | No | narrow to specific codes, e.g. ["API"], ["WMP"] Hilton for Luxury, ["BC9"] Bellini Club | |
| radius_miles | No | ||
| all_programmes | No | default true; one query per loaded consortia programme so PP properties are flagged |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, openWorld, non-destructive), and the description adds substantial context on top: the sample-date defaults when check_in/check_out are omitted, the first-line date disclosure, the provisional-pricing caveat, the latitude/longitude refusal rule, the membership question trigger, and the confirmation-to-payment-page flow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scoping are front-loaded, but the text is a long run-on that blends input semantics, return-value detail, and conversational UI narrative (membership question position, booking reminder, payment page). Some of that narrative adds little for tool selection and dilutes the core guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 parameters and no output schema, the description must carry the return-value burden, and it does: it lists the fields returned, the sample-date first line, and the closing notes. It is close to complete, with only minor ambiguity about pagination or result limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 78%, so most parameters are self-documented, but the description adds real meaning: the concrete sample-date defaults (about 30 days ahead, 2 nights, 2 adults unless adults is given) and the behavioural coupling of check_in/check_out are not spelled out in the schema. This meaningfully goes beyond the field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource (search hotels near a place) and enumerates the returned fields (names, Sabre codes, star rating, distance, provisional lowest rate, partner flags). It explicitly routes bookable rates to sabre_hotel_rates_coded, so the agent can distinguish it from that sibling without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Says it answers questions about hotels, where to stay, hotel prices and availability, and names the alternative (sabre_hotel_rates_coded) for bookable rates and terms. That is a clear use condition and an explicit alternative, but it never states when not to use this tool versus sabre_hotel_content or the other siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
sabre_hotel_rates_coded1 field changed- changed
Input schema / properties / loyalty_id / descriptionPrevious value: -"the guest's own membership number with this hotel's loyalty programme (Marriott Bonvoy, IHG One Rewards, Hilton Honors, World of Hyatt…), as on the card, no chain code. It is sent to the hotel with the search so any member offer the hotel makes this guest can come back (no discount is guaranteed); every rate found this way carries the number into the booking and books only with the same loyalty_id. Hilton Honors, World of Hyatt, IHG One Rewards and I Prefer member rates are listed without it, marked members-only."New value: +"the guest's own membership number with this hotel's loyalty programme (Marriott Bonvoy, IHG One Rewards, Hilton Honors, World of Hyatt…), as on the card, no chain code. It is sent to the hotel with the search so any member offer the hotel makes this guest can come back (no discount is guaranteed); every rate found this way carries the number into the booking and books only with the same loyalty_id. Hilton Honors, World of Hyatt, IHG One Rewards, I Prefer and Marriott Bonvoy member rates are listed without it, marked members-only (Marriott's at some properties only)."
1 tool update
- Changed
sabre_hotel_card_link2 fields changed- changed
Input schema / properties / allow_deposit / descriptionPrevious value: -"permits a deposit rate with the payment timing stated in its live terms to be offered; the page asks the guest for consent"New value: +"no longer needed (2026-10-15): the page shows the live deposit and its timing and the payer's tick authorises it; accepted for compatibility" - added
Input schema / properties / allow_nonrefundable / descriptionAdded value: +"no longer needed (2026-10-15): the page shows the live cancellation terms and the payer's tick authorises them; accepted for compatibility"
1 tool update
- Changed
sabre_hotel_search3 fields changed- changed
Input schema / properties / check_in / descriptionPrevious value: -"YYYY-MM-DD"New value: +"YYYY-MM-DD. Optional: without check_in and check_out the search uses sample dates and its first line names them." - changed
Input schema / properties / check_out / descriptionPrevious value: -"YYYY-MM-DD"New value: +"YYYY-MM-DD. Optional; with check_in alone the sample stay is 2 nights." - changed
Input schema / requiredPrevious value: -[ - "location", - "check_in", - "check_out" -]New value: +[ + "location" +]
1 tool update
- Changed
sabre_hotel_card_link1 field changed- changed
Input schema / requiredPrevious value: -[ - "hotel_code", - "rate_key", - "check_in", - "check_out", - "given_name", - "surname", - "expected_total", - "currency", - "email" -]New value: +[ + "hotel_code", + "rate_key", + "check_in", + "check_out", + "given_name", + "surname", + "expected_total", + "currency" +]
1 tool update
- Changed
sabre_hotel_search3 fields changed- added
Input schema / properties / latitudeAdded value: +{ + "description": "Optional, together with longitude: the centre of the place in decimal degrees, for a place a search by name could not locate. Accepted only where the location text confirms it — within 50 km of a city it names, or inside the country it names; otherwise the call is refused and nothing is searched.", + "type": "number" +} - changed
Input schema / properties / location / descriptionPrevious value: -"3-letter city/airport code (SBA), or a city name — \"Paris\", \"东京\", or \"City, CC\" for anywhere unusual"New value: +"3-letter city/airport code (SBA), a city name — \"Paris\", \"东京\" — or a neighbourhood, resort or hotel with its city and country: \"Namba, Osaka, Japan\", \"Soma Bay, Egypt\". The city written after a comma is checked against, and searched when the first part is not a place on its own." - added
Input schema / properties / longitudeAdded value: +{ + "description": "Optional, together with latitude (decimal degrees).", + "type": "number" +}
1 tool update
- Changed
sabre_hotel_rates_coded1 field changed- changed
Input schema / properties / room_occupancies / descriptionPrevious value: -"one entry per room, in room order, when the rooms differ. Mutually exclusive with adults/children/child_ages. Different guest arrangements need separate one-room quotes and payment links before booking; the combined rate key cannot be reused."New value: +"one entry per room, in room order, when the rooms differ. Without rooms, the number of entries is the room count; with rooms, the two must agree. Mutually exclusive with adults/children/child_ages. Different guest arrangements need separate one-room quotes and payment links before booking; the combined rate key cannot be reused."
1 tool update
- Changed
sabre_hotel_card_link1 field changed- added
Input schema / properties / adults / descriptionAdded value: +"Adults per room — the same number used in sabre_hotel_rates_coded for this rate_key (default 1). A rate_key priced for a different party is refused before any link is created."
1 tool update
- Changed
sabre_hotel_card_link4 fields changed- added
Input schema / properties / child_ages / descriptionAdded value: +"Actual children's ages, matching the selected family quote. adult_pending retains them for advisor confirmation even though only the adults are initially booked." - added
Input schema / properties / children / descriptionAdded value: +"Actual number of children in the party. direct books this occupancy; only explicit adult_pending retains them for advisor follow-up instead of booking them." - added
Input schema / properties / family_modeAdded value: +{ + "default": "direct", + "description": "direct: book the actual adults and children from a rate verified for that party. adult_pending: only after the traveller explicitly chooses adults first, use an adults-only free-cancellation key with no deposit or prepayment and keep children/ages for advisor follow-up.", + "enum": [ + "direct", + "adult_pending" + ], + "type": "string" +} - added
Input schema / properties / family_quote_tokenAdded value: +{ + "description": "Opaque family quote proof copied unchanged from the SAME selected rate row as rate_key; tied to its real adults, children and ages. It is not interchangeable across rows or parties.", + "type": "string" +}
2 tool updates
- Changed
sabre_hotel_card_link5 fields changed- changed
Input schema / properties / allow_deposit / descriptionPrevious value: -"permits a deposit rate — one whose card is charged now — to be offered; the page asks the guest for consent"New value: +"permits a deposit rate with the payment timing stated in its live terms to be offered; the page asks the guest for consent" - changed
Input schema / properties / currency / descriptionPrevious value: -"REQUIRED. The currency of expected_total, copied from the SAME rate row — the hotel's OWN currency, not USD. The commit compares the whole tuple, so a wrong currency refuses the booking AFTER the guest has typed their card."New value: +"REQUIRED. The currency of expected_total, copied from the SAME rate row — the hotel's own currency, not a converted estimate. A changed currency requires a newly selected quote." - changed
Input schema / properties / expected_deposit / descriptionPrevious value: -"the deposit figure from the rates row (deposit_amount) as shown to the payer. OPTIONAL since 2026-09-26: the page charges the hotel's own deposit as long as it is within the stay total, and reports what it took — a deposit that moved no longer refuses at the guest's card. Pass it when you have it so the guest sees the difference."New value: +"the deposit figure from the rates row (deposit_amount) as shown to the payer, when known. A changed deposit is displayed on the existing page for fresh agreement before continuing; this input is not consent to a higher charge." - changed
Input schema / properties / expected_total / descriptionPrevious value: -"the all-in total of the chosen rate row, e.g. 288.09 - a price rise or changed currency stops the booking; a lower price can book"New value: +"the all-in total of the chosen rate row, e.g. 288.09 - for the same room, dates and currency, changed totals or cancellation terms are displayed on the existing page for the payer to agree again and continue. 80 and 80.00 represent the same amount." - changed
Input schema / properties / rooms / descriptionPrevious value: -"Rooms in ONE segment, all for the same guest and the same room type — the way an agent sells two rooms on one PNR. The rate_key comes from sabre_hotel_rates_coded with the same rooms=N: a two-room key and a one-room key are entirely different keys and only the two-room one sells two rooms, and its total is already the whole stay. Rooms sold together share one segment and CANNOT be cancelled individually. Different room types cannot share a sell — for that, book the first room and then mint a second link with add_to_pnr set to the locator it returned. LIVE on production since 2026-09-11 (certified on CERT: one segment carrying NumberOfUnits=2)."New value: +"Rooms in ONE segment, all for the same guest and the same room type and guest arrangement per room. Different arrangements need separate one-room quotes and links. The rate_key comes from sabre_hotel_rates_coded with the same rooms=N: a two-room key and a one-room key are entirely different keys and only the two-room one sells two rooms, and its total is already the whole stay. Rooms sold together share one segment and CANNOT be cancelled individually. Different room types cannot share a sell — for that, book the first room and then mint a second link with add_to_pnr set to the locator it returned. LIVE on production since 2026-09-11 (certified on CERT: one segment carrying NumberOfUnits=2)."
- Changed
sabre_hotel_rates_coded1 field changed- changed
Input schema / properties / room_occupancies / descriptionPrevious value: -"one entry per room, in room order, when the rooms differ. Mutually exclusive with adults/children/child_ages."New value: +"one entry per room, in room order, when the rooms differ. Mutually exclusive with adults/children/child_ages. Different guest arrangements need separate one-room quotes and payment links before booking; the combined rate key cannot be reused."
1 tool update
- Changed
sabre_hotel_card_link1 field changed- changed
Input schema / properties / expected_total / descriptionPrevious value: -"the all-in total of the chosen rate row, e.g. 288.09 - a moved rate aborts the booking"New value: +"the all-in total of the chosen rate row, e.g. 288.09 - a price rise or changed currency stops the booking; a lower price can book"
2 tool updates
- Changed
sabre_hotel_card_link1 field changed- changed
Input schema / properties / loyalty_id / descriptionPrevious value: -"the guest's own programme number with the hotel's chain (not an advisor ID), filed on the segment when the room is booked"New value: +"the guest's own programme number with the hotel's chain (not an advisor ID), filed on the segment when the room is booked. A rate_key found by sabre_hotel_rates_coded WITH loyalty_id carries that number into the booking: pass the same number here (a different one is refused before anything is sent; none adopts the searched one), and a row marked members-only books only from a search made with the guest's number."
- Changed
sabre_hotel_rates_coded1 field changed- added
Input schema / properties / loyalty_idAdded value: +{ + "description": "the guest's own membership number with this hotel's loyalty programme (Marriott Bonvoy, IHG One Rewards, Hilton Honors, World of Hyatt…), as on the card, no chain code. It is sent to the hotel with the search so any member offer the hotel makes this guest can come back (no discount is guaranteed); every rate found this way carries the number into the booking and books only with the same loyalty_id. Hilton Honors, World of Hyatt, IHG One Rewards and I Prefer member rates are listed without it, marked members-only.", + "type": "string" +}
Related MCP Connectors
Hotel direct booking for VIP and corporate rates - upgrades and loyalty eligible, 100K+ hotels
Personal AI travel agent. Points optimization, live flight/hotel/award search, trip planning.
Luxury hotel search, rate comparison, booking quotes, and secure checkout handoff.
Live hotel rates worldwide: search stays, property detail, all-in room prices, human phone desk.
Related MCP Servers
- AlicenseAqualityBmaintenanceTravel award search: compare cash vs points on hotels, flights & cars, cents-per-point, and book319MIT
- AlicenseNot gradedqualityDmaintenanceLuxury hotel intelligence and secure checkout handoff for AI travel agents.1Apache 2.0
- AlicenseBqualityAmaintenanceOfficial MCP server for MAQAMI, a hotel and flight booking platform with 3M+ hotels. Search live hotel rates and flights, look up places, airports and hotel details, then prebook and book. Remote Streamable HTTP endpoint, no API key required.1241428 npm2MIT
- FlicenseAqualityAmaintenanceAgent-native travel search. 5 second flights & hotels $50 cheaper. Free forever for the first 1000 Stargazers.142,172-
Glama MCP Gateway
Add one secure layer between your agents and this server.