← The evidence ledger
Evidence row 771864
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint 4eeaa427-2f7c-4974-8f2c-b866566c19b7
- Recorded
- Previous row
- None: the first of its kind about this subject
- Body SHA-256
- f2dbce8e2392510fa98d8c63588289cec3504d685ae0cdbd52177bb0e65e1cf2
- Leaf
- 0x78d53aa213aeddb5a9ebbd38f4401d72623be0a077a1c9b0f07bb620fa4076f6
What was observed
{
"count": 2,
"tools": [
{
"description": "Find the cheapest round-trip across a FLEXIBLE multi-month date window with a min/max trip length — e.g. \"10–15 days, anytime Sep–Nov\". Search a broad date window rather than requiring the traveler to choose exact dates first. First call the search_locations MCP tool for city or airport names, then pass each returned airport:AAA or city:AAA value unchanged as origin/destination (explicit legacy IATA codes remain supported). Dates are OPTIONAL: add an earliest/latest window when the traveler has one, or omit them (or give just one side) and a sensible default window is searched — metadata.window_defaulted says so and query echoes the window used, so a dateless call always returns flights instead of an error. Add min/max trip duration; get back a ranked list of the cheapest fares (with booking links) plus a price verdict — an honest read of whether the cheapest fare is low, typical, or high versus the route's usual price, or unknown when we lack a usable typical-price band (a price-level read, not a buy-now-or-wait timing prediction). Non-economy requests may return action-bound Google Flights seller quotes or separate route-price evidence in metadata.route_price_check. For a specific route, set checked_bags=1 when the traveler needs one checked bag, then inspect each result's price_basis; anywhere discovery does not support baggage pricing. Checked-bag searches still run seller enrichment but set the fare-only verdict and metadata.route_price_check to null; verify=full does not override that boundary. Use it for any flight question where the dates are flexible, unknown, or the user wants the cheapest time to fly. If a window comes back thin or cannot fit the return, the search widens it one step itself and reports that in metadata.hints — no second call needed. A city:/airport: prefix that contradicts its code (city:CDG names an airport, airport:PAR names a city) is likewise searched as the identity the catalog does know, with a selector_corrected entry in metadata.hints naming the requested and used tokens. Dates already in the past get the same treatment: a window that only STARTS in the past is searched from today with a window_clamped entry in metadata.hints, and a window that has already ENDED is not searched at all — the results are empty and a window_in_past entry names a suggested window to ask for instead, so do not retry the same dates. If metadata.refresh_hint is present, this response shipped without something a repeat call can add: issue the same call again immediately (do not sleep or poll) and read refresh_hint.action for what will be included. If you can wait longer for that best-effort cross-check, set verify=full. It uses a longer ~35s budget, but never treats a different airline, itinerary, gate, or booking URL as verification of the displayed offer. Pass sellers=false when the traveler wants the price picture but is not booking through this answer: it skips the live seller-quote wave, so the ranked calendar fares, booking links and metadata.route_price_check still come back but metadata.seller_enrichment_status is `skipped` and no seller quote, seller-level baggage fee or direct seller action is resolved. Provider failure, unavailability, or a spend cap can still return only cached indicators; always inspect metadata.seller_enrichment_status (`applied` means complete date-pair coverage put Serp-derived seller data in results; `complete` means the selected plan and action resolution completed without such data entering results; `partial` means date-pair or direct-action coverage has gaps though valid seller data may still rank; `skipped` is reserved for response surfaces where enrichment does not apply) and metadata.seller_enrichment_coverage. That object reports the theoretical query-valid date pairs and how many were targeted/searched; it is not exhaustive provider inventory. Default requests target at most three pairs, while explicit verify=full targets at most seven with bounded longer budgets. Inspect metadata.freshness, and metadata.route_price_check.",
"inputSchema": {
"properties": {
"cabin": {
"default": "economy",
"description": "Cabin class: economy (default), premium_economy, business, or first. The Travelpayouts calendar covers economy; Google Flights may additionally return action-bound seller quotes for the requested cabin. Actionless evidence remains in metadata.route_price_check.",
"examples": [
"economy",
"business"
],
"title": "cabin",
"type": "string"
},
"ch": {
"default": "direct",
"description": "Acquisition channel tag (e.g. web, mcp, a campaign name) for first-party analytics. Durable booking links retain the validated Travelpayouts marker for commission but do not trust opaque shortlinks solely to carry provider-dashboard sub_id attribution. Defaults to 'direct'; reduced to a bounded registered channel.",
"examples": [
"web",
"mcp",
"direct"
],
"maxLength": 64,
"title": "ch",
"type": "string"
},
"checked_bags": {
"default": 0,
"description": "Checked bags requested for the current one-adult, specific-route search contract. Anywhere discovery rejects checked_bags=1. Set to 1 to add a seller's unambiguous first-checked-bag fee to the ranked customer price. Unknown fees remain labeled in results[].price_basis instead of being guessed. Seller enrichment still runs, but the fare-only verdict and route-price check remain null, including when verify=true or verify=full.",
"examples": [
0,
1
],
"maximum": 1,
"minimum": 0,
"title": "checked_bags",
"type": "integer"
},
"currency": {
"default": "USD",
"description": "Result currency, 3-letter ISO code UPPERCASE.",
"examples": [
"USD",
"EUR",
"SGD"
],
"title": "currency",
"type": "string"
},
"earliest": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"description": "Earliest acceptable departure date (ISO YYYY-MM-DD). Optional: omit it and a default window is searched, with the applied window echoed in `query` and flagged by `metadata.window_defaulted`. A date already in the past is clamped to today and reported as `window_clamped` in `metadata.hints` — unless `latest` has passed too, in which case the whole window is declined rather than clamped (see `latest`). Ignored in anywhere mode.",
"examples": [
"2026-09-29"
],
"title": "earliest",
"type": "string"
},
"from": {
"description": "Origin location. Use a legacy 3-letter code (SHA), an exact airport (airport:SHA), or an all-airports city (city:SHA). Required for every search, including to=anywhere.",
"examples": [
"SGN",
"airport:SHA",
"city:SHA"
],
"title": "from",
"type": "string"
},
"latest": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"description": "Latest acceptable return date for round-trip, or latest acceptable departure for one-way (ISO YYYY-MM-DD). Window from earliest must be ≤365 days. Optional: omit it and it is derived from `earliest` (or from the default window when both are omitted). A window ending before today is not searched; the response is empty with a `window_in_past` hint. Ignored in anywhere mode.",
"examples": [
"2026-12-28"
],
"title": "latest",
"type": "string"
},
"max_days": {
"default": 30,
"description": "Maximum round-trip duration in days (return - departure); ignored for one-way and anywhere mode.",
"examples": [
15
],
"maximum": 365,
"minimum": 1,
"title": "max_days",
"type": "integer"
},
"max_transfers": {
"anyOf": [
{
"maximum": 5,
"minimum": 0,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Maximum number of transfers/layovers per leg. 0 = nonstop only, 1 = up to 1 stop, etc. Omit for no filter.",
"examples": [
0,
1
],
"title": "max_transfers",
"type": "integer"
},
"min_days": {
"default": 3,
"description": "Minimum round-trip duration in days (return - departure); ignored for one-way and anywhere mode.",
"examples": [
10
],
"maximum": 365,
"minimum": 1,
"title": "min_days",
"type": "integer"
},
"one_way": {
"default": false,
"description": "If true, search one-way flights; return_date and duration_days will be null.",
"title": "one_way",
"type": "boolean"
},
"sellers": {
"default": true,
"description": "Whether to run the live seller-quote wave (Google Flights `booking_options`) for this request. Default `true`: unchanged behavior — the bounded frontier resolves seller prices, baggage basis, and the executable booking action. Set `sellers=false` to ask for the ranked fare calendar and the route-level price check ONLY: the response then carries `metadata.seller_enrichment_status=\"skipped\"`, results keep their Travelpayouts-grounded prices and durable booking links, and no seller quote, seller-level baggage fee, or direct seller action is resolved. It exists for callers that want the price picture cheaply and do not intend to book — our own curve-seeding crons use it — because the seller wave is where a search's provider spend actually goes (about seven of its ~eight calls). Non-economy cabins have no calendar source, so `sellers=false` there leaves `metadata.route_price_check` as the only priced evidence and `results` may be empty.",
"examples": [
true,
false
],
"title": "sellers",
"type": "boolean"
},
"to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Destination location: a legacy code, airport:AAA, or city:AAA. Pass `anywhere` (or omit) to get the cheapest destinations from the origin instead of a specific route.",
"examples": [
"ICN",
"airport:PVG",
"city:BJS",
"anywhere"
],
"title": "to",
"type": "string"
},
"top_n": {
"default": 10,
"description": "Maximum number of results to return, sorted cheapest-first. Specific routes allow up to 50; anywhere mode returns at most 12.",
"examples": [
10
],
"maximum": 50,
"minimum": 1,
"title": "top_n",
"type": "integer"
},
"verify": {
"default": "false",
"description": "How hard to cross-check the top result's route, dates, and cabin against Google Flights (SerpApi). `false` (default): the check still runs automatically on a fresh search when the top isn't already a live price, within a client-aware time budget. `true`: force the check even on a cache hit. `full`: THOROUGH mode — force the same best-effort check with a longer ~35s budget and widen the request-local seller/date sample from at most three pairs to at most seven (set it when you can wait, e.g. an autonomous agent). The six-hour base and its cache key do not change. This does not verify the displayed airline, itinerary, gate, or booking URL; inspect `metadata.route_price_check` separately. Checked-bag searches keep this fare-only route check and verdict null even when verify=true or verify=full; seller-level baggage enrichment still runs. Displayed Travelpayouts fares remain explicitly labeled cached indicators. No-op unless a SerpApi key is configured.",
"examples": [
"false",
"true",
"full"
],
"title": "verify",
"type": "string"
}
},
"required": [
"from"
],
"title": "search_flightsArguments",
"type": "object"
},
"name": "search_flights"
},
{
"description": "Resolve a city or airport name or code before searching flights. Returns typed values such as city:SHA to search every catalog airport in Shanghai or airport:SHA for Hongqiao only. Pass the selected value unchanged to search_flights. Ask the traveler when multiple results are plausible.",
"inputSchema": {
"properties": {
"limit": {
"default": 12,
"maximum": 50,
"minimum": 1,
"title": "limit",
"type": "integer"
},
"q": {
"description": "Airport/city name or 3-letter code prefix.",
"examples": [
"Shanghai",
"SHA",
"Zhangjiajie"
],
"maxLength": 80,
"minLength": 1,
"title": "q",
"type": "string"
}
},
"required": [
"q"
],
"title": "search_locationsArguments",
"type": "object"
},
"name": "search_locations"
}
]
}What the leaf hashes
{"body":"f2dbce8e2392510fa98d8c63588289cec3504d685ae0cdbd52177bb0e65e1cf2","id":771864,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793190744265878,"prev":null,"subject":"4eeaa427-2f7c-4974-8f2c-b866566c19b7","subject_kind":"endpoint"}Proof
Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (231336 rows).
- 0x78d56e3c5e4b28db5e18bdba71f4184f9ee42d3fb47eb916f4c8c12318e18501
- 0xee50080d076788ec914814f3e442ddae647a982155df1eddf73c18c86f4f51a0
- 0x6f4ce0919e1d82ebe2d53c131c00847f1b8e73eaa2795f2a2553a7c01d069d20
- 0xe15cc9fa3ac33f5c1724860d555cd4562b80fdc3b2f0587842f597928a588c11
- 0x1b94b95cb05017036acc38090c0a0a519962654938e8f44f4ad70b6dcb89ae63
- 0xefd3a47dc3a350778566f2eca7e02a22479fcb42d0b319d3915dd0cdb1e89349
- 0x9f5c6eacf8513eea749446af6a0ff7538726540bcb4ab5230d2a8e3d2177f435
- 0x2f41b78309b4c84432b7d3dcee02f645e6ca9c07914a1ba014435cd427317acc
- 0xacb59b78318069cea5eeb47abae43500229ebd52423a05fee47842428da5340a
- 0x66d68c78860c1445468094a54d8011999f780bceded1a27939a169a26cf26f54
- 0x15d8ab6b48c22d68202fad488a3d460412e3d43df7bc99f0b6e0e726e938dad3
- 0x14bc09b6df5a608be5eb21fd732d89ed12cec17a5315a631f36ba8d1ba314ab3
- 0x95d7bc27dc9ea43e607251bd7e1cdfa9e00b59b71051b5db78fe06bf25becc5b
- 0x40581185279a8bf075dca3a4c3a5648ec6f62098ba7402cbc097d5cc707e0840
- 0xab4e84d781dccd579dcf5c47a356a4a2e6cac58a2aefdf3543a3fa15238fa4db
- 0x74cf00e07b52415c2184cf20be69d195ed2725497a6892c2f3e449497c17d0ec
- 0x7a743a0a09057bae687051274e1d45bf973bd36a1a4ba16a191b5d29e3bdfa2a
- 0xe027395fafb7fc41921c42ca0542524ea22204cbd5908b70b27f3d5fb26f5d0f
- Day root
- 0x2c19037464cc4c493624565f01775d6446fc78eaa118fc6865bfe2bfca9ff78e
- Chained
- 0xd1d7dee8322ceff8f4c8d83aa1fe4a4466825c2af1c97dbde3d35db61234f7be
- Published
- On Arc Testnet, block 69584042: 0x8bae2b1d097834c8b458513862d70d29ee807e98dc2e863b27250131c15b35ae