MAQAMI Travel
MAQAMI Travel is an MCP server for searching and booking hotels, flights and tours, plus managing existing bookings — with all payments completed on book.maqami.co via a returned checkout link.
Search hotels with live rates and availability (
post_hotels_rates), cheapest per-hotel prices (post_hotels_min_rates), or by name/place (get_data_hotel_search).Discover hotels semantically — natural-language search (
get_data_hotels_semantic_search), room-by-style search (get_data_hotels_room_search), and AI-generated highlights (post_data_hotel_highlights).Get hotel details — full details, amenities, photos (
get_data_hotel), reviews and sentiment (get_data_reviews), and natural-language Q&A (get_data_hotel_ask).Lock a hotel rate and get a checkout link (
post_rates_prebook), then retrieve the locked prebook (get_prebooks_prebookid).Search flights one-way, round-trip or multi-city with filters and sorting (
post_flights_rates), then verify fare, baggage and rules and get a checkout link (post_flights_verify).Look up reference data — cities, countries, currencies, IATA codes, facilities, hotel types, chains, languages (
get_data_*), airports, airlines and their IATA codes.Find and view bookings — list hotel bookings by email and last name (
listBookings), get hotel (get_bookings_bookingid), flight (get_flights_bookings_bookingid) and tour (getExperienceBooking) bookings, plus flight booking extras.Amend hotel bookings — correct the holder's name, email or phone (
put_bookings_bookingid_amend), or view alternative rates for new dates/occupancy (post_bookings_bookingid_alternative_prebooks).Cancel bookings — hotel (
cancel_hotel_booking), flight (post_flights_bookings_bookingid_cancellations) and tour (cancelExperienceBooking), each with a refund-preview tool first.Check tax rules for a hotel (
getHotelTaxSchema).
All searches are read-only; prebook, amend and cancel tools change real state, and payment always happens on book.maqami.co through a tool-returned checkoutUrl.
Provides cached public hotel pricing sourced from Expedia (and other platforms) to compare against wholesale rates.
Integrates with Google Places API to search for places, cities, and landmarks, and retrieve place details for location-based hotel searches.
Enables searching, pricing, and booking hotels within the Hilton chain through the travel booking engine.
Provides IATA airline and airport code reference data, including airport details and airline lookup, for flight and hotel search.
Enables searching, pricing, and booking hotels within the Marriott chain through the travel booking engine.
MAQAMI Travel MCP Server
Official MCP server for MAQAMI, a hotel and flight booking platform with 3M+ hotels. Search live hotel rates and flights, look up cities, airports and hotel details, then send the customer a secure checkout link on book.maqami.co for the exact room or fare they chose. Remote Streamable HTTP endpoint, no API key required.
https://mcp.maqami.co/Quick start
Pick your client. Each line is enough to connect; the full steps are under Connect.
Client | Fastest way to connect |
Claude Code |
|
Claude Desktop (one click) | Download |
Any stdio client (npm) |
|
claude.ai, Claude Desktop and Claude mobile | Customize → Connectors → Add custom connector, URL |
Cursor | Add to Cursor (one click), or add |
VS Code | Install in VS Code (one click), or |
Windsurf | Add |
Gemini CLI |
|
OpenAI Codex |
|
ChatGPT | Developer mode → create an app with URL |
OpenAI Agents SDK |
|
LangChain |
|
n8n | MCP Client Tool node, endpoint |
Cline | MCP Servers → Remote Servers, URL |
LM Studio | Add |
Booking skill only (Claude Code, Codex, Cursor and other skill-aware agents) |
|
Any other client | Streamable HTTP at |
Then try: "Find 4-star hotels in Lisbon for 2 adults, 12 to 15 May."
Related MCP server: 1Stay Hotel Booking
Contents
Connect
The server is hosted at https://mcp.maqami.co/ and uses the Streamable HTTP transport. There is nothing to install and no API key to configure.
Claude (claude.ai and Claude Desktop)
Add MAQAMI as a custom connector:
Go to Customize → Connectors.
Click + Add, then Add custom connector.
Enter the name
MAQAMI Traveland the URLhttps://mcp.maqami.co/, then click Continue.Under Authentication, choose No sign in, then click Add.
This works on every Claude plan, including Free. Free accounts can have one custom connector at a time.
On Team and Enterprise plans, an Owner adds the connector under Organization settings → Connectors first.
Claude Desktop extension
A one-click install for Claude Desktop on macOS, Windows and Linux. It doesn't use a custom connector slot, so it also suits Free accounts that already have one.
Download
maqami-travel.mcpb.Open the file, or drag it into Claude Desktop under Settings → Extensions.
Click Install.
The extension runs the same stdio bridge as the npm package and connects to https://mcp.maqami.co/. Claude Desktop provides Node.js, so there is nothing else to install.
Claude Code
claude mcp add --transport http maqami-travel https://mcp.maqami.co/Or install the plugin, which adds the server and a booking skill that walks Claude through search, confirmation and the checkout link:
/plugin marketplace add negm17111995/mcp-server
/plugin install maqami-travel@maqamiCursor
Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):
{
"mcpServers": {
"maqami-travel": {
"url": "https://mcp.maqami.co/"
}
}
}Or install with one click: Add to Cursor. The same install as a deeplink, to open in your browser:
cursor://anysphere.cursor-deeplink/mcp/install?name=maqami-travel&config=eyJ1cmwiOiJodHRwczovL21jcC5tYXFhbWkuY28vIn0=VS Code
Add to .vscode/mcp.json in your workspace:
{
"servers": {
"maqami-travel": {
"type": "http",
"url": "https://mcp.maqami.co/"
}
}
}Or install in VS Code with one click, or add it to your user profile from the command line:
code --add-mcp '{"name":"maqami-travel","type":"http","url":"https://mcp.maqami.co/"}'Cline
In the Cline panel, open MCP Servers → Remote Servers, enter the URL https://mcp.maqami.co/ and choose Streamable HTTP. Or add it to the MCP settings JSON:
{
"mcpServers": {
"maqami-travel": {
"type": "streamableHttp",
"url": "https://mcp.maqami.co/"
}
}
}LM Studio
LM Studio 0.3.17 and later can use MCP servers. Open the Program tab in the right-hand sidebar, choose Install → Edit mcp.json, and add:
{
"mcpServers": {
"maqami-travel": {
"url": "https://mcp.maqami.co/"
}
}
}Or install it by opening this link in your browser:
lmstudio://add_mcp?name=maqami-travel&config=eyJ1cmwiOiJodHRwczovL21jcC5tYXFhbWkuY28vIn0%3DLocal models have smaller context windows, so consider turning off the tools you don't need (see the FAQ).
Windsurf
Open mcp_config.json from the … menu in the Cascade panel (Open MCP config file) and add:
{
"mcpServers": {
"maqami-travel": {
"serverUrl": "https://mcp.maqami.co/"
}
}
}On current releases the file is at ~/.config/devin/mcp_config.json (macOS and Linux) or %APPDATA%\devin\mcp_config.json (Windows). Older releases use ~/.codeium/windsurf/mcp_config.json.
ChatGPT
Developer mode apps are available on the web for Plus, Pro, Business, Enterprise and Education accounts. On the Free plan, ChatGPT shows only apps published in its app directory.
Open Settings → Security and login and turn on Developer mode.
Open Plugins, select the + button and create a developer-mode app.
Enter the name
MAQAMI Traveland the URLhttps://mcp.maqami.co/, and choose No Authentication.In a conversation, choose Developer mode from the + menu and select MAQAMI Travel.
OpenAI Codex
codex mcp add maqami-travel --url https://mcp.maqami.co/Or add to ~/.codex/config.toml:
[mcp_servers.maqami-travel]
url = "https://mcp.maqami.co/"Gemini CLI
Install the extension, which adds the server and its context file:
gemini extensions install https://github.com/negm17111995/mcp-serverOr add only the server:
gemini mcp add --transport http maqami-travel https://mcp.maqami.co/Or add to ~/.gemini/settings.json:
{
"mcpServers": {
"maqami-travel": {
"httpUrl": "https://mcp.maqami.co/"
}
}
}OpenAI Agents SDK (Python)
import asyncio
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp
async def main() -> None:
async with MCPServerStreamableHttp(
name="MAQAMI Travel",
params={"url": "https://mcp.maqami.co/"},
) as maqami:
agent = Agent(name="Travel assistant", mcp_servers=[maqami])
result = await Runner.run(agent, "Find 4-star hotels in Lisbon for 2 adults, 12 to 15 May.")
print(result.final_output)
asyncio.run(main())LangChain (Python)
LangChain 1.x includes MCP support in langchain.mcp (beta). Install with pip install langchain langchain-openai:
import asyncio
from langchain.agents import create_agent
from langchain.mcp import MCPAdapter
async def main() -> None:
async with MCPAdapter("https://mcp.maqami.co/") as maqami:
tools = await maqami.list_tools()
agent = create_agent("openai:gpt-5.4-mini", tools)
result = await agent.ainvoke(
{"messages": [{"role": "user", "content": "Which airports serve Tokyo?"}]}
)
print(result["messages"][-1].content)
asyncio.run(main())For a version that asks for your approval before any prebook, see travel-agent-examples/langchain-python.
n8n
Add an AI Agent node to your workflow.
Under Tools, add an MCP Client Tool node.
Set the endpoint to
https://mcp.maqami.co/, choose HTTP Streamable as the server transport (if your n8n version shows the option) and None for authentication.Under Tools to Include, pick the tools your workflow needs, or keep All.
Other Streamable HTTP clients
Setting | Value |
URL |
|
Transport | Streamable HTTP |
Auth | None |
Local stdio (npm)
For clients that only support stdio servers, the maqami-travel npm package is a thin bridge to the remote endpoint. It runs no booking logic locally and needs no credentials. Node.js 18 or later is required.
{
"mcpServers": {
"maqami-travel": {
"command": "npx",
"args": ["-y", "maqami-travel"]
}
}
}This works in claude_desktop_config.json and any other client that launches stdio servers.
How agents use the server
The server is a standard MCP server. Every tool has a JSON Schema for its inputs and MCP annotations, so clients can tell read-only tools (readOnlyHint: true) from tools that change something.
Customers always book and pay on MAQAMI's website, book.maqami.co. The server finds the hotel or flight, holds the price and returns a checkoutUrl for that exact choice; the customer enters guest or passenger details, pays and gets their confirmation there. No tool takes payment or asks for payment details.
Hotel booking flow
Step | What happens | Tool (example) |
1. Search rates | Live rates for the dates and guests. Needs |
|
2. Show details | Description, amenities, photos and reviews for the hotels the user is interested in |
|
3. Confirm | Show the user the hotel, room, dates, guests, price and cancellation terms, and wait for a clear yes | (your agent) |
4. Prebook | Holds one |
|
5. Checkout | Give the customer the | (your agent) |
Flight booking flow
Step | What happens | Tool (example) |
1. Find airports | Resolve cities to IATA airport codes |
|
2. Search flights | Live offers. Needs |
|
3. Verify | Confirms an |
|
4. Confirm | Show the user the flights, passengers, final price and fare rules, and wait for a clear yes | (your agent) |
5. Checkout | Give the customer the | (your agent) |
Existing bookings
Lookup, amend and cancel tools need the booking ID and the email used to book; the server only returns or changes a booking when both match. Pass both bookingId and email to every booking tool. To find a customer's hotel bookings, call listBookings with the email and last name used to book; it returns only bookings where both match the booking holder. Hotel bookings are cancelled with cancel_hotel_booking, flights with post_flights_bookings_bookingid_cancellations (check get_flights_bookings_bookingid_cancellations for the refund estimate first). put_bookings_bookingid_amend corrects the holder's name, email or phone on a hotel booking: it takes the email currently on the booking and the corrected holder (firstName, lastName, email, optional phone).
Tool names and required fields above are as published by the server in October 2026. The tool list your client receives from the server is always the source of truth: only the tools it lists exist, and other tool names are rejected. Hotel offerIds are signed by the server: pass them exactly as returned, and run the search again if one is rejected.
Good practice for agents
Ask for missing inputs instead of guessing: dates, number of guests, the guest's nationality and the currency for hotels; dates, passengers and currency for flights.
Quote only what the tools return. Show the price with its currency and the cancellation or fare rules when they are available.
Confirm before anything that is not read-only. Prebook holds a real rate, and the amend and cancel tools change or cancel real bookings. Ask the user first and show exactly what will happen.
Send only links the tools return. Give the customer the
checkoutUrlfrom prebook or verify, and never ask for card or passport details in the chat.If a price or availability changes at prebook or verify, show the new result and ask again.
Keep guest details to what the booking needs, and only send them once the user has chosen an option.
Keep responses small. Set
limitandmaxRatesPerHotelon hotel searches andfilterson flight searches.get_data_facilities,get_data_chains,get_data_iatacodesandget_data_citiesreturn whole reference lists, so call them only when you need an ID from them; find airports withget_data_flights_airportsinstead.
The examples show one way to do this: read-only tools run automatically and every other tool waits for the user's approval.
FAQ
Do I need an API key or an account to connect? No. The endpoint accepts connections without authentication.
How does the customer pay?
Only on MAQAMI's website. Prebook (hotels) or verify (flights) returns a checkoutUrl on book.maqami.co for that exact room or fare. The customer opens it, enters guest or passenger details, pays securely and receives the confirmation there. The MCP server never takes payment.
Does the checkout link create a real reservation? Yes, once the customer completes checkout on book.maqami.co. Review the details and final price before paying.
Which transport does the server use?
Streamable HTTP at https://mcp.maqami.co/. If your client only supports stdio, use the maqami-travel npm bridge.
My client warns that there are too many tools. What should I do? Turn on only the tools you need. Most clients let you do this: the tool picker in VS Code, per-tool toggles in Cursor and Claude, and Tools to Include in n8n. For a travel assistant, the search, details, prebook and verify tools in the tables above are a good start.
What does the server see? An MCP server receives only the tool calls and arguments your client sends. It does not see the rest of your conversation.
Where is the server listed?
In the official MCP Registry as io.github.negm17111995/maqami-travel, and on npm as maqami-travel. It is also a Claude Desktop extension (maqami-travel.mcpb). This repository is also a Gemini CLI extension (gemini-extension.json), a Claude Code plugin and marketplace (.claude-plugin/), a Codex plugin (.codex-plugin/plugin.json) and an Agent Plugins package (plugin.json and mcp.json). The plugins bundle the maqami-travel-booking skill. Directories: Smithery, Glama, Raycast's MCP registry, the ToolSDK MCP registry and the Hermes Agent plugin catalog.
Can I use it in my own agent or product? Yes, it's a public endpoint. Please follow the confirmation guidance above. For partnerships, contact info@maqami.co.
How do I report a bug or a security issue? Open an issue for bugs and client setup problems. For security issues, follow SECURITY.md and don't open a public issue.
Examples
negm17111995/travel-agent-examples has small, runnable travel assistants that connect to this server from the OpenAI Agents SDK (Python), LangChain with LangGraph (Python) and the Vercel AI SDK (TypeScript). Each one asks for your approval before any call that is not read-only.
What you can do
Search hotels with live rates and availability.
Search flights and compare fares.
Look up cities, airports and hotel details, including amenities and photos.
Hold a price for a hotel room (prebook) or check a flight fare (verify).
Send a checkout link on book.maqami.co where the customer enters their details, pays and gets confirmed.
Find, look up and cancel existing bookings: find them with the email and last name, then act on one with its booking ID and email.
Example prompts
"Find 5-star hotels in Istanbul for 15 to 17 August, 2 adults."
"Show me the amenities and photos for the second hotel."
"Search flights from Dubai to London on 10 December for one adult."
"Which airports serve Tokyo?"
"Hold that room and send me the checkout link."
Privacy and security
No API key or account is required to connect.
All traffic to
https://mcp.maqami.co/is encrypted over HTTPS.Searches and bookings are processed by MAQAMI. Payment happens only on book.maqami.co; the MCP server never receives card details.
Completing checkout creates a real reservation. Review the details and final price before paying.
Privacy policy: maqami.co/privacy-policy
Development
The repository contains the npm stdio bridge (index.js). The hosted server is deployed separately.
npm install
npm testThe bridge tests start a local mock Streamable HTTP server and point the bridge at it with the MAQAMI_MCP_URL environment variable. That variable exists for testing only; by default the bridge connects to https://mcp.maqami.co/. The manifest tests check that every manifest parses, points at the same endpoint and carries the version from package.json.
Repository layout
File | Purpose |
| npm stdio bridge to the hosted endpoint |
| Official MCP Registry entry |
| Gemini CLI extension and its context file |
| Claude Code plugin |
| Claude Code plugin marketplace ( |
| Codex plugin and its icon |
| Agent Plugins manifest |
| Claude Desktop extension ( |
| Booking skill bundled with the plugins |
| Glama directory metadata |
| Short guides for coding agents and LLM tools |
| Bridge tests against a local mock server, and manifest consistency checks ( |
| CI ( |
Contributing
Documentation fixes, client setup guides and bug reports are welcome. See CONTRIBUTING.md and the Code of Conduct. Questions and ideas go to Discussions.
License
Support
Questions or issues: info@maqami.co or open an issue.
Available Tools
41 toolscancelExperienceBookingCancel tour bookingADestructiveInspect
Cancel a confirmed tour or activity booking. First show the customer the refund from getExperienceBookingCancelPreview and wait for a clear yes.
Requires the bookingId and the email used to book: the server only returns or changes a booking when they match.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address used to make the booking. The server checks it against the booking before returning or changing anything. | ||
| lastName | No | The booking holder's last name, if the customer gives it. Optional. | |
| bookingId | Yes | MAQAMI experience booking ID from the booking confirmation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true. The description adds useful behavioral context beyond that: the server only acts when bookingId and email match the booking, which is a verification/authorization trait not visible in structured fields. It stops short of describing refund timing, reversibility, or failure modes.
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 paragraphs, the action and the mandatory pre-step front-loaded, with zero filler. Every sentence carries either the operation or a constraint.
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 destructive mutation with no output schema, the description covers the precondition, the credential-matching rule, and the sibling to consult first. It leaves the post-cancellation result (confirmation, refund mechanism) to be inferred, which is a minor 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?
Schema description coverage is 100%, so both required parameters and the optional lastName are already documented in the schema. The description restates the email-matching rule but adds no syntax, format, or ID-source detail beyond what the schema provides. Baseline 3 is correct here.
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 ('Cancel a confirmed tour or activity booking') and names the exact sibling it must not be confused with implicitly via the tour/activity scope, versus cancel_hotel_booking. An agent can route correctly 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?
Gives an explicit precondition and sequencing rule: first show the refund from getExperienceBookingCancelPreview and wait for a clear yes. It also states the matching requirement for bookingId and email, so the agent knows both when to use this tool and what must be true before calling it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_hotel_bookingCancel hotel bookingADestructiveIdempotentInspect
Cancel a confirmed hotel booking. First check the cancellation policy with get_bookings_bookingid and confirm with the customer: a non-refundable booking, or one past its free-cancellation deadline, can be charged in full.
Requires the bookingId and the email used to book: the server only returns or changes a booking when they match.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address used to make the booking. The server checks it against the booking before returning or changing anything. | ||
| lastName | No | The booking holder's last name, if the customer gives it. Optional. | |
| bookingId | Yes | The unique booking identifier to cancel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds real value beyond them: it discloses the financial consequence (a non-refundable booking or one past its free-cancellation deadline can be charged in full) and the auth rule (server only acts when bookingId and email match). It stops short of describing the post-cancellation response/confirmation state, which keeps it from a 5.
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 wasted words, with the prep step and consequence front-loaded before the credential requirement. The second sentence mildly repeats the schema's auth rule, which is the only redundancy.
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 destructive mutation with no output schema, the description covers the prerequisite lookup, the customer-confirmation requirement, the penalty risk, and the credential matching rule. The main omission is any statement of what a successful cancellation returns or how failures surface, but that is minor given the richness elsewhere.
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 the schema already documents bookingId, email, and the optional lastName including the matching check. The description restates the bookingId/email requirement but adds no new syntax, format, or fallback guidance, so 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+resource ('Cancel a confirmed hotel booking') and implicitly distinguishes itself from the sibling cancelExperienceBooking, which cancels a different resource type. An agent can select this over the other cancel tool 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?
Gives an explicit prerequisite workflow ('First check the cancellation policy with `get_bookings_bookingid` and confirm with the customer') and names the sibling tool to use beforehand. It also states the condition under which cancellation carries a penalty, which is the key decision context for invoking this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bookings_bookingidGet hotel bookingARead-onlyIdempotentInspect
Look up a confirmed hotel booking: status, hotel, dates, rooms, guests, price and cancellation policy.
Requires the bookingId and the email used to book: the server only returns or changes a booking when they match.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address used to make the booking. The server checks it against the booking before returning or changing anything. | ||
| lastName | No | The booking holder's last name, if the customer gives it. Optional. | |
| bookingId | Yes | The unique booking identifier (e.g. '2rSJvdDru') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered structurally; the description adds the non-obvious authorization behavior — the server only returns or changes a booking when bookingId and email match. It does not mention rate limits or error behavior when the pair does not match, so it falls short of a 5.
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 tight sentences with the resource and payload front-loaded ahead of the access condition. The second sentence slightly restates the email-verification note already present in the schema, which is a minor redundancy.
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 compensates by enumerating the returned fields (status, hotel, dates, rooms, guests, price, cancellation policy) and states the credential requirement. An agent has everything needed to call it 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 the schema already explains bookingId, email and the optional lastName; the description only restates the two required parameters. It adds no format, matching or fallback detail beyond what the schema carries, so the baseline of 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+resource ('Look up a confirmed hotel booking') and enumerates the payload (status, hotel, dates, rooms, guests, price, cancellation policy), which cleanly separates it from get_flights_bookings_bookingid and getExperienceBooking. An agent can pick it out of a large sibling list 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?
The description states the precondition for use (the booking must exist as a confirmed booking and both bookingId and email must match) but never names an alternative tool or when to prefer a sibling such as cancel_hotel_booking or put_bookings_bookingid_amend. Context is clear, exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_chainsList hotel chainsARead-onlyIdempotentInspect
Overview
Get all available hotel chains (e.g., Marriott, Hilton, IHG). Use chain IDs to filter hotel searches by brand.
When to Use
Chain filters - Filter hotels by chain/brand
Brand selection - Let users search for specific hotel chains
Reference data - Get chain IDs for use in search filters
What You Get
Chain list - All available hotel chains
Chain IDs - Numeric IDs for use in search filters
Chain names - Hotel chain/brand names
Quick Start
No parameters required. Returns all hotel chains with IDs. Use chain IDs in hotel search filters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds value beyond that by stating 'No parameters required' and enumerating the returned fields (chain list, numeric IDs, names), which matters since there is no output schema.
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-loaded with the answer in the Overview, and the four header sections are easy to scan. It slightly over-structures a trivial 0-param lookup and repeats the 'use chain IDs in search filters' point in both Overview and Quick Start, which is mild redundancy rather than waste.
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 zero-parameter reference-data tool with no output schema, the description covers what it returns, that it needs no input, and how the result is consumed. Nothing an agent needs to call it correctly is 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?
The tool takes zero parameters, which is the baseline-4 case. The description reinforces this ('No parameters required. Returns all hotel chains with IDs'), leaving no ambiguity about invocation.
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 Overview states a specific verb and resource ('Get all available hotel chains'), gives concrete examples (Marriott, Hilton, IHG), and names the downstream purpose ('Use chain IDs to filter hotel searches by brand'). This clearly separates it from sibling reference-data tools like get_data_cities, get_data_hoteltypes, and get_data_hotels.
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 'When to Use' section gives three concrete scenarios (chain filters, brand selection, reference data), which is good context. However, it doesn't contrast with the nearest siblings such as get_data_hoteltypes or explain when you'd want chains versus other hotel reference data, so it stops short of explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_citiesList citiesARead-onlyIdempotentInspect
Overview
Get a list of all cities within a specific country. Perfect for building location dropdowns and city selection interfaces.
When to Use
City dropdowns - Populate city selection lists
Location filters - Filter hotels by city
Geographic data - Get city lists for specific countries
Form autocomplete - Build city autocomplete features
What You Get
City list - All cities in the specified country
City names - Formatted city names ready for display
Quick Start
Provide the countryCode in ISO-2 format (e.g., "US", "GB"). Returns all cities in that country. Use the Get Country List endpoint to get country codes.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | request timeout in seconds | |
| countryCode | Yes | Country code in iso-2 format (example: SG) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds that the call returns the complete, unpaginated city list and requires an ISO-2 code, but says nothing about error behavior for invalid codes or response size limits.
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 four-section markdown document with redundant bullets ('city dropdowns', 'location filters', 'autocomplete' all describe the same one-line lookup) is disproportionate for a single-parameter read tool. The front-loaded overview is good, but most of the structure is boilerplate rather than information.
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 trivial lookup with 100% schema coverage, present annotations and no output schema, the description supplies what an agent needs: the input format, the prerequisite endpoint, and the shape of the result. Only failure-mode and volume details are 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 coverage is 100%, so both parameters (countryCode, timeout) are already documented with the ISO-2 format and an example. The description restates the same format requirement without adding syntax or edge-case detail, so the baseline of 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 and resource ('Get a list of all cities within a specific country') and bounds the scope to a single country, which distinguishes it from siblings such as get_data_countries and get_data_hotels. An agent can identify the operation 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?
The 'When to Use' section gives concrete contexts (dropdowns, location filters, autocomplete) and the Quick Start supplies the prerequisite chain: obtain the ISO-2 code from the country-list endpoint first. It lacks explicit when-not guidance, but the intended usage is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_countriesList countriesARead-onlyIdempotentInspect
Overview
Get a complete list of all countries available in the system with their ISO-2 country codes. Essential for building country selection interfaces.
When to Use
Country dropdowns - Populate country selection lists
Location filters - Filter hotels or searches by country
Form inputs - Build country selection forms
Reference data - Get country codes for use in other endpoints
What You Get
Country list - All available countries
ISO-2 codes - Standard country codes (e.g., "US", "GB", "FR")
Country names - Full country names
Quick Start
No parameters required. Returns all countries with their ISO-2 codes.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | request timeout in seconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered without the description's help. The description adds that no parameters are required and enumerates the returned fields, but says nothing about caching, rate limits, pagination, or ordering of the list.
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 parameter-free reference lookup is expanded into six markdown sections with redundant bullets and marketing filler ('Essential for building country selection interfaces', 'Populate country selection lists'). The 'What You Get' and 'Quick Start' sections largely repeat the Overview.
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 trivial, output-schema-less list endpoint, the description does supply the return content (country names and ISO-2 codes) that an agent would otherwise lack. It is more than sufficient to call the tool correctly, though the return format specifics remain implicit.
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 the single 'timeout' parameter is already fully documented by the schema; the description correctly notes 'No parameters required' but adds no information beyond that. Baseline 3 per the rubric.
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 ('complete list of all countries') and the payload detail that distinguishes it ('with their ISO-2 country codes'). An agent can tell this apart from get_data_cities, get_data_languages, and get_data_currencies purely from the description.
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 'When to Use' section gives four concrete scenarios (dropdowns, location filters, form inputs, reference data for other endpoints). It gives clear context for calling it but never names an alternative tool or says when NOT to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_currenciesList currenciesARead-onlyIdempotentInspect
Overview
Get all available currencies with their codes, names, and the countries where each currency is used. Perfect for building currency selection interfaces.
When to Use
Currency dropdowns - Populate currency selection lists
Price display - Show prices in different currencies
Currency conversion - Get currency information for conversion
Reference data - Get currency codes for use in booking endpoints
What You Get
Currency list - All available currencies
Currency codes - ISO currency codes (e.g., "USD", "EUR", "GBP")
Currency names - Full currency names
Country mapping - Countries where each currency is used
Quick Start
No parameters required. Returns all currencies with codes, names, and country mappings.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | request timeout in seconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds useful context on the return content and explicitly notes no parameters are required to retrieve the full set, which helps the agent understand the call is a full-dump read.
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?
Markdown headings front-load the purpose well, but the content is repetitive: the opening paragraph, 'What You Get', and 'Quick Start' restate the same currency codes/names/country mapping three times. For a simple zero-input list tool this is oversized.
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 read-only reference-data endpoint with no output schema, the description adequately covers what is returned. The only gap is that it never hints at result size or pagination, which matters for an open-world 'return all' call.
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 one parameter (timeout) with 100% schema description coverage, so the schema already does the work. The description's 'No parameters required' is accurate since timeout is optional infrastructure, but it adds no syntax or semantic detail beyond the schema.
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 verb and resource ('Get all available currencies'), and states the exact payload (codes, names, country mappings). It is clearly distinguishable from siblings like get_data_countries or get_data_cities that deal with other reference data.
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 'When to Use' section gives concrete contexts (dropdowns, price display, conversion, booking endpoints), which is more than implied usage. It stops short of naming alternatives or when-not-to-use conditions, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_facilitiesList hotel facilitiesARead-onlyIdempotentInspect
Overview
Get all available hotel facilities (amenities) with multi-language translations. Use these facility IDs to filter hotel searches by amenities.
When to Use
Facility filters - Build amenity filtering in hotel searches
Facility display - Show available facilities with translated names
Multi-language support - Display facilities in user's language
Reference data - Get facility IDs for use in search filters
What You Get
Facility list - All available hotel facilities
Facility IDs - Numeric IDs for use in search filters
Multi-language names - Facility names in multiple languages
Translations - Localized facility names
Quick Start
No parameters required. Returns all facilities with IDs and multi-language translations. Use facility IDs in hotel search filters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered and the bar is lower. The description usefully adds that no parameters are required and that the full facility set (not a filtered subset) is returned, though it says nothing about pagination, caching, or data freshness.
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 markdown structure is front-loaded and readable, but there is real redundancy: 'Multi-language names' and 'Translations' are the same bullet twice, and the Overview and Quick Start both restate that facility IDs are used in hotel search filters. Roughly a third of the text repeats itself.
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 zero-parameter reference-data endpoint with complete annotations and no output schema, the description tells the agent everything needed: it needs no arguments, returns the whole facility list with IDs and localized names, and the IDs plug into hotel search filters. No material gap remains.
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. The description confirms 'No parameters required,' which is consistent with the empty schema and closes the loop for the agent rather than leaving it to inspect the schema.
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 states a specific verb and resource ('Get all available hotel facilities (amenities) with multi-language translations') and frames the output's purpose (facility IDs for search filters). This clearly distinguishes it from siblings like get_data_hoteltypes or get_data_languages, which cover different reference data.
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 'When to Use' section gives four concrete scenarios (facility filters, facility display, multi-language support, reference data), which is strong context. However, it never names an alternative tool or a when-not condition, so the agent must infer the boundary with sibling reference-data endpoints on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_flights_airlinesList airlinesARead-onlyIdempotentInspect
Overview
Retrieve a list of airlines with optional filtering by name, alliance, and active status.
When to Use
Airline directory - Build a searchable list of airlines for display or filtering
Alliance filtering - Filter airlines by alliance membership (Star Alliance, oneworld, SkyTeam)
Active airlines - Retrieve only currently operating airlines
What You Get
Full airline records including name, IATA/ICAO codes, country, alliance, and logo URL
Alliance membership for each airline
Active status to identify currently operating carriers
Filtered results based on query, alliance, and active status parameters
Quick Start
Call with no parameters to get all airlines. Use q to search by name, alliance to filter by alliance, and activeOnly=true to exclude inactive carriers.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Search query (e.g., 'AA' or 'American') | |
| limit | No | Maximum number of results | |
| alliance | No | Filter by airline alliance | |
| activeOnly | No | Only return currently active airlines |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds value beyond that by disclosing the default behavior ('call with no parameters to get all airlines') and enumerating the returned fields (name, IATA/ICAO codes, country, alliance, logo URL), which helps the agent predict results.
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?
It is front-loaded with an Overview and scannable headers, which aids selection. But the 'What You Get' bullets are padded and repetitive ('Full airline records including...', then 'Alliance membership for each airline', then 'Active status...'), restating content already implied by the parameter list and title.
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?
There is no output schema, so the description must carry the return-value burden, and 'What You Get' does describe the fields returned. Combined with full schema parameter coverage, an agent has enough to call the tool correctly; only sibling disambiguation is 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 100%, so all four parameters are already documented, making 3 the baseline. The description reinforces the parameters with the Quick Start ('q' searches by name, 'activeOnly=true' excludes inactive) and expands the alliance names, but omits 'vanilla_alliance' and adds no syntax or format detail the schema lacks.
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 Overview states a specific verb and resource: 'Retrieve a list of airlines with optional filtering by name, alliance, and active status.' An agent immediately knows the operation. However, it does not distinguish itself from closely named siblings like get_data_flights_airlines_iatas or get_data_flights_airlines_iatas_iatacode, which is the exact ambiguity an agent faces here.
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 'When to Use' section gives three concrete scenarios (directory building, alliance filtering, active-only retrieval), which is clear context for invoking it. It stops short of a 5 because it names no alternatives or exclusions, even though siblings like the IATA-list tools exist and could be confused with this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_flights_airlines_iatasList airline IATA codesARead-onlyIdempotentInspect
Overview
Retrieve a lightweight list of airline IATA codes with names for autocomplete and lookup purposes.
When to Use
Autocomplete dropdowns - Populate airline search inputs with a minimal list
Client-side filtering - Download the full list once and filter locally
Code validation - Build a lookup table of valid airline codes
What You Get
IATA codes for all airlines in the database
Airline names paired with each code
Active filtering available via the
activeOnlyparameter
Quick Start
Call with no parameters to get all airline IATA codes and names. Use activeOnly=true to filter out inactive airlines.
| Name | Required | Description | Default |
|---|---|---|---|
| activeOnly | No | Only return currently active airlines |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety is covered. The description adds genuine value beyond that by describing the return payload (IATA codes paired with names) even though no output schema exists, plus the activeOnly filter behavior. No pagination or result-size caveats, though.
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-loaded with an Overview, which is good, but for a one-parameter lookup tool the four markdown sections are heavy and the 'Quick Start' paragraph largely restates what Overview and When to Use already said. Adequate but not tight.
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 trivial one-optional-parameter read tool with annotations and no output schema, the description covers when to use it, what comes back, and how the filter behaves. The only omission is any hint of list size or ordering limits, which is minor.
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% and the single activeOnly parameter is already documented, so baseline is 3. The description adds useful context by framing it as 'Active filtering available' with the effect of filtering out inactive airlines, slightly above baseline.
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+resource: 'Retrieve a lightweight list of airline IATA codes with names.' The word 'lightweight' implicitly separates it from the fuller sibling get_data_flights_airlines, but it never names the alternatives (get_data_flights_airlines, get_data_flights_airlines_iatas_iatacode), so the agent must infer the distinction.
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 'When to Use' section gives three concrete scenarios (autocomplete, client-side filtering, code validation), which is clear positive guidance. It stops short of stating when NOT to use it or which sibling to pick for a single-code lookup, so it does not reach a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_flights_airlines_iatas_iatacodeGet airline by IATA codeARead-onlyIdempotentInspect
Overview
Retrieve full details for a specific airline using its 2-letter IATA code.
When to Use
Airline display - Show airline name, logo, and alliance for a given IATA code
Flight result enrichment - Fetch airline details to display alongside search results
Data validation - Verify an airline code and retrieve its metadata
What You Get
Airline details including name, IATA/ICAO codes, and country
Alliance membership (Star Alliance, oneworld, SkyTeam, or Vanilla Alliance)
Logo URL for displaying the airline's logo in your UI
Active status indicating whether the airline is currently operating
Quick Start
Provide the 2-letter IATA code (e.g., AA for American Airlines) in the URL path.
| Name | Required | Description | Default |
|---|---|---|---|
| iataCode | Yes | 2-letter IATA airline code (e.g., AA) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is covered externally. The description adds real value beyond that by enumerating what is returned (name, codes, country, alliance, logo URL, active status), which matters because no output schema exists. It does not mention error behavior for invalid or unknown 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?
Content is front-loaded and each section is coherent, but four markdown headings are disproportionate for a single-parameter read lookup. Some phrasing ('Fetch airline details to display alongside search results') restates the same idea already given in the overview.
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 one-parameter read tool with no output schema, the description covers the gap well by describing return fields, the alliance enum, active status, and a usage example. An agent has everything needed to call it correctly and interpret the response.
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 100% and the single parameter is already documented as '2-letter IATA airline code (e.g., AA)'. The description's Quick Start repeats that same example without adding format constraints or edge-case behavior, so the schema does the heavy lifting. 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 (Retrieve), resource (full details for a specific airline), and lookup key (2-letter IATA code). This clearly distinguishes it from sibling list tools like get_data_flights_airlines and get_data_flights_airlines_iatas, which return collections rather than a single record.
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 'When to Use' section gives three concrete scenarios (display, enrichment, validation), which is strong context. However, it never names the alternative list tools or states when NOT to use this (e.g., 'to list all airlines, use get_data_flights_airlines'), so routing between siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_flights_airportsList airportsARead-onlyIdempotentInspect
Overview
Search for airports by name, city, or IATA code using a text query. Returns matching airports for use in autocomplete and search inputs.
When to Use
Airport autocomplete - Power origin/destination search inputs with type-ahead suggestions
Airport discovery - Find airports in a city or region by name
Search validation - Look up airports before constructing a flight search request
What You Get
Matching airports ranked by relevance to the query
IATA codes for
legs[].originandlegs[].destinationinpost_flights_ratesCity and country details for display purposes
Geographic coordinates for map-based interfaces
Quick Start
Provide a q query string (minimum 2 characters) to search by airport name, city, or code. Returns matching airports ordered by relevance.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Search query (minimum 2 characters, e.g., 'JFK' or 'New York') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds the 2-character minimum and relevance-ranked result ordering, which is genuinely useful context, but says nothing about error behavior, rate limits, or empty-result handling.
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-loaded and well organized, but heavily over-structured for a one-parameter search tool: four markdown sections repeat the same two facts (query by name/city/code, minimum 2 characters) across Overview, What You Get, and Quick Start.
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 'What You Get' section compensates by enumerating returned fields (matching airports, IATA codes, city/country, coordinates) and their downstream use. Combined with full annotation coverage, an agent has everything needed to call this tool 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% for the single parameter, so the schema already documents the minimum length and example values. The description's 'q query string (minimum 2 characters)' largely restates the schema rather than extending it with matching syntax or relevance-tuning hints.
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 Overview states a specific verb and resource: 'Search for airports by name, city, or IATA code using a text query.' This is clear and unambiguous. It does not, however, distinguish itself from look-alike siblings such as get_data_flights_airports_iatas or get_data_iatacodes, which an agent could easily confuse it with.
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 'When to Use' section gives three concrete scenarios (autocomplete, discovery, search validation) and ties the output to a downstream tool (post_flights_rates). It never states when NOT to use it or names an alternative sibling for full-list needs, so it falls short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_flights_airports_iatasList airport IATA codesARead-onlyIdempotentInspect
Overview
Retrieve a lightweight list of airport IATA codes with names for autocomplete and lookup purposes.
When to Use
Autocomplete dropdowns - Populate airport search inputs with a full list of codes and names
Client-side filtering - Download the full list once and filter locally
Code validation - Build a lookup table of valid airport codes
What You Get
IATA codes for all airports in the database
Airport names paired with each code
Filtered results when the
qquery parameter is provided
Quick Start
Call with no parameters to get all airport codes and names. Use the q parameter to filter by name or code.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Search query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds behavior annotations don't: it is a bulk 'lightweight' list intended for download-once-and-filter-locally usage, and it enumerates the returned fields in the absence of an output schema.
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?
Headers make it scannable and the purpose is front-loaded, but for a single-optional-filter tool the content is padded and self-repeating: the 'Quick Start' paragraph restates what 'When to Use' and 'What You Get' already said about calling with and without q.
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 correctly compensates by listing returned fields (IATA codes, names), which is the right move. It is undermined by the required-vs-optional contradiction for q and by no mention of result size or pagination behavior for a bulk 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?
Schema coverage is 100% but that coverage is only the string 'Search query', so the description meaningfully clarifies that q filters by name or by code. However, it also claims 'Call with no parameters to get all airport codes and names' while the schema marks q as required, which is an unresolved conflict in parameter semantics rather than added clarity.
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 states a specific verb and resource: retrieve a lightweight list of airport IATA codes with names. It differentiates the payload (codes + names, optional filtering) from the broader get_data_flights_airports sibling, though it never explicitly contrasts with get_data_iatacodes or get_data_flights_airlines_iatas.
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 'When to Use' section gives three concrete scenarios (autocomplete, client-side filtering, code validation), which is clear context an agent can match against. It stops short of naming the alternative siblings (e.g., the per-code lookup tool) or stating when not to use this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_flights_airports_iatas_iatacodeGet airport by IATA codeARead-onlyIdempotentInspect
Overview
Retrieve detailed information for a specific airport using its 3-letter IATA code.
When to Use
Airport display - Show airport name, city, and country for a given IATA code
Flight result enrichment - Fetch airport details to display alongside origin/destination in search results
Autocomplete validation - Verify an airport code and retrieve its full details
What You Get
Airport details including name, city, country, and timezone
IATA and ICAO codes for the airport
Geographic coordinates (latitude and longitude)
Country and city information for display purposes
Quick Start
Provide the 3-letter IATA code (e.g., JFK for John F. Kennedy International) in the URL path.
| Name | Required | Description | Default |
|---|---|---|---|
| iataCode | Yes | 3-letter IATA airport code (e.g., JFK) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds useful behavioral context via 'What You Get' — enumerating returned fields (name, city, country, timezone, IATA/ICAO, coordinates) since no output schema exists. It does not describe error behavior for an invalid or unknown code, keeping it below 5.
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?
Markdown sections are front-loaded with the purpose first, and the heading structure makes scanning easy. There is mild redundancy between 'When to Use' and 'What You Get' plus a somewhat ceremonial 'Quick Start' for a one-parameter tool, but nothing seriously wasteful.
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 single-parameter read endpoint with no output schema, the description supplies the return-field inventory and usage contexts an agent needs to select and call it correctly. Nothing material is 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 coverage is 100% and there is a single required parameter already documented as '3-letter IATA airport code (e.g., JFK)'. The description repeats the same example and format with no additional syntax, casing, or validation detail, so 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 and resource: retrieve detailed information for a specific airport by 3-letter IATA code. The singular-lookup framing distinguishes it from siblings like get_data_flights_airports and get_data_flights_airports_iatas, which are list-style endpoints.
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 'When to Use' section gives three concrete scenarios (airport display, flight result enrichment, autocomplete validation) that tell an agent when this is the right call. It does not explicitly name the alternative tool to use for a full airport list, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_hotelGet hotel detailsCRead-onlyIdempotentInspect
Overview
Get comprehensive details about a specific hotel including descriptions, amenities, images, location, and ratings. Perfect for displaying hotel detail pages.
When to Use
Hotel detail pages - Show complete hotel information
Booking pages - Display hotel details before booking
Hotel profiles - Build rich hotel information pages
Content display - Show descriptions, amenities, and images
What You Get
Complete hotel information - Name, address, description, and ratings
Amenities list - All available facilities and services
Image gallery - Hotel photos and images
Location details - Address, coordinates, and location information
Hotel metadata - Star rating, chain information, and classifications
Quick Start
Provide the hotelId as a query parameter. Returns complete hotel details including all metadata, amenities, and images.
| Name | Required | Description | Default |
|---|---|---|---|
| hotelId | Yes | Unique ID of a hotel | |
| timeout | No | request timeout in seconds | |
| language | No | The language code, indicating in which language the results should be returned. e.g. 'fr' | |
| advancedAccessibilityOnly | No | If `true`, accessibility section will be returned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds useful return-shape context (what fields come back) but says nothing about rate limits, error conditions, or behavior when hotelId is invalid/unknown. With annotations carrying the safety load, this is adequate but not rich.
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?
It is heavily padded with Markdown headers and bullet lists that restate the same idea four times ('What You Get' re-lists what the Overview already named; the four 'When to Use' bullets are near-duplicates). Front-loading is fine, but a large share of the text does not earn its place.
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?
There is no output schema, and the description does a reasonable job enumerating the returned fields, which is the main thing an agent needs here. Still missing is any differentiation from the crowded hotel-sibling set, which is the key context gap for this 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?
Schema description coverage is 100%, so the schema already documents hotelId, timeout, language, and advancedAccessibilityOnly. The description only reaffirms that hotelId is required and passed as a query parameter; it adds no format, default, or interaction detail (e.g., what advancedAccessibilityOnly changes) beyond the schema, so the baseline of 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 overview states a specific verb+resource: fetch comprehensive details for a specific hotel (description, amenities, images, location, ratings). That is clear enough to act on. However, it never distinguishes itself from the many hotel siblings (get_data_hotels, get_data_hotel_search, get_data_hotel_ask, get_data_hotels_room_search), so an agent cannot tell which one to pick for detail retrieval.
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 'When to Use' list gives four bullets that all say the same thing – display hotel detail/booking/content pages – with no conditions that select this tool over its search/list siblings. There are no exclusions, prerequisites, or named alternatives, so it provides no routing help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_hotel_askAsk about a hotelARead-onlyIdempotentInspect
Overview
Beta Feature - Ask natural language questions about a specific hotel and get AI-powered answers based on the hotel's information.
When to Use
Hotel Q&A - Answer customer questions about hotels
Information lookup - Get specific details about amenities, services, or features
Conversational interfaces - Build chat interfaces for hotel information
Detailed inquiries - Ask about specific aspects like restaurants, parking, or amenities
What You Get
AI-generated answers - Relevant responses to your questions
Hotel-specific information - Answers based on the hotel's actual data
Natural language responses - Human-readable answers
Example Questions
"What amenities does this hotel have?"
"Is there parking available?"
"What does a meal at the restaurant look like?"
Key Features
Web search option - Enable
allowWebSearchto get additional information from the webHotel context - Answers are specific to the hotel you're asking about
Natural language - Ask questions conversationally
Quick Start
Provide the hotelId and your question. Optionally enable allowWebSearch for web-enhanced answers.
Note: This is a beta feature and may be subject to changes.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The question to ask about the hotel | |
| hotelId | Yes | Unique ID of the hotel (MAQAMI format) | |
| allowWebSearch | No | Whether to allow web search for additional information. Default is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world behavior. The description goes beyond them by disclosing the beta status, that answers are AI-generated from the hotel's data, and that allowWebSearch pulls in external web content. It does not discuss answer accuracy, latency, or error behavior, keeping it short of a 5.
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 overview is front-loaded and scannable, but the body is padded with marketing-style bullets ('Natural language responses', 'Hotel context', 'Natural language') and example questions that repeat the same point several times. Headers help structure but a fair amount of text does not add selection or invocation value.
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 does explain the return shape (AI-generated, natural-language, hotel-specific answers), and it covers all three parameters and the beta caveat. Given the simplicity of a 3-parameter read-only tool, this is nearly complete; only error/edge-case behavior is unaddressed.
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 the schema already documents query, hotelId (MAQAMI format), and allowWebSearch (default false). The description restates these in prose ('Provide the hotelId and your question') without adding format or constraint 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 overview states a specific verb+resource: answer natural-language questions about a specific hotel using AI. It is clearly distinguishable from sibling data tools like get_data_hotel (fetch hotel record) or get_data_hotels_semantic_search, since this is a free-form Q&A endpoint.
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 'When to Use' section gives concrete scenarios (hotel Q&A, information lookup, conversational interfaces, detailed inquiries), which sets clear context. However, it never names a sibling alternative (e.g. get_data_hotel for raw fields) or states when this tool is NOT appropriate, so routing guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_hotelsList hotelsBRead-onlyIdempotentInspect
Overview
Search and retrieve hotel listings based on various criteria. Get hotel metadata including names, addresses, ratings, amenities, and images for display in your application.
When to Use
Hotel listings - Display hotel search results
Location-based search - Find hotels by city, coordinates, or Place ID
Hotel discovery - Browse hotels in specific areas
Metadata retrieval - Get hotel information for display
What You Get
Hotel list - Matching hotels with complete metadata
Basic information - Names, addresses, ratings, and locations
Amenities - Available facilities and features
Images - Hotel photos for display
Identifiers - Hotel IDs for use in rate searches
Search Options
By city - Search hotels in a specific city
By coordinates - Find hotels near latitude/longitude with radius
By Place ID - Get hotels within a specific place boundary
By hotel IDs - Retrieve specific hotels by their IDs
Quick Start
Provide search criteria (city, coordinates+radius, placeId, or hotelIds). Returns matching hotels with complete metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | ZIP code of the location | |
| limit | No | Specifies the maximum number of results to return. By default, this is set to 200, even if not explicitly defined. If a higher limit is specified, the maximum allowed is 5000 results | |
| offset | No | Specifies the number of rows to skip before starting to return rows | |
| radius | No | radius in meters (min 1000m) | |
| placeId | No | Unique ID of a place retrieved from the `/data/places` endpoint. When provided, the API fetches place details and searches for hotels within a 1km radius of the place location center, or a specific hotel when the placeId refers to a property. The response includes a `place` object containing the place information used in the search. | |
| timeout | No | request timeout in seconds | |
| aiSearch | No | Search term for AI search. Uses semantic search to find hotels matching the query intent. Examples: 'Romantic getaway with Italian vibes in London near the London Eye', 'Hotels near the Eiffel tower' | |
| chainIds | No | Comma-separated list of hotel chain ids. e.g. '14675,14677' | |
| cityName | No | Name of the city | |
| hotelIds | No | Comma-separated list of hotel IDs (e.g., 'lp1897,lp1343') to fetch specific hotels by their IDs. This is a valid main query parameter that can be used instead of other search criteria. | |
| language | No | The language code, indicating in which language the results should be returned. e.g. 'fr' | |
| latitude | No | Latitude geo coordinates | |
| hotelName | No | Name of the hotel (loose match, case-insensitive, e.g. 'hilton') | |
| longitude | No | Longitude geo coordinates | |
| minRating | No | Minimum rating of the hotel. e.g. 8.6 | |
| starRating | No | Comma-separated list of star ratings. Note: star ratings have 2 allowed decimals '.0' and '.5' from 1 to 5. e.g. '3.5,4.0,5.0' | |
| countryCode | No | Country code ISO-2 code - example (SG) | |
| facilityIds | No | Comma-separated list of facilities. e.g. '1,2,3' | |
| hotelTypeIds | No | Comma-separated list of hotel types. e.g. '201,204,208' | |
| lastUpdatedAt | No | Retrieve only the hotels that have been updated since the provided date and time (using the RFC3339 format) | |
| minReviewsCount | No | Minimum number of reviews. e.g. 100 | |
| advancedAccessibilityOnly | No | If `true`, only hotels with advanced accessibility will be returned | |
| strictFacilitiesFiltering | No | If `true`, only hotels with all the specified facilities will be returned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered without the description. The description adds useful context about returned content (metadata, images, IDs for rate searches) and search modes, but says nothing about pagination limits beyond the schema, rate limits, or auth requirements.
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?
It is well-structured and front-loaded with a clear Overview, but highly redundant: 'When to Use', 'What You Get', and 'Quick Start' repeatedly restate the same three or four ideas. The same information could be delivered in roughly half the text without loss.
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 tool with zero required parameters and no output schema, the Quick Start's advice to 'Provide search criteria (city, coordinates+radius, placeId, or hotelIds)' is genuinely helpful for avoiding an unbounded query. But it omits other valid entry points (aiSearch, hotelName, chainIds) and gives no default-behavior or result-size guidance, leaving the definition only minimally complete.
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 23 parameters are already documented in the schema; the baseline is 3. The 'Search Options' section maps loosely to the geo/ID parameters but adds no syntax or constraint detail beyond what the schema provides (e.g., it omits chainIds, facilityIds, starRating modes).
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 states a specific verb and resource ('Search and retrieve hotel listings') and enumerates what comes back (names, addresses, ratings, amenities, images, IDs). However, it never distinguishes itself from the many near-identical siblings (get_data_hotel_search, get_data_hotels_semantic_search, get_data_hotel), even though the aiSearch parameter here overlaps semantically with the dedicated semantic-search sibling.
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?
A 'When to Use' section exists, but its bullets ('Hotel listings – Display hotel search results', 'Hotel discovery – Browse hotels in specific areas') restate the overview rather than give real selection criteria. No guidance is offered on when to pick this over get_data_hotel_search or get_data_hotels_semantic_search, which is the key routing decision given the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_hotel_searchFind hotels by name or placeARead-onlyIdempotentInspect
Find hotels by name or place with a semantic text search. Returns up to 5 matches (set limit for more) with name, address, city, country and a relevance score. Check the name and city before using an id. For an exact hotel name, get_data_hotels with hotelName and cityName or countryCode is more precise.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of matches to return. Defaults to 5. | |
| query | Yes | The semantic search query (e.g. 'Burj Jumeirah Dubai'). |
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 real behavioral value beyond them: the default result count of 5 (overridable via limit), the returned fields including a relevance score, and the caution to validate name/city before using an id.
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 tight sentences, front-loaded with what it does and what it returns, then the caution and the alternative. Every sentence earns its place with no redundancy.
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 usefully enumerates the returned fields and the relevance score, and explains both parameters. It omits the 20-result ceiling that lives only in the schema and does not differentiate the other semantic-search sibling, which keeps it just short of fully complete.
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 query and limit are already documented with the default and the example. The description restates the default of 5 and clarifies the query is semantic, but adds no syntax or format detail beyond what the schema provides. 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 and resource ('Find hotels by name or place') plus the mechanism (semantic text search) and routing to the more precise alternative. It distinguishes itself from get_data_hotels, though it never addresses the very similar sibling get_data_hotels_semantic_search, which an agent might otherwise confuse it with.
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 clear guidance for when to prefer the alternative: an exact hotel name should go to get_data_hotels with hotelName and cityName/countryCode. It also advises verifying name and city before reusing an id. It stops short of covering the other near-identical search siblings, so it is clear context but not exhaustive routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_hotels_room_searchSearch hotel rooms by styleARead-onlyIdempotentInspect
Overview
Beta Feature - Search hotel rooms using visual and text-based queries. Uses image search technology to match your query against room images and find hotels with rooms that match your visual preferences, amenities, or style.
When to Use
Visual room search - Find rooms based on visual characteristics like "luxury modernist comfort" or "blue accessible bathroom"
Style-based search - Search for rooms by design style like "art deco hotel room" or "brutalist room"
Amenity-focused search - Find rooms with specific features like "twin room with a city view" or "room with a skylight"
Geographic filtering - Limit results to hotels near a specific location using coordinates or Place ID
City and country filtering - Filter results by city and/or country
What You Get
Matching hotels - Hotels grouped by hotel ID with rooms that match your query
Room details - Room name, image URL, and similarity score (rounded to 3 decimals) for each matching room
Hotel metadata - ID, name, address, city, country, and rating for each hotel
Geographic filtering - Optionally limit results to a specific area using coordinates or Place ID
City and country filters - Filter results by city and/or country code
Example Queries
"luxury modernist comfort"
"an extremely fun room or art deco hotel room"
"luxurious accessible bathroom or blue accessible bathroom with walk in shower"
"twin room with a city view"
"a room filled with paintings"
"a hotel room with a skylight"
Geographic Filtering
You can optionally limit search results to a specific geographic area:
Using coordinates: Provide
latitude,longitude, and optionallyradius(in kilometers, default: 12km)Using Place ID: Provide
placeId- the place's location will be automatically fetched and the search will use the place's viewport boundaries (or the providedradiusif viewport is unavailable)Using city/country: Provide
cityand/orcountryto filter results by location
Quick Start
Provide a query parameter describing the room you're looking for. Optionally add geographic filtering with latitude/longitude or placeId to limit results to a specific area.
Note: This is a beta feature and may be subject to changes.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Filter results by city name. Can be used alone or together with country. | |
| limit | No | Maximum number of results to return (maps to top_k in the API) | |
| query | Yes | Search query describing the room you're looking for. Can be visual (e.g., 'luxury modernist comfort', 'blue accessible bathroom'), amenity-based (e.g., 'twin room with a city view'), or style-based (e.g., 'art deco hotel room', 'brutalist room') | |
| radius | No | Search radius in kilometers. Only used when latitude/longitude is provided, or when placeId is provided but the place does not have viewport information. When placeId is provided and viewport is available, the viewport boundaries are used instead of this radius. Default is 12km. | |
| country | No | Filter results by country code (ISO 3166-1 alpha-2 format, e.g., 'FR', 'US'). Can be used alone or together with city. | |
| placeId | No | Place ID. If provided, the search will be limited to hotels within the place's viewport boundaries (or the provided `radius` if viewport is unavailable). The place's latitude and longitude will be automatically fetched. | |
| latitude | No | Latitude coordinate for geographic filtering. Must be provided together with longitude. Ignored if placeId is provided. | |
| longitude | No | Longitude coordinate for geographic filtering. Must be provided together with latitude. Ignored if placeId is provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description earns credit by adding beta status, the similarity-score rounding convention, the 12km radius default, and the placeId-precedence/viewport fallback behavior — real operational context beyond the annotations.
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-loaded with an Overview and useful structure, but it is bloated: 'Geographic filtering' and 'City and country filters' are each stated in the 'What You Get' list and again in their own dedicated sections, and the closing Quick Start plus beta note repeats the opening. Tighter editing would preserve all information in roughly half the length.
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 correctly carries the burden of explaining returns (grouped hotels, room name/image URL/similarity score, hotel metadata) plus all filter modes. Nothing an agent needs to invoke it is missing, though explicit sibling differentiation would complete the picture.
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 eight parameters are already documented in the schema. The description largely restates those rules (radius default, placeId vs coordinates precedence, city/country ISO codes) rather than adding new semantics, 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?
States a specific verb (search) and resource (hotel rooms) and specifies the distinctive mechanism: image-search matching of visual/text queries against room images. It implicitly separates itself from text-only siblings like get_data_hotels_semantic_search or get_data_hotel_search, but never names them, so an agent must infer the boundary.
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 'When to Use' section gives concrete triggering scenarios (visual, style-based, amenity-focused, geographic) plus example queries. It lacks any explicit when-not-to-use or a named alternative sibling, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_hotels_semantic_searchSearch hotels by descriptionARead-onlyIdempotentInspect
Overview
Beta Feature - Search hotels using natural language queries. Uses AI to understand search intent and find hotels that match the meaning, not just keywords.
When to Use
Natural language search - Let users search with phrases like "romantic getaway in London"
Intent-based matching - Find hotels matching the vibe or style, not just location
Conversational search - Support natural language hotel discovery
Semantic matching - Get hotels that semantically match the query
What You Get
Matching hotels - Hotels that semantically match your query
Semantic attributes - Tags, persona, style, location_type, and story for each hotel
Relevance scores - How well each hotel matches the query
Hotel metadata - ID, name, photos, address, city, country
Example Queries
"Romantic getaway in London with Italian vibes"
"Hotels near Paris"
"Family-friendly beachfront hotels"
Quick Start
Provide a natural language query parameter. Returns hotels with semantic matching scores and attributes.
Note: This is a beta feature and may be subject to changes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return. Default is 3. | |
| query | Yes | Semantic search query. This can be a natural language description of what you're looking for, e.g. 'romantic getaway in london with italian vibes' | |
| min_rating | No | Minimum hotel rating to filter results. Default is 0 (no minimum rating filter). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read-only, idempotent, open-world profile. The description adds real value beyond them: beta status/subject to change, the semantic fields returned (tags, persona, style, location_type, story), relevance scores, and the hotel metadata payload — meaningful context for a tool with no output schema.
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-loaded with an overview and useful sections, but heavy markdown scaffolding carries redundancy: four 'When to Use' bullets that say essentially the same thing, and 'Matching hotels - Hotels that semantically match your query' is a tautology. It could be roughly half the length.
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 correctly fills the gap via 'What You Get' enumerating return fields and scores, and flags beta instability. The main remaining gap is the absence of differentiation from the other hotel-search siblings, which matters given the crowded sibling set.
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 the schema already documents query, limit (default 3), and min_rating (default 0). The description reinforces the query parameter and supplies concrete example queries, but adds no syntax or format detail beyond the schema. Baseline 3 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+resource (semantic/natural-language hotel search) and describes the mechanism (AI intent matching) clearly. However, it never differentiates itself from the several closely-named hotel-search siblings (get_data_hotel_search, get_data_hotel_ask, get_data_hotels), so an agent cannot tell which search to pick from the description alone.
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?
There is a 'When to Use' section, but all four bullets restate the same idea (natural-language / intent / conversational / semantic search) rather than giving distinct conditions. No when-not-to-use guidance and no alternative tools are named, so routing among the hotel search siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_hoteltypesList hotel typesARead-onlyIdempotentInspect
Overview
Get all available hotel type classifications (e.g., resort, boutique, business hotel). Use type IDs to filter hotel searches.
When to Use
Type filters - Filter hotels by type in search
Type display - Show hotel type classifications
Reference data - Get hotel type IDs for filtering
What You Get
Hotel type list - All available hotel types
Type IDs - Numeric IDs for use in search filters
Type names - Hotel type classifications
Quick Start
No parameters required. Returns all hotel types with IDs. Use type IDs in hotel search filters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so safety semantics are covered. The description adds little beyond that: 'No parameters required. Returns all hotel types with IDs' is useful scoping, but pagination, rate limits, and result-size behavior are unaddressed.
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?
Four markdown sections for a no-argument reference lookup is over-structured; 'What You Get' and 'Quick Start' largely restate each other. Front-loading the core action is good, but roughly half the text is redundant.
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 needs to convey returns, and it does list hotel type list, numeric IDs, and type names. For a zero-parameter reference tool this is close to sufficient, though it omits any mention of ordering or completeness guarantees.
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; the description correctly confirms no parameters are required rather than inventing any. Nothing further is needed.
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+resource: 'Get all available hotel type classifications (e.g., resort, boutique, business hotel)', which is unambiguous. It does not explicitly distinguish itself from reference-data siblings like get_data_chains or get_data_facilities, but the referenced resource is narrow enough to be clear.
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 'When to Use' section gives three concrete contexts (type filters in search, type display, reference data for IDs), which is clear guidance. No exclusions or named alternatives are given, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_iatacodesList IATA codesARead-onlyIdempotentInspect
Overview
Get IATA (International Air Transport Association) airport codes with airport names, coordinates, and country information. Useful for airport-based hotel searches.
When to Use
Airport searches - Find hotels near airports
Location selection - Let users search by airport codes
Geographic data - Get airport locations and coordinates
Reference data - Get IATA codes for use in hotel searches
What You Get
Airport list - All available airports with IATA codes
Airport names - Full airport names
Coordinates - Latitude and longitude for each airport
Country codes - ISO-2 country codes for each airport
Quick Start
No parameters required. Returns all airports with IATA codes, names, coordinates, and country information.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | request timeout in seconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds that no parameters are required and that the full airport list is returned, but says nothing about result size, pagination, or rate limits for what is effectively an unpaginated full-list endpoint.
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 Overview, but the four markdown sections are heavily redundant for a zero-parameter listing tool — 'IATA codes' and the hotel-search use case are restated in the Overview, When to Use, and Quick Start. Roughly half the text could be cut without losing information.
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 read-only reference endpoint with no output schema, the description adequately covers what data comes back (codes, names, coordinates, country codes) and that annotations handle the safety contract. The main missing piece is any differentiation from the near-identical airport/IATA siblings.
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% and the only parameter is an optional timeout, so the schema does the heavy lifting. The description's 'No parameters required' is accurate for required inputs but silently omits the timeout knob, adding no real semantic value over the schema.
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 Overview states a specific verb and resource: 'Get IATA airport codes with airport names, coordinates, and country information.' An agent knows exactly what this returns. However, it never distinguishes itself from the many similar siblings (get_data_flights_airports_iatas, get_data_flights_airlines_iatas, get_data_flights_airports), which share overlapping subject matter.
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 'When to Use' section gives clear contexts (airport searches, location selection, geographic reference data). It does not name any alternative tool or state when NOT to use this one, which matters here given the crowded IATA/airport sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_languagesList languagesARead-onlyIdempotentInspect
Overview
Get all supported languages for hotel translations and content localization. Use language codes to request hotel data in specific languages.
When to Use
Language selection - Display available languages to users
Content localization - Get language codes for API requests
Multi-language support - Build language switchers in your application
Reference data - Validate language codes before making requests
What You Get
Language list - All supported and enabled languages
Language codes - ISO 639-1 codes (e.g., 'en', 'es', 'fr')
Language names - Human-readable language names in English
Quick Start
No parameters required. Returns all supported languages with codes and names. Use language codes in hotel search and detail requests.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive). The description adds value beyond them by disclosing the return shape ('codes and names') and confirming the call is parameter-free, though it says nothing about caching, rate limits, or ordering of the returned list.
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 front-loaded Overview is good, but four markdown sections for a zero-parameter reference call is heavy, and the return content (language codes and names) is restated in both 'What You Get' and 'Quick Start'. Some sentences do not earn their place.
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 reference endpoint with no parameters, no output schema, and full annotation coverage, the description supplies everything needed: purpose, usage contexts, and the shape of the returned data. Nothing an agent needs to call it correctly is 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?
With zero parameters the baseline is 4, and the description correctly confirms 'No parameters required,' leaving nothing ambiguous for the caller. There is no parameter detail to add beyond that.
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 Overview states a specific verb and resource: 'Get all supported languages for hotel translations and content localization.' It also names the practical purpose (language codes for API requests), which cleanly distinguishes it from the other get_data_* reference tools such as currencies or countries.
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 'When to Use' section gives four concrete triggering scenarios (language selection UI, content localization, multi-language support, reference validation). It is clear about context but never names a when-not condition or an alternative tool, which is the only thing keeping it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_reviewsGet hotel reviewsBRead-onlyIdempotentInspect
Overview
Retrieve guest reviews and ratings for a specific hotel. Display authentic feedback from previous guests to help users make informed booking decisions.
When to Use
Review display - Show guest reviews on hotel detail pages
Rating aggregation - Display average ratings and review counts
Trust building - Show authentic guest feedback
Decision support - Help users evaluate hotels before booking
What You Get
Guest reviews - Individual review text and ratings
Review dates - When each review was written
Ratings - Numerical and textual ratings
Guest feedback - Detailed comments from previous guests
Quick Start
Provide the hotelId as a query parameter. Returns all reviews for that hotel with ratings and comments.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Specifies the maximum number of results to return. By default, this is set to 200, even if not explicitly defined. If a higher limit is specified, the maximum allowed is 5000 results | |
| offset | No | Specifies the number of reviews to skip, defaults to 0 | |
| hotelId | Yes | Unique ID of a hotel | |
| timeout | No | request timeout in seconds | |
| language | No | ISO 639-1 language code (e.g., 'fr', 'es', 'de') to translate reviews using AI. If not provided, the reviews will be returned in the default language (en). When this parameter is provided, the maximum number of reviews returned is 10. | |
| getSentiment | No | If set to true, an AI sentiment analysis of the last 1000 reviews will be returned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile needs no restating. The description adds a useful inventory of returned fields (text, dates, ratings, comments) but omits behavioral constraints such as the hidden cap that `language` reduces results to 10 and that `getSentiment` analyzes only the last 1000 reviews.
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 markdown section headers and four-bullet lists are padded with marketing framing ('authentic feedback ... informed booking decisions', 'Trust building', 'Decision support') that carries no operational content. Front-loading is fine, but several sentences do not earn their place.
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 six parameters and no output schema, the description usefully sketches the return shape, but it never addresses pagination, result limits, or the conditional behavior of `language` and `getSentiment`. Adequate but with clear gaps for a tool of this complexity.
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 six parameters are already documented in the schema. The prose only echoes `hotelId` as a query parameter and adds nothing about limit/offset paging or the language/sentiment interactions, 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?
States a specific verb and resource ('Retrieve guest reviews and ratings for a specific hotel'), so an agent knows exactly what it returns. It does not, however, distinguish itself from nearby siblings such as get_data_hotel or get_data_hotel_ask, which also surface hotel content.
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 'When to Use' section lists product-level scenarios (review display, rating aggregation, trust building) rather than conditions that select this tool over an alternative. No sibling is named and no exclusion is given, so usage is only implied by the topic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getExperienceBookingGet tour bookingARead-onlyIdempotentInspect
Look up a tour or activity booking: status, booking details and the voucher once it is confirmed.
Requires the bookingId and the email used to book: the server only returns or changes a booking when they match.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address used to make the booking. The server checks it against the booking before returning or changing anything. | ||
| lastName | No | The booking holder's last name, if the customer gives it. Optional. | |
| bookingId | Yes | MAQAMI experience booking ID from the booking confirmation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuine value beyond that by disclosing the identity-verification gate (bookingId + email must match) and that the voucher only appears once the booking is confirmed. Minor oddity: "returns or changes" hints at mutation for a read-only tool, but it describes the server's general check, not this tool's behavior, so it is not a contradiction.
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 tight sentences, front-loaded with the core purpose before the prerequisite. No filler or redundancy.
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 compensates by naming what is returned (status, details, voucher post-confirmation) and the mandatory auth condition. An agent has everything needed to call 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 the schema already documents bookingId, email and the optional lastName, including the match-check behavior. The description largely restates the required-parameter matching rule rather than adding new syntax or format guidance, so the baseline 3 for high coverage 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 ("look up") and resource ("tour or activity booking") and even enumerates the payload (status, booking details, voucher once confirmed). This cleanly separates it from siblings like cancelExperienceBooking and getExperienceBookingCancelPreview without the agent needing to open any 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?
Gives a clear precondition: the `bookingId` and `email` must both be supplied and must match, otherwise the server returns nothing. It does not explicitly name alternatives (e.g. cancelExperienceBooking or the cancel-preview tool) or state when to prefer this over them, so it falls short of a full when/when-not rubric.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getExperienceBookingCancelPreviewPreview tour cancellationRead-onlyIdempotentInspect
Overview
Preview the refund amount and cancellation fee for a booking before committing to cancel it.
When to Use
Cancellation confirmation screens - Show the guest exactly what they'll be refunded
Support tooling - Check whether a booking is still cancellable before offering a refund
What You Get
cancellable- Whether the booking can currently be cancelledpolicy-cancellationFee,refundAmount,refundType,estimateConfidence,currency,sellingPrice
Quick Start
Use this with the bookingId from POST /experiences/bookings. This does not cancel the booking - cancelExperienceBooking cancels it.
Requires the bookingId and the email used to book: the server only returns or changes a booking when they match.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address used to make the booking. The server checks it against the booking before returning or changing anything. | ||
| lastName | No | The booking holder's last name, if the customer gives it. Optional. | |
| bookingId | Yes | MAQAMI experience booking ID from the booking confirmation |
get_flights_bookings_bookingidGet flight bookingARead-onlyIdempotentInspect
Look up a confirmed flight booking: status, passengers, flights, booking references, fare rules and price.
Requires the bookingId and the email used to book: the server only returns or changes a booking when they match.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address used to make the booking. The server checks it against the booking before returning or changing anything. | ||
| lastName | No | The booking holder's last name, if the customer gives it. Optional. | |
| bookingId | Yes | The unique flight booking identifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint, so the safety profile is covered. The description adds real value by disclosing the authorization behavior: the server only returns or changes a booking when the id and email match, which is exactly the kind of context annotations don't carry. The word 'changes' is slightly loose against readOnlyHint but the sentence is about the auth precondition, not a write claim.
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, front-loaded with what the call returns and then the preconditions. No filler; every clause carries information an agent 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 read-only lookup with full annotation coverage and no output schema, the description is nearly complete: it names the return fields and the auth requirement. It stops short of return format or pagination details, but those are not essential for correct invocation.
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 the schema already documents all three parameters including the matching check. The description reinforces the bookingId/email pairing but adds no new syntax or format meaning, 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?
States a specific verb (look up) and resource (confirmed flight booking) and enumerates the returned contents: status, passengers, flights, booking references, fare rules and price. This lets an agent distinguish it from the generic get_bookings_bookingid and from hotel/experience booking siblings without opening any 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 a clear precondition for use — the bookingId and the email used to book must both be supplied and match — which is the key context for calling it correctly. It does not explicitly name alternative tools or when-not-to-use cases, but the scope ('confirmed flight booking') implicitly separates it from the hotel/experience booking siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_flights_bookings_bookingid_cancellationsGet flight cancellation statusARead-onlyIdempotentInspect
Overview
Returns refund eligibility, estimated refund amounts, and penalty details for a booking without actually cancelling it. Useful before post_flights_bookings_bookingid_cancellations to understand the financial impact of cancellation.
When to Use
Pre-cancellation review — Show the customer the potential maximum refund (not guaranteed) before they confirm cancellation
Refund estimation — Display potential maximum refund and penalty amounts in the booking management UI (refund is not granted until cancel completes)
Eligibility check — Determine whether the booking is within the void window (
isVoidable) or eligible for a partial refund (isRefundable)
What You Get
confidence— How reliable the quote is (confirmed,estimated,heuristic,unknown)isRefundable/isVoidable— Quick eligibility flagsrefund/penalty— Aggregate amounts with margin applied.refundis the potential maximum the airline may refund — not a granted/guaranteed amountpenalties[]— Itemised penalty breakdown when availabletickets[]— Per-ticket detail when availabledestination— Where the refund goesvouchers[]— Airline travel vouchers / credit-shells whendestinationisvoucher; omitted when absent. Distinct from MAQAMI discountvoucherCodeon prebook
Concurrent cancellation
If a cancellation was already submitted and is still awaiting provider confirmation, this endpoint returns HTTP 409 with code 49007 (CONCURRENT_OPERATION). A new quote is not available until that cancellation completes or fails.
Refund amount caveat
The refund amount on a cancellation quote is the potential maximum the airline may refund if cancellation proceeds under the quoted conditions. It is an estimate for decision-making only and is not granted — the final refund (if any) is determined when cancellation completes and may be lower or zero. The refund may arrive asynchronously once the airline determines the final amount.
Key Features
Non-destructive — Does not cancel the booking; safe to call before user confirmation
Margin-applied pricing — All amounts (including voucher
pricing.display) reflect the same margin applied at booking time
Quick Start
Provide the bookingId from the flight booking confirmation. Each call checks the airline live.
Requires the bookingId and the email used to book: the server only returns or changes a booking when they match.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address used to make the booking. The server checks it against the booking before returning or changing anything. | ||
| lastName | No | The booking holder's last name, if the customer gives it. Optional. | |
| bookingId | Yes | The unique booking identifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive, but the description adds substantial behavioral context beyond them: HTTP 409 with code 49007 when a concurrent cancellation is pending, the caveat that refunds are potential maximums not granted amounts, async refund arrival, margin-applied pricing, and the email-match auth requirement. This is unusually rich disclosure for a read 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?
Front-loaded with an Overview and well-organized headers, so the key facts come first. It is somewhat long and repeats the refund-maximum caveat in both 'What You Get' and a dedicated 'Refund amount caveat' section, which costs a point on conciseness despite the clean structure.
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?
There is no output schema, so the description must describe return values, and the 'What You Get' section enumerates the response fields (confidence, isRefundable/isVoidable, refund/penalty, penalties[], tickets[], destination, vouchers[]) in detail. Combined with the 409/async/margin behavior, an agent has everything needed to call and interpret the tool 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 bookingId, email, and lastName are already documented per-field, including the email-verification check. The description's 'Requires the bookingId and the email used to book' largely restates that, adding no new syntax or format detail. Baseline 3 is appropriate when the schema does the heavy lifting.
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 Overview states a specific verb and resource: returns refund eligibility, estimated refund amounts, and penalty details for a flight booking. It explicitly distinguishes itself from the sibling post_flights_bookings_bookingid_cancellations by stating it works 'without actually cancelling it', so an agent can route correctly 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?
A dedicated 'When to Use' section names three concrete scenarios (pre-cancellation review, refund estimation, eligibility check) and positions the tool as a precursor to the cancellation sibling. The 'Concurrent cancellation' section also states the condition (already-submitted cancellation) under which the tool fails, which is explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_flights_bookings_bookingid_servicesGet flight booking extrasRead-onlyIdempotentInspect
Overview
Retrieve the ancillary services (seats, baggage) for an existing flight booking: services that are already booked together with the live catalog of services that can still be booked.
When to Use
Post-booking upsell - Show the passenger which seats and bags they can still add after the booking was created
Booking management - Display the services already attached to the booking with the prices that were charged
Availability refresh - The bookable catalog is fetched live from the provider on every call
What You Get
groups- Bookable services grouped by category (seat, baggage) with post-margin prices and encodedserviceIdsbookedServices- Services already attached to the booking; entries booked through the API carry the exact price that was charged at attach timeexpiresAt- Validity window of the bookable catalog
Key Features
Read-only: Safe to call at any time; the catalog reflects live availability
Consistent pricing: Booked services echo the post-margin amounts the user actually paid
Quick Start
Provide the bookingId from the flight booking confirmation.
On a ticketed booking (status CONFIRMED) groups lists only what can be sold after ticketing (provider-dependent, usually baggage) and only when canAddServicesAfterTicketing is true; buy them with POST /flights/bookings/{bookingId}/services and /services/confirm.
Requires the bookingId and the email used to book: the server only returns or changes a booking when they match.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address used to make the booking. The server checks it against the booking before returning or changing anything. | ||
| lastName | No | The booking holder's last name, if the customer gives it. Optional. | |
| bookingId | Yes | The unique booking identifier | |
| forceRefresh | No | Bypass the provider's 15-minute services cache | |
| includeServicesHistory | No | Include non-confirmed bookedServices rows (pending, requested, failed, replaced, dropped). By default only confirmed rows are returned. |
getHotelTaxSchemaGet hotel tax rulesARead-onlyIdempotentInspect
Overview
Returns the tax schema of a hotel as normalized static data, independent of the supply provider the rules were learned from. Each entry describes one tax or fee: whether it is already included in the room rate, whether it is a percentage of the rate or a fixed amount, and how fixed amounts scale (per adult and/or per night).
When to Use
Price transparency - Show guests which taxes and fees apply at a property
Amount-due-at-property estimates - Excluded taxes are typically collected at the hotel
Tax auditing - Compare supplier-declared taxes against the reference schema
Notes
Fixed amounts are expressed in USD
Percentage rates apply to the room rate (e.g. 13.5 means 13.5%)
The schema is learned by an offline pipeline; hotels without learned data return 404
When the direct (hotel-declared) source is enabled, taxes declared by the hotel in MAQAMI Cloud take precedence over learned rules and each entry carries
source,chargeType,appliedPer,appliedOn,payAtPropertyand validity dates
| Name | Required | Description | Default |
|---|---|---|---|
| hotelId | Yes | Unique identifier of the hotel, in 'lp' format or numeric. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds materially beyond them: 404 for hotels without learned data, USD-denominated fixed amounts, percentage semantics, and the direct-source precedence rule along with the extra fields each entry then carries.
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?
Markdown sections are front-loaded with the overview and each bullet carries information, not filler. Slightly longer than strictly necessary for a single-parameter read tool, but nothing is redundant.
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 return-value burden and does so: it explains that each entry states inclusion in the room rate, percentage vs fixed, fixed-amount scaling granularity, and source/validity fields. An agent knows what it will get and under what failure condition.
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 100% and hotelId's 'lp format or numeric' description lives in the schema, so the description adds no parameter-level detail. Baseline 3 is appropriate when the schema does all the work.
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 ('Returns the tax schema of a hotel') and adds a distinguishing qualifier: normalized static data independent of the supply provider. No sibling tool covers hotel tax rules, so the purpose is unambiguous.
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 'When to Use' section gives three concrete scenarios (price transparency, amount-due-at-property estimates, tax auditing) that clearly frame the tool's context. It stops short of naming an alternative tool or stating when not to use it, but the context is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prebooks_prebookidGet locked hotel rateARead-onlyIdempotentInspect
Retrieve a hotel prebook by its prebookId: final price, cancellation terms, room details and the checkoutUrl (https://book.maqami.co/booking?prebookId=...). Bookings are paid and confirmed only on MAQAMI's website, through the checkoutUrl.
| Name | Required | Description | Default |
|---|---|---|---|
| prebookId | Yes | (Required) The unique identifier of the prebook session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely new behavioral context: the result feeds into an external payment flow and booking is completed outside this tool via checkoutUrl.
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 tightly written sentences with the retrieval scope front-loaded and the payment caveat second. No filler, and every clause carries information an agent 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?
With no output schema, the description compensates by enumerating the returned payload fields, and annotations handle the safety profile. For a single-parameter read this is complete enough to invoke 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 coverage is 100% for the single parameter, so the baseline is 3. The description restates the prebookId as an identifier and shows the URL template it populates, which adds marginal context but no new input semantics (e.g., format or validity rules).
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 (Retrieve) and resource (hotel prebook) and enumerates what is returned (final price, cancellation terms, room details, checkoutUrl). It is clearly a read of an existing prebook, but it never names its natural sibling post_rates_prebook to disambiguate create-vs-read.
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 implies the tool is used to inspect a prebook obtained elsewhere and tells the agent that payment/confirmation happens only via checkoutUrl on MAQAMI's site, which is a useful workflow hint. However, it never states when to call this versus post_rates_prebook or when a prebook expires, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listBookingsFind bookings by email and last nameARead-onlyIdempotentInspect
Find a customer's hotel bookings by the email address and last name used to book.
Both must match the booking holder; nothing is returned otherwise. Returns each booking with its bookingId, status, hotel, dates, guests, price and cancellation policy.
To look up, change or cancel one booking, use its bookingId with the same email in the booking tools.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address used to make the bookings. | ||
| lastName | Yes | The booking holder's last name. |
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 genuine behavior beyond that: both credentials must match or an empty result is returned, plus the shape of what comes back. It stops short of discussing rate limits or pagination for multi-booking results.
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 purpose, then the match constraint, then the result shape, then the routing hint. No filler or restatement of the title.
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?
There is no output schema, so the description compensates by enumerating the returned fields (bookingId, status, hotel, dates, guests, price, cancellation policy). Combined with the match precondition and sibling routing, an agent has everything needed to call 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 coverage is 100%, so the baseline is 3, but the description adds the conjunctive semantics — both email and lastName must match the booking holder and are not alternatives. That is meaningful behavior not derivable from the two independent properties.
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 ('Find'), resource ('a customer's hotel bookings') and the exact lookup keys ('email address and last name used to book'). This clearly separates it from ID-based siblings like get_bookings_bookingid and the booking-management tools.
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 states the match precondition ('Both must match the booking holder; nothing is returned otherwise') and routes the agent to the alternative path for single-booking operations ('To look up, change or cancel one booking, use its bookingId with the same email'). When-to-use and when-to-use-something-else are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_bookings_bookingid_alternative_prebooksFind alternative hotel ratesAInspect
Overview
Hard Amendment — Search for alternative rates at the same hotel and create prebook sessions for a confirmed booking. Used when the guest needs to change their check-in/check-out dates or room occupancy.
When to Use
Date changes — Guest needs different check-in or check-out dates
Occupancy changes — Guest needs a different number of adults or children
Hard amendments — Situations where the booking must be cancelled and re-booked with new parameters
How It Works
The system searches for live availability at the same hotel with the new parameters.
Up to
maxPrebooksalternative rates are selected (sorted by price ascending). Defaults to 3 when omitted; capped at 10 (any larger value is silently clamped to 10).A prebook session is created for each rate.
The caller receives a list of
prebookIdvalues with prices to show the guest.
What You Get
Up to
maxPrebooksprebook sessions — Each with aprebookId, final pricing, cancellation policies, and room detailsPrice comparison —
priceDifferencePercentshows how each alternative compares to the original booking's selling price (negative = cheaper than what the guest paid, positive = more expensive)Policy change flags —
cancellationChangedandboardChangedhighlight any policy differences
Key Notes
The booking must be in CONFIRMED status.
If the original booking is non-refundable, only non-refundable alternatives are returned (unless overridden with
refundableRatesOnly).The nationality and currency of the original booking are used for the availability search.
Quick Start
Call this endpoint with the
bookingIdand newoccupancies/dates — get back up tomaxPrebooksprebookIdvalues.
On this server: rebooking is not available, so use this only to show the guest alternative prices. To change a booking, cancel it if its policy allows and make a new booking, or contact MAQAMI support.
Requires the bookingId and the email used to book: the server only returns or changes a booking when they match.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address used to make the booking. The server checks it against the booking before returning or changing anything. | ||
| checkin | No | The new check-in date in YYYY-MM-DD format. Must be before `checkout`. | |
| checkout | No | The new check-out date in YYYY-MM-DD format. Must be after `checkin`. | |
| lastName | No | The booking holder's last name, if the customer gives it. Optional. | |
| boardType | No | Filter results by board/meal-plan type (e.g. `RO` for Room Only, `BB` for Bed & Breakfast). Leave empty to return all board types. | |
| bookingId | Yes | (Required) The unique identifier of the confirmed booking to amend. | |
| maxPrebooks | No | Maximum number of alternative prebook sessions to create. Defaults to 3 when omitted. Values above 10 are silently capped at 10; values ≤ 0 fall back to the default. The response may contain fewer entries when the hotel does not have enough distinct alternative offers. | |
| occupancies | Yes | The desired room occupancies for the amended stay. One entry per room. | |
| refundableRatesOnly | No | When true, only fully refundable alternative rates are returned. Defaults to false (or true if the original booking was refundable). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, and the description adds substantial context beyond them: the CONFIRMED-status prerequisite, that non-refundable originals yield only non-refundable alternatives, that nationality and currency are inherited from the original booking, and that the email must match the booking. It also notes this server cannot actually rebook, a meaningful behavioral limit.
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 definition is long but front-loaded and clearly sectioned under headers, so an agent can scan to the relevant part. There is some redundancy — 'Quick Start' largely restates the final step of 'How It Works' — which keeps it out of the top band.
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 100% schema coverage and no output schema, the description closes the remaining gaps by describing what comes back (prebookId, final pricing, cancellation policies, room details) and the policy-change flags cancellationChanged and boardChanged. Nothing an agent needs to invoke or interpret the call is 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 coverage is 100%, so baseline is 3, but the description adds real semantics the schema lacks: alternatives are sorted by price ascending, maxPrebooks defaults to 3 and clamps above 10, and priceDifferencePercent is defined relative to the original selling price (negative = cheaper). The refundableRatesOnly override behavior is also explained in prose.
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 verb+resource (search alternative rates at the same hotel and create prebook sessions) and scopes it to a confirmed booking being 'hard amended'. It explicitly contrasts with the amend path ('rebooking is not available, so use this only to show the guest alternative prices'), which separates it from sibling put_bookings_bookingid_amend.
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?
A dedicated 'When to Use' section enumerates the three triggering scenarios (date changes, occupancy changes, hard amendments). It also states the precondition (booking must be CONFIRMED) and the server-specific fallback when a true rebooking is needed, which is exactly the when-to-use/when-not guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_data_hotel_highlightsGet hotel highlightsRead-onlyInspect
Overview
Generate short, AI-written "Smart Highlight" cards for a hotel. Each highlight is a title plus a one or two sentence description, generated directly in the requested language.
Pricing: $0.02 per request
Rate Limiting: This endpoint is rate-limited to 10 requests per minute. Exceeding this limit will result in a 429 Too Many Requests response.
When to Use
Hotel detail pages - Show a few compelling reasons to consider a property
Partner-specific tone - Adjust voice and emphasis per surface via
tone,styleand per-highlightcontext
What You Get
Exactly
counthighlights, always, in the requested ordertypeechoed back from the request so you can map each card to your own UIgeneratedindicating whether the copy is AI-generated or template fallback
Behaviour
Hotel facts are resolved server-side from hotelId; the caller never supplies them. The model sees the name, city, country, street address, parking, and description, plus a sample of facilities, rooms, policies, and nearby places (with a server-computed distance phrase: on the property, short walk, short drive, or longer drive; farther places are omitted), guest sentiment strengths when stored (not drawbacks), and classification (star rating, hotel type, chain). Generated copy is grounded in those facts. Straight apostrophes in titles and descriptions are normalized to typographic apostrophes. Enterprise API keys also omit wifi and the phrase modern amenities from the facts and from the copy, and they omit review-style wording such as guests say. Other API keys still return wifi and connectivity copy when the request asks for it. When tone or style specify length or format, those rules override the default title and description lengths.
If AI generation fails, the endpoint still returns 200 with the requested number of neutral template highlights and generated: false. It never returns an empty array for a valid hotel.
Results are cached, so repeated calls with an identical request body return identical copy.
tone and style are truncated to 200 characters (5,000 for enterprise accounts). Each highlight context is truncated to 300 characters (10,000 for enterprise accounts).
| Name | Required | Description | Default |
|---|---|---|---|
| tone | No | Global writing guidance, e.g. `professional and inviting` or `calm and practical`. Truncated to 200 characters (5,000 for enterprise accounts). | |
| count | No | Number of highlights to generate. If `highlights` is supplied, `count` must equal its length. | |
| style | No | Formatting preferences such as title or description length. When supplied, these rules override the default title (2-4 words) and description (~180 characters) lengths. Truncated to 200 characters (5,000 for enterprise accounts). | |
| hotelId | Yes | Unique ID of the hotel (MAQAMI format) | |
| language | Yes | Language code. Highlights are generated directly in this language. | |
| highlights | No | Per-highlight guidance. Omit for generic generation. When supplied, its length must equal `count` and the response preserves this order. |
post_flights_bookings_bookingid_cancellationsCancel flight bookingADestructiveInspect
Cancel a confirmed flight booking. First show the customer the refund estimate from get_flights_bookings_bookingid_cancellations and wait for a clear yes.
Requires the bookingId and the email used to book: the server only returns or changes a booking when they match.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address used to make the booking. The server checks it against the booking before returning or changing anything. | ||
| lastName | No | The booking holder's last name, if the customer gives it. Optional. | |
| bookingId | Yes | The flight booking identifier to cancel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered; the description adds the crucial behavioral constraint that the server only acts when bookingId and email match. It stops short of describing post-cancellation state or refund timing, keeping it below 5.
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: the action first, then the mandatory pre-step, then the credential constraint. No filler, and the most important gating information is front-loaded.
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 adequately covers the action, the required confirmation prerequisite, and auth matching. It could say what a successful cancellation returns or whether it is reversible, but for a destructive mutation whose annotations already flag destructiveness, this is close to complete.
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 each parameter including the optional lastName is already documented. The description reiterates the two required params and the match requirement but adds no syntax or format 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 verb and resource ('Cancel a confirmed flight booking'), and the scoping word 'flight' distinguishes it from siblings like cancel_hotel_booking and cancelExperienceBooking without needing to open their schemas.
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 prescribes a workflow: first surface the refund estimate from `get_flights_bookings_bookingid_cancellations` and wait for a clear yes before cancelling. It names the sibling tool and the gating condition, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_flights_ratesSearch flightsRead-onlyInspect
Overview
Search for available flights with real-time pricing from multiple providers. The itinerary must be sent as a non-empty legs array. Each leg follows the provider SearchLeg shape: required origin, destination, and date (YYYY-MM-DD); optional direction (OUTBOUND or INBOUND); optional per-leg filters that override global filters for that leg only.
Not supported: top-level origin, destination, departureDate, or returnDate — use legs only.
When to Use
Listings — live prices for search results UI
One-way, round-trip, or multi-city — one leg per segment, in order
Filtering — cabin class, stops, price, refundability, times (globally or per leg)
What You Get
Offers from multiple providers
Itineraries with segments, layovers, and durations
Price breakdown (fares, taxes, fees) and baggage hints
Key Features
Multi-provider aggregation in one request
Global
filters,sort
Quick Start
Required: legs (at least one object with origin, destination, date), adults (≥ 1), currency
Date limit: each leg date must not be more than 11 months from today.
Round-trip: two legs (e.g. outbound then return with direction OUTBOUND / INBOUND). One-way: one leg.
Booking
The response includes searchUrl, the same search on book.maqami.co. Flights are booked and paid only on MAQAMI's website: post_flights_verify re-prices the chosen offer and returns its checkoutUrl.
| Name | Required | Description | Default |
|---|---|---|---|
| legs | Yes | Ordered itinerary legs (provider SearchLeg). One-way: one entry. Round-trip: outbound then inbound. Multi-city / open-jaw: additional legs in travel order. | |
| sort | No | Sort options for results | |
| adults | Yes | Number of adults (12+) | |
| country | No | Optional ISO 3166-1 alpha-2 country code for point of sale | |
| filters | No | Optional filters to refine search results | |
| infants | No | Number of infants (<2) | |
| children | No | Number of children (2-11) | |
| currency | Yes | ISO 4217 currency code | |
| cabinClass | No | Cabin class (provider SearchFilters codes only). Same enum as filters.cabinClass. | |
| infantAges | No | Age of each infant (under 2, per IATA). Length must equal infants count. Optional — omit if ages are not relevant. | |
| childrenAges | No | Age of each child (2–11 inclusive, per IATA). Length must equal children count. Optional — omit if ages are not relevant. |
post_flights_verifyConfirm flight price and get checkout linkARead-onlyInspect
Overview
Confirm a flight offer is still available and retrieve the latest pricing before proceeding to booking. Returns the checkout link for the verified offer.
When to Use
Pre-booking validation - Confirm offer availability after user selects a flight
Price confirmation - Show users the guaranteed price
Fare rule retrieval - Get the latest cancellation and change policies
What You Get
Verified pricing with up-to-date fare breakdown
changes(when present) — cabin/fare flags, human-readablemessages, andpricing(old/newfull OfferPricing) instead of deprecated scalar currency/pricesJourney
pricing—original(provider/PCC) anddisplay(customer) price breakdown per provider FlattenedJourneyFare family details including name and included amenities
Baggage policy for each passenger type and segment
Booking terms including cancellation and change fee rules
Key Features
Real-time price check: Confirms current availability and price with the provider
Updated baggage info: Returns the latest baggage allowances at time of verification
Fare rules: Includes cancellation and change fee policies before commitment
Quick Start
Provide the offerId from post_flights_rates search results. The verified offer data gives the customer a booking summary.
Booking
The response includes checkoutUrl (https://book.maqami.co/flights/booking?offerId=...). Flights are booked and paid only on MAQAMI's website: the checkoutUrl opens checkout for this fare, where the customer enters passenger details, pays securely and receives the confirmation. This tool takes no card or passport details.
| Name | Required | Description | Default |
|---|---|---|---|
| offerId | Yes | The offerId from the search results |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description usefully adds that no card or passport details are handled here and that booking/payment happens on MAQAMI's website via checkoutUrl, which is context beyond the annotations; however it does not discuss the non-idempotent price-change behavior implied by idempotentHint=false.
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 header structure and front-loaded Overview are good, but content is duplicated across sections: fare rules and baggage are each advertised two to three times ('Fare rule retrieval', 'Booking terms', 'Fare rules'; 'Baggage policy', 'Updated baggage info'), and there is redundancy between 'Quick Start' and 'Booking'. Several sentences do not earn their place.
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 return-value burden and does so thoroughly, enumerating the changes/pricing objects, journey pricing, fare family, baggage and booking terms, and the checkoutUrl flow. An agent has everything needed to call and interpret this one-parameter 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?
With a single parameter and 100% schema coverage, the schema already documents offerId; the description adds provenance by telling the agent to take it from post_flights_rates search results. That is meaningful routing context, though no format or error-handling detail is added.
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 operation (re-verify an existing flight offer's availability and price) plus a concrete downstream artifact (checkoutUrl). It is clearly distinguishable from the sibling search tool post_flights_rates, which is named as the source of the offerId.
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 'When to Use' section enumerates three concrete triggers (pre-booking validation, price confirmation, fare rule retrieval) and 'Quick Start' ties the input to post_flights_rates results, giving clear context. It never states an explicit exclusion or when-not-to-use case (e.g., before an offerId exists), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_hotels_min_ratesGet lowest hotel pricesARead-onlyInspect
Overview
Get the cheapest available rate for each hotel in your list. Perfect for displaying price comparisons without loading full rate details.
When to Use
Show price ranges on hotel listing pages
Quick price comparisons across multiple hotels
Optimize performance when you only need the lowest price, not all rate options
Build price filters or sorting by price
What You Get
Minimum rate per hotel - the cheapest available room option
Basic rate information - price, currency, and availability
Fast response - optimized for quick price lookups
Key Features
Lightweight - Returns only the minimum rate, not all options
Same parameters as the main rates endpoint for consistency
Perfect for listings - Ideal when displaying multiple hotels where users just need to see starting prices
Quick Start
Provide a list of hotel IDs, dates, and guest occupancy. The endpoint returns the cheapest rate available for each hotel.
| Name | Required | Description | Default |
|---|---|---|---|
| checkin | Yes | Check in date in YYYY-MM-DD (ISO 8601) format | |
| timeout | No | Request timeout in seconds | |
| checkout | Yes | Check out date in YYYY-MM-DD (ISO 8601) format | |
| currency | Yes | Booking currency | |
| hotelIds | Yes | List of hotel IDs | |
| occupancies | Yes | ||
| guestNationality | Yes | Guest nationality (ISO 2-code) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive), so the description's additional value is in disclosing the return shape: minimum rate only, price/currency/availability, and an explicitly lighter/faster payload than the full rates call. It does not mention auth, rate limits, or error behavior, which is a minor gap for an openWorld 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?
Five markdown sections for a single lookup endpoint, with heavy repetition: 'Perfect for displaying price comparisons,' 'Perfect for listings,' and 'ideal when displaying multiple hotels' all say the same thing. The Quick Start paragraph restates parameters already covered by the schema. Front-loading is decent but the padding is substantial.
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, but the description compensates by describing the returned fields (minimum rate, price, currency, availability), which is what an agent needs. Combined with 86% schema coverage and clear annotations, the definition is nearly sufficient, though it omits timeout usage and any error/empty-result behavior.
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 86%, so the schema already documents nearly every parameter including date format, currency, and occupancy structure. The description only restates 'hotel IDs, dates, and guest occupancy' and claims parameter parity with the main rates endpoint, adding minimal semantics beyond the schema.
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 (get) and resource (cheapest available rate for each hotel) and explicitly scopes it against the fuller alternative, noting the same parameters as 'the main rates endpoint.' An agent can distinguish this from post_hotels_rates 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 'When to Use' section gives concrete contexts (listing pages, quick comparisons, price sorting) and a when-not condition ('when you only need the lowest price, not all rate options'). It implies rather than names the sibling post_hotels_rates, so it falls just short of fully explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_hotels_ratesSearch hotel ratesARead-onlyInspect
Overview
Search for hotel rates and availability across multiple hotels. This is your primary endpoint for finding bookable hotel rooms with real-time pricing.
When to Use
Display hotel listings with prices on your search results page
Show detailed rate options for specific hotels users are viewing
Support multi-room bookings for families or groups
Filter hotels by location, amenities, ratings, or AI-powered semantic search
What You Get
Real-time rates with availability and pricing
Multiple room options per hotel, sorted by price
Complete booking details including cancellation policies, meal plans, and room types
Hotel information (name, photos, address, ratings) when searching by filters
Key Features
Multiple search methods: Search by hotel IDs, city/country, coordinates, Place ID, IATA code, or natural language (AI search)
Flexible filtering: Filter by star rating, facilities, hotel chains, accessibility, and more
Multi-room support: Book multiple rooms with different guest configurations in one request
Performance optimized: Default limit of 200 hotels (expandable to 5,000), recommended timeout of 6-12 seconds
Price consistency: Optional
sessionIdensures rates stay consistent across listing and detail searches within a user session
Quick Start
Required fields: checkin, checkout, currency, guestNationality, occupancies, plus one location method (hotel IDs, city/country, coordinates, Place ID, or IATA code)
Tip: When searching by filters (like aiSearch or cityName), hotel data is automatically included. For direct hotel ID searches, set includeHotelData=true to include hotel names and photos.
Price consistency: Generate a unique sessionId per user search session and include it on every rates request in that session, using the same checkin, and checkout.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | The zip code of the search location. This is a filter on top of the main query. | |
| feed | No | Which rate feed to search. Leave unset to use the default feed. | |
| sort | No | Sorting criteria for the results. Multiple criteria can be provided, processed in order. The default sorting is by top picks (weighted by search popularity, review quality, and content completeness). Use 'revenue' to sort by historical booking value and monetary performance. | |
| limit | No | The maximum number of results to return. Defaults to 200, max allowed is 5000. | |
| offset | No | The number of results to skip for pagination. This paginates the passed hotels not the results returned so the actual returned results will vary. | |
| radius | No | The search radius in meters for location-based searches. Pairs with latitude to do a lat/long search. | |
| stream | No | If true, enables streaming mode where response data is sent incrementally instead of as a single payload. | |
| checkin | Yes | The check-in date in YYYY-MM-DD format (ISO 8601). | |
| placeId | No | The unique Place ID of the search location. Instead of using hotel IDs, pass a Place ID to get all the hotels in the specified region. This is a valid main query. | |
| timeout | No | The maximum time in seconds before the request times out. This is when the live request for rates will cut off responses; it will take a few more ms to return the value. | |
| aiSearch | No | AI-powered hotel search based on a natural language query. Uses semantic search to find hotels matching the query intent. Examples: 'Romantic getaway with Italian vibes in London near the London Eye', 'hotels near Paris'. This is a valid main query. | |
| bedTypes | No | Filter results by bed types extracted from room names. Only rates from rooms matching the specified bed types will be returned. Example values: 'double', 'twin', 'king', 'queen', 'single'. | |
| chainIds | No | An array of hotel chain IDs to filter the search results. This is a filter on top of the main query. | |
| checkout | Yes | The check-out date in YYYY-MM-DD format (ISO 8601). | |
| cityName | No | The name of the city to search for hotels in. Pairs with countryCode to do a country/city search. | |
| currency | Yes | The currency in which the prices will be displayed. | |
| hotelIds | No | An array of hotel IDs to search for availability and pricing. Get them from `get_data_hotels` or `get_data_hotel_search`. | |
| iataCode | No | The IATA code of the search location, typically an airport code. Instead of using hotel IDs, you can search by IATA code. This is a valid main query. | |
| latitude | No | The latitude coordinate for location-based hotel searches. Instead of using hotel IDs, you can search by lat/long and a radius around that spot. This is a valid main query. | |
| boardType | No | Filter results by board type(s). Can be a single value (e.g., 'BI') or comma-separated values (e.g., 'BI,HB') for OR logic. Example values: RO (Room Only), BI (Breakfast Included), HB (Half Board), FB (Full Board), AI (All Inclusive), DI (Dinner Included), LI (Lunch Included), BDI (Breakfast and Dinner Included), BLI (Breakfast and Lunch Included), LDI (Lunch and Dinner Included). | |
| hotelName | No | A case-insensitive search for a hotel's name (e.g., 'Hilton'). | |
| longitude | No | The longitude coordinate for location-based hotel searches. Pairs with latitude to do a lat/long search. | |
| minRating | No | The minimum rating (on a scale of 0-5) required for hotels in search results. This is a filter on top of the main query. | |
| sessionId | No | Optional client-generated session identifier that ensures price consistency for the user's search session. Pass the same `sessionId` with the same `checkin` and `checkout` across related requests in that session. | |
| facilities | No | An array of facility IDs. Results will include hotels with at least one of these facilities by default. This is a filter on top of the main query. | |
| starRating | No | An array of hotel star ratings to include. Ratings are rounded to the nearest half-star (e.g., [3.5, 4.0, 4.5, 5.0]). This is a filter on top of the main query. | |
| countryCode | No | The country code in ISO 2-letter format (e.g., 'SG' for Singapore). Instead of using hotel IDs, you can search by country/city. This is a valid main query. | |
| occupancies | Yes | An array of objects specifying the number of guests per room. Required. | |
| roomMapping | No | Enable room mapping to retrieve the mappedRoomId for each room. This allows you to link a rate to its specific room by combining it with hotel details, providing access to room images and additional information | |
| hotelTypeIds | No | An array of hotel type IDs to filter the search results. This is a filter on top of the main query. | |
| roomAmenities | No | Legacy room-level amenity filter. Only rates from rooms that match the specified amenities will be returned. Use amenityFilterLogic to control flat AND/OR behavior. If roomAmenitiesFilter is provided, it takes precedence over this field. | |
| loyaltyProgram | No | Loyalty program identifier used to request loyalty-eligible rates from supported suppliers. When set, rates that support the program may return member pricing and benefits. | |
| minReviewsCount | No | The minimum number of reviews a hotel must have to be included in results. This is a filter on top of the main query. | |
| guestNationality | Yes | The guest's nationality in ISO 2-letter country code format. | |
| includeHotelData | No | If `true`, includes hotel data (name, main photo, address, rating) in the response even when searching by direct hotel IDs. By default, hotel data is only included when searching by filters (e.g., using `aiSearch`, `countryCode`, `cityName`, etc.). Setting this to `true` enables hotel data inclusion for all search types. | |
| maxRatesPerHotel | No | The number of room rates to return per hotel, sorted by price (cheapest first). Set to 1 to just get the cheapest rate for each hotel, this is helpful for listing pages. Try increasing this if you are missing rate types, and be aware that the cap is applied before room mapping. | |
| amenityFilterLogic | No | Legacy logic applied to roomAmenities. 'AND': room must have all specified amenities. 'OR': room must have at least one specified amenity. Ignored when roomAmenitiesFilter is provided. | |
| refundableRatesOnly | No | If true, only refundable rates (RFN) will be included in the response. | |
| roomAmenitiesFilter | No | Grouped room-level amenity filter. Use '-' for OR within a group and ',' for AND across groups. Example: '1-2,3-4' means (1 OR 2) AND (3 OR 4). If provided, this field takes precedence over roomAmenities and amenityFilterLogic. | |
| loyaltyProgramDetails | No | Loyalty membership details forwarded to supported suppliers to unlock member rates and benefits. Provide one entry per loyalty program membership. | |
| strictFacilityFiltering | No | If enabled, only hotels with all specified facilities will be returned. | |
| advancedAccessibilityOnly | No | If true, only hotels with advanced accessibility features will be returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already covering readOnly/openWorld/idempotent/destructive, the description adds substantial non-obvious behavior: recommended timeout of 6-12s, default limit of 200 (expandable to 5,000), incremental streaming mode, the `sessionId` price-consistency contract, and the caveat that pagination via `offset` skips passed hotels rather than returned results. It also warns that `maxRatesPerHotel` caps before room mapping.
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 markdown structure is front-loaded and scannable, opening with Overview, When to Use, then What You Get. The price-consistency guidance is duplicated across 'Key Features' and the Quick Start tip, and the bullet-heavy formatting makes it longer than strictly necessary, but nearly every line earns its place for a 42-parameter tool.
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 42-param search tool with no output schema, the description compensates with a 'What You Get' section describing rates, room options, booking details, and hotel data. It covers required inputs, location-method alternatives, and performance defaults. Minor gaps remain around response ordering, error behavior, and timeout defaults, but nothing an agent needs to construct a valid call is 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 100%, so the schema already documents all 42 parameters thoroughly. The description mostly restates the required fields and the `includeHotelData` tip rather than adding new semantics; the one genuinely additive piece is the `sessionId` usage pattern (unique per session, reused with the same checkin/checkout). Baseline 3 is appropriate when the schema carries the load.
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 states a specific verb and resource ('Search for hotel rates and availability') and positions the tool precisely as 'your primary endpoint for finding bookable hotel rooms with real-time pricing.' It differentiates itself from data-lookup siblings by noting hotel IDs come from `get_data_hotels` or `get_data_hotel_search`, and it enumerates the search methods it supports.
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 'When to Use' section gives four concrete scenarios (listing pages, detail pages, multi-room bookings, filtering) and the Quick Start names the required fields and the alternative location methods. However, it never explicitly contrasts with the closest sibling, `post_hotels_min_rates`, nor states when not to use this tool, leaving some routing inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_rates_prebookLock hotel rate and get checkout linkAInspect
Overview
Locks the chosen hotel rate and returns the final price, cancellation terms and a checkout link on MAQAMI's website.
When to Use
When the customer has chosen a hotel, room, dates and guests and reviewed the price and cancellation terms.
Quick Start
Pass the offerId from post_hotels_rates exactly as it was returned.
What You Get
prebookId - The locked rate
Final price and cancellation terms - For the customer to review
checkoutUrl -
https://book.maqami.co/booking?prebookId=...
Payment
Bookings are paid and confirmed only on MAQAMI's website. The checkoutUrl opens checkout for this exact rate, where the customer enters guest details, pays securely and receives the confirmation. This tool takes no payment details and does not confirm the booking.
| Name | Required | Description | Default |
|---|---|---|---|
| offerId | Yes | The offerId from post_hotels_rates on this server, passed exactly as returned. | |
| timeout | No | ||
| bedTypeIds | No | An optional array of bed type IDs to specify preferred bed configurations for the rooms being booked. The availability of specific bed types depends on the hotel's inventory. | |
| voucherCode | No | An optional voucher code to apply discounts to the booking. The vouchers API allows creation of these discounts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=false, openWorldHint=true), so the bar is lower. The description adds genuinely useful context the annotations cannot convey: this only locks a rate, takes no payment details, and does not confirm the booking — payment happens on MAQAMI's website via the returned checkoutUrl. It omits any mention of how long a lock survives or expiry 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?
Sectioned with headers (Overview/When to Use/Quick Start/What You Get/Payment) and front-loaded with the core action. The 'What You Get' list is efficient, though the prose is slightly longer than strictly necessary.
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, but the description compensates by enumerating the return payload (prebookId, price, terms, checkoutUrl) and explaining the downstream flow. With annotations covering safety and 75% schema coverage on params, only the undocumented `timeout` leaves a 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?
Schema description coverage is 75%, so bedTypeIds and voucherCode are already documented in the schema. The description reinforces that offerId must come from post_hotels_rates 'exactly as it was returned', adding a real constraint, but the undocumented `timeout` parameter is addressed nowhere. Baseline 3 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 — 'Locks the chosen hotel rate' — and enumerates the exact outputs (final price, cancellation terms, checkout link). It is clearly distinguished from siblings by naming post_hotels_rates as the source of the offerId and get_prebooks_prebookid as the retrieval counterpart.
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 'When to Use' section gives a concrete precondition (customer has chosen hotel, room, dates, guests and reviewed price/terms) and the 'Quick Start' names the upstream tool post_hotels_rates. It does not state when-not to use this or name an alternative prebook path, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
put_bookings_bookingid_amendAmend hotel bookingADestructiveIdempotentInspect
Correct the booking holder's name, email or phone on a confirmed hotel booking, for example to fix a typo.
It does not change dates, rooms or guests. To show the customer prices for other dates or guests, use post_bookings_bookingid_alternative_prebooks.
Pass the bookingId, the email currently on the booking and the corrected holder (firstName, lastName, email, optional phone). Confirm the new details with the customer before calling.
Requires the bookingId and the email used to book: the server only returns or changes a booking when they match.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address currently on the booking, used to verify the customer. A new email goes in holder.email. | ||
| holder | Yes | The corrected booking holder. Send firstName, lastName and email even if only one of them changes. | |
| remarks | No | Optional note for the amendment. | |
| lastName | No | The booking holder's last name, if the customer gives it. Optional. | |
| bookingId | Yes | The booking ID from the booking confirmation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (destructiveHint=true, idempotentHint=true), and the description adds genuinely new behavioral context: the server only changes a booking when bookingId and the original email match, and the agent should confirm new details with the customer before calling. It does not explain what 'destructive' means here (holder data is overwritten and not reversible), which keeps it short of a 5.
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, front-loaded paragraphs: scope of change, alternative tool, then how to call it. Minor redundancy in restating the bookingId/email verification requirement in two places costs it the top mark.
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 mutating tool with no output schema, the description covers scope, exclusions, alternative routing, required inputs and a pre-call confirmation step. Only the consequence of the destructive overwrite is left unspecified.
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 the schema already documents every parameter including the current-vs-new email distinction. The description restates the required triple (bookingId, email, holder) but adds no syntax, format or constraint detail beyond what the schema already provides.
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 (correct), resource (booking holder's name, email or phone) and scope constraint (on a confirmed hotel booking). It explicitly names the sibling it is not (post_bookings_bookingid_alternative_prebooks), so an agent can differentiate without opening schemas.
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 the intended use case ('fix a typo'), explicit exclusions ('does not change dates, rooms or guests'), and a named alternative with the condition that selects it ('to show the customer prices for other dates or guests'). Nothing is left to inference.
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.
3 tool updates
v1.0.10- Changed
get_flights_bookings_bookingid_services2 fields changed- added
Input schema / properties / forceRefreshAdded value: +{ + "description": "Bypass the provider's 15-minute services cache", + "type": "boolean" +} - added
Input schema / properties / includeServicesHistoryAdded value: +{ + "description": "Include non-confirmed bookedServices rows (pending, requested, failed, replaced, dropped). By default only confirmed rows are returned.", + "type": "boolean" +}
- Changed
post_data_hotel_highlights3 fields changed- changed
Input schema / properties / highlights / items / properties / context / descriptionPrevious value: -"Free-text guidance describing what this highlight should emphasise. Treated as topic guidance only; claims not supported by the hotel's data will not be invented."New value: +"Free-text guidance describing what this highlight should emphasise. Treated as topic guidance only; claims not supported by the hotel's data will not be invented. Truncated to 300 characters (10,000 for enterprise accounts)." - changed
Input schema / properties / style / descriptionPrevious value: -"Formatting preferences such as title or description length."New value: +"Formatting preferences such as title or description length. When supplied, these rules override the default title (2-4 words) and description (~180 characters) lengths. Truncated to 200 characters (5,000 for enterprise accounts)." - changed
Input schema / properties / tone / descriptionPrevious value: -"Global writing guidance, e.g. `professional and inviting` or `calm and practical`."New value: +"Global writing guidance, e.g. `professional and inviting` or `calm and practical`. Truncated to 200 characters (5,000 for enterprise accounts)."
- Changed
post_flights_rates6 fields changed- added
Input schema / properties / filters / properties / excludeAirlinesAdded value: +{ + "description": "Exclude airlines (2-character IATA airline codes, case-insensitive): a journey is removed when any of its flights is marketed or operated by one of them (codeshares included), and an offer is removed when one of them is its validating (ticketing) carrier. A leg's own filters.excludeAirlines replaces this list on that leg. Airlines excluded on your account are always excluded in addition to this list.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / legs / items / properties / date / descriptionPrevious value: -"Departure date for this leg (YYYY-MM-DD)"New value: +"Departure date for this leg (YYYY-MM-DD). Must not be more than 11 months from today." - added
Input schema / properties / legs / items / properties / filters / properties / excludeAirlinesAdded value: +{ + "description": "Exclude airlines on this leg only (2-character IATA airline codes, case-insensitive): a journey is removed when a flight on this leg is marketed or operated by one of them. Replaces the top-level filters.excludeAirlines on this leg; airlines excluded on your account are always excluded.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / legs / items / properties / filters / properties / excludeConnectionAirports / descriptionAdded value: +"Exclude layovers at these airports (e.g. IST, DOH)" - added
Input schema / properties / legs / items / properties / filters / properties / excludeOvernight / descriptionAdded value: +"Exclude red-eye flights and overnight layovers" - added
Input schema / properties / legs / items / properties / filters / properties / flightNumbers / descriptionAdded value: +"Filter by flight numbers (e.g. SK500, AF123)"
70 tool updates
v1.0.6- Added
cancel_hotel_booking - Added
cancelExperienceBooking - Removed
chargeFlightExtraCharges - Removed
createExperienceBooking - Removed
delete_Voucher - Removed
get_bookings - Changed
get_bookings_bookingid5 fields changed- changed
Input schema / properties / bookingId / descriptionPrevious value: -"(Required) The unique identifier of the booking you would like to update."New value: +"The unique booking identifier (e.g. '2rSJvdDru')" - added
Input schema / properties / emailAdded value: +{ + "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.", + "type": "string" +} - added
Input schema / properties / lastNameAdded value: +{ + "description": "The booking holder's last name, if the customer gives it. Optional.", + "type": "string" +} - removed
Input schema / properties / timeoutRemoved value: -{ - "description": "request timeout in seconds", - "type": "number" -} - changed
Input schema / requiredPrevious value: -[ - "bookingId" -]New value: +[ + "bookingId", + "email" +]
- Removed
get_bookings_guest_nationality_report - Removed
get_bookings_hotels_sales_report - Removed
get_bookings_source_markets_report - Changed
get_data_hotel_ask1 field changed- changed
Input schema / properties / hotelId / descriptionPrevious value: -"Unique ID of the hotel (liteAPI format)"New value: +"Unique ID of the hotel (MAQAMI format)"
- Changed
get_data_hotel_search1 field changed- added
Input schema / properties / limitAdded value: +{ + "description": "Maximum number of matches to return. Defaults to 5.", + "maximum": 20, + "minimum": 1, + "type": "integer" +}
- Removed
get_data_places - Removed
get_data_places_placeid - Removed
get_data_weather - Removed
get_flights_bookings - Changed
get_flights_bookings_bookingid4 fields changed- changed
Input schema / properties / bookingId / descriptionPrevious value: -"The unique booking identifier"New value: +"The unique flight booking identifier" - added
Input schema / properties / emailAdded value: +{ + "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.", + "type": "string" +} - added
Input schema / properties / lastNameAdded value: +{ + "description": "The booking holder's last name, if the customer gives it. Optional.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "bookingId" -]New value: +[ + "bookingId", + "email" +]
- Changed
get_flights_bookings_bookingid_cancellations3 fields changed- added
Input schema / properties / emailAdded value: +{ + "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.", + "type": "string" +} - added
Input schema / properties / lastNameAdded value: +{ + "description": "The booking holder's last name, if the customer gives it. Optional.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "bookingId" -]New value: +[ + "bookingId", + "email" +]
- Changed
get_flights_bookings_bookingid_services3 fields changed- added
Input schema / properties / emailAdded value: +{ + "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.", + "type": "string" +} - added
Input schema / properties / lastNameAdded value: +{ + "description": "The booking holder's last name, if the customer gives it. Optional.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "bookingId" -]New value: +[ + "bookingId", + "email" +]
- Removed
get_guests - Removed
get_guests_guestid - Removed
get_guests_guestid_bookings - Removed
get_guests_guestid_loyalty_points - Removed
get_guests_guestid_vouchers - Removed
get_loyalties - Changed
get_prebooks_prebookid1 field changed- removed
Input schema / properties / includeCreditBalanceRemoved value: -{ - "description": "Whether to include updated credit balance information with the prebook.", - "type": "string" -}
- Removed
get_supply_customization - Removed
get_vouchers - Removed
get_vouchers_history - Removed
get_vouchers_voucherid - Changed
getExperienceBooking4 fields changed- changed
Input schema / properties / bookingId / descriptionPrevious value: -"Dispatcher booking ID returned from POST /experiences/bookings"New value: +"MAQAMI experience booking ID from the booking confirmation" - added
Input schema / properties / emailAdded value: +{ + "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.", + "type": "string" +} - added
Input schema / properties / lastNameAdded value: +{ + "description": "The booking holder's last name, if the customer gives it. Optional.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "bookingId" -]New value: +[ + "bookingId", + "email" +]
- Added
getExperienceBookingCancelPreview - Removed
getExperienceTour - Removed
getExperienceTourAvailability - Removed
getExperienceTourBookingOptions - Removed
getExperienceTourReviews - Removed
getFlightPrebook - Removed
getPriceIndexCity - Removed
getPriceIndexHotels - Removed
getPublicPrice - Changed
listBookings7 fields changed- removed
Input schema / properties / clientReferenceRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / customTagsRemoved value: -{ - "description": "Filter by customTags. Comma-separated `KEY:VALUE` pairs (e.g. `SOURCE:GOOGLE,TIER:GOLD`); all pairs are joined with AND. Keys must match `^[A-Z0-9_-]+$`, up to 5 keys, value up to 255 characters. Value matching is case-insensitive.", - "type": "string" -} - added
Input schema / properties / emailAdded value: +{ + "description": "The email address used to make the bookings.", + "type": "string" +} - removed
Input schema / properties / guestIdRemoved value: -{ - "type": "string" -} - added
Input schema / properties / lastNameAdded value: +{ + "description": "The booking holder's last name.", + "type": "string" +} - removed
Input schema / properties / timeoutRemoved value: -{ - "description": "request timeout in seconds", - "type": "number" -} - added
Input schema / requiredAdded value: +[ + "email", + "lastName" +]
- Removed
post_analytics_hotels - Removed
post_analytics_markets - Removed
post_analytics_report - Removed
post_analytics_weekly - Changed
post_bookings_bookingid_alternative_prebooks3 fields changed- added
Input schema / properties / emailAdded value: +{ + "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.", + "type": "string" +} - added
Input schema / properties / lastNameAdded value: +{ + "description": "The booking holder's last name, if the customer gives it. Optional.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "bookingId", - "occupancies" -]New value: +[ + "bookingId", + "email", + "occupancies" +]
- Removed
post_commissions_report - Changed
post_data_hotel_highlights1 field changed- changed
Input schema / properties / hotelId / descriptionPrevious value: -"Unique ID of the hotel (liteAPI format)"New value: +"Unique ID of the hotel (MAQAMI format)"
- Removed
post_flights_bookings - Changed
post_flights_bookings_bookingid_cancellations4 fields changed- changed
Input schema / properties / bookingId / descriptionPrevious value: -"The unique booking identifier"New value: +"The flight booking identifier to cancel" - added
Input schema / properties / emailAdded value: +{ + "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.", + "type": "string" +} - added
Input schema / properties / lastNameAdded value: +{ + "description": "The booking holder's last name, if the customer gives it. Optional.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "bookingId" -]New value: +[ + "bookingId", + "email" +]
- Removed
post_flights_prebooks - Removed
post_flights_prebooks_prebookid_services - Changed
post_flights_rates2 fields changed- changed
Input schema / properties / filters / properties / maxStops / descriptionPrevious value: -"Maximum number of stops: -1 or omit = any, 0 = nonstop, 1 = 1 or fewer, 2 = 2 or fewer"New value: +"Maximum number of stops: -1 or omit = any, 0 = genuinely non-stop, 1 = 1 or fewer, 2 = 2 or fewer. Stops include both connections between segments and en-route technical stops inside a segment (segments[].stopCount), so a single flight number with a technical landing is excluded by maxStops: 0." - added
Input schema / properties / legs / items / properties / filters / properties / maxStops / descriptionAdded value: +"Max stops for this leg. Counts connections between segments and en-route technical stops inside a segment (segments[].stopCount); 0 = genuinely non-stop."
- Removed
post_guests_guestid_loyalty_points_redeem - Changed
post_hotels_rates5 fields changed- changed
Input schema / properties / feed / descriptionPrevious value: -"Which feed to use when searching for rates. This applies only to accounts with multiple feeds enabled"New value: +"Which rate feed to search. Leave unset to use the default feed." - changed
Input schema / properties / hotelIds / descriptionPrevious value: -"An array of hotel IDs to search for availability and pricing. These are usually pulled from https://docs.liteapi.travel/reference/get_data-hotels."New value: +"An array of hotel IDs to search for availability and pricing. Get them from `get_data_hotels` or `get_data_hotel_search`." - removed
Input schema / properties / marginRemoved value: -{ - "description": "Override the markup percentage for this specific request. When provided, this value takes precedence over your account-level margin setting, allowing you to dynamically adjust pricing based on your business logic, customer segments, or other factors. Specified as a percentage number (e.g., `10` for 10% commission).", - "type": "number" -} - changed
Input schema / properties / maxRatesPerHotel / descriptionPrevious value: -"The number of room rates to return per hotel, sorted by price (cheapest first). Set to 1 to just get the cheapest rate for each hotel, this is helpful for listing pages."New value: +"The number of room rates to return per hotel, sorted by price (cheapest first). Set to 1 to just get the cheapest rate for each hotel, this is helpful for listing pages. Try increasing this if you are missing rate types, and be aware that the cap is applied before room mapping." - changed
Input schema / properties / sessionId / descriptionPrevious value: -"Optional client-generated session identifier that ensures price consistency for the user's search session. When your account has price consistency enabled, pass the same `sessionId` with the same `checkin` and `checkout` across related requests in that session. Has no effect when price consistency is not enabled for your account."New value: +"Optional client-generated session identifier that ensures price consistency for the user's search session. Pass the same `sessionId` with the same `checkin` and `checkout` across related requests in that session."
- Removed
post_rates_book - Changed
post_rates_prebook6 fields changed- removed
Input schema / properties / addonsRemoved value: -{ - "description": "A list of additional services or extras that can be added to the booking. For example, adding an Uber voucher or an esim card. The final booking amount is the sum of the offer's total price and the cost of any addons. Each addon's price is added individually to reflect all extras in the billed total. ", - "items": { - "additionalProperties": false, - "properties": { - "addon": { - "description": "The type of addon service (e.g., uber, esimply).", - "type": "string" - }, - "addonDetails": { - "additionalProperties": false, - "properties": { - "destination_code": { - "description": " Short code representing the destination or country (e.g., ES for Spain)", - "type": "string" - }, - "end_date": { - "description": "The end date for the add-on service (YYYY-MM-DD format)", - "type": "string" - }, - "package_id": { - "description": "Unique identifier of the addon package", - "type": "integer" - }, - "start_date": { - "description": "The start date for the add-on service (YYYY-MM-DD format)", - "type": "string" - } - }, - "type": "object" - }, - "currency": { - "description": "The currency in which the addon service is charged", - "type": "string" - }, - "value": { - "description": "The monetary cost of the addon service", - "type": "number" - } - }, - "type": "object" - }, - "type": "array" -} - removed
Input schema / properties / includeCreditBalanceRemoved value: -{ - "description": "Optional flag to include credit line information in the response. When set to true, credit line details will be returned if the user has a credit line available.", - "type": "boolean" -} - changed
Input schema / properties / offerId / descriptionPrevious value: -"The unique identifier of the selected offer from the search results."New value: +"The offerId from post_hotels_rates on this server, passed exactly as returned." - removed
Input schema / properties / paymentRemoved value: -{ - "additionalProperties": false, - "description": "Optional payment configuration when usePaymentSdk is true", - "properties": { - "descriptorSuffix": { - "description": "Suffix appended to the Stripe payment descriptor (visible on customer's bank statement)", - "type": "string" - }, - "gateway": { - "description": "Payment gateway when using partner Stripe keys. Only STRIPE is supported.", - "type": "string" - }, - "paymentMethodConfiguration": { - "description": "Stripe Payment Method Configuration ID (pmc_...) controlling which payment methods Payment Element presents. Must exist on the Stripe account that owns the PaymentIntent (LiteAPI or partner when useOwnSecretKey is true).", - "type": "string" - }, - "useOwnSecretKey": { - "description": "When true, create the PaymentIntent on the partner's Stripe account (requires configured Stripe keys).", - "type": "boolean" - } - }, - "type": "object" -} - removed
Input schema / properties / usePaymentSdkRemoved value: -{ - "description": "Specifies whether the fields needed to call the payment processing SDK are returned. Set to true if using the SDK for payment processing.", - "type": "boolean" -} - changed
Input schema / requiredPrevious value: -[ - "offerId", - "usePaymentSdk" -]New value: +[ + "offerId" +]
- Removed
post_rates_rebook - Removed
post_vouchers - Removed
prebookExperienceTour - Removed
prechargeFlightExtraCharges - Removed
put_bookings_bookingid - Changed
put_bookings_bookingid_amend10 fields changed- changed
Input schema / properties / bookingId / descriptionPrevious value: -"(Required) The unique identifier of the booking to amend."New value: +"The booking ID from the booking confirmation." - added
Input schema / properties / emailAdded value: +{ + "description": "The email address currently on the booking, used to verify the customer. A new email goes in holder.email.", + "type": "string" +} - added
Input schema / properties / holder / descriptionAdded value: +"The corrected booking holder. Send firstName, lastName and email even if only one of them changes." - changed
Input schema / properties / holder / properties / email / descriptionPrevious value: -"The new email address of the booking holder."New value: +"The holder's email address." - changed
Input schema / properties / holder / properties / firstName / descriptionPrevious value: -"The new first name of the booking holder."New value: +"The holder's first name." - changed
Input schema / properties / holder / properties / lastName / descriptionPrevious value: -"The new last name of the booking holder."New value: +"The holder's last name." - changed
Input schema / properties / holder / properties / phone / descriptionPrevious value: -"The new phone number of the booking holder."New value: +"The holder's phone number." - added
Input schema / properties / lastNameAdded value: +{ + "description": "The booking holder's last name, if the customer gives it. Optional.", + "type": "string" +} - changed
Input schema / properties / remarks / descriptionPrevious value: -"Optional remarks for the amendment request."New value: +"Optional note for the amendment." - changed
Input schema / requiredPrevious value: -[ - "bookingId", - "holder" -]New value: +[ + "bookingId", + "email", + "holder" +]
- Removed
put_loyalties - Removed
put_supply_customization - Removed
put_vouchers_id - Removed
put_vouchers_id_status - Removed
searchBookings - Removed
searchExperienceTours - Removed
searchFlightsMatrix
89 tool updates
v0.1.0- First observed
chargeFlightExtraCharges - First observed
createExperienceBooking - First observed
delete_Voucher - First observed
get_bookings - First observed
get_bookings_bookingid - First observed
get_bookings_guest_nationality_report - First observed
get_bookings_hotels_sales_report - First observed
get_bookings_source_markets_report - First observed
get_data_chains - First observed
get_data_cities - First observed
get_data_countries - First observed
get_data_currencies - First observed
get_data_facilities - First observed
get_data_flights_airlines - First observed
get_data_flights_airlines_iatas - First observed
get_data_flights_airlines_iatas_iatacode - First observed
get_data_flights_airports - First observed
get_data_flights_airports_iatas - First observed
get_data_flights_airports_iatas_iatacode - First observed
get_data_hotel - First observed
get_data_hotel_ask - First observed
get_data_hotel_search - First observed
get_data_hotels - First observed
get_data_hotels_room_search - First observed
get_data_hotels_semantic_search - First observed
get_data_hoteltypes - First observed
get_data_iatacodes - First observed
get_data_languages - First observed
get_data_places - First observed
get_data_places_placeid - First observed
get_data_reviews - First observed
get_data_weather - First observed
get_flights_bookings - First observed
get_flights_bookings_bookingid - First observed
get_flights_bookings_bookingid_cancellations - First observed
get_flights_bookings_bookingid_services - First observed
get_guests - First observed
get_guests_guestid - First observed
get_guests_guestid_bookings - First observed
get_guests_guestid_loyalty_points - First observed
get_guests_guestid_vouchers - First observed
get_loyalties - First observed
get_prebooks_prebookid - First observed
get_supply_customization - First observed
get_vouchers - First observed
get_vouchers_history - First observed
get_vouchers_voucherid - First observed
getExperienceBooking - First observed
getExperienceTour - First observed
getExperienceTourAvailability - First observed
getExperienceTourBookingOptions - First observed
getExperienceTourReviews - First observed
getFlightPrebook - First observed
getHotelTaxSchema - First observed
getPriceIndexCity - First observed
getPriceIndexHotels - First observed
getPublicPrice - First observed
listBookings - First observed
post_analytics_hotels - First observed
post_analytics_markets - First observed
post_analytics_report - First observed
post_analytics_weekly - First observed
post_bookings_bookingid_alternative_prebooks - First observed
post_commissions_report - First observed
post_data_hotel_highlights - First observed
post_flights_bookings - First observed
post_flights_bookings_bookingid_cancellations - First observed
post_flights_prebooks - First observed
post_flights_prebooks_prebookid_services - First observed
post_flights_rates - First observed
post_flights_verify - First observed
post_guests_guestid_loyalty_points_redeem - First observed
post_hotels_min_rates - First observed
post_hotels_rates - First observed
post_rates_book - First observed
post_rates_prebook - First observed
post_rates_rebook - First observed
post_vouchers - First observed
prebookExperienceTour - First observed
prechargeFlightExtraCharges - First observed
put_bookings_bookingid - First observed
put_bookings_bookingid_amend - First observed
put_loyalties - First observed
put_supply_customization - First observed
put_vouchers_id - First observed
put_vouchers_id_status - First observed
searchBookings - First observed
searchExperienceTours - First observed
searchFlightsMatrix
TDQS
Scored across 41 tools
Several hotel-discovery/search tools overlap in purpose (get_data_hotels, get_data_hotel_search, get_data_hotels_semantic_search, get_data_hotels_room_search), and many reference-data endpoints are similarly named. Descriptions do distinguish most cases, but an agent could still misselect among the hotel search and data-lookup options.
The tool set mixes long snake_case/path-style names (e.g., get_flights_bookings_bookingid_cancellations, post_bookings_bookingid_alternative_prebooks) with camelCase names (listBookings, getExperienceBooking, cancelExperienceBooking, getHotelTaxSchema). There is no single predictable verb_noun convention across the set.
41 tools is heavy for a coherent MCP surface, even for a travel domain spanning hotels, flights, experiences, and reference data. Many endpoints are granular reference-data lookups rather than core workflows, making the set feel over-expanded.
Hotel and flight booking lifecycles are fairly well represented, including search, prebook/verify, lookup, cancellation, and ancillary services. However, experiences have only lookup/cancel tools with no search or create path, flight bookings lack a list-by-email endpoint, and several workflows intentionally end at external MAQAMI checkout pages.
Maintenance
Related MCP Connectors
Search and book 3M+ hotels in 200+ countries. Agents pay per reservation in USDC on Base over x402. Hosted, no auth.
Hotel direct booking for VIP and corporate rates - upgrades and loyalty eligible, 100K+ hotels
Book real hotel and resort stays from any AI agent: all-in pricing, hosted Stripe checkout, no key.
Hotel booking MCP server. Search, book, and manage reservations across 250K+ properties worldwide.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI agents to search, browse, and book hotels from a database of 2 million properties worldwide. Provides comprehensive hotel search capabilities with location lookup, filtering by amenities, detailed property information, and integrated booking functionality.69 npm1ISC
- AlicenseAqualityCmaintenanceHotel booking MCP server — the first transaction-complete hotel booking integration for AI agents. Search 300K+ properties in 140+ countries, get live rates and room details, and generate secure checkout URLs. No payment in the AI conversation — guests complete booking at a hosted checkout page and receive a real hotel confirmation number. Set your own booking fee via Stripe Connect.816 npm3-

DIDA Hotel MCPofficial
AlicenseNot gradedqualityBmaintenanceEnables AI agents to search, compare, and book hotels with real-time pricing and availability, supporting multiple location types, star ratings, and price filters.11MIT
Dida Hotel MCPofficial
AlicenseNot gradedqualityDmaintenanceEnables AI agents to search and book hotels globally with real-time pricing and inventory from over 2 million properties.46MIT