Voyscout Price History
Server Details
Historical flight and package price series for Czech origins. Honest stats, no verdicts. CC BY 4.0
- Status
- Healthy
- Uptime
- 100.0% over 57 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2024-11-05
- URL
TDQS
Scored across 5 tools
Each tool maps to a distinct query shape: catalog (list_destinations), one-destination summary vs history (current_vs_history), one-destination time series (price_history), 2-8 destinations side by side (compare_destinations), and global ranking with no destination named (find_opportunities). The descriptions cross-reference each other well, but there is residual overlap since compare_destinations emits the same per-destination stats as current_vs_history and the boundary between current_vs_history and find_opportunities hinges only on whether a destination is named.
All names use snake_case, and three follow a clean verb_noun pattern (compare_destinations, list_destinations, find_opportunities). However current_vs_history and price_history are noun phrases rather than verb_noun, so the convention is not fully uniform across the set.
Five tools is well-scoped for a read-only price history service, and each earns its place: a catalog, a single-destination summary, a single-destination time series, a multi-destination comparison, and a global ranking. There is no redundant or filler tool.
The read-only historical-price domain is fully covered: discover destinations, inspect one destination's current position or full series, compare several side by side, and rank all rails. No write operations are needed for a historical dataset, and no obvious query path is left as a dead end.
Available Tools
5 toolscompare_destinationsCompare destinationsARead-onlyInspect
Use when the user names two or more destinations and wants their prices side by side ("porovnej Egypt a Maltu", "compare Malta and Madeira"). Put 2-8 named destinations side by side on the same snapshot, each with the stats current_vs_history reports (last measurement, median, min, share of TRACKED DAYS that were dearer). Numbers are for the WHOLE party, not per person, and percentages are over observed days rather than the calendar span. Rows come back in the order you asked for - it does not rank, and gives no verdict; use find_opportunities to rank. A destination that yields no row is returned under excluded with the reason, and with available_in_country when a page of the same country does publish that party. A flight row and a package row can price DIFFERENT trip lengths (searched.stay_nights, e.g. 28-31-night flights beside the cheapest 5-14-night package): stay_comparison says so per destination - say the lengths when you put the two side by side, and never present the gap as the price of accommodation. When you answer from this, say where the latest price sits in its own history and stop there: do not tell the reader to buy, book, wait, avoid or which destination to pick - the series carries no trend, volatility or live availability, so that judgement stays the reader's.
| Name | Required | Description | Default |
|---|---|---|---|
| rail | No | optional (default both): restrict to one rail | |
| party | No | optional (default '2-2'): '<adults>-<children>', the same A-C shape the price streams are keyed on. A well-formed party no rail carries returns `no_coverage` with the parties that exist | |
| destinations | Yes | 2-8 destination slugs, or each destination's own published name in English or Czech (e.g. 'turkey', 'Bulharsko'); resort keys are not accepted here; the answer keeps this order | |
| min_history_days | No | optional (default 30): rails measured for fewer days are listed under 'excluded' |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly, non-destructive) but the description adds far more: whole-party vs per-person pricing, percentages over observed days not calendar span, preserved input ordering with no ranking, excluded rows with reasons plus available_in_country, and the flight/package stay_nights mismatch with the stay_comparison caveat. It even constrains the agent's phrasing ('do not tell the reader to buy, book, wait').
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?
Trigger phrase and core behavior are front-loaded, and the informational density is high. It runs long and the final guidance sentence is extended, but nearly every clause carries decision-relevant content rather than 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 described, yet the description still supplies the interpretation the schema can't convey (whole-party totals, observed-day percentages, ordering, exclusion semantics). Nothing needed to call or interpret this 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 coverage is already 100%, so the baseline is 3, but the description adds real meaning beyond the schema: prices are for the whole party rather than per person, and min_history_days excludes under-measured rails into 'excluded'. It explains the semantic consequence of the destinations ordering as well.
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?
Specific verb (compare) plus resource (destinations) with an explicit scope: 2-8 named destinations side by side on the same snapshot. It also states what each row contains and that rows are not ranked, which separates it cleanly from find_opportunities.
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?
Opens with the exact trigger condition ('user names two or more destinations and wants their prices side by side') and gives bilingual example utterances. It explicitly routes ranking/verdict requests to find_opportunities, so the when-not is covered too.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
current_vs_historyCurrent price vs. historyARead-onlyInspect
Use when the user asks whether today's price for one destination is low or high against its own history ("je teď Egypt levný?", "is Egypt cheap right now?"). Stats for one destination (min, median, and what share of the TRACKED DAYS were dearer than the last measurement) without the sample points. Percentages are over observed days, not over the calendar span. Descriptive only: it does not say whether to buy. A rail without resort covers the whole destination, so after resolved_from cite it under the destination's name, not the resort's. other_parties_in_country names the related pages that publish a party this destination does not (e.g. a solo series on a city): cite it instead of saying that party is not tracked. When you answer from this, say where the latest price sits in its own history and stop there: do not tell the reader to buy, book, wait, avoid or which destination to pick - the series carries no trend, volatility or live availability, so that judgement stays the reader's.
| Name | Required | Description | Default |
|---|---|---|---|
| destination | Yes | destination slug, as returned by list_destinations. A RESORT key read off a rail (e.g. 'hurghada') also resolves, to its parent destination, and the answer then carries `resolved_from`; underscores and hyphens are interchangeable, and the destination's own published name in English or Czech (e.g. 'thailand', 'Řecko') resolves to that same page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read-only/non-destructive safety profile; the description goes well beyond by disclosing that percentages are over observed days (not calendar span), that no sample points are returned, that it is descriptive-only with no buy signal, and that the series carries no trend/volatility/availability. It even constrains the answering behavior (state where the price sits and stop).
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 trigger is front-loaded, but the piece is long and repeats itself: the 'descriptive only / does not say whether to buy' point appears at the start and again in the final clause ('do not tell the reader to buy, book, wait, avoid...'). Tightening would lose no information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be re-described, and the description still summarizes the stats and the resolved_from / other_parties_in_country fields an agent must interpret. It is essentially complete for a single-parameter stats tool, minor redundancy aside.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3: destination resolution, resort aliasing, and resolved_from are already fully documented in the schema. The description's added note about citing a rail without `resort` under the destination's name is answer-formatting guidance rather than new parameter meaning.
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?
It names a specific resource and scope: history-relative statistics (min, median, share of tracked days dearer) for a single destination's latest price. This is clearly distinguishable from siblings like compare_destinations (multi-destination) and price_history (raw series), so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger with real user-phrasing examples ("je teď Egypt levný?") and states the condition that selects it: one destination, judged against its own history. It also prescribes how to handle rails without `resort` and when to defer to `other_parties_in_country`, i.e. how to answer rather than which other tool to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_opportunitiesFind opportunitiesARead-onlyInspect
Use when the user asks where it is unusually cheap right now without naming a destination ("kde je teď levně?", "where is it cheap right now?"). Rank every published rail by how its LAST measurement compares with its own tracked history, so a caller can ask 'where is it unusually cheap right now?' in one call instead of one call per destination. Each row is ONE rail, so a destination with several rails can appear once per rail with different numbers: name the rail when you cite a row. Read searched before interpreting a price: it is the TRIP the series was collected for (the search mode, and the fixed travel dates where there are any - a Christmas series is not the price of a summer trip), while measured is when we observed it; price_covers says what the money buys and origins the departure-airport cluster. Percentages are over observed days, not the calendar span. latest_cheaper_than_pct_of_days is the same number as cheaper_than_pct under a name that states its direction (higher = cheaper than more of the tracked days). stale_rails says how many of the rails THIS call matched are past their own freshness boundary today, with the day it was judged (as_of), so the caller need not subtract dates per row. Descriptive only: it ranks observations and gives no verdict. Rails with too little history are returned under excluded, never dropped silently. When you answer from this, say where the latest price sits in its own history and stop there: do not tell the reader to buy, book, wait, avoid or which destination to pick - the series carries no trend, volatility or live availability, so that judgement stays the reader's.
| Name | Required | Description | Default |
|---|---|---|---|
| rail | No | optional: restrict to one rail | |
| sort | No | optional (default cheapest_vs_history): 'cheapest_vs_history' ranks by the share of tracked days that were dearer; 'most_below_median' ranks by how far the last measurement sits below the median, relatively | |
| limit | No | optional (default 10): how many rows to return; 'matched' reports the count before the cap | |
| party | No | optional: '<adults>-<children>', e.g. '2-2' - the same A-C shape the price streams are keyed on. A well-formed party no rail carries returns `no_coverage` with the parties that exist | |
| min_history_days | No | optional (default 30): rails measured for fewer days are listed under 'excluded' |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description adds substantial behavioral context beyond them: descriptive-only with no verdict, low-history rails surfaced under `excluded` rather than dropped, `stale_rails` freshness judgement with `as_of`, and the explicit caveat that the series carries no trend, volatility or live availability.
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 usage trigger, then moves through output interpretation in a dense, purposeful sequence. It is long (~250 words) and repeats the 'unusually cheap right now' framing, but nearly every sentence carries an interpretive constraint that would otherwise be missed.
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?
Despite having an output schema, it supplies the interpretive context an agent needs to read the rows correctly: rail-level row semantics, the direction sign of the cheaper-than percentage, day-based vs calendar-based percentages, and freshness handling. Complete for a zero-required-parameter screening tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter is already documented in the schema, so the baseline is 3. The description adds meaning mostly about output fields (`searched`, `measured`, `price_covers`, `origins`) rather than input parameters; it does not extend sort/limit/rail semantics beyond what the schema states.
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 precise verb+resource and scope: it ranks every published rail by how its latest measurement compares with that rail's own tracked history, and frames it as the one-call alternative to 'one call per destination', which implicitly distinguishes it from destination-scoped siblings. An agent can tell this apart from price_history or compare_destinations 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?
Gives an explicit trigger with bilingual example utterances ('kde je teď levně?'), a contrast condition (without naming a destination), and downstream guidance on what to say from the answer and what not to claim (no buy/book/wait/avoid verdict).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_destinationsList destinationsARead-onlyInspect
Use when the user asks which destinations are tracked or how long a price history is ("co sledujete?", "what do you track?"), or when another tool needs a slug you do not know. List every destination with a published price series, with how many days each rail was actually measured and the calendar span those measurements fall in. A destination can have several rails (e.g. flights and packages), each with its OWN measured days and span: history depth is a property of the rail, not of the destination, so when you report it, name the rail or give each one. A city names its country under country, and related lists the other tracked pages of the same country (a country lists its cities): a party or rail missing on one page may be published on another, so check related before saying something is not tracked. same_airport_as marks pages that fly to the same airport from a different departure cluster - their prices differ because origins differ. Historical observations only. When you answer from this, say where the latest price sits in its own history and stop there: do not tell the reader to buy, book, wait, avoid or which destination to pick - the series carries no trend, volatility or live availability, so that judgement stays the reader's.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), yet the description layers on substantive behavior: per-rail measurement semantics, country/related cross-page structure, same_airport_as origins differences, the 'historical observations only' scope, and the explicit no-recommendation guardrail. It even tells the agent how to phrase an answer, which 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?
Trigger conditions are front-loaded and every sentence carries distinct information, but it is delivered as one dense, unstructured paragraph mixing invocation guidance, output semantics, and response-authoring rules. A few line breaks or ordering cues would make the same content easier to scan.
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?
Even though an output schema exists, the description supplies the interpretive layer the schema cannot (rail-level granularity, related-page coverage, same_airport_as meaning, historical-only scope). For a parameterless reference tool with sibling analysis tools, nothing an agent needs to call and correctly report it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters (schema coverage 100%), so per the scoring baseline this starts at 4. The description spends its detail on output fields (rails, measured days, span, country, related, same_airport_as) rather than inputs, which is appropriate but means no parameter semantics are added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb+resource (list every destination with a published price series) and adds the distinguishing detail that history depth is per-rail, not per-destination. It also implicitly separates this enumeration/reference tool from the analysis-oriented siblings (price_history, compare_destinations) by framing itself as the place to resolve an unknown slug.
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 trigger conditions ('use when the user asks which destinations are tracked', 'when another tool needs a slug you do not know') including sample user phrasings, and adds a pre-condition for authoring answers ('check `related` before saying something is not tracked'). This is well beyond implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
price_historyPrice historyARead-onlyInspect
Use when the user asks how the price of one destination developed over time ("jak se vyvíjela cena letenek do Egypta?", "price history for Egypt"). Price series for one destination: measured span, stats, a downsampled sample of points and any regime breaks. Historical observations only, never a live quote or a recommendation. Each rail's searched.stay_nights is the trip length its points price, and a destination's flight and package rails can differ - state it when citing a number. In series_sample.points, origin is the departure airport of that day's cheapest fare, not a price from that airport: points from different days do not compare airports, and the sample holds no per-airport price for any day. A rail without resort covers the whole destination, so after resolved_from cite it under the destination's name, not the resort's. other_parties_in_country names the related pages that publish a party this destination does not (e.g. a solo series on a city): cite it instead of saying that party is not tracked. When you answer from this, say where the latest price sits in its own history and stop there: do not tell the reader to buy, book, wait, avoid or which destination to pick - the series carries no trend, volatility or live availability, so that judgement stays the reader's.
| Name | Required | Description | Default |
|---|---|---|---|
| rail | No | optional: restrict to one rail | |
| destination | Yes | destination slug, as returned by list_destinations. A RESORT key read off a rail (e.g. 'hurghada') also resolves, to its parent destination, and the answer then carries `resolved_from`; underscores and hyphens are interchangeable, and the destination's own published name in English or Czech (e.g. 'thailand', 'Řecko') resolves to that same page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read profile (readOnlyHint=true, destructiveHint=false), so the bar is low, yet the description adds substantial behavior: per-rail stay_nights semantics, the fact that flight and package rails can differ, what `origin` actually means in a sample, how `resolved_from`/resort keys affect citation, and the `other_parties_in_country` fallback. It even constrains the answer ('say where the latest price sits... do not tell the reader to buy').
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 trigger and purpose, and each following sentence carries distinct citation/semantics guidance rather than filler. It is dense and long, but the length is mostly earned by the number of field-level semantics it clarifies; structure is additive, not repetitive.
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 not needed, and the description supplies the cross-cutting semantics an agent needs (rail divergence, origin meaning, resolved_from citation, untracked-party pointer). Nothing required to call or correctly narrate the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the `destination` schema text is already rich, so the baseline is 3. The description still adds value by explaining that `rail`'s points price a specific `searched.stay_nights` trip length and that flight/package rails can diverge, which the schema does not convey.
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 price series for a single destination over time - and enumerates what the series contains (measured span, stats, downsampled points, regime breaks). It explicitly fences itself off from current_vs_history ('never a live quote') and from recommendation tools, so an agent can pick it apart from siblings 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?
Opens with a concrete when-to-use trigger and quoted user phrasings, then gives the when-not ('historical observations only, never a live quote or a recommendation'). This functionally routes the agent away from current_vs_history and the opportunity/comparison siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- Changed
compare_destinations1 field changed- changed
Input schema / properties / destinations / descriptionPrevious value: -"2-8 destination slugs; the answer keeps this order"New value: +"2-8 destination slugs, or each destination's own published name in English or Czech (e.g. 'turkey', 'Bulharsko'); resort keys are not accepted here; the answer keeps this order"
- Changed
current_vs_history1 field changed- changed
Input schema / properties / destination / descriptionPrevious value: -"destination slug, as returned by list_destinations. A RESORT key read off a rail (e.g. 'hurghada') also resolves, to its parent destination, and the answer then carries `resolved_from`; underscores and hyphens are interchangeable."New value: +"destination slug, as returned by list_destinations. A RESORT key read off a rail (e.g. 'hurghada') also resolves, to its parent destination, and the answer then carries `resolved_from`; underscores and hyphens are interchangeable, and the destination's own published name in English or Czech (e.g. 'thailand', 'Řecko') resolves to that same page."
- Changed
price_history2 fields changed- changed
Input schema / properties / destination / descriptionPrevious value: -"destination slug, as returned by list_destinations. A RESORT key read off a rail (e.g. 'hurghada') also resolves, to its parent destination, and the answer then carries `resolved_from`; underscores and hyphens are interchangeable."New value: +"destination slug, as returned by list_destinations. A RESORT key read off a rail (e.g. 'hurghada') also resolves, to its parent destination, and the answer then carries `resolved_from`; underscores and hyphens are interchangeable, and the destination's own published name in English or Czech (e.g. 'thailand', 'Řecko') resolves to that same page." - changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "country": { - "description": "the one country page this city belongs to, where the catalogue names exactly one", - "type": "string" - }, - "currency": { - "type": "string" - }, - "destination": { - "properties": { - "key": { - "type": "string" - }, - "slug": { - "type": "string" - }, - "title": { - "properties": { - "cs": { - "type": "string" - }, - "en": { - "type": "string" - } - }, - "required": [ - "cs", - "en" - ], - "type": "object" - } - }, - "required": [ - "key", - "slug", - "title" - ], - "type": "object" - }, - "disclaimer": { - "type": "string" - }, - "generated": { - "type": "string" - }, - "license": { - "properties": { - "attribution": { - "type": "string" - }, - "id": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "url", - "attribution" - ], - "type": "object" - }, - "note": { - "description": "present when the `rail` filter matched nothing published for this destination", - "type": "string" - }, - "other_parties_in_country": { - "description": "parties a `related` page publishes and this destination does not - e.g. a solo series on a city of this country", - "items": { - "properties": { - "destinations": { - "items": { - "type": "string" - }, - "type": "array" - }, - "party": { - "type": "string" - } - }, - "required": [ - "party", - "destinations" - ], - "type": "object" - }, - "type": "array" - }, - "rails": { - "items": { - "properties": { - "arrivals": { - "description": "arrival airports RECORDED; covers_all_published_prices is false", - "type": "object" - }, - "latest_stale_after_days": { - "description": "this rail's own freshness boundary, in days after measured.to", - "type": "number" - }, - "measured": { - "properties": { - "days": { - "type": "integer" - }, - "from": { - "type": "string" - }, - "to": { - "type": "string" - } - }, - "required": [ - "days", - "from", - "to" - ], - "type": "object" - }, - "origins": { - "description": "departure-airport CLUSTER; covers_all_published_prices is false", - "type": "object" - }, - "party": { - "properties": { - "adults": { - "type": "integer" - }, - "children": { - "type": "integer" - } - }, - "required": [ - "adults", - "children" - ], - "type": "object" - }, - "price_covers": { - "description": "what the money buys - airfare only, or a package as offered", - "type": "object" - }, - "rail": { - "enum": [ - "flight", - "package" - ], - "type": "string" - }, - "regime_breaks": { - "description": "[from, to] date spans where the series was not comparable", - "type": "array" - }, - "resort": { - "type": "string" - }, - "resort_key": { - "type": "string" - }, - "searched": { - "description": "the search mode (and fixed dates, where there are any) the series was collected under, and `stay_nights` {from, to}: how long a trip each point prices - the flight and package rails of one destination can differ", - "type": "object" - }, - "series_sample": { - "description": "a DOWNSAMPLED sample; `complete` says whether it is the whole series", - "properties": { - "complete": { - "type": "boolean" - }, - "points": { - "items": { - "properties": { - "cheapest_total": { - "type": "number" - }, - "date": { - "type": "string" - }, - "departure": { - "type": "string" - }, - "origin": { - "type": "string" - }, - "return": { - "type": "string" - } - }, - "required": [ - "date", - "cheapest_total" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "complete", - "points" - ], - "type": "object" - }, - "stats": { - "properties": { - "basis": { - "type": "string" - }, - "cheaper_than_pct": { - "type": [ - "number", - "null" - ] - }, - "is_series_max": { - "type": "boolean" - }, - "is_series_min": { - "type": "boolean" - }, - "latest": { - "type": [ - "number", - "null" - ] - }, - "median": { - "type": [ - "number", - "null" - ] - }, - "min": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "basis" - ], - "type": "object" - } - }, - "required": [ - "rail", - "party", - "price_covers", - "measured", - "stats", - "series_sample" - ], - "type": "object" - }, - "type": "array" - }, - "related": { - "description": "the other tracked pages in the same country (a country lists its cities); a party or rail missing here may exist on one of them", - "items": { - "type": "string" - }, - "type": "array" - }, - "resolved_from": { - "description": "Present when the caller named a RESORT key; the answer is its parent destination.", - "properties": { - "asked": { - "type": "string" - }, - "resort": { - "type": [ - "string", - "null" - ] - }, - "resort_key": { - "type": "string" - } - }, - "required": [ - "asked", - "resort_key", - "resort" - ], - "type": "object" - }, - "same_airport_as": { - "description": "pages whose flight rail lands at an airport this one records - measured from a different departure cluster (see `origins`), so their numbers differ for a reason", - "items": { - "type": "string" - }, - "type": "array" - }, - "schema": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "schema", - "generated", - "destination", - "url", - "currency", - "license", - "related", - "rails", - "disclaimer" - ], - "type": "object" - }, - { - "description": "tool-level failure, returned with isError: true", - "properties": { - "error": { - "additionalProperties": true, - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - } - }, - "required": [ - "error" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "country": { + "description": "the one country page this city belongs to, where the catalogue names exactly one", + "type": "string" + }, + "currency": { + "type": "string" + }, + "destination": { + "properties": { + "key": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "title": { + "properties": { + "cs": { + "type": "string" + }, + "en": { + "type": "string" + } + }, + "required": [ + "cs", + "en" + ], + "type": "object" + } + }, + "required": [ + "key", + "slug", + "title" + ], + "type": "object" + }, + "disclaimer": { + "type": "string" + }, + "generated": { + "type": "string" + }, + "license": { + "properties": { + "attribution": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "attribution" + ], + "type": "object" + }, + "note": { + "description": "present when the `rail` filter matched nothing published for this destination", + "type": "string" + }, + "other_parties_in_country": { + "description": "parties a `related` page publishes and this destination does not - e.g. a solo series on a city of this country", + "items": { + "properties": { + "destinations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "party": { + "type": "string" + } + }, + "required": [ + "party", + "destinations" + ], + "type": "object" + }, + "type": "array" + }, + "rails": { + "items": { + "properties": { + "arrivals": { + "description": "arrival airports RECORDED; covers_all_published_prices is false", + "type": "object" + }, + "latest_stale_after_days": { + "description": "this rail's own freshness boundary, in days after measured.to", + "type": "number" + }, + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "origins": { + "description": "departure-airport CLUSTER; covers_all_published_prices is false", + "type": "object" + }, + "party": { + "properties": { + "adults": { + "type": "integer" + }, + "children": { + "type": "integer" + } + }, + "required": [ + "adults", + "children" + ], + "type": "object" + }, + "price_covers": { + "description": "what the money buys - airfare only, or a package as offered", + "type": "object" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "regime_breaks": { + "description": "[from, to] date spans where the series was not comparable", + "type": "array" + }, + "resort": { + "type": "string" + }, + "resort_key": { + "type": "string" + }, + "searched": { + "description": "the search mode (and fixed dates, where there are any) the series was collected under, and `stay_nights` {from, to}: how long a trip each point prices - the flight and package rails of one destination can differ", + "type": "object" + }, + "series_sample": { + "description": "a DOWNSAMPLED sample; `complete` says whether it is the whole series", + "properties": { + "complete": { + "type": "boolean" + }, + "points": { + "items": { + "properties": { + "cheapest_total": { + "type": "number" + }, + "date": { + "type": "string" + }, + "departure": { + "type": "string" + }, + "origin": { + "description": "In `series_sample.points`, `origin` is the departure airport of that day's cheapest fare, not a price from that airport: points from different days do not compare airports, and the sample holds no per-airport price for any day.", + "type": "string" + }, + "return": { + "type": "string" + } + }, + "required": [ + "date", + "cheapest_total" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "complete", + "points" + ], + "type": "object" + }, + "stats": { + "properties": { + "basis": { + "type": "string" + }, + "cheaper_than_pct": { + "type": [ + "number", + "null" + ] + }, + "is_series_max": { + "type": "boolean" + }, + "is_series_min": { + "type": "boolean" + }, + "latest": { + "type": [ + "number", + "null" + ] + }, + "median": { + "type": [ + "number", + "null" + ] + }, + "min": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "basis" + ], + "type": "object" + } + }, + "required": [ + "rail", + "party", + "price_covers", + "measured", + "stats", + "series_sample" + ], + "type": "object" + }, + "type": "array" + }, + "related": { + "description": "the other tracked pages in the same country (a country lists its cities); a party or rail missing here may exist on one of them", + "items": { + "type": "string" + }, + "type": "array" + }, + "resolved_from": { + "description": "Present when the caller named a RESORT key; the answer is its parent destination.", + "properties": { + "asked": { + "type": "string" + }, + "resort": { + "type": [ + "string", + "null" + ] + }, + "resort_key": { + "type": "string" + } + }, + "required": [ + "asked", + "resort_key", + "resort" + ], + "type": "object" + }, + "same_airport_as": { + "description": "pages whose flight rail lands at an airport this one records - measured from a different departure cluster (see `origins`), so their numbers differ for a reason", + "items": { + "type": "string" + }, + "type": "array" + }, + "schema": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "schema", + "generated", + "destination", + "url", + "currency", + "license", + "related", + "rails", + "disclaimer" + ], + "type": "object" + }, + { + "description": "tool-level failure, returned with isError: true", + "properties": { + "error": { + "additionalProperties": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } +]
5 tool updates
- Changed
compare_destinations2 fields changed- changed
Input schema / properties / party / descriptionPrevious value: -"optional (default '2-2'): '<adults>-<children>', the same A-C shape the price streams are keyed on"New value: +"optional (default '2-2'): '<adults>-<children>', the same A-C shape the price streams are keyed on. A well-formed party no rail carries returns `no_coverage` with the parties that exist" - changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "comparison": { - "items": { - "properties": { - "arrivals": { - "description": "arrival airports RECORDED; covers_all_published_prices is false", - "type": "object" - }, - "destination": { - "type": "string" - }, - "generated": { - "type": "string" - }, - "latest_stale_after_days": { - "description": "this rail's own freshness boundary, in days after measured.to", - "type": "number" - }, - "measured": { - "properties": { - "days": { - "type": "integer" - }, - "from": { - "type": "string" - }, - "to": { - "type": "string" - } - }, - "required": [ - "days", - "from", - "to" - ], - "type": "object" - }, - "origins": { - "description": "departure-airport CLUSTER; covers_all_published_prices is false", - "type": "object" - }, - "party": { - "properties": { - "adults": { - "type": "integer" - }, - "children": { - "type": "integer" - } - }, - "required": [ - "adults", - "children" - ], - "type": "object" - }, - "price_covers": { - "description": "what the money buys - airfare only, or a package as offered", - "type": "object" - }, - "rail": { - "enum": [ - "flight", - "package" - ], - "type": "string" - }, - "regime_breaks": { - "description": "[from, to] date spans where the series was not comparable", - "type": "array" - }, - "resort": { - "type": "string" - }, - "resort_key": { - "type": "string" - }, - "searched": { - "description": "the search mode (and fixed dates, where there are any) the series was collected under", - "type": "object" - }, - "stats": { - "properties": { - "basis": { - "type": "string" - }, - "cheaper_than_pct": { - "type": [ - "number", - "null" - ] - }, - "is_series_max": { - "type": "boolean" - }, - "is_series_min": { - "type": "boolean" - }, - "latest": { - "type": [ - "number", - "null" - ] - }, - "median": { - "type": [ - "number", - "null" - ] - }, - "min": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "basis" - ], - "type": "object" - }, - "title": { - "properties": { - "cs": { - "type": "string" - }, - "en": { - "type": "string" - } - }, - "required": [ - "cs", - "en" - ], - "type": "object" - }, - "url": { - "type": "string" - } - }, - "required": [ - "destination", - "title", - "url", - "generated", - "rail", - "party", - "price_covers", - "measured", - "stats" - ], - "type": "object" - }, - "type": "array" - }, - "comparison_rows": { - "description": "rows, not destinations - a dual-rail destination contributes two", - "type": "integer" - }, - "currency": { - "type": "string" - }, - "disclaimer": { - "type": "string" - }, - "excluded": { - "items": { - "properties": { - "destination": { - "type": "string" - }, - "generated": { - "type": "string" - }, - "measured": { - "properties": { - "days": { - "type": "integer" - }, - "from": { - "type": "string" - }, - "to": { - "type": "string" - } - }, - "required": [ - "days", - "from", - "to" - ], - "type": "object" - }, - "party": { - "type": "string" - }, - "rail": { - "enum": [ - "flight", - "package", - "both" - ], - "type": "string" - }, - "reason": { - "type": "string" - }, - "resort_key": { - "type": "string" - } - }, - "required": [ - "destination", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "generated": { - "description": "the OLDEST `generated` among the rows and dated exclusions", - "type": [ - "string", - "null" - ] - }, - "license": { - "properties": { - "attribution": { - "type": "string" - }, - "id": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "url", - "attribution" - ], - "type": "object" - }, - "min_history_days": { - "type": "integer" - }, - "party": { - "type": "string" - }, - "rail": { - "enum": [ - "flight", - "package", - "both" - ], - "type": "string" - }, - "schema": { - "type": "string" - } - }, - "required": [ - "schema", - "generated", - "party", - "rail", - "min_history_days", - "comparison_rows", - "comparison", - "excluded", - "disclaimer" - ], - "type": "object" - }, - { - "description": "tool-level failure, returned with isError: true", - "properties": { - "error": { - "additionalProperties": true, - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - } - }, - "required": [ - "error" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "comparison": { + "items": { + "properties": { + "arrivals": { + "description": "arrival airports RECORDED; covers_all_published_prices is false", + "type": "object" + }, + "destination": { + "type": "string" + }, + "generated": { + "type": "string" + }, + "latest_stale_after_days": { + "description": "this rail's own freshness boundary, in days after measured.to", + "type": "number" + }, + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "origins": { + "description": "departure-airport CLUSTER; covers_all_published_prices is false", + "type": "object" + }, + "party": { + "properties": { + "adults": { + "type": "integer" + }, + "children": { + "type": "integer" + } + }, + "required": [ + "adults", + "children" + ], + "type": "object" + }, + "price_covers": { + "description": "what the money buys - airfare only, or a package as offered", + "type": "object" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "regime_breaks": { + "description": "[from, to] date spans where the series was not comparable", + "type": "array" + }, + "resort": { + "type": "string" + }, + "resort_key": { + "type": "string" + }, + "searched": { + "description": "the search mode (and fixed dates, where there are any) the series was collected under, and `stay_nights` {from, to}: how long a trip each point prices - the flight and package rails of one destination can differ", + "type": "object" + }, + "stats": { + "properties": { + "basis": { + "type": "string" + }, + "cheaper_than_pct": { + "type": [ + "number", + "null" + ] + }, + "is_series_max": { + "type": "boolean" + }, + "is_series_min": { + "type": "boolean" + }, + "latest": { + "type": [ + "number", + "null" + ] + }, + "median": { + "type": [ + "number", + "null" + ] + }, + "min": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "basis" + ], + "type": "object" + }, + "title": { + "properties": { + "cs": { + "type": "string" + }, + "en": { + "type": "string" + } + }, + "required": [ + "cs", + "en" + ], + "type": "object" + }, + "url": { + "type": "string" + } + }, + "required": [ + "destination", + "title", + "url", + "generated", + "rail", + "party", + "price_covers", + "measured", + "stats" + ], + "type": "object" + }, + "type": "array" + }, + "comparison_rows": { + "description": "rows, not destinations - a dual-rail destination contributes two", + "type": "integer" + }, + "currency": { + "type": "string" + }, + "disclaimer": { + "type": "string" + }, + "excluded": { + "items": { + "properties": { + "available_in_country": { + "description": "on `no_rail_for_selection`: pages in the same country that do publish the party asked", + "items": { + "type": "string" + }, + "type": "array" + }, + "available_parties": { + "description": "on `no_rail_for_selection`: the parties this destination does publish for the rail asked", + "items": { + "type": "string" + }, + "type": "array" + }, + "destination": { + "type": "string" + }, + "generated": { + "type": "string" + }, + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "party": { + "type": "string" + }, + "rail": { + "enum": [ + "flight", + "package", + "both" + ], + "type": "string" + }, + "reason": { + "type": "string" + }, + "resort_key": { + "type": "string" + } + }, + "required": [ + "destination", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "generated": { + "description": "the OLDEST `generated` among the rows and dated exclusions", + "type": [ + "string", + "null" + ] + }, + "license": { + "properties": { + "attribution": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "attribution" + ], + "type": "object" + }, + "min_history_days": { + "type": "integer" + }, + "no_coverage": { + "description": "present only when NO published rail carries the requested party: a coverage limit, distinct from an empty ranking", + "properties": { + "available_parties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "message": { + "type": "string" + }, + "party": { + "type": "string" + }, + "rail": { + "type": "string" + } + }, + "required": [ + "party", + "rail", + "available_parties", + "message" + ], + "type": "object" + }, + "party": { + "type": "string" + }, + "rail": { + "enum": [ + "flight", + "package", + "both" + ], + "type": "string" + }, + "schema": { + "type": "string" + }, + "stay_comparison": { + "description": "per destination with both a flight and a package row: the trip length each series prices, and whether the two ranges overlap (`stay_comparable`); a `note` when they do not", + "items": { + "properties": { + "destination": { + "type": "string" + }, + "flight_stay_nights": { + "type": "object" + }, + "note": { + "type": "string" + }, + "package_stay_nights": { + "type": "object" + }, + "resort_key": { + "type": "string" + }, + "stay_comparable": { + "type": "boolean" + } + }, + "required": [ + "destination", + "flight_stay_nights", + "package_stay_nights", + "stay_comparable" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "schema", + "generated", + "party", + "rail", + "min_history_days", + "comparison_rows", + "comparison", + "excluded", + "disclaimer" + ], + "type": "object" + }, + { + "description": "tool-level failure, returned with isError: true", + "properties": { + "error": { + "additionalProperties": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } +]
- Changed
current_vs_history1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "currency": { - "type": "string" - }, - "destination": { - "properties": { - "key": { - "type": "string" - }, - "slug": { - "type": "string" - }, - "title": { - "properties": { - "cs": { - "type": "string" - }, - "en": { - "type": "string" - } - }, - "required": [ - "cs", - "en" - ], - "type": "object" - } - }, - "required": [ - "key", - "slug", - "title" - ], - "type": "object" - }, - "disclaimer": { - "type": "string" - }, - "generated": { - "type": "string" - }, - "license": { - "properties": { - "attribution": { - "type": "string" - }, - "id": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "url", - "attribution" - ], - "type": "object" - }, - "rails": { - "items": { - "properties": { - "arrivals": { - "description": "arrival airports RECORDED; covers_all_published_prices is false", - "type": "object" - }, - "latest_stale_after_days": { - "description": "this rail's own freshness boundary, in days after measured.to", - "type": "number" - }, - "measured": { - "properties": { - "days": { - "type": "integer" - }, - "from": { - "type": "string" - }, - "to": { - "type": "string" - } - }, - "required": [ - "days", - "from", - "to" - ], - "type": "object" - }, - "origins": { - "description": "departure-airport CLUSTER; covers_all_published_prices is false", - "type": "object" - }, - "party": { - "properties": { - "adults": { - "type": "integer" - }, - "children": { - "type": "integer" - } - }, - "required": [ - "adults", - "children" - ], - "type": "object" - }, - "price_covers": { - "description": "what the money buys - airfare only, or a package as offered", - "type": "object" - }, - "rail": { - "enum": [ - "flight", - "package" - ], - "type": "string" - }, - "regime_breaks": { - "description": "[from, to] date spans where the series was not comparable", - "type": "array" - }, - "resort": { - "type": "string" - }, - "resort_key": { - "type": "string" - }, - "searched": { - "description": "the search mode (and fixed dates, where there are any) the series was collected under", - "type": "object" - }, - "stats": { - "properties": { - "basis": { - "type": "string" - }, - "cheaper_than_pct": { - "type": [ - "number", - "null" - ] - }, - "is_series_max": { - "type": "boolean" - }, - "is_series_min": { - "type": "boolean" - }, - "latest": { - "type": [ - "number", - "null" - ] - }, - "median": { - "type": [ - "number", - "null" - ] - }, - "min": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "basis" - ], - "type": "object" - } - }, - "required": [ - "rail", - "party", - "price_covers", - "measured", - "stats" - ], - "type": "object" - }, - "type": "array" - }, - "resolved_from": { - "description": "Present when the caller named a RESORT key; the answer is its parent destination.", - "properties": { - "asked": { - "type": "string" - }, - "resort": { - "type": [ - "string", - "null" - ] - }, - "resort_key": { - "type": "string" - } - }, - "required": [ - "asked", - "resort_key", - "resort" - ], - "type": "object" - }, - "schema": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "schema", - "generated", - "destination", - "url", - "currency", - "license", - "rails", - "disclaimer" - ], - "type": "object" - }, - { - "description": "tool-level failure, returned with isError: true", - "properties": { - "error": { - "additionalProperties": true, - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - } - }, - "required": [ - "error" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "country": { + "description": "the one country page this city belongs to, where the catalogue names exactly one", + "type": "string" + }, + "currency": { + "type": "string" + }, + "destination": { + "properties": { + "key": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "title": { + "properties": { + "cs": { + "type": "string" + }, + "en": { + "type": "string" + } + }, + "required": [ + "cs", + "en" + ], + "type": "object" + } + }, + "required": [ + "key", + "slug", + "title" + ], + "type": "object" + }, + "disclaimer": { + "type": "string" + }, + "generated": { + "type": "string" + }, + "license": { + "properties": { + "attribution": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "attribution" + ], + "type": "object" + }, + "other_parties_in_country": { + "description": "parties a `related` page publishes and this destination does not - e.g. a solo series on a city of this country", + "items": { + "properties": { + "destinations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "party": { + "type": "string" + } + }, + "required": [ + "party", + "destinations" + ], + "type": "object" + }, + "type": "array" + }, + "rails": { + "items": { + "properties": { + "arrivals": { + "description": "arrival airports RECORDED; covers_all_published_prices is false", + "type": "object" + }, + "latest_stale_after_days": { + "description": "this rail's own freshness boundary, in days after measured.to", + "type": "number" + }, + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "origins": { + "description": "departure-airport CLUSTER; covers_all_published_prices is false", + "type": "object" + }, + "party": { + "properties": { + "adults": { + "type": "integer" + }, + "children": { + "type": "integer" + } + }, + "required": [ + "adults", + "children" + ], + "type": "object" + }, + "price_covers": { + "description": "what the money buys - airfare only, or a package as offered", + "type": "object" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "regime_breaks": { + "description": "[from, to] date spans where the series was not comparable", + "type": "array" + }, + "resort": { + "type": "string" + }, + "resort_key": { + "type": "string" + }, + "searched": { + "description": "the search mode (and fixed dates, where there are any) the series was collected under, and `stay_nights` {from, to}: how long a trip each point prices - the flight and package rails of one destination can differ", + "type": "object" + }, + "stats": { + "properties": { + "basis": { + "type": "string" + }, + "cheaper_than_pct": { + "type": [ + "number", + "null" + ] + }, + "is_series_max": { + "type": "boolean" + }, + "is_series_min": { + "type": "boolean" + }, + "latest": { + "type": [ + "number", + "null" + ] + }, + "median": { + "type": [ + "number", + "null" + ] + }, + "min": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "basis" + ], + "type": "object" + } + }, + "required": [ + "rail", + "party", + "price_covers", + "measured", + "stats" + ], + "type": "object" + }, + "type": "array" + }, + "related": { + "description": "the other tracked pages in the same country (a country lists its cities); a party or rail missing here may exist on one of them", + "items": { + "type": "string" + }, + "type": "array" + }, + "resolved_from": { + "description": "Present when the caller named a RESORT key; the answer is its parent destination.", + "properties": { + "asked": { + "type": "string" + }, + "resort": { + "type": [ + "string", + "null" + ] + }, + "resort_key": { + "type": "string" + } + }, + "required": [ + "asked", + "resort_key", + "resort" + ], + "type": "object" + }, + "same_airport_as": { + "description": "pages whose flight rail lands at an airport this one records - measured from a different departure cluster (see `origins`), so their numbers differ for a reason", + "items": { + "type": "string" + }, + "type": "array" + }, + "schema": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "schema", + "generated", + "destination", + "url", + "currency", + "license", + "related", + "rails", + "disclaimer" + ], + "type": "object" + }, + { + "description": "tool-level failure, returned with isError: true", + "properties": { + "error": { + "additionalProperties": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } +]
- Changed
find_opportunities3 fields changed- changed
Input schema / properties / party / descriptionPrevious value: -"optional: '<adults>-<children>', e.g. '2-2' - the same A-C shape the price streams are keyed on"New value: +"optional: '<adults>-<children>', e.g. '2-2' - the same A-C shape the price streams are keyed on. A well-formed party no rail carries returns `no_coverage` with the parties that exist" - added
Input schema / properties / party / patternAdded value: +"^(0|[1-9]\\d*)-(0|[1-9]\\d*)$" - changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "currency": { - "type": "string" - }, - "disclaimer": { - "type": "string" - }, - "excluded": { - "items": { - "properties": { - "destination": { - "type": "string" - }, - "history_days": { - "type": "integer" - }, - "rail": { - "enum": [ - "flight", - "package" - ], - "type": "string" - }, - "reason": { - "type": "string" - }, - "resort_key": { - "type": "string" - } - }, - "required": [ - "destination", - "rail", - "reason", - "history_days" - ], - "type": "object" - }, - "type": "array" - }, - "generated": { - "description": "the OLDEST `generated` among the rows returned", - "type": [ - "string", - "null" - ] - }, - "license": { - "properties": { - "attribution": { - "type": "string" - }, - "id": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "url", - "attribution" - ], - "type": "object" - }, - "matched": { - "description": "rows before the `limit` cap", - "type": "integer" - }, - "min_history_days": { - "type": "integer" - }, - "opportunities": { - "items": { - "properties": { - "cheaper_than_pct": { - "type": [ - "number", - "null" - ] - }, - "destination": { - "type": "string" - }, - "generated": { - "type": "string" - }, - "history_days": { - "type": "integer" - }, - "is_series_min": { - "type": "boolean" - }, - "latest": { - "type": [ - "number", - "null" - ] - }, - "latest_cheaper_than_pct_of_days": { - "type": [ - "number", - "null" - ] - }, - "latest_stale_after_days": { - "type": "number" - }, - "measured": { - "properties": { - "days": { - "type": "integer" - }, - "from": { - "type": "string" - }, - "to": { - "type": "string" - } - }, - "required": [ - "days", - "from", - "to" - ], - "type": "object" - }, - "median": { - "type": [ - "number", - "null" - ] - }, - "min": { - "type": [ - "number", - "null" - ] - }, - "party": { - "properties": { - "adults": { - "type": "integer" - }, - "children": { - "type": "integer" - } - }, - "required": [ - "adults", - "children" - ], - "type": "object" - }, - "rail": { - "enum": [ - "flight", - "package" - ], - "type": "string" - }, - "resort": { - "type": "string" - }, - "resort_key": { - "type": "string" - }, - "title": { - "properties": { - "cs": { - "type": "string" - }, - "en": { - "type": "string" - } - }, - "required": [ - "cs", - "en" - ], - "type": "object" - }, - "url": { - "type": "string" - } - }, - "required": [ - "destination", - "title", - "url", - "rail", - "party", - "latest", - "median", - "min", - "cheaper_than_pct", - "latest_cheaper_than_pct_of_days", - "is_series_min", - "history_days", - "measured", - "generated" - ], - "type": "object" - }, - "type": "array" - }, - "schema": { - "type": "string" - }, - "sort": { - "enum": [ - "cheapest_vs_history", - "most_below_median" - ], - "type": "string" - }, - "stale_rails": { - "description": "How many of the rails in scope are past their own freshness boundary on `as_of` (Europe/Prague).", - "properties": { - "as_of": { - "type": "string" - }, - "count": { - "type": "integer" - }, - "keys": { - "items": { - "type": "string" - }, - "type": "array" - }, - "of": { - "type": "integer" - }, - "unknown": { - "type": "integer" - } - }, - "required": [ - "as_of", - "of", - "count", - "keys" - ], - "type": "object" - } - }, - "required": [ - "schema", - "generated", - "sort", - "min_history_days", - "matched", - "stale_rails", - "opportunities", - "excluded", - "disclaimer" - ], - "type": "object" - }, - { - "description": "tool-level failure, returned with isError: true", - "properties": { - "error": { - "additionalProperties": true, - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - } - }, - "required": [ - "error" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "currency": { + "type": "string" + }, + "disclaimer": { + "type": "string" + }, + "excluded": { + "items": { + "properties": { + "destination": { + "type": "string" + }, + "history_days": { + "type": "integer" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "reason": { + "type": "string" + }, + "resort_key": { + "type": "string" + } + }, + "required": [ + "destination", + "rail", + "reason", + "history_days" + ], + "type": "object" + }, + "type": "array" + }, + "generated": { + "description": "the OLDEST `generated` among the rows returned", + "type": [ + "string", + "null" + ] + }, + "license": { + "properties": { + "attribution": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "attribution" + ], + "type": "object" + }, + "matched": { + "description": "rows before the `limit` cap", + "type": "integer" + }, + "min_history_days": { + "type": "integer" + }, + "no_coverage": { + "description": "present only when NO published rail carries the requested party: a coverage limit, distinct from an empty ranking", + "properties": { + "available_parties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "message": { + "type": "string" + }, + "party": { + "type": "string" + }, + "rail": { + "type": "string" + } + }, + "required": [ + "party", + "rail", + "available_parties", + "message" + ], + "type": "object" + }, + "opportunities": { + "items": { + "properties": { + "arrivals": { + "description": "arrival airports RECORDED; covers_all_published_prices is false", + "type": "object" + }, + "cheaper_than_pct": { + "type": [ + "number", + "null" + ] + }, + "destination": { + "type": "string" + }, + "generated": { + "type": "string" + }, + "history_days": { + "type": "integer" + }, + "is_series_min": { + "type": "boolean" + }, + "latest": { + "type": [ + "number", + "null" + ] + }, + "latest_cheaper_than_pct_of_days": { + "type": [ + "number", + "null" + ] + }, + "latest_stale_after_days": { + "description": "this rail's own freshness boundary, in days after measured.to", + "type": "number" + }, + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "median": { + "type": [ + "number", + "null" + ] + }, + "min": { + "type": [ + "number", + "null" + ] + }, + "origins": { + "description": "departure-airport CLUSTER; covers_all_published_prices is false", + "type": "object" + }, + "party": { + "properties": { + "adults": { + "type": "integer" + }, + "children": { + "type": "integer" + } + }, + "required": [ + "adults", + "children" + ], + "type": "object" + }, + "price_covers": { + "description": "what the money buys - airfare only, or a package as offered", + "type": "object" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "regime_breaks": { + "description": "[from, to] date spans where the series was not comparable", + "type": "array" + }, + "resort": { + "type": "string" + }, + "resort_key": { + "type": "string" + }, + "searched": { + "description": "the search mode (and fixed dates, where there are any) the series was collected under, and `stay_nights` {from, to}: how long a trip each point prices - the flight and package rails of one destination can differ", + "type": "object" + }, + "stats": { + "properties": { + "basis": { + "type": "string" + }, + "cheaper_than_pct": { + "type": [ + "number", + "null" + ] + }, + "is_series_max": { + "type": "boolean" + }, + "is_series_min": { + "type": "boolean" + }, + "latest": { + "type": [ + "number", + "null" + ] + }, + "median": { + "type": [ + "number", + "null" + ] + }, + "min": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "basis" + ], + "type": "object" + }, + "title": { + "properties": { + "cs": { + "type": "string" + }, + "en": { + "type": "string" + } + }, + "required": [ + "cs", + "en" + ], + "type": "object" + }, + "url": { + "type": "string" + } + }, + "required": [ + "destination", + "title", + "url", + "rail", + "party", + "price_covers", + "measured", + "stats", + "latest", + "median", + "min", + "cheaper_than_pct", + "latest_cheaper_than_pct_of_days", + "is_series_min", + "history_days", + "measured", + "generated" + ], + "type": "object" + }, + "type": "array" + }, + "schema": { + "type": "string" + }, + "sort": { + "enum": [ + "cheapest_vs_history", + "most_below_median" + ], + "type": "string" + }, + "stale_rails": { + "description": "How many of the rails in scope are past their own freshness boundary on `as_of` (Europe/Prague).", + "properties": { + "as_of": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "of": { + "type": "integer" + }, + "unknown": { + "type": "integer" + } + }, + "required": [ + "as_of", + "of", + "count", + "keys" + ], + "type": "object" + } + }, + "required": [ + "schema", + "generated", + "sort", + "min_history_days", + "matched", + "stale_rails", + "opportunities", + "excluded", + "disclaimer" + ], + "type": "object" + }, + { + "description": "tool-level failure, returned with isError: true", + "properties": { + "error": { + "additionalProperties": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } +]
- Changed
list_destinations1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "count": { - "type": "integer" - }, - "currency": { - "type": "string" - }, - "destinations": { - "items": { - "properties": { - "generated": { - "type": "string" - }, - "key": { - "type": "string" - }, - "rails": { - "description": "one entry per rail; each carries its own `measured`, which is not the destination's", - "items": { - "properties": { - "measured": { - "properties": { - "days": { - "type": "integer" - }, - "from": { - "type": "string" - }, - "to": { - "type": "string" - } - }, - "required": [ - "days", - "from", - "to" - ], - "type": "object" - }, - "party": { - "properties": { - "adults": { - "type": "integer" - }, - "children": { - "type": "integer" - } - }, - "required": [ - "adults", - "children" - ], - "type": "object" - }, - "rail": { - "enum": [ - "flight", - "package" - ], - "type": "string" - }, - "resort": { - "type": "string" - }, - "resort_key": { - "type": "string" - } - }, - "required": [ - "rail", - "party", - "measured" - ], - "type": "object" - }, - "type": "array" - }, - "slug": { - "type": "string" - }, - "title": { - "properties": { - "cs": { - "type": "string" - }, - "en": { - "type": "string" - } - }, - "required": [ - "cs", - "en" - ], - "type": "object" - }, - "url": { - "type": "string" - } - }, - "required": [ - "key", - "slug", - "title", - "url", - "generated", - "rails" - ], - "type": "object" - }, - "type": "array" - }, - "disclaimer": { - "type": "string" - }, - "license": { - "properties": { - "attribution": { - "type": "string" - }, - "id": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "url", - "attribution" - ], - "type": "object" - }, - "schema": { - "type": "string" - }, - "stale_rails": { - "description": "How many of the rails in scope are past their own freshness boundary on `as_of` (Europe/Prague).", - "properties": { - "as_of": { - "type": "string" - }, - "count": { - "type": "integer" - }, - "keys": { - "items": { - "type": "string" - }, - "type": "array" - }, - "of": { - "type": "integer" - }, - "unknown": { - "type": "integer" - } - }, - "required": [ - "as_of", - "of", - "count", - "keys" - ], - "type": "object" - } - }, - "required": [ - "schema", - "currency", - "count", - "stale_rails", - "destinations", - "disclaimer" - ], - "type": "object" - }, - { - "description": "tool-level failure, returned with isError: true", - "properties": { - "error": { - "additionalProperties": true, - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - } - }, - "required": [ - "error" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "count": { + "type": "integer" + }, + "currency": { + "type": "string" + }, + "destinations": { + "items": { + "properties": { + "country": { + "description": "the one country page this city belongs to, where the catalogue names exactly one", + "type": "string" + }, + "generated": { + "type": "string" + }, + "key": { + "type": "string" + }, + "rails": { + "description": "one entry per rail; each carries its own `measured`, which is not the destination's", + "items": { + "properties": { + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "party": { + "properties": { + "adults": { + "type": "integer" + }, + "children": { + "type": "integer" + } + }, + "required": [ + "adults", + "children" + ], + "type": "object" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "resort": { + "type": "string" + }, + "resort_key": { + "type": "string" + } + }, + "required": [ + "rail", + "party", + "measured" + ], + "type": "object" + }, + "type": "array" + }, + "related": { + "description": "the other tracked pages in the same country (a country lists its cities); a party or rail missing here may exist on one of them", + "items": { + "type": "string" + }, + "type": "array" + }, + "same_airport_as": { + "description": "pages whose flight rail lands at an airport this one records - measured from a different departure cluster (see `origins`), so their numbers differ for a reason", + "items": { + "type": "string" + }, + "type": "array" + }, + "slug": { + "type": "string" + }, + "title": { + "properties": { + "cs": { + "type": "string" + }, + "en": { + "type": "string" + } + }, + "required": [ + "cs", + "en" + ], + "type": "object" + }, + "url": { + "type": "string" + } + }, + "required": [ + "key", + "slug", + "title", + "url", + "generated", + "related", + "rails" + ], + "type": "object" + }, + "type": "array" + }, + "disclaimer": { + "type": "string" + }, + "license": { + "properties": { + "attribution": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "attribution" + ], + "type": "object" + }, + "schema": { + "type": "string" + }, + "stale_rails": { + "description": "How many of the rails in scope are past their own freshness boundary on `as_of` (Europe/Prague).", + "properties": { + "as_of": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "of": { + "type": "integer" + }, + "unknown": { + "type": "integer" + } + }, + "required": [ + "as_of", + "of", + "count", + "keys" + ], + "type": "object" + } + }, + "required": [ + "schema", + "currency", + "count", + "stale_rails", + "destinations", + "disclaimer" + ], + "type": "object" + }, + { + "description": "tool-level failure, returned with isError: true", + "properties": { + "error": { + "additionalProperties": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } +]
- Changed
price_history1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "currency": { - "type": "string" - }, - "destination": { - "properties": { - "key": { - "type": "string" - }, - "slug": { - "type": "string" - }, - "title": { - "properties": { - "cs": { - "type": "string" - }, - "en": { - "type": "string" - } - }, - "required": [ - "cs", - "en" - ], - "type": "object" - } - }, - "required": [ - "key", - "slug", - "title" - ], - "type": "object" - }, - "disclaimer": { - "type": "string" - }, - "generated": { - "type": "string" - }, - "license": { - "properties": { - "attribution": { - "type": "string" - }, - "id": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "url", - "attribution" - ], - "type": "object" - }, - "note": { - "description": "present when the `rail` filter matched nothing published for this destination", - "type": "string" - }, - "rails": { - "items": { - "properties": { - "arrivals": { - "description": "arrival airports RECORDED; covers_all_published_prices is false", - "type": "object" - }, - "latest_stale_after_days": { - "description": "this rail's own freshness boundary, in days after measured.to", - "type": "number" - }, - "measured": { - "properties": { - "days": { - "type": "integer" - }, - "from": { - "type": "string" - }, - "to": { - "type": "string" - } - }, - "required": [ - "days", - "from", - "to" - ], - "type": "object" - }, - "origins": { - "description": "departure-airport CLUSTER; covers_all_published_prices is false", - "type": "object" - }, - "party": { - "properties": { - "adults": { - "type": "integer" - }, - "children": { - "type": "integer" - } - }, - "required": [ - "adults", - "children" - ], - "type": "object" - }, - "price_covers": { - "description": "what the money buys - airfare only, or a package as offered", - "type": "object" - }, - "rail": { - "enum": [ - "flight", - "package" - ], - "type": "string" - }, - "regime_breaks": { - "description": "[from, to] date spans where the series was not comparable", - "type": "array" - }, - "resort": { - "type": "string" - }, - "resort_key": { - "type": "string" - }, - "searched": { - "description": "the search mode (and fixed dates, where there are any) the series was collected under", - "type": "object" - }, - "series_sample": { - "description": "a DOWNSAMPLED sample; `complete` says whether it is the whole series", - "properties": { - "complete": { - "type": "boolean" - }, - "points": { - "items": { - "properties": { - "cheapest_total": { - "type": "number" - }, - "date": { - "type": "string" - }, - "departure": { - "type": "string" - }, - "origin": { - "type": "string" - }, - "return": { - "type": "string" - } - }, - "required": [ - "date", - "cheapest_total" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "complete", - "points" - ], - "type": "object" - }, - "stats": { - "properties": { - "basis": { - "type": "string" - }, - "cheaper_than_pct": { - "type": [ - "number", - "null" - ] - }, - "is_series_max": { - "type": "boolean" - }, - "is_series_min": { - "type": "boolean" - }, - "latest": { - "type": [ - "number", - "null" - ] - }, - "median": { - "type": [ - "number", - "null" - ] - }, - "min": { - "type": [ - "number", - "null" - ] - } - }, - "required": [ - "basis" - ], - "type": "object" - } - }, - "required": [ - "rail", - "party", - "price_covers", - "measured", - "stats", - "series_sample" - ], - "type": "object" - }, - "type": "array" - }, - "resolved_from": { - "description": "Present when the caller named a RESORT key; the answer is its parent destination.", - "properties": { - "asked": { - "type": "string" - }, - "resort": { - "type": [ - "string", - "null" - ] - }, - "resort_key": { - "type": "string" - } - }, - "required": [ - "asked", - "resort_key", - "resort" - ], - "type": "object" - }, - "schema": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "schema", - "generated", - "destination", - "url", - "currency", - "license", - "rails", - "disclaimer" - ], - "type": "object" - }, - { - "description": "tool-level failure, returned with isError: true", - "properties": { - "error": { - "additionalProperties": true, - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - } - }, - "required": [ - "error" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "country": { + "description": "the one country page this city belongs to, where the catalogue names exactly one", + "type": "string" + }, + "currency": { + "type": "string" + }, + "destination": { + "properties": { + "key": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "title": { + "properties": { + "cs": { + "type": "string" + }, + "en": { + "type": "string" + } + }, + "required": [ + "cs", + "en" + ], + "type": "object" + } + }, + "required": [ + "key", + "slug", + "title" + ], + "type": "object" + }, + "disclaimer": { + "type": "string" + }, + "generated": { + "type": "string" + }, + "license": { + "properties": { + "attribution": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "attribution" + ], + "type": "object" + }, + "note": { + "description": "present when the `rail` filter matched nothing published for this destination", + "type": "string" + }, + "other_parties_in_country": { + "description": "parties a `related` page publishes and this destination does not - e.g. a solo series on a city of this country", + "items": { + "properties": { + "destinations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "party": { + "type": "string" + } + }, + "required": [ + "party", + "destinations" + ], + "type": "object" + }, + "type": "array" + }, + "rails": { + "items": { + "properties": { + "arrivals": { + "description": "arrival airports RECORDED; covers_all_published_prices is false", + "type": "object" + }, + "latest_stale_after_days": { + "description": "this rail's own freshness boundary, in days after measured.to", + "type": "number" + }, + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "origins": { + "description": "departure-airport CLUSTER; covers_all_published_prices is false", + "type": "object" + }, + "party": { + "properties": { + "adults": { + "type": "integer" + }, + "children": { + "type": "integer" + } + }, + "required": [ + "adults", + "children" + ], + "type": "object" + }, + "price_covers": { + "description": "what the money buys - airfare only, or a package as offered", + "type": "object" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "regime_breaks": { + "description": "[from, to] date spans where the series was not comparable", + "type": "array" + }, + "resort": { + "type": "string" + }, + "resort_key": { + "type": "string" + }, + "searched": { + "description": "the search mode (and fixed dates, where there are any) the series was collected under, and `stay_nights` {from, to}: how long a trip each point prices - the flight and package rails of one destination can differ", + "type": "object" + }, + "series_sample": { + "description": "a DOWNSAMPLED sample; `complete` says whether it is the whole series", + "properties": { + "complete": { + "type": "boolean" + }, + "points": { + "items": { + "properties": { + "cheapest_total": { + "type": "number" + }, + "date": { + "type": "string" + }, + "departure": { + "type": "string" + }, + "origin": { + "type": "string" + }, + "return": { + "type": "string" + } + }, + "required": [ + "date", + "cheapest_total" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "complete", + "points" + ], + "type": "object" + }, + "stats": { + "properties": { + "basis": { + "type": "string" + }, + "cheaper_than_pct": { + "type": [ + "number", + "null" + ] + }, + "is_series_max": { + "type": "boolean" + }, + "is_series_min": { + "type": "boolean" + }, + "latest": { + "type": [ + "number", + "null" + ] + }, + "median": { + "type": [ + "number", + "null" + ] + }, + "min": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "basis" + ], + "type": "object" + } + }, + "required": [ + "rail", + "party", + "price_covers", + "measured", + "stats", + "series_sample" + ], + "type": "object" + }, + "type": "array" + }, + "related": { + "description": "the other tracked pages in the same country (a country lists its cities); a party or rail missing here may exist on one of them", + "items": { + "type": "string" + }, + "type": "array" + }, + "resolved_from": { + "description": "Present when the caller named a RESORT key; the answer is its parent destination.", + "properties": { + "asked": { + "type": "string" + }, + "resort": { + "type": [ + "string", + "null" + ] + }, + "resort_key": { + "type": "string" + } + }, + "required": [ + "asked", + "resort_key", + "resort" + ], + "type": "object" + }, + "same_airport_as": { + "description": "pages whose flight rail lands at an airport this one records - measured from a different departure cluster (see `origins`), so their numbers differ for a reason", + "items": { + "type": "string" + }, + "type": "array" + }, + "schema": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "schema", + "generated", + "destination", + "url", + "currency", + "license", + "related", + "rails", + "disclaimer" + ], + "type": "object" + }, + { + "description": "tool-level failure, returned with isError: true", + "properties": { + "error": { + "additionalProperties": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } +]
1 tool update
- Changed
list_destinations1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "properties": { - "count": { - "type": "integer" - }, - "currency": { - "type": "string" - }, - "destinations": { - "items": { - "properties": { - "generated": { - "type": "string" - }, - "key": { - "type": "string" - }, - "rails": { - "items": { - "properties": { - "measured": { - "properties": { - "days": { - "type": "integer" - }, - "from": { - "type": "string" - }, - "to": { - "type": "string" - } - }, - "required": [ - "days", - "from", - "to" - ], - "type": "object" - }, - "party": { - "properties": { - "adults": { - "type": "integer" - }, - "children": { - "type": "integer" - } - }, - "required": [ - "adults", - "children" - ], - "type": "object" - }, - "rail": { - "enum": [ - "flight", - "package" - ], - "type": "string" - }, - "resort": { - "type": "string" - }, - "resort_key": { - "type": "string" - } - }, - "required": [ - "rail", - "party", - "measured" - ], - "type": "object" - }, - "type": "array" - }, - "slug": { - "type": "string" - }, - "title": { - "properties": { - "cs": { - "type": "string" - }, - "en": { - "type": "string" - } - }, - "required": [ - "cs", - "en" - ], - "type": "object" - }, - "url": { - "type": "string" - } - }, - "required": [ - "key", - "slug", - "title", - "url", - "generated", - "rails" - ], - "type": "object" - }, - "type": "array" - }, - "disclaimer": { - "type": "string" - }, - "license": { - "properties": { - "attribution": { - "type": "string" - }, - "id": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "url", - "attribution" - ], - "type": "object" - }, - "schema": { - "type": "string" - }, - "stale_rails": { - "description": "How many of the rails in scope are past their own freshness boundary on `as_of` (Europe/Prague).", - "properties": { - "as_of": { - "type": "string" - }, - "count": { - "type": "integer" - }, - "keys": { - "items": { - "type": "string" - }, - "type": "array" - }, - "of": { - "type": "integer" - }, - "unknown": { - "type": "integer" - } - }, - "required": [ - "as_of", - "of", - "count", - "keys" - ], - "type": "object" - } - }, - "required": [ - "schema", - "currency", - "count", - "stale_rails", - "destinations", - "disclaimer" - ], - "type": "object" - }, - { - "description": "tool-level failure, returned with isError: true", - "properties": { - "error": { - "additionalProperties": true, - "properties": { - "code": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - } - }, - "required": [ - "error" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "count": { + "type": "integer" + }, + "currency": { + "type": "string" + }, + "destinations": { + "items": { + "properties": { + "generated": { + "type": "string" + }, + "key": { + "type": "string" + }, + "rails": { + "description": "one entry per rail; each carries its own `measured`, which is not the destination's", + "items": { + "properties": { + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "party": { + "properties": { + "adults": { + "type": "integer" + }, + "children": { + "type": "integer" + } + }, + "required": [ + "adults", + "children" + ], + "type": "object" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "resort": { + "type": "string" + }, + "resort_key": { + "type": "string" + } + }, + "required": [ + "rail", + "party", + "measured" + ], + "type": "object" + }, + "type": "array" + }, + "slug": { + "type": "string" + }, + "title": { + "properties": { + "cs": { + "type": "string" + }, + "en": { + "type": "string" + } + }, + "required": [ + "cs", + "en" + ], + "type": "object" + }, + "url": { + "type": "string" + } + }, + "required": [ + "key", + "slug", + "title", + "url", + "generated", + "rails" + ], + "type": "object" + }, + "type": "array" + }, + "disclaimer": { + "type": "string" + }, + "license": { + "properties": { + "attribution": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "attribution" + ], + "type": "object" + }, + "schema": { + "type": "string" + }, + "stale_rails": { + "description": "How many of the rails in scope are past their own freshness boundary on `as_of` (Europe/Prague).", + "properties": { + "as_of": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "of": { + "type": "integer" + }, + "unknown": { + "type": "integer" + } + }, + "required": [ + "as_of", + "of", + "count", + "keys" + ], + "type": "object" + } + }, + "required": [ + "schema", + "currency", + "count", + "stale_rails", + "destinations", + "disclaimer" + ], + "type": "object" + }, + { + "description": "tool-level failure, returned with isError: true", + "properties": { + "error": { + "additionalProperties": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } +]
5 tool updates
- Changed
compare_destinations1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "anyOf": [ + { + "properties": { + "comparison": { + "items": { + "properties": { + "arrivals": { + "description": "arrival airports RECORDED; covers_all_published_prices is false", + "type": "object" + }, + "destination": { + "type": "string" + }, + "generated": { + "type": "string" + }, + "latest_stale_after_days": { + "description": "this rail's own freshness boundary, in days after measured.to", + "type": "number" + }, + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "origins": { + "description": "departure-airport CLUSTER; covers_all_published_prices is false", + "type": "object" + }, + "party": { + "properties": { + "adults": { + "type": "integer" + }, + "children": { + "type": "integer" + } + }, + "required": [ + "adults", + "children" + ], + "type": "object" + }, + "price_covers": { + "description": "what the money buys - airfare only, or a package as offered", + "type": "object" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "regime_breaks": { + "description": "[from, to] date spans where the series was not comparable", + "type": "array" + }, + "resort": { + "type": "string" + }, + "resort_key": { + "type": "string" + }, + "searched": { + "description": "the search mode (and fixed dates, where there are any) the series was collected under", + "type": "object" + }, + "stats": { + "properties": { + "basis": { + "type": "string" + }, + "cheaper_than_pct": { + "type": [ + "number", + "null" + ] + }, + "is_series_max": { + "type": "boolean" + }, + "is_series_min": { + "type": "boolean" + }, + "latest": { + "type": [ + "number", + "null" + ] + }, + "median": { + "type": [ + "number", + "null" + ] + }, + "min": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "basis" + ], + "type": "object" + }, + "title": { + "properties": { + "cs": { + "type": "string" + }, + "en": { + "type": "string" + } + }, + "required": [ + "cs", + "en" + ], + "type": "object" + }, + "url": { + "type": "string" + } + }, + "required": [ + "destination", + "title", + "url", + "generated", + "rail", + "party", + "price_covers", + "measured", + "stats" + ], + "type": "object" + }, + "type": "array" + }, + "comparison_rows": { + "description": "rows, not destinations - a dual-rail destination contributes two", + "type": "integer" + }, + "currency": { + "type": "string" + }, + "disclaimer": { + "type": "string" + }, + "excluded": { + "items": { + "properties": { + "destination": { + "type": "string" + }, + "generated": { + "type": "string" + }, + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "party": { + "type": "string" + }, + "rail": { + "enum": [ + "flight", + "package", + "both" + ], + "type": "string" + }, + "reason": { + "type": "string" + }, + "resort_key": { + "type": "string" + } + }, + "required": [ + "destination", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "generated": { + "description": "the OLDEST `generated` among the rows and dated exclusions", + "type": [ + "string", + "null" + ] + }, + "license": { + "properties": { + "attribution": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "attribution" + ], + "type": "object" + }, + "min_history_days": { + "type": "integer" + }, + "party": { + "type": "string" + }, + "rail": { + "enum": [ + "flight", + "package", + "both" + ], + "type": "string" + }, + "schema": { + "type": "string" + } + }, + "required": [ + "schema", + "generated", + "party", + "rail", + "min_history_days", + "comparison_rows", + "comparison", + "excluded", + "disclaimer" + ], + "type": "object" + }, + { + "description": "tool-level failure, returned with isError: true", + "properties": { + "error": { + "additionalProperties": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ], + "type": "object" +}
- Changed
current_vs_history1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "anyOf": [ + { + "properties": { + "currency": { + "type": "string" + }, + "destination": { + "properties": { + "key": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "title": { + "properties": { + "cs": { + "type": "string" + }, + "en": { + "type": "string" + } + }, + "required": [ + "cs", + "en" + ], + "type": "object" + } + }, + "required": [ + "key", + "slug", + "title" + ], + "type": "object" + }, + "disclaimer": { + "type": "string" + }, + "generated": { + "type": "string" + }, + "license": { + "properties": { + "attribution": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "attribution" + ], + "type": "object" + }, + "rails": { + "items": { + "properties": { + "arrivals": { + "description": "arrival airports RECORDED; covers_all_published_prices is false", + "type": "object" + }, + "latest_stale_after_days": { + "description": "this rail's own freshness boundary, in days after measured.to", + "type": "number" + }, + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "origins": { + "description": "departure-airport CLUSTER; covers_all_published_prices is false", + "type": "object" + }, + "party": { + "properties": { + "adults": { + "type": "integer" + }, + "children": { + "type": "integer" + } + }, + "required": [ + "adults", + "children" + ], + "type": "object" + }, + "price_covers": { + "description": "what the money buys - airfare only, or a package as offered", + "type": "object" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "regime_breaks": { + "description": "[from, to] date spans where the series was not comparable", + "type": "array" + }, + "resort": { + "type": "string" + }, + "resort_key": { + "type": "string" + }, + "searched": { + "description": "the search mode (and fixed dates, where there are any) the series was collected under", + "type": "object" + }, + "stats": { + "properties": { + "basis": { + "type": "string" + }, + "cheaper_than_pct": { + "type": [ + "number", + "null" + ] + }, + "is_series_max": { + "type": "boolean" + }, + "is_series_min": { + "type": "boolean" + }, + "latest": { + "type": [ + "number", + "null" + ] + }, + "median": { + "type": [ + "number", + "null" + ] + }, + "min": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "basis" + ], + "type": "object" + } + }, + "required": [ + "rail", + "party", + "price_covers", + "measured", + "stats" + ], + "type": "object" + }, + "type": "array" + }, + "resolved_from": { + "description": "Present when the caller named a RESORT key; the answer is its parent destination.", + "properties": { + "asked": { + "type": "string" + }, + "resort": { + "type": [ + "string", + "null" + ] + }, + "resort_key": { + "type": "string" + } + }, + "required": [ + "asked", + "resort_key", + "resort" + ], + "type": "object" + }, + "schema": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "schema", + "generated", + "destination", + "url", + "currency", + "license", + "rails", + "disclaimer" + ], + "type": "object" + }, + { + "description": "tool-level failure, returned with isError: true", + "properties": { + "error": { + "additionalProperties": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ], + "type": "object" +}
- Changed
find_opportunities1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "anyOf": [ + { + "properties": { + "currency": { + "type": "string" + }, + "disclaimer": { + "type": "string" + }, + "excluded": { + "items": { + "properties": { + "destination": { + "type": "string" + }, + "history_days": { + "type": "integer" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "reason": { + "type": "string" + }, + "resort_key": { + "type": "string" + } + }, + "required": [ + "destination", + "rail", + "reason", + "history_days" + ], + "type": "object" + }, + "type": "array" + }, + "generated": { + "description": "the OLDEST `generated` among the rows returned", + "type": [ + "string", + "null" + ] + }, + "license": { + "properties": { + "attribution": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "attribution" + ], + "type": "object" + }, + "matched": { + "description": "rows before the `limit` cap", + "type": "integer" + }, + "min_history_days": { + "type": "integer" + }, + "opportunities": { + "items": { + "properties": { + "cheaper_than_pct": { + "type": [ + "number", + "null" + ] + }, + "destination": { + "type": "string" + }, + "generated": { + "type": "string" + }, + "history_days": { + "type": "integer" + }, + "is_series_min": { + "type": "boolean" + }, + "latest": { + "type": [ + "number", + "null" + ] + }, + "latest_cheaper_than_pct_of_days": { + "type": [ + "number", + "null" + ] + }, + "latest_stale_after_days": { + "type": "number" + }, + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "median": { + "type": [ + "number", + "null" + ] + }, + "min": { + "type": [ + "number", + "null" + ] + }, + "party": { + "properties": { + "adults": { + "type": "integer" + }, + "children": { + "type": "integer" + } + }, + "required": [ + "adults", + "children" + ], + "type": "object" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "resort": { + "type": "string" + }, + "resort_key": { + "type": "string" + }, + "title": { + "properties": { + "cs": { + "type": "string" + }, + "en": { + "type": "string" + } + }, + "required": [ + "cs", + "en" + ], + "type": "object" + }, + "url": { + "type": "string" + } + }, + "required": [ + "destination", + "title", + "url", + "rail", + "party", + "latest", + "median", + "min", + "cheaper_than_pct", + "latest_cheaper_than_pct_of_days", + "is_series_min", + "history_days", + "measured", + "generated" + ], + "type": "object" + }, + "type": "array" + }, + "schema": { + "type": "string" + }, + "sort": { + "enum": [ + "cheapest_vs_history", + "most_below_median" + ], + "type": "string" + }, + "stale_rails": { + "description": "How many of the rails in scope are past their own freshness boundary on `as_of` (Europe/Prague).", + "properties": { + "as_of": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "of": { + "type": "integer" + }, + "unknown": { + "type": "integer" + } + }, + "required": [ + "as_of", + "of", + "count", + "keys" + ], + "type": "object" + } + }, + "required": [ + "schema", + "generated", + "sort", + "min_history_days", + "matched", + "stale_rails", + "opportunities", + "excluded", + "disclaimer" + ], + "type": "object" + }, + { + "description": "tool-level failure, returned with isError: true", + "properties": { + "error": { + "additionalProperties": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ], + "type": "object" +}
- Changed
list_destinations1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "anyOf": [ + { + "properties": { + "count": { + "type": "integer" + }, + "currency": { + "type": "string" + }, + "destinations": { + "items": { + "properties": { + "generated": { + "type": "string" + }, + "key": { + "type": "string" + }, + "rails": { + "items": { + "properties": { + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "party": { + "properties": { + "adults": { + "type": "integer" + }, + "children": { + "type": "integer" + } + }, + "required": [ + "adults", + "children" + ], + "type": "object" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "resort": { + "type": "string" + }, + "resort_key": { + "type": "string" + } + }, + "required": [ + "rail", + "party", + "measured" + ], + "type": "object" + }, + "type": "array" + }, + "slug": { + "type": "string" + }, + "title": { + "properties": { + "cs": { + "type": "string" + }, + "en": { + "type": "string" + } + }, + "required": [ + "cs", + "en" + ], + "type": "object" + }, + "url": { + "type": "string" + } + }, + "required": [ + "key", + "slug", + "title", + "url", + "generated", + "rails" + ], + "type": "object" + }, + "type": "array" + }, + "disclaimer": { + "type": "string" + }, + "license": { + "properties": { + "attribution": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "attribution" + ], + "type": "object" + }, + "schema": { + "type": "string" + }, + "stale_rails": { + "description": "How many of the rails in scope are past their own freshness boundary on `as_of` (Europe/Prague).", + "properties": { + "as_of": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "of": { + "type": "integer" + }, + "unknown": { + "type": "integer" + } + }, + "required": [ + "as_of", + "of", + "count", + "keys" + ], + "type": "object" + } + }, + "required": [ + "schema", + "currency", + "count", + "stale_rails", + "destinations", + "disclaimer" + ], + "type": "object" + }, + { + "description": "tool-level failure, returned with isError: true", + "properties": { + "error": { + "additionalProperties": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ], + "type": "object" +}
- Changed
price_history1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "anyOf": [ + { + "properties": { + "currency": { + "type": "string" + }, + "destination": { + "properties": { + "key": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "title": { + "properties": { + "cs": { + "type": "string" + }, + "en": { + "type": "string" + } + }, + "required": [ + "cs", + "en" + ], + "type": "object" + } + }, + "required": [ + "key", + "slug", + "title" + ], + "type": "object" + }, + "disclaimer": { + "type": "string" + }, + "generated": { + "type": "string" + }, + "license": { + "properties": { + "attribution": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "attribution" + ], + "type": "object" + }, + "note": { + "description": "present when the `rail` filter matched nothing published for this destination", + "type": "string" + }, + "rails": { + "items": { + "properties": { + "arrivals": { + "description": "arrival airports RECORDED; covers_all_published_prices is false", + "type": "object" + }, + "latest_stale_after_days": { + "description": "this rail's own freshness boundary, in days after measured.to", + "type": "number" + }, + "measured": { + "properties": { + "days": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "days", + "from", + "to" + ], + "type": "object" + }, + "origins": { + "description": "departure-airport CLUSTER; covers_all_published_prices is false", + "type": "object" + }, + "party": { + "properties": { + "adults": { + "type": "integer" + }, + "children": { + "type": "integer" + } + }, + "required": [ + "adults", + "children" + ], + "type": "object" + }, + "price_covers": { + "description": "what the money buys - airfare only, or a package as offered", + "type": "object" + }, + "rail": { + "enum": [ + "flight", + "package" + ], + "type": "string" + }, + "regime_breaks": { + "description": "[from, to] date spans where the series was not comparable", + "type": "array" + }, + "resort": { + "type": "string" + }, + "resort_key": { + "type": "string" + }, + "searched": { + "description": "the search mode (and fixed dates, where there are any) the series was collected under", + "type": "object" + }, + "series_sample": { + "description": "a DOWNSAMPLED sample; `complete` says whether it is the whole series", + "properties": { + "complete": { + "type": "boolean" + }, + "points": { + "items": { + "properties": { + "cheapest_total": { + "type": "number" + }, + "date": { + "type": "string" + }, + "departure": { + "type": "string" + }, + "origin": { + "type": "string" + }, + "return": { + "type": "string" + } + }, + "required": [ + "date", + "cheapest_total" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "complete", + "points" + ], + "type": "object" + }, + "stats": { + "properties": { + "basis": { + "type": "string" + }, + "cheaper_than_pct": { + "type": [ + "number", + "null" + ] + }, + "is_series_max": { + "type": "boolean" + }, + "is_series_min": { + "type": "boolean" + }, + "latest": { + "type": [ + "number", + "null" + ] + }, + "median": { + "type": [ + "number", + "null" + ] + }, + "min": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "basis" + ], + "type": "object" + } + }, + "required": [ + "rail", + "party", + "price_covers", + "measured", + "stats", + "series_sample" + ], + "type": "object" + }, + "type": "array" + }, + "resolved_from": { + "description": "Present when the caller named a RESORT key; the answer is its parent destination.", + "properties": { + "asked": { + "type": "string" + }, + "resort": { + "type": [ + "string", + "null" + ] + }, + "resort_key": { + "type": "string" + } + }, + "required": [ + "asked", + "resort_key", + "resort" + ], + "type": "object" + }, + "schema": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "schema", + "generated", + "destination", + "url", + "currency", + "license", + "rails", + "disclaimer" + ], + "type": "object" + }, + { + "description": "tool-level failure, returned with isError: true", + "properties": { + "error": { + "additionalProperties": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ], + "type": "object" +}
2 tool updates
- Changed
current_vs_history1 field changed- changed
Input schema / properties / destination / descriptionPrevious value: -"destination slug"New value: +"destination slug, as returned by list_destinations. A RESORT key read off a rail (e.g. 'hurghada') also resolves, to its parent destination, and the answer then carries `resolved_from`; underscores and hyphens are interchangeable."
- Changed
price_history1 field changed- changed
Input schema / properties / destination / descriptionPrevious value: -"destination slug, as returned by list_destinations"New value: +"destination slug, as returned by list_destinations. A RESORT key read off a rail (e.g. 'hurghada') also resolves, to its parent destination, and the answer then carries `resolved_from`; underscores and hyphens are interchangeable."
1 tool update
- Added
compare_destinations
1 tool update
- Added
find_opportunities
3 tool updates
- First observed
current_vs_history - First observed
list_destinations - First observed
price_history
Related MCP Connectors
Daily Korean outbound travel demand index (Naver package buyers) + direct flight & top-hotel prices
Realtime package holiday and charter flight prices from Sweden. Inventory not on Google Flights.
Flight search, airfare analytics, flexible destinations
Realtime package holiday and charter flight prices from Finland. Inventory not on Google Flights.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceReal prices people actually paid (homes, rents, fuel, energy, groceries, medicines) from official open data, with source, period, sample size and licence on every answer. Read-only, no API key.MIT
- AlicenseAqualityCmaintenanceProvides AI assistants direct access to 700+ statistical datasets about the Czech Republic, including population, economy, prices, wages, employment, industry, agriculture, trade, tourism, environment, and more.122MIT
- AlicenseNot gradedqualityCmaintenanceFlight search for AI agents: flexible-date cheapest round-trips with a good-price verdict from historical data. Hosted remote MCP, free, no key.3MIT
- AlicenseNot gradedqualityBmaintenanceEnables querying Czech Statistical Office open data through MCP tools and natural language questions.423 npm2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.