Skip to main content
Glama

MAQAMI Travel MCP Server

Official MCP Registry npm version License: MIT Transport: Streamable HTTP MAQAMI Travel MCP server on Glama

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 mcp add --transport http maqami-travel https://mcp.maqami.co/

Claude Desktop (one click)

Download maqami-travel.mcpb and open it (steps)

Any stdio client (npm)

npx -y maqami-travel as the server command (config); Node.js 18+

claude.ai, Claude Desktop and Claude mobile

Customize → Connectors → Add custom connector, URL https://mcp.maqami.co/, No sign in. Works on the Free plan (steps)

Cursor

Add to Cursor (one click), or add "maqami-travel": { "url": "https://mcp.maqami.co/" } to mcp.json

VS Code

Install in VS Code (one click), or code --add-mcp '{"name":"maqami-travel","type":"http","url":"https://mcp.maqami.co/"}'

Windsurf

Add "maqami-travel": { "serverUrl": "https://mcp.maqami.co/" } to mcp_config.json

Gemini CLI

gemini extensions install https://github.com/negm17111995/mcp-server

OpenAI Codex

codex mcp add maqami-travel --url https://mcp.maqami.co/

ChatGPT

Developer mode → create an app with URL https://mcp.maqami.co/ and No Authentication (steps and plans)

OpenAI Agents SDK

MCPServerStreamableHttp(name="MAQAMI Travel", params={"url": "https://mcp.maqami.co/"})

LangChain

MCPAdapter("https://mcp.maqami.co/") from langchain.mcp (example)

n8n

MCP Client Tool node, endpoint https://mcp.maqami.co/, HTTP Streamable, no authentication (steps)

Cline

MCP Servers → Remote Servers, URL https://mcp.maqami.co/, Streamable HTTP

LM Studio

Add "maqami-travel": { "url": "https://mcp.maqami.co/" } to mcp.json, or use the install link

Booking skill only (Claude Code, Codex, Cursor and other skill-aware agents)

npx skills add negm17111995/mcp-server

Any other client

Streamable HTTP at https://mcp.maqami.co/ with no auth, or npx -y maqami-travel for stdio-only clients

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:

  1. Go to Customize → Connectors.

  2. Click + Add, then Add custom connector.

  3. Enter the name MAQAMI Travel and the URL https://mcp.maqami.co/, then click Continue.

  4. 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.

  1. Download maqami-travel.mcpb.

  2. Open the file, or drag it into Claude Desktop under Settings → Extensions.

  3. 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@maqami

Cursor

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%3D

Local 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.

  1. Open Settings → Security and login and turn on Developer mode.

  2. Open Plugins, select the + button and create a developer-mode app.

  3. Enter the name MAQAMI Travel and the URL https://mcp.maqami.co/, and choose No Authentication.

  4. 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-server

Or 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

  1. Add an AI Agent node to your workflow.

  2. Under Tools, add an MCP Client Tool node.

  3. 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.

  4. Under Tools to Include, pick the tools your workflow needs, or keep All.

Other Streamable HTTP clients

Setting

Value

URL

https://mcp.maqami.co/

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 checkin, checkout, occupancies, currency, guestNationality and one location field (cityName with countryCode, latitude and longitude, iataCode, hotelIds or aiSearch). To find a hotel by name, call get_data_hotels with hotelName and countryCode, then search by hotelIds. Each rate has an offerId.

post_hotels_rates

2. Show details

Description, amenities, photos and reviews for the hotels the user is interested in

get_data_hotel, get_data_reviews

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 offerId, passed exactly as the search returned it, and returns a prebookId with the final price, the cancellation terms and a checkoutUrl

post_rates_prebook

5. Checkout

Give the customer the checkoutUrl (https://book.maqami.co/booking?prebookId=...) to enter guest details and pay

(your agent)

Flight booking flow

Step

What happens

Tool (example)

1. Find airports

Resolve cities to IATA airport codes

get_data_flights_airports

2. Search flights

Live offers. Needs legs (each with origin, destination and date), adults and currency. One leg for one-way, two for a round trip. Also returns searchUrl, the same search on book.maqami.co.

post_flights_rates

3. Verify

Confirms an offerId is still available and returns the latest price, baggage, fare rules and a checkoutUrl for that offer. Offers expire (see expiration); if one is gone, search again.

post_flights_verify

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 checkoutUrl (https://book.maqami.co/flights/booking?offerId=...) promptly; the fare is held for a limited time

(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 checkoutUrl from 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 limit and maxRatesPerHotel on hotel searches and filters on flight searches. get_data_facilities, get_data_chains, get_data_iatacodes and get_data_cities return whole reference lists, so call them only when you need an ID from them; find airports with get_data_flights_airports instead.

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 test

The 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

index.js

npm stdio bridge to the hosted endpoint

server.json

Official MCP Registry entry

gemini-extension.json, GEMINI.md

Gemini CLI extension and its context file

.claude-plugin/plugin.json, .mcp.json

Claude Code plugin

.claude-plugin/marketplace.json

Claude Code plugin marketplace (maqami)

.codex-plugin/plugin.json, assets/logo-512.png

Codex plugin and its icon

plugin.json, mcp.json

Agent Plugins manifest

mcpb/manifest.json, scripts/build-mcpb.sh

Claude Desktop extension (npm run build:mcpb writes dist/maqami-travel.mcpb)

skills/maqami-travel-booking/SKILL.md

Booking skill bundled with the plugins

glama.json

Glama directory metadata

AGENTS.md, llms.txt

Short guides for coding agents and LLM tools

test/

Bridge tests against a local mock server, and manifest consistency checks (npm test)

.github/workflows/

CI (npm test on every pull request) and the release workflow that publishes to npm and the Official MCP Registry

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

MIT

Support

Questions or issues: info@maqami.co or open an issue.

Available Tools

41 tools
cancelExperienceBookingCancel tour bookingA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address used to make the booking. The server checks it against the booking before returning or changing anything.
lastNameNoThe booking holder's last name, if the customer gives it. Optional.
bookingIdYesMAQAMI experience booking ID from the booking confirmation

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 bookingA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address used to make the booking. The server checks it against the booking before returning or changing anything.
lastNameNoThe booking holder's last name, if the customer gives it. Optional.
bookingIdYesThe unique booking identifier to cancel

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 bookingA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address used to make the booking. The server checks it against the booking before returning or changing anything.
lastNameNoThe booking holder's last name, if the customer gives it. Optional.
bookingIdYesThe unique booking identifier (e.g. '2rSJvdDru')

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 chainsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 citiesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNorequest timeout in seconds
countryCodeYesCountry code in iso-2 format (example: SG)

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness2/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 countriesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNorequest timeout in seconds

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness2/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 currenciesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNorequest timeout in seconds

TDQS

A4/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 facilitiesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 airlinesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch query (e.g., 'AA' or 'American')
limitNoMaximum number of results
allianceNoFilter by airline alliance
activeOnlyNoOnly return currently active airlines

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 codesA
Read-onlyIdempotent
Inspect

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 activeOnly parameter

Quick Start

Call with no parameters to get all airline IATA codes and names. Use activeOnly=true to filter out inactive airlines.

ParametersJSON Schema
NameRequiredDescriptionDefault
activeOnlyNoOnly return currently active airlines

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 codeA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
iataCodeYes2-letter IATA airline code (e.g., AA)

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 airportsA
Read-onlyIdempotent
Inspect

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[].origin and legs[].destination in post_flights_rates

  • City 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesSearch query (minimum 2 characters, e.g., 'JFK' or 'New York')

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 codesA
Read-onlyIdempotent
Inspect

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 q query 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesSearch query

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 codeA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
iataCodeYes3-letter IATA airport code (e.g., JFK)

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 detailsC
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hotelIdYesUnique ID of a hotel
timeoutNorequest timeout in seconds
languageNoThe language code, indicating in which language the results should be returned. e.g. 'fr'
advancedAccessibilityOnlyNoIf `true`, accessibility section will be returned

TDQS

C2.9/5.0
Behavior3/5

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.

Conciseness2/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 hotelA
Read-onlyIdempotent
Inspect

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 allowWebSearch to get additional information from the web

  • Hotel 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe question to ask about the hotel
hotelIdYesUnique ID of the hotel (MAQAMI format)
allowWebSearchNoWhether to allow web search for additional information. Default is false.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 hotelsB
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
zipNoZIP code of the location
limitNoSpecifies 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
offsetNoSpecifies the number of rows to skip before starting to return rows
radiusNoradius in meters (min 1000m)
placeIdNoUnique 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.
timeoutNorequest timeout in seconds
aiSearchNoSearch 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'
chainIdsNoComma-separated list of hotel chain ids. e.g. '14675,14677'
cityNameNoName of the city
hotelIdsNoComma-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.
languageNoThe language code, indicating in which language the results should be returned. e.g. 'fr'
latitudeNoLatitude geo coordinates
hotelNameNoName of the hotel (loose match, case-insensitive, e.g. 'hilton')
longitudeNoLongitude geo coordinates
minRatingNoMinimum rating of the hotel. e.g. 8.6
starRatingNoComma-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'
countryCodeNoCountry code ISO-2 code - example (SG)
facilityIdsNoComma-separated list of facilities. e.g. '1,2,3'
hotelTypeIdsNoComma-separated list of hotel types. e.g. '201,204,208'
lastUpdatedAtNoRetrieve only the hotels that have been updated since the provided date and time (using the RFC3339 format)
minReviewsCountNoMinimum number of reviews. e.g. 100
advancedAccessibilityOnlyNoIf `true`, only hotels with advanced accessibility will be returned
strictFacilitiesFilteringNoIf `true`, only hotels with all the specified facilities will be returned

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_hoteltypesList hotel typesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 codesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNorequest timeout in seconds

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 languagesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 reviewsB
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoSpecifies 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
offsetNoSpecifies the number of reviews to skip, defaults to 0
hotelIdYesUnique ID of a hotel
timeoutNorequest timeout in seconds
languageNoISO 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.
getSentimentNoIf set to true, an AI sentiment analysis of the last 1000 reviews will be returned

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness2/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 bookingA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address used to make the booking. The server checks it against the booking before returning or changing anything.
lastNameNoThe booking holder's last name, if the customer gives it. Optional.
bookingIdYesMAQAMI experience booking ID from the booking confirmation

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 cancellation
Read-onlyIdempotent
Inspect

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 cancelled

  • policy - 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address used to make the booking. The server checks it against the booking before returning or changing anything.
lastNameNoThe booking holder's last name, if the customer gives it. Optional.
bookingIdYesMAQAMI experience booking ID from the booking confirmation
get_flights_bookings_bookingidGet flight bookingA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address used to make the booking. The server checks it against the booking before returning or changing anything.
lastNameNoThe booking holder's last name, if the customer gives it. Optional.
bookingIdYesThe unique flight booking identifier

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 statusA
Read-onlyIdempotent
Inspect

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 flags

  • refund / penalty — Aggregate amounts with margin applied. refund is the potential maximum the airline may refund — not a granted/guaranteed amount

  • penalties[] — Itemised penalty breakdown when available

  • tickets[] — Per-ticket detail when available

  • destination — Where the refund goes

  • vouchers[] — Airline travel vouchers / credit-shells when destination is voucher; omitted when absent. Distinct from MAQAMI discount voucherCode on 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address used to make the booking. The server checks it against the booking before returning or changing anything.
lastNameNoThe booking holder's last name, if the customer gives it. Optional.
bookingIdYesThe unique booking identifier

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 extras
Read-onlyIdempotent
Inspect

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 encoded serviceIds

  • bookedServices - Services already attached to the booking; entries booked through the API carry the exact price that was charged at attach time

  • expiresAt - 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address used to make the booking. The server checks it against the booking before returning or changing anything.
lastNameNoThe booking holder's last name, if the customer gives it. Optional.
bookingIdYesThe unique booking identifier
forceRefreshNoBypass the provider's 15-minute services cache
includeServicesHistoryNoInclude non-confirmed bookedServices rows (pending, requested, failed, replaced, dropped). By default only confirmed rows are returned.
getHotelTaxSchemaGet hotel tax rulesA
Read-onlyIdempotent
Inspect

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, payAtProperty and validity dates

ParametersJSON Schema
NameRequiredDescriptionDefault
hotelIdYesUnique identifier of the hotel, in 'lp' format or numeric.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 rateA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
prebookIdYes(Required) The unique identifier of the prebook session.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 nameA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address used to make the bookings.
lastNameYesThe booking holder's last name.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

  1. The system searches for live availability at the same hotel with the new parameters.

  2. Up to maxPrebooks alternative rates are selected (sorted by price ascending). Defaults to 3 when omitted; capped at 10 (any larger value is silently clamped to 10).

  3. A prebook session is created for each rate.

  4. The caller receives a list of prebookId values with prices to show the guest.

What You Get

  • Up to maxPrebooks prebook sessions — Each with a prebookId, final pricing, cancellation policies, and room details

  • Price comparison — priceDifferencePercent shows how each alternative compares to the original booking's selling price (negative = cheaper than what the guest paid, positive = more expensive)

  • Policy change flags — cancellationChanged and boardChanged highlight 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

  1. Call this endpoint with the bookingId and new occupancies/dates — get back up to maxPrebooks prebookId values.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address used to make the booking. The server checks it against the booking before returning or changing anything.
checkinNoThe new check-in date in YYYY-MM-DD format. Must be before `checkout`.
checkoutNoThe new check-out date in YYYY-MM-DD format. Must be after `checkin`.
lastNameNoThe booking holder's last name, if the customer gives it. Optional.
boardTypeNoFilter results by board/meal-plan type (e.g. `RO` for Room Only, `BB` for Bed & Breakfast). Leave empty to return all board types.
bookingIdYes(Required) The unique identifier of the confirmed booking to amend.
maxPrebooksNoMaximum 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.
occupanciesYesThe desired room occupancies for the amended stay. One entry per room.
refundableRatesOnlyNoWhen true, only fully refundable alternative rates are returned. Defaults to false (or true if the original booking was refundable).

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 highlights
Read-only
Inspect

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, style and per-highlight context

What You Get

  • Exactly count highlights, always, in the requested order

  • type echoed back from the request so you can map each card to your own UI

  • generated indicating 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).

ParametersJSON Schema
NameRequiredDescriptionDefault
toneNoGlobal writing guidance, e.g. `professional and inviting` or `calm and practical`. Truncated to 200 characters (5,000 for enterprise accounts).
countNoNumber of highlights to generate. If `highlights` is supplied, `count` must equal its length.
styleNoFormatting 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).
hotelIdYesUnique ID of the hotel (MAQAMI format)
languageYesLanguage code. Highlights are generated directly in this language.
highlightsNoPer-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 bookingA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address used to make the booking. The server checks it against the booking before returning or changing anything.
lastNameNoThe booking holder's last name, if the customer gives it. Optional.
bookingIdYesThe flight booking identifier to cancel

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 flights
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
legsYesOrdered itinerary legs (provider SearchLeg). One-way: one entry. Round-trip: outbound then inbound. Multi-city / open-jaw: additional legs in travel order.
sortNoSort options for results
adultsYesNumber of adults (12+)
countryNoOptional ISO 3166-1 alpha-2 country code for point of sale
filtersNoOptional filters to refine search results
infantsNoNumber of infants (<2)
childrenNoNumber of children (2-11)
currencyYesISO 4217 currency code
cabinClassNoCabin class (provider SearchFilters codes only). Same enum as filters.cabinClass.
infantAgesNoAge of each infant (under 2, per IATA). Length must equal infants count. Optional — omit if ages are not relevant.
childrenAgesNoAge 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 linkA
Read-only
Inspect

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-readable messages, and pricing (old / new full OfferPricing) instead of deprecated scalar currency/prices

  • Journey pricing — original (provider/PCC) and display (customer) price breakdown per provider FlattenedJourney

  • Fare 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
offerIdYesThe offerId from the search results

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 pricesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
checkinYesCheck in date in YYYY-MM-DD (ISO 8601) format
timeoutNoRequest timeout in seconds
checkoutYesCheck out date in YYYY-MM-DD (ISO 8601) format
currencyYesBooking currency
hotelIdsYesList of hotel IDs
occupanciesYes
guestNationalityYesGuest nationality (ISO 2-code)

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness2/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ratesA
Read-only
Inspect

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 sessionId ensures 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
zipNoThe zip code of the search location. This is a filter on top of the main query.
feedNoWhich rate feed to search. Leave unset to use the default feed.
sortNoSorting 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.
limitNoThe maximum number of results to return. Defaults to 200, max allowed is 5000.
offsetNoThe number of results to skip for pagination. This paginates the passed hotels not the results returned so the actual returned results will vary.
radiusNoThe search radius in meters for location-based searches. Pairs with latitude to do a lat/long search.
streamNoIf true, enables streaming mode where response data is sent incrementally instead of as a single payload.
checkinYesThe check-in date in YYYY-MM-DD format (ISO 8601).
placeIdNoThe 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.
timeoutNoThe 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.
aiSearchNoAI-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.
bedTypesNoFilter 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'.
chainIdsNoAn array of hotel chain IDs to filter the search results. This is a filter on top of the main query.
checkoutYesThe check-out date in YYYY-MM-DD format (ISO 8601).
cityNameNoThe name of the city to search for hotels in. Pairs with countryCode to do a country/city search.
currencyYesThe currency in which the prices will be displayed.
hotelIdsNoAn array of hotel IDs to search for availability and pricing. Get them from `get_data_hotels` or `get_data_hotel_search`.
iataCodeNoThe 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.
latitudeNoThe 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.
boardTypeNoFilter 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).
hotelNameNoA case-insensitive search for a hotel's name (e.g., 'Hilton').
longitudeNoThe longitude coordinate for location-based hotel searches. Pairs with latitude to do a lat/long search.
minRatingNoThe minimum rating (on a scale of 0-5) required for hotels in search results. This is a filter on top of the main query.
sessionIdNoOptional 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.
facilitiesNoAn 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.
starRatingNoAn 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.
countryCodeNoThe 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.
occupanciesYesAn array of objects specifying the number of guests per room. Required.
roomMappingNoEnable 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
hotelTypeIdsNoAn array of hotel type IDs to filter the search results. This is a filter on top of the main query.
roomAmenitiesNoLegacy 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.
loyaltyProgramNoLoyalty program identifier used to request loyalty-eligible rates from supported suppliers. When set, rates that support the program may return member pricing and benefits.
minReviewsCountNoThe minimum number of reviews a hotel must have to be included in results. This is a filter on top of the main query.
guestNationalityYesThe guest's nationality in ISO 2-letter country code format.
includeHotelDataNoIf `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.
maxRatesPerHotelNoThe 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.
amenityFilterLogicNoLegacy 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.
refundableRatesOnlyNoIf true, only refundable rates (RFN) will be included in the response.
roomAmenitiesFilterNoGrouped 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.
loyaltyProgramDetailsNoLoyalty membership details forwarded to supported suppliers to unlock member rates and benefits. Provide one entry per loyalty program membership.
strictFacilityFilteringNoIf enabled, only hotels with all specified facilities will be returned.
advancedAccessibilityOnlyNoIf true, only hotels with advanced accessibility features will be returned.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
offerIdYesThe offerId from post_hotels_rates on this server, passed exactly as returned.
timeoutNo
bedTypeIdsNoAn 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.
voucherCodeNoAn optional voucher code to apply discounts to the booking. The vouchers API allows creation of these discounts

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 bookingA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address currently on the booking, used to verify the customer. A new email goes in holder.email.
holderYesThe corrected booking holder. Send firstName, lastName and email even if only one of them changes.
remarksNoOptional note for the amendment.
lastNameNoThe booking holder's last name, if the customer gives it. Optional.
bookingIdYesThe booking ID from the booking confirmation.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 3 tool updatesv1.0.10
    • Changedget_flights_bookings_bookingid_services2 fields changed
      • addedInput schema / properties / forceRefresh
        Added value: +{
        +  "description": "Bypass the provider's 15-minute services cache",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / includeServicesHistory
        Added value: +{
        +  "description": "Include non-confirmed bookedServices rows (pending, requested, failed, replaced, dropped). By default only confirmed rows are returned.",
        +  "type": "boolean"
        +}
    • Changedpost_data_hotel_highlights3 fields changed
      • changedInput schema / properties / highlights / items / properties / context / description
        Previous 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)."
      • changedInput schema / properties / style / description
        Previous 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)."
      • changedInput schema / properties / tone / description
        Previous 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)."
    • Changedpost_flights_rates6 fields changed
      • addedInput schema / properties / filters / properties / excludeAirlines
        Added 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"
        +}
      • changedInput schema / properties / legs / items / properties / date / description
        Previous 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."
      • addedInput schema / properties / legs / items / properties / filters / properties / excludeAirlines
        Added 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"
        +}
      • addedInput schema / properties / legs / items / properties / filters / properties / excludeConnectionAirports / description
        Added value: +"Exclude layovers at these airports (e.g. IST, DOH)"
      • addedInput schema / properties / legs / items / properties / filters / properties / excludeOvernight / description
        Added value: +"Exclude red-eye flights and overnight layovers"
      • addedInput schema / properties / legs / items / properties / filters / properties / flightNumbers / description
        Added value: +"Filter by flight numbers (e.g. SK500, AF123)"
  2. 70 tool updatesv1.0.6
    • Addedcancel_hotel_booking
    • AddedcancelExperienceBooking
    • RemovedchargeFlightExtraCharges
    • RemovedcreateExperienceBooking
    • Removeddelete_Voucher
    • Removedget_bookings
    • Changedget_bookings_bookingid5 fields changed
      • changedInput schema / properties / bookingId / description
        Previous value: -"(Required) The unique identifier of the booking you would like to update."New value: +"The unique booking identifier (e.g. '2rSJvdDru')"
      • addedInput schema / properties / email
        Added value: +{
        +  "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.",
        +  "type": "string"
        +}
      • addedInput schema / properties / lastName
        Added value: +{
        +  "description": "The booking holder's last name, if the customer gives it. Optional.",
        +  "type": "string"
        +}
      • removedInput schema / properties / timeout
        Removed value: -{
        -  "description": "request timeout in seconds",
        -  "type": "number"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "bookingId"
        -]New value: +[
        +  "bookingId",
        +  "email"
        +]
    • Removedget_bookings_guest_nationality_report
    • Removedget_bookings_hotels_sales_report
    • Removedget_bookings_source_markets_report
    • Changedget_data_hotel_ask1 field changed
      • changedInput schema / properties / hotelId / description
        Previous value: -"Unique ID of the hotel (liteAPI format)"New value: +"Unique ID of the hotel (MAQAMI format)"
    • Changedget_data_hotel_search1 field changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Maximum number of matches to return. Defaults to 5.",
        +  "maximum": 20,
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Removedget_data_places
    • Removedget_data_places_placeid
    • Removedget_data_weather
    • Removedget_flights_bookings
    • Changedget_flights_bookings_bookingid4 fields changed
      • changedInput schema / properties / bookingId / description
        Previous value: -"The unique booking identifier"New value: +"The unique flight booking identifier"
      • addedInput schema / properties / email
        Added value: +{
        +  "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.",
        +  "type": "string"
        +}
      • addedInput schema / properties / lastName
        Added value: +{
        +  "description": "The booking holder's last name, if the customer gives it. Optional.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "bookingId"
        -]New value: +[
        +  "bookingId",
        +  "email"
        +]
    • Changedget_flights_bookings_bookingid_cancellations3 fields changed
      • addedInput schema / properties / email
        Added value: +{
        +  "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.",
        +  "type": "string"
        +}
      • addedInput schema / properties / lastName
        Added value: +{
        +  "description": "The booking holder's last name, if the customer gives it. Optional.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "bookingId"
        -]New value: +[
        +  "bookingId",
        +  "email"
        +]
    • Changedget_flights_bookings_bookingid_services3 fields changed
      • addedInput schema / properties / email
        Added value: +{
        +  "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.",
        +  "type": "string"
        +}
      • addedInput schema / properties / lastName
        Added value: +{
        +  "description": "The booking holder's last name, if the customer gives it. Optional.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "bookingId"
        -]New value: +[
        +  "bookingId",
        +  "email"
        +]
    • Removedget_guests
    • Removedget_guests_guestid
    • Removedget_guests_guestid_bookings
    • Removedget_guests_guestid_loyalty_points
    • Removedget_guests_guestid_vouchers
    • Removedget_loyalties
    • Changedget_prebooks_prebookid1 field changed
      • removedInput schema / properties / includeCreditBalance
        Removed value: -{
        -  "description": "Whether to include updated credit balance information with the prebook.",
        -  "type": "string"
        -}
    • Removedget_supply_customization
    • Removedget_vouchers
    • Removedget_vouchers_history
    • Removedget_vouchers_voucherid
    • ChangedgetExperienceBooking4 fields changed
      • changedInput schema / properties / bookingId / description
        Previous value: -"Dispatcher booking ID returned from POST /experiences/bookings"New value: +"MAQAMI experience booking ID from the booking confirmation"
      • addedInput schema / properties / email
        Added value: +{
        +  "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.",
        +  "type": "string"
        +}
      • addedInput schema / properties / lastName
        Added value: +{
        +  "description": "The booking holder's last name, if the customer gives it. Optional.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "bookingId"
        -]New value: +[
        +  "bookingId",
        +  "email"
        +]
    • AddedgetExperienceBookingCancelPreview
    • RemovedgetExperienceTour
    • RemovedgetExperienceTourAvailability
    • RemovedgetExperienceTourBookingOptions
    • RemovedgetExperienceTourReviews
    • RemovedgetFlightPrebook
    • RemovedgetPriceIndexCity
    • RemovedgetPriceIndexHotels
    • RemovedgetPublicPrice
    • ChangedlistBookings7 fields changed
      • removedInput schema / properties / clientReference
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / customTags
        Removed 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"
        -}
      • addedInput schema / properties / email
        Added value: +{
        +  "description": "The email address used to make the bookings.",
        +  "type": "string"
        +}
      • removedInput schema / properties / guestId
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / lastName
        Added value: +{
        +  "description": "The booking holder's last name.",
        +  "type": "string"
        +}
      • removedInput schema / properties / timeout
        Removed value: -{
        -  "description": "request timeout in seconds",
        -  "type": "number"
        -}
      • addedInput schema / required
        Added value: +[
        +  "email",
        +  "lastName"
        +]
    • Removedpost_analytics_hotels
    • Removedpost_analytics_markets
    • Removedpost_analytics_report
    • Removedpost_analytics_weekly
    • Changedpost_bookings_bookingid_alternative_prebooks3 fields changed
      • addedInput schema / properties / email
        Added value: +{
        +  "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.",
        +  "type": "string"
        +}
      • addedInput schema / properties / lastName
        Added value: +{
        +  "description": "The booking holder's last name, if the customer gives it. Optional.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "bookingId",
        -  "occupancies"
        -]New value: +[
        +  "bookingId",
        +  "email",
        +  "occupancies"
        +]
    • Removedpost_commissions_report
    • Changedpost_data_hotel_highlights1 field changed
      • changedInput schema / properties / hotelId / description
        Previous value: -"Unique ID of the hotel (liteAPI format)"New value: +"Unique ID of the hotel (MAQAMI format)"
    • Removedpost_flights_bookings
    • Changedpost_flights_bookings_bookingid_cancellations4 fields changed
      • changedInput schema / properties / bookingId / description
        Previous value: -"The unique booking identifier"New value: +"The flight booking identifier to cancel"
      • addedInput schema / properties / email
        Added value: +{
        +  "description": "The email address used to make the booking. The server checks it against the booking before returning or changing anything.",
        +  "type": "string"
        +}
      • addedInput schema / properties / lastName
        Added value: +{
        +  "description": "The booking holder's last name, if the customer gives it. Optional.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "bookingId"
        -]New value: +[
        +  "bookingId",
        +  "email"
        +]
    • Removedpost_flights_prebooks
    • Removedpost_flights_prebooks_prebookid_services
    • Changedpost_flights_rates2 fields changed
      • changedInput schema / properties / filters / properties / maxStops / description
        Previous 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."
      • addedInput schema / properties / legs / items / properties / filters / properties / maxStops / description
        Added value: +"Max stops for this leg. Counts connections between segments and en-route technical stops inside a segment (segments[].stopCount); 0 = genuinely non-stop."
    • Removedpost_guests_guestid_loyalty_points_redeem
    • Changedpost_hotels_rates5 fields changed
      • changedInput schema / properties / feed / description
        Previous 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."
      • changedInput schema / properties / hotelIds / description
        Previous 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`."
      • removedInput schema / properties / margin
        Removed 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"
        -}
      • changedInput schema / properties / maxRatesPerHotel / description
        Previous 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."
      • changedInput schema / properties / sessionId / description
        Previous 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."
    • Removedpost_rates_book
    • Changedpost_rates_prebook6 fields changed
      • removedInput schema / properties / addons
        Removed 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"
        -}
      • removedInput schema / properties / includeCreditBalance
        Removed 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"
        -}
      • changedInput schema / properties / offerId / description
        Previous 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."
      • removedInput schema / properties / payment
        Removed 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"
        -}
      • removedInput schema / properties / usePaymentSdk
        Removed 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"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "offerId",
        -  "usePaymentSdk"
        -]New value: +[
        +  "offerId"
        +]
    • Removedpost_rates_rebook
    • Removedpost_vouchers
    • RemovedprebookExperienceTour
    • RemovedprechargeFlightExtraCharges
    • Removedput_bookings_bookingid
    • Changedput_bookings_bookingid_amend10 fields changed
      • changedInput schema / properties / bookingId / description
        Previous value: -"(Required) The unique identifier of the booking to amend."New value: +"The booking ID from the booking confirmation."
      • addedInput schema / properties / email
        Added value: +{
        +  "description": "The email address currently on the booking, used to verify the customer. A new email goes in holder.email.",
        +  "type": "string"
        +}
      • addedInput schema / properties / holder / description
        Added value: +"The corrected booking holder. Send firstName, lastName and email even if only one of them changes."
      • changedInput schema / properties / holder / properties / email / description
        Previous value: -"The new email address of the booking holder."New value: +"The holder's email address."
      • changedInput schema / properties / holder / properties / firstName / description
        Previous value: -"The new first name of the booking holder."New value: +"The holder's first name."
      • changedInput schema / properties / holder / properties / lastName / description
        Previous value: -"The new last name of the booking holder."New value: +"The holder's last name."
      • changedInput schema / properties / holder / properties / phone / description
        Previous value: -"The new phone number of the booking holder."New value: +"The holder's phone number."
      • addedInput schema / properties / lastName
        Added value: +{
        +  "description": "The booking holder's last name, if the customer gives it. Optional.",
        +  "type": "string"
        +}
      • changedInput schema / properties / remarks / description
        Previous value: -"Optional remarks for the amendment request."New value: +"Optional note for the amendment."
      • changedInput schema / required
        Previous value: -[
        -  "bookingId",
        -  "holder"
        -]New value: +[
        +  "bookingId",
        +  "email",
        +  "holder"
        +]
    • Removedput_loyalties
    • Removedput_supply_customization
    • Removedput_vouchers_id
    • Removedput_vouchers_id_status
    • RemovedsearchBookings
    • RemovedsearchExperienceTours
    • RemovedsearchFlightsMatrix
  3. 89 tool updatesv0.1.0
    • First observedchargeFlightExtraCharges
    • First observedcreateExperienceBooking
    • First observeddelete_Voucher
    • First observedget_bookings
    • First observedget_bookings_bookingid
    • First observedget_bookings_guest_nationality_report
    • First observedget_bookings_hotels_sales_report
    • First observedget_bookings_source_markets_report
    • First observedget_data_chains
    • First observedget_data_cities
    • First observedget_data_countries
    • First observedget_data_currencies
    • First observedget_data_facilities
    • First observedget_data_flights_airlines
    • First observedget_data_flights_airlines_iatas
    • First observedget_data_flights_airlines_iatas_iatacode
    • First observedget_data_flights_airports
    • First observedget_data_flights_airports_iatas
    • First observedget_data_flights_airports_iatas_iatacode
    • First observedget_data_hotel
    • First observedget_data_hotel_ask
    • First observedget_data_hotel_search
    • First observedget_data_hotels
    • First observedget_data_hotels_room_search
    • First observedget_data_hotels_semantic_search
    • First observedget_data_hoteltypes
    • First observedget_data_iatacodes
    • First observedget_data_languages
    • First observedget_data_places
    • First observedget_data_places_placeid
    • First observedget_data_reviews
    • First observedget_data_weather
    • First observedget_flights_bookings
    • First observedget_flights_bookings_bookingid
    • First observedget_flights_bookings_bookingid_cancellations
    • First observedget_flights_bookings_bookingid_services
    • First observedget_guests
    • First observedget_guests_guestid
    • First observedget_guests_guestid_bookings
    • First observedget_guests_guestid_loyalty_points
    • First observedget_guests_guestid_vouchers
    • First observedget_loyalties
    • First observedget_prebooks_prebookid
    • First observedget_supply_customization
    • First observedget_vouchers
    • First observedget_vouchers_history
    • First observedget_vouchers_voucherid
    • First observedgetExperienceBooking
    • First observedgetExperienceTour
    • First observedgetExperienceTourAvailability
    • First observedgetExperienceTourBookingOptions
    • First observedgetExperienceTourReviews
    • First observedgetFlightPrebook
    • First observedgetHotelTaxSchema
    • First observedgetPriceIndexCity
    • First observedgetPriceIndexHotels
    • First observedgetPublicPrice
    • First observedlistBookings
    • First observedpost_analytics_hotels
    • First observedpost_analytics_markets
    • First observedpost_analytics_report
    • First observedpost_analytics_weekly
    • First observedpost_bookings_bookingid_alternative_prebooks
    • First observedpost_commissions_report
    • First observedpost_data_hotel_highlights
    • First observedpost_flights_bookings
    • First observedpost_flights_bookings_bookingid_cancellations
    • First observedpost_flights_prebooks
    • First observedpost_flights_prebooks_prebookid_services
    • First observedpost_flights_rates
    • First observedpost_flights_verify
    • First observedpost_guests_guestid_loyalty_points_redeem
    • First observedpost_hotels_min_rates
    • First observedpost_hotels_rates
    • First observedpost_rates_book
    • First observedpost_rates_prebook
    • First observedpost_rates_rebook
    • First observedpost_vouchers
    • First observedprebookExperienceTour
    • First observedprechargeFlightExtraCharges
    • First observedput_bookings_bookingid
    • First observedput_bookings_bookingid_amend
    • First observedput_loyalties
    • First observedput_supply_customization
    • First observedput_vouchers_id
    • First observedput_vouchers_id_status
    • First observedsearchBookings
    • First observedsearchExperienceTours
    • First observedsearchFlightsMatrix

TDQS

B3.3/5.0

Scored across 41 tools

Disambiguation3/5

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.

Naming Consistency2/5

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.

Tool Count2/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    6
    9 npm
    1
    ISC
  • A
    license
    A
    quality
    C
    maintenance
    Hotel 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.
    8
    16 npm
    3
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to search, compare, and book hotels with real-time pricing and availability, supporting multiple location types, star ratings, and price filters.
    11
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to search and book hotels globally with real-time pricing and inventory from over 2 million properties.
    46
    MIT