create_alert
ChatGPTCreate a price-drop alert for a route/date. Alert delivery on this channel is by email to contact_email: an MCP server can only respond within a conversation the client started, so there is no way to push a notification here outside of that. The result's confirmed field reflects the state of this specific alert as created: confirmed=true means this user was already linked to a TrainPriceTracker account (by verifying their email once) and the alert is active immediately. confirmed=false is the normal case for an unlinked connection -- a confirmation email is attempted to contact_email on a best-effort basis (delivery isn't guaranteed or checked by this call), and the alert activates once its link is clicked; this applies even when contact_email belongs to an existing account, since a typed email address alone isn't proof of ownership of that inbox. departure_date/return_date: ISO dates (YYYY-MM-DD). For journey_type "return" (the default), return_date is optional: if the traveler has a specific return date, passing it makes the alert's own record and any follow-up booking link reflect their real trip; omitting it defaults to the day after departure_date. target_price is the price this alert fires at, in the origin's display currency -- GBP (£) for London origin, EUR (€) otherwise, matching find_cheapest_dates / get_calendar. Omit target_price to alert on any drop below the date's current price (the result's target_price says which price that was).
find_cheapest_dates
ChatGPTFind the cheapest upcoming travel dates for a route. Use this when the user asks for the cheapest dates to travel, including within a weekday/time-of-day scope. Returns live fares for the tracked routes. For a day's full timetable see get_trains_for_date; for a fare's price history see get_price_trend. origin/destination: city names, e.g. "London", "Brussels", "Paris", "Amsterdam", "Cologne". journey_type: "return" or "oneway", defaults to "return". A "return" price is the OUTBOUND leg's fare when booked as part of a return trip -- it is not a round-trip total and is not tied to any particular return date (use get_return_trip_price for a real trip total) -- get_booking_link accepts a real return_date for an accurate full-trip link. Never call this a "one-way" or "single" fare whenever journey_type is "return" (whether it defaulted or was explicitly requested) -- get_booking_link builds a matching return-journey link for it, so a reply that says "one way" here will visibly contradict the booking link you hand out next. date_from/date_to: ISO dates (YYYY-MM-DD), defaults to the next 120 days. limit: max results. weekdays / departure_after / departure_before: optional scope, e.g. weekdays=["friday"], departure_after="12:00", departure_before="17:59" for "Friday afternoon". When set, each date's price is the cheapest train INSIDE that scope (dates with no matching train are left out), so one call answers "cheapest Friday-afternoon departure in the next 30 days" -- no need to call get_trains_for_date per date. Those rows carry no previous_price/at_risk. Prices are in the origin's display currency: GBP (£) for journeys starting in London, EUR (€) otherwise. Each result includes a currency field. Each result includes price, previous_price, seats_available, and at_risk (whether the fare is likely to rise soon, based on recent seat availability). This is live data. This only returns the single cheapest fare per date. For the full train list on one specific date -- time-of-day questions like "mornings only", "after 2pm", "the 6pm train" -- use get_trains_for_date instead.
get_booking_link
ChatGPTBuild a TrainPriceTracker link for a given route and date(s), where the user sees the fares and trains and continues to Eurostar to book. Use this when the user wants to book or open the page for a journey. Not for looking up fares or times (get_calendar, get_trains_for_date). journey_type here needs to match whichever journey_type actually produced the price you most recently quoted for this route/date -- return and oneway searches price the same date differently, so if that quote came from a journey_type="oneway" lookup, pass journey_type="oneway" here too, or this link will point at a different fare than the one just discussed. journey_type defaults to "return" here only because that's every other tool's own default -- it is not a reason to override what was actually quoted. When it's "return" and the user hasn't given you a specific return date, this fills in the day after outbound_date automatically. If the user does give you their actual return date, pass it as return_date so the link reflects their real trip rather than a default. journey_type="oneway" omits the inbound leg regardless of return_date.
get_calendar
ChatGPTGet the full day-by-day price calendar for a route (defaults to the next 120 days). Use this when the user wants Eurostar fares across a stretch of dates: the cheapest day, a month at a glance, or the best day within a weekday/time-of-day scope. Returns live fares for the tracked routes. For a day's full timetable see get_trains_for_date; for a fare's price history see get_price_trend. journey_type: "return" or "oneway", defaults to "return". A "return" price is the OUTBOUND leg's fare when booked as part of a return trip -- it is not a round-trip total and is not tied to any particular return date (use get_return_trip_price for a real trip total) -- get_booking_link accepts a real return_date for an accurate full-trip link. Never call this a "one-way" or "single" fare whenever journey_type is "return" (whether it defaulted or was explicitly requested) -- get_booking_link builds a matching return-journey link for it, so a reply that says "one way" here will visibly contradict the booking link you hand out next. Prices are in the origin's display currency: GBP (£) for journeys starting in London, EUR (€) otherwise. Each result includes a currency field. Each result includes price, previous_price, seats_available, and at_risk (whether the fare is likely to rise soon, based on recent seat availability). This is live data. This only returns the single cheapest fare per date. For the full train list on one specific date -- time-of-day questions like "mornings only", "after 2pm", "the 6pm train" -- use get_trains_for_date instead. weekdays / departure_after / departure_before: optional scope, e.g. weekdays=["friday"], departure_after="12:00", departure_before="17:59" for "Friday afternoon". When set, each date's price is the cheapest train INSIDE that scope and dates with no matching train are left out, so the calendar's minimum is the minimum for what the traveler asked for. Use this for any "only Fridays / only mornings / after 2pm" question over a date range instead of calling get_trains_for_date per date. Those rows carry no previous_price/at_risk. card_data: internal flag the price-calendar card sets when it loads its own data; leave it unset.
get_price_trend
ChatGPTGet the recent price-check history for one specific travel date, to show a trend. Use this when the user asks how a fare has moved, whether it is rising or falling, or whether now is a good time to book. Not for today's timetable or prices (get_trains_for_date, get_calendar). travel_date: ISO date (YYYY-MM-DD) being traveled. days: how many days of history to look back over (default 30, capped at 90). journey_type: "return" or "oneway", defaults to "return". A "return" price is the OUTBOUND leg's fare when booked as part of a return trip -- it is not a round-trip total and is not tied to any particular return date (use get_return_trip_price for a real trip total). Never call this a "one-way" or "single" fare whenever journey_type is "return" (whether it defaulted or was explicitly requested) -- get_booking_link builds a matching return-journey link for it, so a reply that says "one way" here will visibly contradict the booking link you hand out next. Prices are in the origin's display currency: GBP (£) for journeys starting in London, EUR (€) otherwise. Each result includes a currency field. Returns {"history": [...], "verdict": {...}}. history has one row per day of checks (runDate, min_price, currency). verdict says how this date's current fare compares with the route's other departures on the same weekday, the same "below typical / typical / above typical" call the TrainPriceTracker website makes: label ("low", "typical", "high", or "no data" when there isn't enough to compare), current_price, position (0-100 along the low-to-high bar), typical_low and typical_high (the typical band), median, lowest, highest, sample_size and currency. verdict is null if it couldn't be worked out.
get_return_trip_price
ChatGPTGet the return-trip total for a traveler's real outbound/return dates. find_cheapest_dates/get_calendar/get_price_trend's "return" price is only the outbound leg, not tied to a real return date. This prices each direction for its own exact date and sums them into the actual trip total. Returns {"outbound": {...}, "inbound": {...}, "total_price": float, "currency": str}. Each leg has date, price, previous_price, at_risk, seats_available, departure_time, arrival_time -- null if that leg has no fare for the given date. total_price is omitted when either leg is null since there's nothing to sum. Prices are in the origin's display currency: GBP (£) for journeys starting in London, EUR (€) otherwise. outbound_date/return_date: ISO dates (YYYY-MM-DD); return_date must be after outbound_date.
get_trains_for_date
ChatGPTGet every departure on one date or across a date range -- the full train list, not just the cheapest fare. Use this when the user asks what trains run, departure or arrival times, what a particular train costs, or what else is on a date ("what are the train times on 13 Oct", "the 6pm train", "mornings only"). Returns the live timetable for the tracked routes: times, current fares and seats left per train. For the cheapest date over a long range see get_calendar (it accepts weekday and departure-time filters); for a fare's price history see get_price_trend. Use this whenever the user asks about a particular time of day (e.g. "mornings only", "after 2pm", "what's the 6pm train", "what else is there that day") -- find_cheapest_dates and get_calendar can only ever tell you about the single cheapest fare of a day, not the rest of the timetable. For a single date, pass travel_date. For a question spanning several dates (e.g. "morning trains this week", "any evening departure under £60 in the next couple weeks") pass date_from/date_to instead -- do this in ONE call rather than calling this tool once per date; there's a hard cap on how many tool calls fit in one reply, and iterating per-date would silently check only part of the range. Combine with departure_after/departure_before ("HH:MM", 24h) to filter by time of day server-side rather than filtering results yourself. Omitting all three defaults to the next data.DEFAULT_TRAINS_RANGE_DAYS days. The range is capped at data.MAX_TRAINS_RANGE_DAYS days -- raises InvalidQuery if you ask for more. This tool covers specific upcoming departures; for historical or long-range statistics ("average morning fare over the last few months", "trends by day of week across the year") use get_price_trend (one date's own repricing history) or get_calendar (day-by-day cheapest fares, up to 120 days) instead. journey_type: "return" or "oneway", defaults to "return". A "return" price is the OUTBOUND leg's fare when booked as part of a return trip -- it is not a round-trip total and is not tied to any particular return date (use get_return_trip_price for a real trip total). Never call this a "one-way" or "single" fare whenever journey_type is "return" (whether it defaulted or was explicitly requested) -- get_booking_link builds a matching return-journey link for it, so a reply that says "one way" here will visibly contradict the booking link you hand out next. Prices are in the origin's display currency: GBP (£) for journeys starting in London, EUR (€) otherwise. Each entry in trains includes a date and a currency field. Returns {"trains": [...], "truncated": bool} -- not a bare list. truncated=true means real departures exist beyond what's in trains (results are ordered by date then departure_time and capped) -- read this field directly rather than inferring truncation from the length of trains. An empty, non-truncated trains list means no per-train detail is available yet for that date/range, distinct from no trains running that day -- find_cheapest_dates/ get_calendar can still give at least the cheapest fare in that case.
list_routes
ChatGPTList every origin/destination route pair this tracker covers. Each route includes origin_country and destination_country (London: UK; Paris: France; Brussels: Belgium; Amsterdam: Netherlands; Cologne: Germany). country: optional, one of those names, to list only the routes that start or end there -- use it to turn "to Belgium" into the tracked station(s) before searching.