viajante
Viajante is a no-API-key travel search server that finds flights, hotels, and trip options from live providers (Google Flights/Hotels, Booking.com, Skiplagged) and returns evidence-backed results for agents and users.
Flights:
search_flightsfor named routes/dates (one-way, round-trip, multi-city) with filters for cabin, stops, bags, layovers, times, airlines, and price caps.Date flexibility:
search_datesfor the cheapest day across a window (up to 31 days) andsearch_flexfor ±N days around a target date.Destination discovery:
search_explorefinds priced destinations from an origin.Hidden-city fares:
search_hidden_city(opt-in) checks Skiplagged for a named route/date.Hotels:
search_hotelsreturns total-stay quotes with cancellation terms, location, ratings, and optional distance filtering; supports batching multiple stays in one call.Hotel rooms:
search_hotel_roomsreturns Skiplagged room-level rates and occupancy limits for 1–3 named finalists.Combined trips:
search_tripsearches flights and a hotel stay together in one request.Awards & points:
compare_awardscomputes cents-per-point for a named award offer;lookup_transfersreturns a card-to-program transfer table.Itinerary validation:
validate_itinerarychecks selected offers against their original query locally.Stay planning math:
plan_stay_blocksgroups consecutive nights by people;split_stay_costssplits stay totals and fees among sleepers.Answer verification:
verify_answerflags amounts, codes, dates, or links in a draft that no recorded search returned.Airport lookup:
lookup_airportsresolves airport/metro codes offline.Runtime info:
get_runtime_inforeports installed package, Python, and hotel schema versions offline.
Searches Google Flights and Google Hotels for flight and hotel availability, prices, itinerary details, and links, including date comparison, flexible date, explore, and combined flight-plus-hotel searches.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@viajanteFind cheap hotels in Tokyo for two adults next week."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Flight and hotel search for your terminal, Python, and AI assistants. Runs on your machine, no API keys.
Website · Usage guide · Architecture · Changelog
It reads Google Flights, Google Hotels, and Booking.com directly, and Skiplagged when you opt in. It returns prices, itinerary details, and links. It reports what the provider returned and says so when something is unknown; it never invents a fare.
Quick start
Requires Python 3.10+.
pip install viajante
viajante flights JFK-LHR:2026-11-15 --fetch sweep
viajante hotels London 2026-11-15 2026-11-20 --currency GBP --source googleUse future dates. Not sure of a code? viajante airports london.
Prefer not to install? uvx --from viajante viajante airports JFK, or
npx -y -p @viajante/mcp viajante airports JFK (both need uv).
These searches use plain HTTP. Booking.com and --fetch detail need the
browser extra.
Related MCP server: FlightTicketMCP
Connect an AI assistant
Add this to your assistant's MCP configuration (needs
uv and Python 3.10+):
{
"mcpServers": {
"viajante": {
"command": "npx",
"args": ["-y", "@viajante/mcp"]
}
}
}Without Node, use "command": "uvx" with
"args": ["--from", "viajante[mcp]", "viajante-mcp"]. That covers Google
Flights and Hotels with no Chromium. The npm entry also includes the browser
extra, which search_explore needs.
Then ask in plain language:
Find a seven-night round trip from BOS to LHR, departing any day in November 2026. Compare the dates.
Hotels in Tokyo, November 12 to 16, two adults, free cancellation, in JPY.
Every tool result (except lookup_airports) carries one envelope: status,
completeness, empty_reason, retry_after, observed_at. Only
empty_reason: provider_empty means the provider found nothing. A client that
only takes a URL can use viajante-mcp --transport streamable-http; it has no
auth, so keep it on loopback (details).
Tool | What it does |
| One-way, round-trip, or multi-city flights |
| Cheapest fare per departure date in a window |
| Dates around a target, then flights for the cheapest day |
| Destinations from an origin, with a priced shortlist |
| Stays with total-stay prices and cancellation terms |
| Skiplagged room rates for one named hotel |
| A hotel offer from this session, plus an optional room quote |
| Flights and hotel together, summed when compatible |
| Opt-in separately ticketed itineraries (connections not protected) |
| Opt-in Skiplagged hidden-city fares |
| One fresh search to re-check an earlier offer |
| Check a proposed itinerary against search evidence |
| Cents-per-point math for a named award offer |
| Points transfer-partner table |
| Airport and metro codes, offline |
| Group consecutive nights with the same people |
| Split stay totals among who slept there |
| Flag amounts, codes, dates, or links no search returned |
| Prices this machine recorded for a query (opt-in) |
| Re-run a saved search and report the change |
| Installed version, offline |
| Long operational guide |
Command line
Run viajante <command> --help for options. Add --save FILE to write a JSON report.
Command | Purpose |
| Specific routes and dates ( |
| Cheapest departure day across a window of up to 31 days |
| A few days either side of a target date |
| Destinations from an origin airport |
| Google Hotels, Booking.com, or Skiplagged |
| Flights and a hotel stay in one request |
| Re-check a saved offer against a fresh search |
| Find airport codes |
| Skiplagged fares, award value, transfer partners |
| Recorded prices and saved re-runs (opt-in) |
| Open a prefilled GitHub issue (viajante sends nothing itself) |
viajante dates BOS-LHR --from 2026-11-01 --to 2026-11-30 --nights 7Python
from viajante import get_flights
report = get_flights("JFK-LHR:2026-11-15", fetch="sweep", top=5)
for result in report.queries:
if result.status == "ok":
for offer in result.offers:
print(offer.price, report.currency, offer.airline, offer.duration)
else:
print(result.error)FlightQuery, HotelQuery, and the search_* functions are exported too;
see the Python examples.
Optional browser support
pip install 'viajante[browser]'
playwright install chromiumFor uvx, use viajante[mcp,browser] in --from and install Chromium from
that same environment.
Good to know
Currency. Taken from
--currency, or from a named origin airport's country. Hotels always need one. Viajante never converts between currencies.Baggage.
--carry-onasks Google to price one carry-on. Checked bags (--bags) are refused, because no transport can verify them.--baggage-bufferonly affects ranking; it is not a quoted fee.Hotels. Prices are for the whole stay. Free cancellation is required unless you opt out. Google rates 0–5, Booking.com 0–10.
Recommendation. Flight results may include a short
recommendationblock. It adds to the offer list and never replaces it.Price level. Flight results may include Google's own price level (
low,typical, orhigh) from the results page already fetched. It is Google's label for that price against its typical range.--price-historyadds the page's price history. No extra request.Unknown stays unknown. Missing fields are left out or marked unknown.
Travel sites change their pages, block requests, and update prices at any time. Confirm the final fare, baggage, hotel total, and cancellation terms with the provider before you book.
Contributing
Bug reports and focused pull requests are welcome; see CONTRIBUTING.md.
License
MIT. Independent project, not affiliated with Google, Booking.com, or any airline. Use of those services is subject to their terms: Google, Booking.com.
Available Tools
22 toolscompare_awardsCompare award to cashARead-onlyIdempotent
Compare a named award offer to cash locally. Does not invent seats.
offer must include origin, destination, departure_date, program, points, and evidence. confirmed evidence needs a named source. Unnamed cash_price omits cpp_cents. Do not treat estimated or user_supplied as live inventory.
| Name | Required | Description | Default |
|---|---|---|---|
| offer | Yes | ||
| balances | No | ||
| currency | No | ||
| cash_price | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely new behavior: it computes locally, it 'does not invent seats', it distinguishes confirmed vs estimated/user_supplied evidence, and it discloses an output rule ('unnamed cash_price omits cpp_cents'). That is meaningful extra context, though it doesn't address edge cases like what happens with an invalid or unverifiable offer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight paragraphs with the core purpose front-loaded and constraints following. The telegraphic style ('Does not invent seats', 'Unnamed cash_price omits cpp_cents') is dense but every clause adds a rule; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is correctly omitted, and the description covers the complex nested input and evidence semantics that the schema can't express. It falls short only on balances/currency semantics and on how evidence tiers map to the resulting comparison, minor gaps for a read-only, idempotent tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the required 'offer' param is an opaque object with additionalProperties:true, so the description carries real weight by enumerating required offer keys (origin, destination, departure_date, program, points, evidence) and the evidence-source rule. It partially covers cash_price ('unnamed cash_price omits cpp_cents') but says nothing about balances or currency, leaving two of four parameters undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (compare a named award offer to cash) and adds a scope qualifier ('locally'), which tells the agent the computation is offline and no live inventory is fetched. No sibling tool in the list performs award-vs-cash comparison, so differentiation is implicit rather than stated, keeping this just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives input-validity rules ('offer must include origin, destination, departure_date, program, points, and evidence', 'confirmed evidence needs a named source') and a caution ('Do not treat estimated or user_supplied as live inventory'), which implies when the tool is appropriate. However, it never says when to choose this over recheck_offer, verify_answer, or other siblings, so usage is inferred rather than instructed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_guideOperational guideARead-onlyIdempotent
The long operational guide (markdown); the same text as the viajante://guide resource.
For clients that do not read MCP resources. Returns {"guide": markdown}. Local; may run during a search.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| guide | Yes | |
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and non-open-world behavior, so the safety profile is covered. The description adds genuinely new context: it is local, returns a {"guide": markdown} payload, and 'may run during a search' — a hint about possible invocation timing, though that phrase is vague and never explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded: identity/equivalence first, then the audience condition, then the return shape. The trailing fragment 'Local; may run during a search' is terse to the point of ambiguity, which costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with an output schema and full annotation coverage, the description supplies everything essential: what it returns, the resource equivalent, and the client condition. The only incompleteness is the unexplained 'may run during a search' behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to document; the schema is empty and fully covered. Baseline of 4 applies since no parameter ambiguity exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies exactly what is returned: the long operational guide as markdown, equivalent to the viajante://guide resource. No sibling tool serves a comparable purpose, so there is nothing to disambiguate against, but the retrieval verb is only implicit and the guide's subject matter is not stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit selection condition: 'For clients that do not read MCP resources,' which implies the resource is the preferred path when available. That is clear when-to-use guidance, though it does not say what to do for clients that do read resources or note any other constraints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hotel_detailsHotel finalist detailsARead-onlyIdempotent
Read a hotel offer this process returned. room_rates must be a boolean.
False returns the stored quote, does not search, and may run during another search. True asks Skiplagged for a separate USD room quote and takes the one-search lock. That quote is not the original stay when the city matches more than one place, the returned coordinates do not match the hotel, or the provider echoes different adults, rooms, or dates (occupancy_mismatch, dates_mismatch, property_mismatch). A missing echo is echo unknown. When the provider does not echo adults, rooms, and dates, a returned quote is partial. A read does not evict stored searches. Unknown or evicted ids send nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| room_rates | No | ||
| selection_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint/idempotent/openWorld), the description discloses a lot the structured fields do not: lock acquisition on the expensive path, the mismatch conditions (occupancy_mismatch, dates_mismatch, property_mismatch), echo-unknown and partial-quote semantics, and that reads do not evict stored searches while unknown/evicted ids return nothing. This is unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body collapses into long run-on sentences ('That quote is not the original stay when the city matches more than one place, the returned coordinates do not match...'), which makes the mismatch rules harder to parse than necessary. Information-dense but structurally weak.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the annotations plus description cover the safety profile and edge cases well. The remaining gap is the provenance/format of selection_id, which matters because it is the only required parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the load, and it does explain room_rates thoroughly (default false, cost/lock implications of true). However selection_id is only hinted at via 'this process returned' and is never defined as the id from a prior search result, leaving one of two parameters underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Read a hotel offer this process returned') and scopes it to offers already produced by the search flow, which implicitly separates it from the search_* siblings. It is clear, but it never names a sibling (e.g. recheck_offer, search_hotel_rooms) to reinforce the boundary, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit operating conditions for the room_rates flag: false returns the stored quote, does not search, and may run during another search; true requests a separate USD quote and takes the one-search lock. That is clear when-to-use guidance, though it never states when NOT to call this at all versus using a sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_runtime_infoRuntime infoARead-onlyIdempotent
Offline executing package, Python and hotel schema versions.
Check before searches; an npm MCP does not upgrade a separate uv tool installation. May run during a search. No network or personal paths.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, closed-world behavior, so the bar is lower; the description still adds two facts beyond them — "No personal paths" (no path leakage in the response) and "May run during a search" (concurrency safety). "No network" partially duplicates openWorldHint=false, so this is value-add rather than fully new coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short, and the resource list is front-loaded, but the terse telegraphic style leaves the middle sentence ("an npm MCP does not upgrade a separate uv tool installation") cryptic in isolation. Every sentence is relevant, yet the structure costs clarity that a few more words would have bought cheaply.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and there are no parameters to document. For a trivial zero-arg diagnostics call, the description supplies purpose, timing, and side-effect profile — everything needed to invoke it correctly, with only the interpretation of the version results left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to compensate for. No parameter semantics are needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact resources returned — the executing package version, Python version, and hotel schema version — which pins the purpose despite the fragmentary, verb-less phrasing. It is clearly distinct from every sibling, which are all search/lookup/validation tools, though it never explicitly says so. An agent can tell what it gets without opening the output schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Check before searches" gives explicit timing guidance, and the npm/uv sentence explains why a version check matters (an npm-installed MCP won't upgrade a separate uv tool install). "May run during a search" also reassures that call placement is flexible. It stops short of saying what to do with the version output, but for a zero-arg diagnostic tool this is solid context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_airportsLook up airportsDRead-onlyIdempotent
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Tool has no description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tool has no description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has no description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Tool has no description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tool has no description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_transfersLook up point transfersCRead-onlyIdempotent
Local card-to-program transfer table. Not live award availability.
| Name | Required | Description | Default |
|---|---|---|---|
| points | Yes | ||
| program | Yes | ||
| balances | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description's one real addition is the staleness caveat 'Local ... not live', which usefully warns the agent the data is static, but it says nothing about freshness dates, coverage of programs, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two very short sentences with no padding, and the disqualifying condition is front-loaded. The first sentence is a verbless fragment, which slightly hurts readability but not economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, but for a 3-parameter tool with zero schema descriptions the description supplies no parameter meaning and only the barest usage boundary. It is not complete enough to invoke confidently without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description explains no parameters at all. 'balances' in particular is undocumented and non-obvious (an optional array, semantics unknown), and there is no hint about the units or format expected for 'points' or 'program'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The fragment 'Local card-to-program transfer table' identifies the resource (credit-card-to-loyalty-program transfer ratios) but never states an action verb and never names or contrasts the closest sibling, compare_awards. An agent must infer from the title that this performs a lookup rather than, say, a comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Not live award availability' gives one negative boundary, implicitly routing live-award questions elsewhere, but no alternative tool is named and the positive use case ('when you need static transfer ratios') is only implied. Reasonable but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_stay_blocksPlan stay blocksARead-onlyIdempotent
Local: group consecutive nights with the same people into blocks.
roster maps each night (YYYY-MM-DD, the night that starts that day) to the names sleeping. Nights must be consecutive. Each block gives check_in, check_out, nights, headcount and people, so one search_hotels stay per block can use headcount as adults. Never decides where anyone sleeps.
| Name | Required | Description | Default |
|---|---|---|---|
| roster | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/local safety. Description adds behavioral constraints: nights must be consecutive, roster key format (night-start date), output block fields, and 'Never decides where anyone sleeps' clarifies scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then necessary detail on input, output, and constraint. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a local, single-parameter planning tool with an output schema, the description supplies input format, output block fields, constraints, and scope boundary. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and there is 1 nested parameter. The description compensates by defining roster as a date→names mapping with YYYY-MM-DD night-start keys and consecutive-night requirement, though it doesn't specify every edge case (e.g., empty arrays).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'group' and resource 'consecutive nights' with scope 'same people into blocks'. The 'Local:' prefix and downstream reference to search_hotels distinguish it from search siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: use this to produce blocks so one search_hotels stay per block can use headcount as adults. Does not explicitly state when not to use or name alternative planning tools, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
price_historyPrice historyARead-onlyIdempotent
Local read of prices this machine observed (opt-in: VIAJANTE_PRICE_HISTORY=1 in the server environment). One exact query in one currency is a series: first_seen, last_seen, lowest, highest, and the change since the previous observation. One observation reports no trend. Currencies are never merged or converted, and nothing is forecast. route is ORIGIN-DEST; date matches a departure, return, check-in or check-out; location names a hotel stay. An unreadable log gives read_error and series null: unknown, not empty. May run during a search.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| kind | No | ||
| limit | No | ||
| route | No | ||
| currency | No | ||
| location | No | ||
| query_key | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, and the description adds genuinely new behavioral facts on top of that: the environment opt-in requirement, the no-conversion/no-forecast guarantees, the failure mode (unreadable log yields read_error with series null), and the crucial distinction that null means unknown rather than empty. That is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core identity and the opt-in constraint are front-loaded, and nearly every clause carries a distinct fact (scope, series shape, single-observation behavior, currency rule, null semantics). The telegraphic 'route is ORIGIN-DEST; date matches...' style is efficient, though the clipped phrasing costs a little readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-field explanation is not strictly required, yet the description helpfully characterizes the series anyway and covers the failure/null semantics an agent needs for correct interpretation. The remaining hole is the undocumented kind/limit/query_key parameters, which is the one thing an agent could still get wrong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the whole burden, and it defines four of seven parameters: route as ORIGIN-DEST, date as matching a departure/return/check-in/check-out, location as a hotel stay, and currency via the never-merged/never-converted rule. It is silent on kind, limit, and query_key, leaving a substantial part of the surface undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — a local read of price observations recorded on this machine — and scopes it precisely with the opt-in environment flag and the per-series shape (first_seen, last_seen, lowest, highest, change). It implicitly separates itself from search_flights/search_hotels (live search) and watch_price (forward-looking) by insisting nothing is forecast and nothing is merged or converted, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It discloses a real precondition (VIAJANTE_PRICE_HISTORY=1 must be set) and the interpretive rule that a single observation yields no trend, plus the note that it may run during a search. However there is no explicit routing advice — no statement of when to prefer this over watch_price or a fresh search, nor what to do when the log is disabled. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recheck_offerRe-check offerARead-onlyIdempotent
Re-check an earlier flight offer with one fresh Google Flights search (never the replay cache). offer is a prior search_flights offer, or a {query, offer} row, or enough of one: price plus every segment's flight_number, origin, destination and departure clock. query defaults to the offer's evidence query and is replayed (cabin, stops, bags, airline filters). A price_cap is not sent; a break is reported in filter_violations. Read the outcome: check_failed means the check did not run, never that the offer is gone. Confirm the price on the provider's page; this is not a booking guarantee. Full rules: get_guide.
| Name | Required | Description | Default |
|---|---|---|---|
| fetch | No | ||
| offer | Yes | ||
| proxy | No | ||
| query | No | ||
| country | No | ||
| currency | No | ||
| allow_substitute | No | ||
| allow_loose_match | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive/open-world, yet the description adds substantial behavior the annotations cannot: a fresh search is always performed (never the replay cache), a price_cap is intentionally omitted with breaks surfaced in filter_violations, and critically that check_failed means the check did not run rather than the offer being gone. It also disclaims that this is not a booking guarantee.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded, with the core action and the freshness constraint stated first. Every sentence carries information, though the middle clauses are telegraphic and would benefit from slightly clearer separation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained; the description instead supplies the interpretation of the check_failed outcome, which is the non-obvious part. For an 8-param tool it delegates full rules to get_guide, which is reasonable, and covers the primary call path adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 8 parameters, so the description must compensate. It richly explains the two key inputs — offer (required fields: price plus each segment's flight_number, origin, destination, departure clock) and query (defaults to the offer's evidence query, replayed with cabin/stops/bags/airline filters) — but leaves fetch, proxy, country, currency, allow_substitute, and allow_loose_match entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (re-check) and resource (an earlier flight offer) with a precise scope: one fresh Google Flights search, never the replay cache. This cleanly distinguishes it from search_flights, which the description explicitly references as the source of the offer being re-checked.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Establishes the context of use (re-validating a prior search_flights offer) and what input qualifies as an offer, including the minimum fields needed. It does not name a sibling to use instead for other scenarios, but the 'earlier offer' framing makes the triggering condition clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_datesCheapest-dates calendarARead-onlyIdempotent
Cheapest-per-day calendar for one named route, up to 31 days. route is ORIGIN-DEST; start and end are ISO dates. Use search_flex for +/-N around one date. This calendar is HTTP only and has no fetch mode. If it returns blocked, stop: do not switch to a browser or follow with search_flex or search_flights. Currency and country as in search_flights. Viajante does not convert.
deadline_seconds stops starting queries after that many seconds; unfinished
queries are error code deadline (not loaded, not empty). See get_guide.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| via | No | ||
| bags | No | ||
| sort | No | ||
| trip | No | one-way | |
| cabin | No | economy | |
| proxy | No | ||
| route | Yes | ||
| start | Yes | ||
| adults | No | ||
| nearby | No | ||
| nights | No | ||
| country | No | ||
| airlines | No | ||
| alliance | No | ||
| carry_on | No | ||
| children | No | ||
| currency | No | ||
| max_stops | No | ||
| price_cap | No | ||
| exclude_via | No | ||
| max_layover | No | ||
| min_layover | No | ||
| depart_after | No | ||
| max_duration | No | ||
| no_overnight | No | ||
| arrive_before | No | ||
| depart_window | No | ||
| baggage_buffer | No | ||
| infants_on_lap | No | ||
| infants_in_seat | No | ||
| deadline_seconds | No | ||
| exclude_airlines | No | ||
| exclude_airports | No | ||
| exclude_alliance | No | ||
| include_airports | No | ||
| require_overnight | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: HTTP-only transport, no fetch/browser fallback, blocking behavior, and the deadline_seconds failure mode where unfinished queries return error code deadline rather than empty results. Currency conversion behavior ('Viajante does not convert') is also disclosed. It stops short of saying anything about result shape, though the output schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core capability and scope before the alternatives and caveats; almost every sentence carries operational information. Minor drag from the oddly indented deadline_seconds block, but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The decision-critical behaviors (blocking, no fallback, deadline semantics) are covered and an output schema exists so return values need not be described. However, for a tool with 37 parameters and no schema documentation, an agent is still guessing on most optional filters, which is a meaningful completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 37 parameters at 0% schema description coverage, the description carries the full burden, yet it explains only route, start, end, currency, country, and deadline_seconds. The remaining ~30 (sort, trip, cabin, adults, children, nearby, nights, price_cap, max_stops, airline/alliance filters, layover bounds, etc.) are left entirely undefined in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Cheapest-per-day calendar for one named route, up to 31 days', and pins the scope with route/start/end semantics. It explicitly contrasts itself with search_flex, so an agent can route between them without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit alternative routing ('Use search_flex for +/-N around one date') and an explicit stop rule: on 'blocked', do not switch to browser or follow with search_flex or search_flights. Both when-to-use and when-not-to-use are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_exploreExplore destinationsBRead-onlyIdempotent
Destinations from one origin, then a priced shortlist. Give start (ISO date) or month, not both. Needs the browser extra; one adult in economy only. Currency and country as in search_flights. Viajante does not convert. A destination without a price is not_loaded, not a usable row.
deadline_seconds stops starting queries after that many seconds; unfinished
queries are error code deadline (not loaded, not empty). See get_guide.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| via | No | ||
| bags | No | ||
| days | No | ||
| sort | No | price | |
| cabin | No | economy | |
| month | No | ||
| proxy | No | ||
| start | No | ||
| adults | No | ||
| nearby | No | ||
| origin | Yes | ||
| country | No | ||
| airlines | No | ||
| alliance | No | ||
| carry_on | No | ||
| children | No | ||
| currency | No | ||
| max_stops | No | ||
| price_cap | No | ||
| exclude_via | No | ||
| max_layover | No | ||
| min_layover | No | ||
| depart_after | No | ||
| max_duration | No | ||
| no_overnight | No | ||
| arrive_before | No | ||
| depart_window | No | ||
| baggage_buffer | No | ||
| infants_on_lap | No | ||
| exclude_regions | No | ||
| infants_in_seat | No | ||
| deadline_seconds | No | ||
| exclude_airlines | No | ||
| exclude_airports | No | ||
| exclude_alliance | No | ||
| include_airports | No | ||
| require_overnight | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which already cover read-only, idempotent, non-destructive, open-world), the description adds real behavioral detail: a dependency requirement ('browser extra'), no currency conversion, unpriced destinations surfacing as not_loaded, and timeout semantics via deadline_seconds returning error code deadline rather than an empty result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the text is dense but short for a 38-parameter tool; each sentence carries information. The stray indentation in the second paragraph and heavy reliance on cross-references ('as in search_flights', 'See get_guide') slightly hurt readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 38-parameter exploration tool with zero schema description coverage, the description leaves most inputs unexplained, which is a substantial gap even though an output schema exists and the safety profile is covered by annotations. The error/prerequisite notes are good but do not compensate for the parameter coverage void.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 38 parameters, so the description carries the full burden, yet it meaningfully covers only a handful (start, month, currency, country, deadline_seconds, and the adults/cabin restrictions). The other ~30 parameters (top, via, bags, sort, price_cap, max_layover, exclude_*, require_overnight, etc.) are undefined in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the resource and the two-stage output ('Destinations from one origin, then a priced shortlist'), so an agent knows it returns priced destination options from a single origin. It does not, however, differentiate itself from plausible siblings like search_dates or search_flex, so the agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives hard operating constraints ('Needs the browser extra', 'one adult in economy only') and an input rule ('Give start ... or month, not both'), plus a pointer to get_guide. It never states when to prefer this tool over search_dates/search_flex/search_trip, so usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_flexFlexible-date flight searchARead-onlyIdempotent
Flex window of +/-N days around one date, then one shopping search on the cheapest day. route is ORIGIN-DEST; around is an ISO date. Use search_dates for a cheapest-week calendar; do not brute-force a date matrix. Currency and country as in search_flights. A markup_drift day is not no_results: do not invent a cheapest week. A named-date search_flights is allowed.
deadline_seconds stops starting queries after that many seconds; unfinished
queries are error code deadline (not loaded, not empty). See get_guide.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| via | No | ||
| bags | No | ||
| flex | Yes | ||
| sort | No | ranked | |
| trip | No | one-way | |
| cabin | No | economy | |
| proxy | No | ||
| route | Yes | ||
| adults | No | ||
| around | Yes | ||
| nearby | No | ||
| nights | No | ||
| country | No | ||
| airlines | No | ||
| alliance | No | ||
| carry_on | No | ||
| children | No | ||
| currency | No | ||
| max_stops | No | ||
| price_cap | No | ||
| exclude_via | No | ||
| max_layover | No | ||
| min_layover | No | ||
| depart_after | No | ||
| max_duration | No | ||
| no_overnight | No | ||
| arrive_before | No | ||
| depart_window | No | ||
| baggage_buffer | No | ||
| infants_on_lap | No | ||
| infants_in_seat | No | ||
| deadline_seconds | No | ||
| exclude_airlines | No | ||
| exclude_airports | No | ||
| exclude_alliance | No | ||
| include_airports | No | ||
| require_overnight | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond them: deadline_seconds stops starting queries and returns error code deadline (not loaded, not empty), plus markup_drift semantics, and points to get_guide. Strong but not exhaustive (no pagination/rate-limit detail).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Mostly tight and front-loaded: the core mechanic and sibling routing come first, with the deadline caveat and guide pointer afterward. A couple of sentences (markup_drift, allowed search_flights) are slightly fragmentary but each carries routing or failure-mode value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is rightly absent. However, for a 38-parameter tool with zero schema coverage, the description's parameter gap is a meaningful completeness shortfall; the routing and failure-mode guidance are good but do not fully equip the agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 38 parameters and 0% schema description coverage, the schema documents essentially nothing. The description only clarifies route (ORIGIN-DEST), around (ISO date), flex, and defers currency/country to search_flights. That leaves the vast majority of parameters (sort, trip, cabin, stops, layover windows, excludes, passengers, etc.) semantically undocumented in either place.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Flex window of +/-N days around one date, then one shopping search on the cheapest day') and names route/around formats. It clearly distinguishes itself from search_dates and search_flights, so an agent can select it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to alternatives: 'Use search_dates for a cheapest-week calendar; do not brute-force a date matrix' and 'A named-date search_flights is allowed.' It also gives exclusion guidance on markup_drift days ('not no_results'), so when-to-use and when-not are fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_flightsSearch flightsARead-onlyIdempotent
Google Flights search for named routes and dates. Each routes entry is ORIGIN-DEST:YYYY-MM-DD. Use search_dates for the cheapest week and search_flex for +/-N days. fetch=detail needs the browser extra and Chromium. Currency is currency, or inferred from a named origin's owned country; if unproven, ask. Viajante does not convert. Do not invent a bag fee. max_stops is 0, 1 or 2. Metro codes (LON, NYC) expand on one-way and rt routes. One-way searches send clock bounds, max_duration, max_layover, price_cap, less_emissions and hide_separate_tickets to the page, and check each one locally. exclude_basic_economy is refused. nearby_days (default 0, off) adds a ±N cheapest-fare grid on that search; round trips shift both dates and keep the trip length. The grid reuses the date calendar and does not change offers. A successful query carries price_insight when the page states a level (low, typical, or high) that matches its heading. That level is Google's label for the current price against its typical range, not a forecast. include_price_history adds the page's own price history and is off by default. A successful query may carry recommendation: evidence, not a verdict. Check relaxed_requirements before calling it a match. After a named hub or leisure trunk, search_hidden_city may run once with the same route and date, never when bags were named. Rules and wording: get_guide.
deadline_seconds stops starting queries after that many seconds; unfinished
queries are error code deadline (not loaded, not empty). See get_guide.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| via | No | ||
| bags | No | ||
| sort | No | ranked | |
| trip | No | one-way | |
| cabin | No | economy | |
| fetch | No | auto | |
| proxy | No | ||
| adults | No | ||
| nearby | No | ||
| routes | Yes | ||
| country | No | ||
| airlines | No | ||
| alliance | No | ||
| carry_on | No | ||
| children | No | ||
| currency | No | ||
| max_stops | No | ||
| price_cap | No | ||
| exclude_via | No | ||
| max_layover | No | ||
| min_layover | No | ||
| nearby_days | No | ||
| arrive_after | No | ||
| depart_after | No | ||
| max_duration | No | ||
| no_overnight | No | ||
| arrive_before | No | ||
| depart_before | No | ||
| depart_window | No | ||
| baggage_buffer | No | ||
| infants_on_lap | No | ||
| less_emissions | No | ||
| infants_in_seat | No | ||
| deadline_seconds | No | ||
| exclude_airlines | No | ||
| exclude_airports | No | ||
| exclude_alliance | No | ||
| include_airports | No | ||
| require_overnight | No | ||
| exclude_basic_economy | No | ||
| hide_separate_tickets | No | ||
| include_price_history | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotations, it discloses important behavior: currency inference and no conversion, refusal of exclude_basic_economy, how nearby_days builds a separate cheapest-fare grid, deadline_seconds producing error code 'deadline' rather than an empty result, and that price_insight is Google's label, not a forecast.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening is front-loaded and information-dense, with little filler. However, the body is a run-on stream of clauses with no grouping or headings, and the trailing deadline_seconds block has awkward indentation, making the definition hard to scan despite its useful content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The presence of an output schema means return values need not be explained, and annotations cover the safety profile. The description captures several critical gotchas for a complex search tool, but it does not fully equip an agent to use a 43-parameter surface whose schema has no per-field descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 43 parameters and 0% schema description coverage, the description must carry parameter meaning but only explains a subset: routes format, max_stops values, nearby_days, include_price_history, deadline_seconds, fetch, currency, and exclude_basic_economy. Many parameters such as top, via, sort, cabin, proxy, airlines, alliance, min_layover, and the clock-bound fields are left without semantic guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource ('Google Flights search') plus the required route format 'ORIGIN-DEST:YYYY-MM-DD'. It also distinguishes this tool from search_dates and search_flex, so an agent can identify it without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes alternatives: 'Use search_dates for the cheapest week and search_flex for +/-N days', and constrains search_hidden_city to one run after a named hub or leisure trunk, never when bags were named. It also points to get_guide for rules and wording.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_hotel_roomsHotel room ratesARead-onlyIdempotent
Room rates for one Skiplagged hotel, for 1-3 finalists. Name it by hotel_id (the provider_id of a skiplagged search_hotels offer) or by hotel_name plus city. A name must match exactly (case, accents and punctuation ignored); no match or several matches is no_results, never a guess. Use the name form for a Google finalist: a Google hostel price can be a dorm bed, and these rates say what the room is. Rates are USD, not converted, in provider order. total_price is the whole stay for the party and rooms searched. occupancy_limit is per room type and is not proof that a party fits across rooms. Skiplagged only: do not mix these rows with Google or Booking prices.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| rooms | No | ||
| adults | No | ||
| check_in | Yes | ||
| hotel_id | No | ||
| check_out | Yes | ||
| hotel_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds substantial behavior beyond them: exact name matching with case/accents/punctuation ignored, ambiguous or absent matches return no_results rather than a guess, prices are unconverted USD in provider order. These are exactly the operational traits an agent cannot infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core statement ('Room rates for one Skiplagged hotel, for 1-3 finalists') and every subsequent sentence carries distinct information (matching rules, provider exclusivity, price semantics). It is dense and some clauses are run-on, but there is little padding to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a rate-lookup tool with an output schema, the description covers the high-risk gotchas: provider mixing, the occupancy_limit-per-room-type caveat, total_price scope, and currency. The remaining gap is that it never clarifies the date parameter formats or the rooms/adults defaults for a 7-param tool, so it falls just short of fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full parameter burden. It does explain hotel_id (provider_id from a skiplagged search_hotels offer), the hotel_name+city pairing, and exact-match semantics, and touches rooms/adults indirectly via 'the party and rooms searched'. However check_in/check_out and the city parameter are never defined, leaving several parameters undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (room rates) scoped to exactly one Skiplagged hotel, and explicitly links its input to 'the provider_id of a skiplagged search_hotels offer', which cleanly separates it from the sibling search_hotels and get_hotel_details. An agent can tell what this returns (rate rows for a single hotel) without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use conditions: intended 'for 1-3 finalists', and the hotel_name form should be used 'for a Google finalist' because Google hostel prices may be dorm beds. It also states an explicit exclusion ('Skiplagged only: do not mix these rows with Google or Booking prices'), so both selection and non-selection are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_hotelsSearch hotelsARead-onlyIdempotent
Hotel search. Quotes are total-stay prices, not per person. Currency is required (no origin airport), except source skiplagged, whose quotes are USD. Quotes come back in the requested currency as the provider returned them. Viajante does not convert and never invents ISO 4217. location is one named place: ask when it is a typo, a region, or several candidate towns. The request carries adults and rooms only; do not state a room split. Google offers are in price order, not advice: weigh location, latitude and longitude, and review_count yourself. stays batches up to 8 location/check_in/check_out objects in one call. property_matrix lists each property's total per stay, null where it was not returned (not proof of unavailability), sorted by name. near is a point you name, {lat, lng}; max_distance_km needs it. entire_home=true asks for a house or villa; those offers carry sleeps, bedrooms and beds. lodging_evidence_conflict marks contradictory room or unit labels. Full rules: get_guide.
deadline_seconds stops starting queries after that many seconds; unfinished
queries are error code deadline (not loaded, not empty). See get_guide.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| near | No | ||
| rooms | No | ||
| stays | No | ||
| adults | No | ||
| source | No | ||
| check_in | No | ||
| currency | No | ||
| location | No | ||
| check_out | No | ||
| min_rating | No | ||
| entire_home | No | ||
| max_distance_km | No | ||
| deadline_seconds | No | ||
| free_cancellation | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, open-world, idempotent and non-destructive, and the description still adds substantial behavioral context beyond them: no currency conversion and no invented ISO codes, deadline_seconds yields error code 'deadline' (not loaded, not empty), property_matrix nulls are not proof of unavailability, and Google ordering is not advice. These are exactly the non-obvious traits an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Nearly every sentence carries real information, so it is not padded, but it is delivered as a dense telegraphic wall that mixes input-parameter semantics with output-field semantics (property_matrix, lodging_evidence_conflict) and ends with an oddly indented deadline_seconds note. It is hard to scan and not cleanly front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape needn't be explained, and the description covers most behavior for a 15-parameter tool. However, with zero schema descriptions it leaves min_rating, free_cancellation, and top entirely undocumented, and never clarifies that all parameters are optional or which combination of location/check_in/check_out is actually required to get a useful result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does for most high-stakes parameters: currency and the skiplagged USD exception, location as a single named place, adults/rooms with no room split, stays batching up to 8 objects, near as {lat,lng} with max_distance_km depending on it, entire_home semantics, and deadline_seconds. It stops short of documenting top, min_rating, and free_cancellation, so coverage of the 15 parameters is strong but incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Hotel search') and immediately scopes it with substantive semantics (total-stay quotes, currency behavior, batch mode via stays). It differentiates the scope of the search from the downstream artifacts it produces (property_matrix, lodging_evidence_conflict), though it never explicitly contrasts itself with close siblings like search_hotel_rooms or get_hotel_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: it says to ask when 'location' is a typo/region/multiple towns, forbids stating a room split, and routes to get_guide for 'full rules'. But there is no explicit when-to-use-this-instead-of-X guidance against a 22-tool sibling set, which leaves the routing burden on the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_split_ticketsSplit-ticket itinerariesARead-onlyIdempotent
Opt-in separately ticketed itineraries built from real one-way quotes. route is ORIGIN-DEST:DATE (one-way: self-transfer via a hub) or, with trip="rt", ORIGIN-DEST:OUT:BACK (cheapest outbound plus cheapest return one-way). It runs the packaged search first (packaged_report), then up to max_hubs hubs (default 3, at most 5): 2 queries per hub, 3 with allow_overnight. via lists up to 5 connection airports; unnamed, hubs are the packaged layover airports. It stops at a recorded rate limit: do not retry. Currency as in search_flights. Every itinerary says split_ticket true and connection_protected false. A missed connection between tickets is not rebooked, and bags may need re-checking. Each ticket is confirmed on its own google_flights_url. Clock, duration, layover, via, overnight, and airport filters apply to the itinerary: via and exclude_via name hubs. min_connection_hours (default 3) is a planning default, not provider evidence. total is null unless every part shares one currency. Not for multi-city. Full rules: get_guide.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| via | No | ||
| bags | No | ||
| trip | No | one-way | |
| cabin | No | economy | |
| fetch | No | sweep | |
| proxy | No | ||
| route | Yes | ||
| adults | No | ||
| country | No | ||
| airlines | No | ||
| alliance | No | ||
| carry_on | No | ||
| children | No | ||
| currency | No | ||
| max_hubs | No | ||
| max_stops | No | ||
| price_cap | No | ||
| exclude_via | No | ||
| max_layover | No | ||
| min_layover | No | ||
| depart_after | No | ||
| max_duration | No | ||
| no_overnight | No | ||
| arrive_before | No | ||
| depart_window | No | ||
| leg_max_stops | No | ||
| baggage_buffer | No | ||
| infants_on_lap | No | ||
| allow_overnight | No | ||
| infants_in_seat | No | ||
| exclude_airlines | No | ||
| exclude_airports | No | ||
| exclude_alliance | No | ||
| include_airports | No | ||
| require_overnight | No | ||
| min_connection_hours | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/openWorld annotations, the description discloses important behavior: packaged search runs first, then up to max_hubs hubs with 2 queries per hub (3 with allow_overnight), and it stops at a recorded rate limit without retrying. It also explains that each ticket is confirmed on its own google_flights_url, that missed connections are not rebooked, that bags may need re-checking, and that total is null unless all parts share one currency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core definition and route syntax, and nearly every sentence carries operational information. It is dense and somewhat clause-heavy, but given the tool's complexity and 37 parameters, the length is justified rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the annotations cover the safety profile. The description still supplies essential caveats about split ticketing, connection risk, currency aggregation, and rate limits. It is not fully self-contained for a 37-parameter tool, though, because many parameters are only indirectly covered and the description defers to get_guide for full rules.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It does well for the distinctive parameters: route formats, trip, max_hubs bounds/default, via/exclude_via hub behavior, allow_overnight query behavior, and min_connection_hours as a planning default. However, with 37 parameters, many key inputs such as top, fetch, proxy, max_stops, leg_max_stops, baggage_buffer, and most passenger/filter fields are left unexplained or only covered by broad category references, so it only partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and scope: separately ticketed itineraries built from real one-way quotes, with route syntax and round-trip behavior. It distinguishes itself from packaged search by running packaged search first and by flagging split_ticket true / connection_protected false, so an agent can identify when this tool rather than search_flights or search_trip applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is clearly implied as opt-in split-ticket search, with explicit route formats for one-way and trip="rt", and an exclusion: 'Not for multi-city.' It also points to get_guide for full rules. It does not explicitly compare itself with search_flights/search_trip by name, so it stops short of a full when-to-use/when-not matrix.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tripSearch flights and hotelBRead-onlyIdempotent
Flights then one hotel stay, under one lock. Currency follows the flight origin or an explicit code; if unproven, ask. Viajante does not convert. The same currency goes to the hotel. Stay dates default to the flights' window. Unnamed baggage_buffer is 0. A positive carry_on is verified on the page; named bags are refused. Flight queries carry the same recommendation block as search_flights. trip_total is omitted if either side missed.
deadline_seconds stops starting queries after that many seconds; unfinished
queries are error code deadline (not loaded, not empty). See get_guide.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| via | No | ||
| bags | No | ||
| sort | No | ranked | |
| trip | No | one-way | |
| cabin | No | economy | |
| fetch | No | auto | |
| rooms | No | ||
| adults | No | ||
| nearby | No | ||
| routes | Yes | ||
| source | No | ||
| country | No | ||
| airlines | No | ||
| alliance | No | ||
| carry_on | No | ||
| check_in | No | ||
| children | No | ||
| currency | No | ||
| location | Yes | ||
| check_out | No | ||
| max_stops | No | ||
| price_cap | No | ||
| min_rating | No | ||
| entire_home | No | ||
| exclude_via | No | ||
| depart_after | No | ||
| no_overnight | No | ||
| arrive_before | No | ||
| baggage_buffer | No | ||
| infants_on_lap | No | ||
| infants_in_seat | No | ||
| deadline_seconds | No | ||
| exclude_airlines | No | ||
| exclude_airports | No | ||
| exclude_alliance | No | ||
| include_airports | No | ||
| free_cancellation | No | ||
| require_overnight | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, yet the description adds real operational detail: no currency conversion, hotel inherits the flight currency, stay dates default to the flight window, positive carry_on is verified on-page while named bags are refused, trip_total is omitted if either side misses, and deadline_seconds yields error code 'deadline' rather than empty results. The deadline and trip_total semantics in particular are non-obvious behavior that annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the whole description is short for a 39-parameter tool, so it is not padded. However, several fragments ('Unnamed baggage_buffer is 0', 'under one lock') are terse to the point of ambiguity and the odd indentation of the deadline_seconds block hurts scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape needn't be spelled out, and the description does cover several cross-cutting behaviors. But for a tool this complex (two bundled searches, 39 params, 0% schema coverage), omitting the format and semantics of the required routes and location arguments, plus nearly all filter parameters, leaves the agent unable to invoke it correctly without external help.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 39 parameters, so the description carries the full burden, yet it only touches currency, check_in/check_out defaults, baggage_buffer, carry_on, bags, and deadline_seconds. The two required parameters, routes and location, are never described, and the meanings of sort, trip, fetch, source, via, max_stops, price_cap, and the exclude/include families are left entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a concrete composite verb+resource: it searches flights and then one hotel stay 'under one lock'. That is distinguishable from search_flights and search_hotels, and it explicitly ties its flight output to the search_flights recommendation block. It stops short of naming the siblings it replaces, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use statement versus search_flights, search_hotels, or plan_stay_blocks. The only conditional guidance is 'if unproven, ask' for currency and a referral to get_guide for deadline behavior. The agent has to infer that this tool is for combined flight+lodging itineraries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
split_stay_costsSplit stay costsARead-onlyIdempotent
Local: split each stay's total among the people who sleep there.
stays are {name, check_in, check_out, total}; roster is as for plan_stay_blocks. A stay's rate is its total over the person-nights the roster puts inside it, so someone who never sleeps there pays nothing toward it. currency is named by the caller and never converted. fee_per_person_night is a per-night charge the caller names (a city tax) added per person. Cents are allocated so each stay sums exactly. Nights no stay covers come back as unallocated_nights. Arithmetic only: it does not price or recommend a stay.
| Name | Required | Description | Default |
|---|---|---|---|
| stays | Yes | ||
| roster | Yes | ||
| currency | Yes | ||
| fee_per_person_night | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, and the description still adds real behavioral content: cents are allocated so each stay sums exactly, uncovered nights surface as unallocated_nights, currency is never converted, and fee_per_person_night is applied per person. That is meaningful disclosure about rounding and output beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first clause, and the remaining sentences each carry distinct semantics (rate derivation, currency, fee, rounding, unallocated nights). It is dense but nothing is obviously redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, yet the description usefully explains the unallocated_nights concept and the exact-sum rounding guarantee. The only real gap is the roster structure, which is delegated to a sibling rather than described for a tool with nested-object inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full load. It documents the stays shape ({name, check_in, check_out, total}), the currency semantics, and what fee_per_person_night does, but it defers the roster format entirely to plan_stay_blocks rather than describing it. Three of four parameters are partially covered; the fourth is only referenced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('split each stay's total among the people who sleep there') and marks it as 'Local' arithmetic, which separates it from the search/booking siblings. It also ties itself to plan_stay_blocks via the roster reference. It stops short of a full sibling differentiation (e.g., when to choose this over plan_stay_blocks).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'roster is as for plan_stay_blocks' signals it follows that tool in a workflow, and 'Arithmetic only: it does not price or recommend a stay' functions as a when-not boundary. But no alternative is named for the case where the agent wants pricing or recommendations, so the guidance is only partially explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_itineraryValidate itineraryARead-onlyIdempotent
Validate selected v2 flight offers locally, without fetching. Pass legs in travel order, each with its exact query and one selected offer. The result is tri-state: unknown evidence never becomes pass. arrival_deadline is an ISO date and time: an explicit offset is compared in UTC, a naive time is local at the arrival airport. chronological checks owned segment instants. min_stay_days and max_stay_days use owned journey dates.
| Name | Required | Description | Default |
|---|---|---|---|
| legs | Yes | ||
| currency | No | ||
| constraints | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent and non-destructive traits, so the bar is lower; the description still adds real behavior: local-only execution with no fetch, and a tri-state result where 'unknown evidence never becomes pass'. Timezone resolution rules (offset compared in UTC, naive time local at arrival airport) further disclose non-obvious semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and free of filler, but the final two sentences rely on terse domain jargon ('chronological checks owned segment instants', 'owned journey dates') that costs comprehension. Every sentence earns its place, yet the phrasing is compressed past clarity in places.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex nested tool the description covers ordering, the exact-input contract, tri-state semantics and timezone handling, and the output schema exists so return formatting needn't be restated. Remaining gaps — full constraints fields and failure/error behavior — are real but secondary given the output schema's presence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the objects are opaque (additionalProperties: true), so the description carries the burden and largely meets it: legs must be in travel order with an exact query plus one selected offer, and constraints keys arrival_deadline, min_stay_days and max_stay_days are explained with their date/time semantics. It stops short of enumerating the full constraints shape or the currency parameter, so it is not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('validate selected v2 flight offers') and adds the key distinguishing constraint 'locally, without fetching', which separates it from fetch-based siblings like recheck_offer. It is clear about what is validated, though it never names the sibling it contrasts with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without fetching' implies this is the cheap/local alternative to a networked recheck, and 'Pass legs in travel order, each with its exact query and one selected offer' gives invocation context. However, no sibling is named and no explicit when-not condition is stated, so the agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_answerVerify draft answerARead-onlyIdempotent
Check a draft reply against this process's recent search payloads.
Call before sending a reply that quotes fares, stays, dates, airport codes, or links. Lists each amount, currency, IATA code, ISO date, and URL in the draft that no recorded search returned. Drop or re-search every unowned row; do not quote it as found. Sums you computed are unowned unless a payload carries them (e.g. trip_total). Local; may run during a search.
| Name | Required | Description | Default |
|---|---|---|---|
| answer | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), but the description adds substantial semantics beyond them: what the tool returns (each unowned amount/currency/IATA code/ISO date/URL), the edge case that agent-computed sums count as unowned unless a payload carries them, and execution context ('Local; may run during a search'). This is rich, non-redundant behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose, then trigger, then output semantics, then the computed-sum caveat, then the execution note. Every sentence adds distinct, actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Purpose, trigger, output meaning, and the key edge case are all covered, and an output schema exists so return structure needn't be restated. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden, and it does partially: 'Check a draft reply' tells the agent the single 'answer' parameter is the draft reply text. It stops short of stating format or length constraints, so it compensates but not fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (check/verify) and resource (a draft reply against recorded search payloads), and it clearly distinguishes itself from the sibling search_* and lookup_* tools by being a pre-send validation gate. An agent can tell exactly what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger condition — 'Call before sending a reply that quotes fares, stays, dates, airport codes, or links' — and prescribes the follow-up action ('Drop or re-search every unowned row; do not quote it as found'). Nothing about when to invoke it 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.
watch_priceWatch a priceA
Re-run a saved flight or hotel search and report the change. With no arguments, list saved watches (watches null and status failed when the file cannot be read). With name, kind (flight or hotel) and params (the search_flights or search_hotels arguments): validate, save, then run. Saving under an existing name replaces that watch. With only name, run the saved search. The run records an observation even when the history opt-in is off. A cached or rate-limited run records nothing. No scheduler and no notification: do not call it in a loop.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| name | No | ||
| params | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| empty_note | Yes | |
| error_code | Yes | |
| observed_at | Yes | |
| retry_after | Yes | |
| completeness | Yes | |
| empty_reason | Yes | |
| observed_at_basis | Yes | |
| retry_after_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the generic safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false). The description adds the behavior that matters: saving under an existing name replaces that watch, an observation is recorded even when history opt-in is off, and cached/rate-limited runs record nothing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is dense and front-loaded with the core action, and parenthetical asides compress edge cases (file-unreadable behavior, cached runs) efficiently. Slightly run-on in the middle paragraphs, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained. For a stateful, side-effecting watch tool with an open-world hint, the description covers modes, persistence semantics, and recording conditions without gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and all three params are untyped nullables, so the description carries the full burden. It does so by defining each one: name identifies the watch, kind is 'flight or hotel', and params takes 'the search_flights or search_hotels arguments', plus the semantics of omitting them entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb (re-run) and resource (a saved flight or hotel search) and states the outcome (report the change). It is clearly distinguishable from siblings like search_flights and search_hotels, which it explicitly references rather than duplicates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description enumerates each invocation mode and its effect: no arguments lists watches, name+kind+params validates/saves/runs, and name alone runs the saved search. It also supplies an explicit when-not-to-use rule ('no scheduler and no notification: do not call it in a loop').
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.
22 tool updates
v1.5.2- Changed
compare_awards6 fields changed- removed
Input schema / properties / balances / titleRemoved value: -"Balances" - removed
Input schema / properties / cash_price / titleRemoved value: -"Cash Price" - removed
Input schema / properties / currency / titleRemoved value: -"Currency" - removed
Input schema / properties / offer / titleRemoved value: -"Offer" - removed
Input schema / titleRemoved value: -"compare_awardsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Added
get_guide - Added
get_hotel_details - Changed
get_runtime_info2 fields changed- removed
Input schema / titleRemoved value: -"get_runtime_infoArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Changed
lookup_airports3 fields changed- removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"lookup_airportsArguments"
- Changed
lookup_transfers5 fields changed- removed
Input schema / properties / balances / titleRemoved value: -"Balances" - removed
Input schema / properties / points / titleRemoved value: -"Points" - removed
Input schema / properties / program / titleRemoved value: -"Program" - removed
Input schema / titleRemoved value: -"lookup_transfersArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Changed
plan_stay_blocks3 fields changed- removed
Input schema / properties / roster / titleRemoved value: -"Roster" - removed
Input schema / titleRemoved value: -"plan_stay_blocksArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Added
price_history - Added
recheck_offer - Changed
search_dates39 fields changed- removed
Input schema / properties / adults / titleRemoved value: -"Adults" - removed
Input schema / properties / airlines / titleRemoved value: -"Airlines" - removed
Input schema / properties / alliance / titleRemoved value: -"Alliance" - removed
Input schema / properties / arrive_before / titleRemoved value: -"Arrive Before" - removed
Input schema / properties / baggage_buffer / titleRemoved value: -"Baggage Buffer" - removed
Input schema / properties / bags / titleRemoved value: -"Bags" - removed
Input schema / properties / cabin / titleRemoved value: -"Cabin" - removed
Input schema / properties / carry_on / titleRemoved value: -"Carry On" - removed
Input schema / properties / children / titleRemoved value: -"Children" - removed
Input schema / properties / country / titleRemoved value: -"Country" - removed
Input schema / properties / currency / titleRemoved value: -"Currency" - added
Input schema / properties / deadline_secondsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / depart_after / titleRemoved value: -"Depart After" - removed
Input schema / properties / depart_window / titleRemoved value: -"Depart Window" - removed
Input schema / properties / end / titleRemoved value: -"End" - removed
Input schema / properties / exclude_airlines / titleRemoved value: -"Exclude Airlines" - removed
Input schema / properties / exclude_airports / titleRemoved value: -"Exclude Airports" - removed
Input schema / properties / exclude_alliance / titleRemoved value: -"Exclude Alliance" - removed
Input schema / properties / exclude_via / titleRemoved value: -"Exclude Via" - removed
Input schema / properties / include_airports / titleRemoved value: -"Include Airports" - removed
Input schema / properties / infants_in_seat / titleRemoved value: -"Infants In Seat" - removed
Input schema / properties / infants_on_lap / titleRemoved value: -"Infants On Lap" - removed
Input schema / properties / max_duration / titleRemoved value: -"Max Duration" - removed
Input schema / properties / max_layover / titleRemoved value: -"Max Layover" - removed
Input schema / properties / max_stops / titleRemoved value: -"Max Stops" - removed
Input schema / properties / min_layover / titleRemoved value: -"Min Layover" - removed
Input schema / properties / nearby / titleRemoved value: -"Nearby" - removed
Input schema / properties / nights / titleRemoved value: -"Nights" - removed
Input schema / properties / no_overnight / titleRemoved value: -"No Overnight" - removed
Input schema / properties / price_cap / titleRemoved value: -"Price Cap" - removed
Input schema / properties / proxy / titleRemoved value: -"Proxy" - removed
Input schema / properties / require_overnight / titleRemoved value: -"Require Overnight" - removed
Input schema / properties / route / titleRemoved value: -"Route" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / properties / start / titleRemoved value: -"Start" - removed
Input schema / properties / trip / titleRemoved value: -"Trip" - removed
Input schema / properties / via / titleRemoved value: -"Via" - removed
Input schema / titleRemoved value: -"search_datesArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Changed
search_explore40 fields changed- removed
Input schema / properties / adults / titleRemoved value: -"Adults" - removed
Input schema / properties / airlines / titleRemoved value: -"Airlines" - removed
Input schema / properties / alliance / titleRemoved value: -"Alliance" - removed
Input schema / properties / arrive_before / titleRemoved value: -"Arrive Before" - removed
Input schema / properties / baggage_buffer / titleRemoved value: -"Baggage Buffer" - removed
Input schema / properties / bags / titleRemoved value: -"Bags" - removed
Input schema / properties / cabin / titleRemoved value: -"Cabin" - removed
Input schema / properties / carry_on / titleRemoved value: -"Carry On" - removed
Input schema / properties / children / titleRemoved value: -"Children" - removed
Input schema / properties / country / titleRemoved value: -"Country" - removed
Input schema / properties / currency / titleRemoved value: -"Currency" - removed
Input schema / properties / days / titleRemoved value: -"Days" - added
Input schema / properties / deadline_secondsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / depart_after / titleRemoved value: -"Depart After" - removed
Input schema / properties / depart_window / titleRemoved value: -"Depart Window" - removed
Input schema / properties / exclude_airlines / titleRemoved value: -"Exclude Airlines" - removed
Input schema / properties / exclude_airports / titleRemoved value: -"Exclude Airports" - removed
Input schema / properties / exclude_alliance / titleRemoved value: -"Exclude Alliance" - removed
Input schema / properties / exclude_regions / titleRemoved value: -"Exclude Regions" - removed
Input schema / properties / exclude_via / titleRemoved value: -"Exclude Via" - removed
Input schema / properties / include_airports / titleRemoved value: -"Include Airports" - removed
Input schema / properties / infants_in_seat / titleRemoved value: -"Infants In Seat" - removed
Input schema / properties / infants_on_lap / titleRemoved value: -"Infants On Lap" - removed
Input schema / properties / max_duration / titleRemoved value: -"Max Duration" - removed
Input schema / properties / max_layover / titleRemoved value: -"Max Layover" - removed
Input schema / properties / max_stops / titleRemoved value: -"Max Stops" - removed
Input schema / properties / min_layover / titleRemoved value: -"Min Layover" - removed
Input schema / properties / month / titleRemoved value: -"Month" - removed
Input schema / properties / nearby / titleRemoved value: -"Nearby" - removed
Input schema / properties / no_overnight / titleRemoved value: -"No Overnight" - removed
Input schema / properties / origin / titleRemoved value: -"Origin" - removed
Input schema / properties / price_cap / titleRemoved value: -"Price Cap" - removed
Input schema / properties / proxy / titleRemoved value: -"Proxy" - removed
Input schema / properties / require_overnight / titleRemoved value: -"Require Overnight" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / properties / start / titleRemoved value: -"Start" - removed
Input schema / properties / top / titleRemoved value: -"Top" - removed
Input schema / properties / via / titleRemoved value: -"Via" - removed
Input schema / titleRemoved value: -"search_exploreArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Changed
search_flex40 fields changed- removed
Input schema / properties / adults / titleRemoved value: -"Adults" - removed
Input schema / properties / airlines / titleRemoved value: -"Airlines" - removed
Input schema / properties / alliance / titleRemoved value: -"Alliance" - removed
Input schema / properties / around / titleRemoved value: -"Around" - removed
Input schema / properties / arrive_before / titleRemoved value: -"Arrive Before" - removed
Input schema / properties / baggage_buffer / titleRemoved value: -"Baggage Buffer" - removed
Input schema / properties / bags / titleRemoved value: -"Bags" - removed
Input schema / properties / cabin / titleRemoved value: -"Cabin" - removed
Input schema / properties / carry_on / titleRemoved value: -"Carry On" - removed
Input schema / properties / children / titleRemoved value: -"Children" - removed
Input schema / properties / country / titleRemoved value: -"Country" - removed
Input schema / properties / currency / titleRemoved value: -"Currency" - added
Input schema / properties / deadline_secondsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / depart_after / titleRemoved value: -"Depart After" - removed
Input schema / properties / depart_window / titleRemoved value: -"Depart Window" - removed
Input schema / properties / exclude_airlines / titleRemoved value: -"Exclude Airlines" - removed
Input schema / properties / exclude_airports / titleRemoved value: -"Exclude Airports" - removed
Input schema / properties / exclude_alliance / titleRemoved value: -"Exclude Alliance" - removed
Input schema / properties / exclude_via / titleRemoved value: -"Exclude Via" - removed
Input schema / properties / flex / titleRemoved value: -"Flex" - removed
Input schema / properties / include_airports / titleRemoved value: -"Include Airports" - removed
Input schema / properties / infants_in_seat / titleRemoved value: -"Infants In Seat" - removed
Input schema / properties / infants_on_lap / titleRemoved value: -"Infants On Lap" - removed
Input schema / properties / max_duration / titleRemoved value: -"Max Duration" - removed
Input schema / properties / max_layover / titleRemoved value: -"Max Layover" - removed
Input schema / properties / max_stops / titleRemoved value: -"Max Stops" - removed
Input schema / properties / min_layover / titleRemoved value: -"Min Layover" - removed
Input schema / properties / nearby / titleRemoved value: -"Nearby" - removed
Input schema / properties / nights / titleRemoved value: -"Nights" - removed
Input schema / properties / no_overnight / titleRemoved value: -"No Overnight" - removed
Input schema / properties / price_cap / titleRemoved value: -"Price Cap" - removed
Input schema / properties / proxy / titleRemoved value: -"Proxy" - removed
Input schema / properties / require_overnight / titleRemoved value: -"Require Overnight" - removed
Input schema / properties / route / titleRemoved value: -"Route" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / properties / top / titleRemoved value: -"Top" - removed
Input schema / properties / trip / titleRemoved value: -"Trip" - removed
Input schema / properties / via / titleRemoved value: -"Via" - removed
Input schema / titleRemoved value: -"search_flexArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Changed
search_flights45 fields changed- removed
Input schema / properties / adults / titleRemoved value: -"Adults" - removed
Input schema / properties / airlines / titleRemoved value: -"Airlines" - removed
Input schema / properties / alliance / titleRemoved value: -"Alliance" - added
Input schema / properties / arrive_afterAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / arrive_before / titleRemoved value: -"Arrive Before" - removed
Input schema / properties / baggage_buffer / titleRemoved value: -"Baggage Buffer" - removed
Input schema / properties / bags / titleRemoved value: -"Bags" - removed
Input schema / properties / cabin / titleRemoved value: -"Cabin" - removed
Input schema / properties / carry_on / titleRemoved value: -"Carry On" - removed
Input schema / properties / children / titleRemoved value: -"Children" - removed
Input schema / properties / country / titleRemoved value: -"Country" - removed
Input schema / properties / currency / titleRemoved value: -"Currency" - added
Input schema / properties / deadline_secondsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / depart_after / titleRemoved value: -"Depart After" - added
Input schema / properties / depart_beforeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / depart_window / titleRemoved value: -"Depart Window" - removed
Input schema / properties / exclude_airlines / titleRemoved value: -"Exclude Airlines" - removed
Input schema / properties / exclude_airports / titleRemoved value: -"Exclude Airports" - removed
Input schema / properties / exclude_alliance / titleRemoved value: -"Exclude Alliance" - added
Input schema / properties / exclude_basic_economyAdded value: +{ + "default": false, + "type": "boolean" +} - removed
Input schema / properties / exclude_via / titleRemoved value: -"Exclude Via" - removed
Input schema / properties / fetch / titleRemoved value: -"Fetch" - added
Input schema / properties / hide_separate_ticketsAdded value: +{ + "default": false, + "type": "boolean" +} - removed
Input schema / properties / include_airports / titleRemoved value: -"Include Airports" - added
Input schema / properties / include_price_historyAdded value: +{ + "default": false, + "type": "boolean" +} - removed
Input schema / properties / infants_in_seat / titleRemoved value: -"Infants In Seat" - removed
Input schema / properties / infants_on_lap / titleRemoved value: -"Infants On Lap" - added
Input schema / properties / less_emissionsAdded value: +{ + "default": false, + "type": "boolean" +} - removed
Input schema / properties / max_duration / titleRemoved value: -"Max Duration" - removed
Input schema / properties / max_layover / titleRemoved value: -"Max Layover" - removed
Input schema / properties / max_stops / titleRemoved value: -"Max Stops" - removed
Input schema / properties / min_layover / titleRemoved value: -"Min Layover" - removed
Input schema / properties / nearby / titleRemoved value: -"Nearby" - added
Input schema / properties / nearby_daysAdded value: +{ + "default": 0, + "type": "integer" +} - removed
Input schema / properties / no_overnight / titleRemoved value: -"No Overnight" - removed
Input schema / properties / price_cap / titleRemoved value: -"Price Cap" - removed
Input schema / properties / proxy / titleRemoved value: -"Proxy" - removed
Input schema / properties / require_overnight / titleRemoved value: -"Require Overnight" - removed
Input schema / properties / routes / titleRemoved value: -"Routes" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / properties / top / titleRemoved value: -"Top" - removed
Input schema / properties / trip / titleRemoved value: -"Trip" - removed
Input schema / properties / via / titleRemoved value: -"Via" - removed
Input schema / titleRemoved value: -"search_flightsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Changed
search_hidden_city8 fields changed- removed
Input schema / properties / adults / titleRemoved value: -"Adults" - removed
Input schema / properties / currency / titleRemoved value: -"Currency" - removed
Input schema / properties / departure / titleRemoved value: -"Departure" - removed
Input schema / properties / return_date / titleRemoved value: -"Return Date" - removed
Input schema / properties / route / titleRemoved value: -"Route" - removed
Input schema / properties / top / titleRemoved value: -"Top" - removed
Input schema / titleRemoved value: -"search_hidden_cityArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Changed
search_hotel_rooms9 fields changed- removed
Input schema / properties / adults / titleRemoved value: -"Adults" - removed
Input schema / properties / check_in / titleRemoved value: -"Check In" - removed
Input schema / properties / check_out / titleRemoved value: -"Check Out" - removed
Input schema / properties / city / titleRemoved value: -"City" - removed
Input schema / properties / hotel_id / titleRemoved value: -"Hotel Id" - removed
Input schema / properties / hotel_name / titleRemoved value: -"Hotel Name" - removed
Input schema / properties / rooms / titleRemoved value: -"Rooms" - removed
Input schema / titleRemoved value: -"search_hotel_roomsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Changed
search_hotels17 fields changed- removed
Input schema / properties / adults / titleRemoved value: -"Adults" - removed
Input schema / properties / check_in / titleRemoved value: -"Check In" - removed
Input schema / properties / check_out / titleRemoved value: -"Check Out" - removed
Input schema / properties / currency / titleRemoved value: -"Currency" - added
Input schema / properties / deadline_secondsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / entire_home / titleRemoved value: -"Entire Home" - removed
Input schema / properties / free_cancellation / titleRemoved value: -"Free Cancellation" - removed
Input schema / properties / location / titleRemoved value: -"Location" - removed
Input schema / properties / max_distance_km / titleRemoved value: -"Max Distance Km" - removed
Input schema / properties / min_rating / titleRemoved value: -"Min Rating" - removed
Input schema / properties / near / titleRemoved value: -"Near" - removed
Input schema / properties / rooms / titleRemoved value: -"Rooms" - removed
Input schema / properties / source / titleRemoved value: -"Source" - removed
Input schema / properties / stays / titleRemoved value: -"Stays" - removed
Input schema / properties / top / titleRemoved value: -"Top" - removed
Input schema / titleRemoved value: -"search_hotelsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Added
search_split_tickets - Changed
search_trip41 fields changed- removed
Input schema / properties / adults / titleRemoved value: -"Adults" - removed
Input schema / properties / airlines / titleRemoved value: -"Airlines" - removed
Input schema / properties / alliance / titleRemoved value: -"Alliance" - removed
Input schema / properties / arrive_before / titleRemoved value: -"Arrive Before" - removed
Input schema / properties / baggage_buffer / titleRemoved value: -"Baggage Buffer" - removed
Input schema / properties / bags / titleRemoved value: -"Bags" - removed
Input schema / properties / cabin / titleRemoved value: -"Cabin" - removed
Input schema / properties / carry_on / titleRemoved value: -"Carry On" - removed
Input schema / properties / check_in / titleRemoved value: -"Check In" - removed
Input schema / properties / check_out / titleRemoved value: -"Check Out" - removed
Input schema / properties / children / titleRemoved value: -"Children" - removed
Input schema / properties / country / titleRemoved value: -"Country" - removed
Input schema / properties / currency / titleRemoved value: -"Currency" - added
Input schema / properties / deadline_secondsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Input schema / properties / depart_after / titleRemoved value: -"Depart After" - removed
Input schema / properties / entire_home / titleRemoved value: -"Entire Home" - removed
Input schema / properties / exclude_airlines / titleRemoved value: -"Exclude Airlines" - removed
Input schema / properties / exclude_airports / titleRemoved value: -"Exclude Airports" - removed
Input schema / properties / exclude_alliance / titleRemoved value: -"Exclude Alliance" - removed
Input schema / properties / exclude_via / titleRemoved value: -"Exclude Via" - removed
Input schema / properties / fetch / titleRemoved value: -"Fetch" - removed
Input schema / properties / free_cancellation / titleRemoved value: -"Free Cancellation" - removed
Input schema / properties / include_airports / titleRemoved value: -"Include Airports" - removed
Input schema / properties / infants_in_seat / titleRemoved value: -"Infants In Seat" - removed
Input schema / properties / infants_on_lap / titleRemoved value: -"Infants On Lap" - removed
Input schema / properties / location / titleRemoved value: -"Location" - removed
Input schema / properties / max_stops / titleRemoved value: -"Max Stops" - removed
Input schema / properties / min_rating / titleRemoved value: -"Min Rating" - removed
Input schema / properties / nearby / titleRemoved value: -"Nearby" - removed
Input schema / properties / no_overnight / titleRemoved value: -"No Overnight" - removed
Input schema / properties / price_cap / titleRemoved value: -"Price Cap" - removed
Input schema / properties / require_overnight / titleRemoved value: -"Require Overnight" - removed
Input schema / properties / rooms / titleRemoved value: -"Rooms" - removed
Input schema / properties / routes / titleRemoved value: -"Routes" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / properties / source / titleRemoved value: -"Source" - removed
Input schema / properties / top / titleRemoved value: -"Top" - removed
Input schema / properties / trip / titleRemoved value: -"Trip" - removed
Input schema / properties / via / titleRemoved value: -"Via" - removed
Input schema / titleRemoved value: -"search_tripArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Changed
split_stay_costs6 fields changed- removed
Input schema / properties / currency / titleRemoved value: -"Currency" - removed
Input schema / properties / fee_per_person_night / titleRemoved value: -"Fee Per Person Night" - removed
Input schema / properties / roster / titleRemoved value: -"Roster" - removed
Input schema / properties / stays / titleRemoved value: -"Stays" - removed
Input schema / titleRemoved value: -"split_stay_costsArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Changed
validate_itinerary5 fields changed- removed
Input schema / properties / constraints / titleRemoved value: -"Constraints" - removed
Input schema / properties / currency / titleRemoved value: -"Currency" - removed
Input schema / properties / legs / titleRemoved value: -"Legs" - removed
Input schema / titleRemoved value: -"validate_itineraryArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Changed
verify_answer3 fields changed- removed
Input schema / properties / answer / titleRemoved value: -"Answer" - removed
Input schema / titleRemoved value: -"verify_answerArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "completeness": { + "enum": [ + "complete", + "partial", + "blocked" + ], + "type": "string" + }, + "empty_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "empty_reason": { + "anyOf": [ + { + "enum": [ + "provider_empty", + "filtered_out", + "not_loaded" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "error_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "observed_at_basis": { + "anyOf": [ + { + "enum": [ + "provider", + "fetch" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_after_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "ok", + "no_results", + "rate_limited", + "blocked", + "timeout", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status", + "completeness", + "empty_reason", + "empty_note", + "error_code", + "retry_after", + "retry_after_seconds", + "observed_at", + "observed_at_basis" + ], + "type": "object" +}
- Added
watch_price
10 tool updates
v1.4.1- Added
compare_awards - Added
get_runtime_info - Added
lookup_transfers - Added
plan_stay_blocks - Added
search_hidden_city - Added
search_hotel_rooms - Changed
search_hotels13 fields changed- added
Input schema / properties / check_in / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / check_in / defaultAdded value: +null - removed
Input schema / properties / check_in / typeRemoved value: -"string" - added
Input schema / properties / check_out / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / check_out / defaultAdded value: +null - removed
Input schema / properties / check_out / typeRemoved value: -"string" - added
Input schema / properties / location / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / location / defaultAdded value: +null - removed
Input schema / properties / location / typeRemoved value: -"string" - added
Input schema / properties / max_distance_kmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Max Distance Km" +} - added
Input schema / properties / nearAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Near" +} - added
Input schema / properties / staysAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Stays" +} - removed
Input schema / requiredRemoved value: -[ - "location", - "check_in", - "check_out" -]
- Added
split_stay_costs - Added
validate_itinerary - Added
verify_answer
7 tool updates
v1.0.0- First observed
lookup_airports - First observed
search_dates - First observed
search_explore - First observed
search_flex - First observed
search_flights - First observed
search_hotels - First observed
search_trip
TDQS
Scored across 22 tools
The many search_* tools have clearly distinct scopes (dates vs flex vs explore vs hidden city vs split tickets), but some overlap remains: get_hotel_details with room_rates=true and search_hotel_rooms both fetch room quotes, and price_history/watch_price both track price changes. Descriptions help, so mostly distinct but not perfect.
All names are lowercase snake_case, mostly verb_noun, but price_history is noun-only and the set mixes search_, lookup_, get_, watch_ verbs without a single uniform convention. Still readable and predictable overall.
22 tools is on the heavy side for a travel search server. While most tools have a clear role, the breadth of flight-search modes and overlapping hotel/price utilities makes the set feel borderline overloaded.
The surface covers flight/hotel search, validation, rechecking, price history, watching, awards, transfers, and local planning. Booking is explicitly out of scope, but there is no dedicated multi-city search or ground transport coverage, leaving minor gaps.
Maintenance
Related MCP Connectors
Flight search MCP server providing search, pagination, and itinerary details for AI assistants.
Search and compare flight offers through a cache-aware Streamable HTTP MCP server for AI agents.
AI marketplace — flights, tours, activities, transport & more via MCP. No auth required.
Give AI assistants access to real-time data. Search the web, compare flights, find hotels, and more.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceThis MCP server allows an AI assistants to search for flight information online using Google Flights. It can find flights for specific dates or search through a range of dates to find all options or just the cheapest ones available.27-
- AlicenseBqualityDmaintenanceEnables AI assistants to query flight routes, real-time flight tracking, weather, and transfer flights via standardized MCP tools.10MIT
- AlicenseNot gradedqualityDmaintenanceCoordinates flights, hotels, events, weather, currency, and traffic data through a single MCP server, enabling comprehensive trip planning via natural language prompts.MIT
- FlicenseNot gradedqualityAmaintenanceProvides real travel search for AI assistants, enabling flight, hotel, car rental, and ground transportation searches through a single MCP tool, with no API keys required.88-