Skip to main content
Glama

Server Details

Check UK Delay Repay, UK261 flights and TfL refunds. Save claims and check commutes on request.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
29.8% over 63 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
aneduaim/untap-mcp
GitHub Stars
0
Server Listing
Untap MCP server

TDQS

A4.1/5.0

Scored across 20 tools

Disambiguation4/5

The add_ vs check_ pairs (add_flight/check_flight_compensation, add_train_journey/check_train_delay, add_tfl_journeys/check_tfl_journeys) share the same computational purpose and differ mainly in whether they persist to an account, which is a real misselection risk. Still, descriptions consistently flag sign-in and saving behavior, and the list_/save_/get_ families target distinct resources. Boundaries are mostly clear but not fully distinct.

Naming Consistency5/5

Every tool follows a consistent snake_case verb_noun pattern (add_flight, check_train_delay, list_my_claims, save_claim, update_claim_status, stop_commute). Verbs are used predictably and the same noun roots recur across add/check/list/save operations, making the set easy to scan.

Tool Count4/5

20 tools sits at the heavy end of the scale but the domain is genuinely broad (train, flight, TfL, parking, commutes, claims, savings, email scanning). Each tool maps to a distinct lifecycle step or resource, so few feel redundant, though the add_/check_ duplication slightly inflates the count.

Completeness4/5

Core workflows are well covered: stateless checks, account-scoped saves, listing, status updates, rules, submission instructions and full data deletion. Gaps include no per-item delete for individual claims/bookings (only delete_my_data wipes everything) and no check tools for the council tax/water/broadband problems that find_money_owed advertises.

Available Tools

20 tools
add_flightAdd a flightAInspect

Adds a flight to the person’s Untap account and returns the UK261 or EU261 verdict, the amount and the airline’s claim link. For past flights Untap checks AeroDataBox flight-status records; the status, delay and actual arrival fields are optional, and when left out Untap looks them up. Takes the airline’s two-letter IATA code (BA, U2, FR) and three-letter airport codes (LHR, BCN). When the airports given differ from the flight-status record, the result says so. Compensation applies to arrival delays of 3 hours or more and to cancellations. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoOptional. What happened to the flight, if known. When left out, Untap looks the flight up in AeroDataBox flight-status records.
airline_iataYesTwo-letter IATA airline code, e.g. "BA" for British Airways, "U2" for easyJet.
arrival_iataYesThree-letter IATA arrival airport code, e.g. "BCN".
delay_minutesNoOptional. Arrival delay in minutes, if known.
flight_numberYesFlight number including the airline prefix, e.g. "BA2551".
actual_arrivalNoOptional. Actual arrival as an ISO 8601 datetime, if known.
departure_iataYesThree-letter IATA departure airport code, e.g. "LHR".
passenger_nameYesPassenger name as printed on the ticket, or null if not visible.
booking_referenceYesPNR / airline booking reference if available, otherwise null.
scheduled_arrivalYesScheduled arrival as ISO 8601 datetime.
ticket_price_penceYesTotal fare paid in pence.
scheduled_departureYesScheduled departure as ISO 8601 datetime.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false), the description discloses rich behavioral details: it returns a verdict and claim link, performs AeroDataBox lookups for past flights, handles optional status/delay/arrival fields, flags airport mismatches, defines compensation eligibility (3+ hour delays or cancellations), and requires authentication.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph with no wasted words; it front-loads the core purpose and then layers necessary operational details. It could be slightly more structured for readability, but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter write tool with no output schema and open-world lookups, the description covers all essential aspects: the mutation side effect, the returned verdict/amount/link, fallback lookup behavior, compensation rules, and authentication. Nothing critical for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the description adds extra meaning by clarifying that the optional status, delay, and actual arrival fields are all looked up when omitted (the schema only mentions lookup for status). It also reinforces IATA code formats, though most parameter details are already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Adds') and resource ('a flight to the person's Untap account'), plus the outcome ('returns the UK261 or EU261 verdict, the amount and the airline's claim link'). It clearly distinguishes itself from siblings like add_train_journey and check_flight_compensation by combining an add operation with an immediate eligibility verdict.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through the verb and resource, and gives some context (e.g., 'For past flights Untap checks AeroDataBox flight-status records') plus a prerequisite ('Requires sign-in to Untap'). However, it never explicitly states when to choose this tool over alternatives such as check_flight_compensation, nor does it name any alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_parking_fineAdd a parking ticket (PCN)AInspect

Adds a UK parking ticket (a council PCN or a private parking charge) to the person’s Untap account and runs Untap’s appeal-grounds engine. Returns the grounds that may apply, how confident the match is, the appeal route and deadline. Grounds are matched against the contravention, the location and observed_notes; with no observed_notes, only general grounds come back and the result is a possible appeal, not money owed. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
locationYesStreet or car park name where the contravention allegedly occurred.
appeal_urlYesDirect https URL on the notice for online appeals, or null if none.
issued_dateYesDate the notice was issued or served, ISO 8601 date.
issuer_nameYesIssuer name as written, e.g. "London Borough of Camden" or "ParkingEye Ltd".
issuer_typeYesCouncil = local authority issued under TMA 2004. Private = on private land by a parking operator (BPA or IPC member).
amount_penceYesFull charge amount in pence. £65 = 6500.
full_deadlineYesLast date on the notice for paying the full amount or lodging an appeal, as an ISO date.
pcn_referenceYesPCN or notice reference number printed on the document.
observed_notesYesShort phrases from the notice or the person’s account that may support an appeal, such as unclear signs, a broken machine or a few minutes over. The appeal-grounds engine matches against these; with none, it can only suggest general grounds.
discount_deadlineYesISO date by which the discount applies, or null if not stated.
contravention_codeYesCouncil contravention code, e.g. "01", "12", "MR11". Null for private tickets.
contravention_dateYesDate the contravention allegedly occurred, ISO 8601 date.
vehicle_registrationYesVehicle registration mark, or null if not shown.
has_windscreen_noticeYesTrue if a paper notice was placed on the windscreen. False if it arrived in the post only.
discounted_amount_penceYesReduced amount in pence if paid promptly (usually 50% within 14 or 21 days). Null if none stated.
contravention_descriptionYesFull text of the alleged contravention as printed on the notice.
keeper_notice_served_dateYesPrivate only: date the Notice to Keeper was served.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a non-idempotent, non-read-only, closed-world mutation. The description adds real value on top: auth requirement, the fact that it returns grounds/confidence/route/deadline, and the conditional behavior that empty observed_notes yields only general grounds and a 'possible appeal' rather than money owed. It does not contradict any annotation, though duplicate/idempotency handling is left unaddressed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each carrying distinct information (action, return payload, matching logic/caveat). It is front-loaded onto the core action and avoids padding, though the middle sentence packs several return fields into one dense clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 17 required parameters, no output schema and no nested objects, the description does the necessary work: it discloses the authentication requirement, summarizes the return payload, and explains the conditional outcome when observed_notes is empty. Only edge cases such as duplicate submissions are left uncovered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 17 parameters thoroughly, making 3 the baseline. The description does add one meaningful point of semantics — that grounds are matched against contravention, location and observed_notes — which explains how the inputs are consumed, but it does not otherwise elaborate on parameter syntax or formats.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (adds) and a precisely scoped resource (a UK council PCN or private parking charge) and names the secondary effect (runs the appeal-grounds engine). This cleanly separates it from the other add_* record tools, which cover flights, trains and TfL journeys.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: an agent can infer this is for recording a parking ticket someone received. The description adds a useful prerequisite (Untap sign-in) and a conditional caveat about missing observed_notes, but it names no alternative tool or explicit when-not case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_tfl_journeysAdd TfL journeys from a contactless statementA
Idempotent
Inspect

Adds TfL contactless journeys to the person’s Untap account, up to 500 rows per call, and checks everything they have saved for incomplete journeys, missed Hopper fares and other overcharges. Each row carries flags for an incomplete journey, a revenue-inspection maximum fare, a free Hopper fare, a TfL correction and the daily or weekly cap, as shown on the statement. Journeys already saved are skipped. Refunds follow the same rule as the TfL check: an incomplete journey without a destination is an upper limit equal to the whole charge, and one with intended_destination is an estimate. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
journeysYesEvery journey on the statement. Up to 500 per call.
card_last4YesLast 4 digits of the contactless card, if shown.
period_endYesStatement period end date YYYY-MM-DD.
period_startYesStatement period start date YYYY-MM-DD.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare write (readOnlyHint=false), idempotentHint=true and destructiveHint=false; the description earns credit for the extra behavioural detail behind those flags — duplicate rows are skipped, up to 500 rows per call, and authentication is required. It stops short of describing failure/partial-import behaviour, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense paragraph that front-loads the core action, then layers limits, flag semantics and refund rules in a logical order. Every sentence carries information, though the refund-rule sentence is intricate enough that it reads more like documentation than a quick scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-param, fully-documented write tool with no output schema, the description covers the essentials: what is written, the batch ceiling, dedupe behaviour, auth and how refunds are computed. Only the outcome/response behaviour after a partial or rejected import is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline would be 3, but the description goes further by naming the meaning of the per-row flags (revenue-inspection max fare, free Hopper fare, TfL correction, daily/weekly cap) and by restating the intended_destination refund rule as an estimate versus an upper limit. That is meaningful added interpretation, not a repeat of the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Adds TfL contactless journeys to the person's Untap account"), which cleanly separates it from add_flight, add_train_journey and add_parking_fine. It also ties itself to the sibling check_tfl_journeys by referencing "the same rule as the TfL check", so the agent can place it in the family 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context of use is clear (ingesting statement rows, with journeys already saved being skipped and a 500-row-per-call ceiling), and the sign-in requirement is stated. It does not, however, explicitly tell the agent when to prefer this over, or run it alongside, check_tfl_journeys — the relationship is implied rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_train_journeyAdd a train bookingAInspect

Adds a UK train booking to the person’s Untap account and works out Delay Repay for it. One booking per call, with each journey in legs (one for a single, two for a return, in travel order). Untap checks National Rail’s Historical Service Performance records for each journey; the delay, actual arrival and cancellation fields are optional, and when left out Untap looks them up. Operators accept one journey per claim form, so a return with both directions late means two claims. A train journey that is already saved is returned as it is, not saved twice. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
legsYesEach journey on this booking, in travel order: one for a single, two for a return (outward first), more for a multi-stop booking. Untap works out Delay Repay for each journey and adds them up.
season_typeNoSeason tickets only: how long the season runs. The operator divides the season price into single journeys (for example annual 464, monthly 40, weekly 10, flexi 16) and pays a share of one journey. When left out, the result gives the percentage and the method but no amount.
ticket_typeYesTicket type as printed. For "return" and "open_return" the single fare is half the price paid; for "season" the amount is a share of one journey value (see season_type); every other type uses the full price as the single fare.
booking_referenceYesBooking reference if available, otherwise null.
ticket_price_penceYesTotal fare paid in pence for the whole booking. £62.00 = 6200.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a non-readonly, open-world, non-destructive write, and the description adds real context beyond them: Untap queries National Rail Historical Service Performance per journey, omitted delay/arrival/cancellation fields trigger lookups, and an already-saved journey is returned as-is rather than duplicated. The dedup statement sits in mild tension with idempotentHint=false, though it plausibly describes content-level dedup rather than same-argument idempotency. Auth requirement ('Requires sign-in') is a useful addition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and the remaining clauses are dense but purposeful (leg ordering, optional-field lookups, dedup, one-claim-per-journey, auth). A few items duplicate the schema descriptions, so there is minor redundancy, but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with a nested legs array, no output schema and no return-value documentation, the description covers prerequisites (sign-in), cardinality rules per claim, dedup, and the external lookup dependency. It gives a hint about result shape for season_type but does not otherwise characterize what the call returns, leaving a modest gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents ticket_type fare math, season_type proration, operator codes and every leg field. The description largely restates this (optional lookup fields, single-vs-return leg count), adding only the 'travel order' framing for legs. Correct to sit at the baseline when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Adds a UK train booking to the person's Untap account') and adds the secondary outcome ('works out Delay Repay for it'), which separates it cleanly from siblings like add_flight, add_parking_fine and add_tfl_journeys. An agent can identify it as the UK-rail booking creator without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete operating context: one booking per call, legs in travel order (one single / two return), and the rule that operators accept one journey per claim form so a late return means two claims. It also states the sign-in prerequisite. It stops short of naming an alternative sibling (e.g. check_train_delay vs this add path), so it is not a full when/when-not routing statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_commuteCheck a saved commute for a travel dateA
Read-onlyIdempotent
Inspect

Checks a saved train route against National Rail’s running records for one travel date and works out Delay Repay: the matched train, the delay, the amount, the deadline and a claim pack. When several trains match, the result lists them, each with a service_id. A saved route does not show that the person travelled that day, and the result says so. Nothing is saved or filed. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesThe travel date to check, preferably YYYY-MM-DD. "yesterday" also works.
commute_idYesThe id of a saved commute.
service_idNoThe service_id of a train listed in an earlier result. With it, that train is checked directly.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent and non-destructive, but the description adds real context beyond them: 'Nothing is saved or filed', sign-in to Untap is required, and a saved route does not prove travel (with the result stating so). It still doesn't cover rate limits or error modes, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four compact sentences, front-loaded with what is computed before the caveats and auth note. Each sentence carries distinct information (output, multi-match handling, limitation, side effects/auth) with no repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating the return contents (matched train, delay, amount, deadline, claim pack, service_id per match) and stating the read-only, sign-in-gated behavior. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all three parameters; baseline is 3. The description adds operational meaning by tying service_id to the multi-match flow ('When several trains match, the result lists them, each with a service_id'), which explains why that optional parameter exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb ('checks') and resource ('a saved train route') against a named data source (National Rail running records) for 'one travel date', and its output scope (Delay Repay amount, deadline, claim pack). 'Saved' distinguishes it from sibling check_train_delay, which operates on a one-off journey.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear context for use: a saved commute (requiring commute_id) checked for a single date, with the service_id path described for disambiguating multiple matches. It does not explicitly say when to prefer check_train_delay or add_train_journey instead, so it falls short of stating alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_flight_compensationCheck a flight for UK261 or EU261 compensationA
Read-onlyIdempotent
Inspect

Works out compensation for a delayed or cancelled flight under UK261 or EU261. Takes the flight number and date. What happened comes from flight-status records, which cover about the last year, or from what_happened and arrival_delay_minutes when given. Returns the matched route, the arrival delay, the distance band, the amount per passenger, the extraordinary-circumstances caveat, the airline’s claim page, the dispute body for a refused claim, deadline guidance, a claim pack and the details needed to save the claim to an Untap account. When the airports given differ from the flight-status record, the result says so. No sign-in needed. Nothing is saved to an account. A record of the check, with no name, account or IP address, is kept for a year so answers can be verified.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDate the flight was due to depart, local time. YYYY-MM-DD is best.
price_paidNoOptional, in pounds: "£180" or 180. Not used for the amount, which is fixed in law, but needed to save the claim to an account.
to_airportNoThree-letter arrival airport code, if known: "BCN".
from_airportNoThree-letter departure airport code, if known: "LGW". Helps pick the right flight on multi-stop numbers.
flight_numberYesAirline code and number, as on the booking: "BA2551", "U2 8123".
what_happenedNoWhat happened, if known. When left out, Untap looks it up in flight-status records.
arrival_delay_minutesNoHow late the flight arrived at the gate, in minutes, if the person knows. Compensation turns on arrival, not departure.
cancellation_notice_daysNoFor a cancellation: how many days before departure the airline told the person. 14 or more means no compensation.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/idempotent annotations: no sign-in required, nothing saved to an account, an anonymous record retained for a year, flight-status history limited to roughly the last year, and reconciliation behavior when supplied airports disagree with the record. These are exactly the operational traits an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and inputs, then the return payload. The long enumeration of returned fields is justified because there is no output schema, though it makes the description denser than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so thoroughly: matched route, arrival delay, distance band, per-passenger amount, extraordinary-circumstances caveat, airline claim page, dispute body, deadline guidance, and claim pack. Privacy/retention and mismatch handling complete the picture.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents every parameter (baseline 3). The description adds genuine meaning beyond it by explaining data-source selection: what_happened/arrival_delay_minutes are used when given, otherwise the flight-status record is consulted, and it reiterates that price_paid feeds account-saving rather than the amount.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Works out compensation for a delayed or cancelled flight'), names the governing regimes (UK261/EU261), and scopes it to flights, which separates it from siblings like check_train_delay or scan_for_claims. An agent can identify what this tool produces without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context: it takes a flight number and date, and explains that the incident is either looked up in flight-status records or supplied via what_happened/arrival_delay_minutes. It does not name or exclude alternatives (e.g. save_claim, get_claim_instructions), so selection guidance is contextual rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_tfl_journeysCheck TfL journeys for overchargesA
Read-onlyIdempotent
Inspect

Checks Transport for London contactless or Oyster journeys for overcharges: incomplete journeys (no touch out, so the maximum fare was charged) and missed Hopper fares. Takes journey rows from a journey history, or the text of the CSV download from a TfL account. PDFs and images are not accepted. TfL refunds an incomplete journey as the maximum fare minus the fare for the journey actually made. Without the destination, the refund shown is an upper limit equal to the whole charge; with intended_destination on the row, it is an estimate from the usual fare to that station. Returns the refundable journeys and total, older journeys outside TfL’s 8 week window, how to claim in the TfL account, a claim pack and the details needed to save the journeys to an Untap account. It does not check service delays on the Tube, DLR, Elizabeth line or Overground, or Santander Cycles; the result lists these under not_checked. No sign-in needed. Nothing is saved to an account. A record of the check, with no name, account or IP address, is kept for a year so answers can be verified.

ParametersJSON Schema
NameRequiredDescriptionDefault
csv_textNoThe text of the CSV journey history downloaded from a TfL account. Takes priority over journeys.
journeysNoJourney rows from a TfL contactless or Oyster journey history. Used when csv_text is not given.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/non-destructive, but the description adds substantial context beyond them: the refund calculation logic (max fare minus actual fare), upper-limit vs estimate depending on intended_destination, the 8-week TfL window, and a year-long anonymised verification record. This is rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then layers inputs, refund logic, returns, exclusions and privacy. Every sentence carries real information, though the single dense paragraph is longer than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully carries the return burden (refundable journeys, total, out-of-window journeys, claim pack, not_checked list) and annotates safety. For a 2-parameter, no-required-input tool, nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — both csv_text priority and intended_destination's refund effect are already fully documented in the schema. The description restates these accurately but adds no syntax or semantics not already in the structured fields, so the 3 baseline applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (checks) and resource (TfL contactless/Oyster journeys) with named overcharge classes — incomplete journeys and missed Hopper fares. It also distinguishes itself from siblings like add_tfl_journeys by scoping itself to checking rather than saving, and enumerates what it does not check.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear input guidance: accepts journey rows or CSV text, rejects PDFs and images, and states 'no sign-in needed, nothing saved'. It doesn't explicitly route to sibling alternatives (e.g. add_tfl_journeys, check_commute), so it stops short of a full when/when-not with named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_train_delayCheck a delayed train for Delay RepayA
Read-onlyIdempotent
Inspect

Checks a late or cancelled train in Great Britain against National Rail’s historic running records and works out Delay Repay. Takes the two stations (names, partial names or three-letter codes), the date and roughly when the train left; the operator, ticket type and price paid are optional. Returns the matched train with scheduled and actual times, the delay at the destination, the operator and its scheme, the amount (or the percentage when no price is given), the claim deadline, a claim pack with the value for each form field, and the details needed to save the claim to an Untap account. When several trains fit, the result lists them, each with a service_id. The records cover roughly the last year and each day appears the day after. They hold direct trains only, so a journey with a change is checked one train at a time. When nothing could be learned, status is data_not_available with delay_known false, a reason, retryable and retry_after_seconds or try_again_on. When National Rail is slow the lookup carries on in the background, and a retry after retry_after_seconds is answered from the cache. No sign-in needed. Nothing is saved to an account. A record of the check, with no name, account or IP address, is kept for a year so answers can be verified.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesStation the person got off at, in the same forms.
dateYesDate of travel. YYYY-MM-DD is best; "25/09/2026", "25 September", "yesterday" and "last Friday" also work.
fromYesStation the person got on at. A name, part of a name or a three-letter code: "Brighton", "Kings Cross", "BTN".
ticketsNoHow many tickets of this price are on the booking, one per passenger. Defaults to 1. The amount is per ticket times this.
operatorNoTrain company if known, as the person says it: "Southern", "GWR", "Avanti". Used to narrow the match.
price_paidNoWhat one ticket cost, in pounds: "£24.50", 24.5 or 17 (read as £17.00). For a season ticket, the price of the whole season. Needed for a cash amount; without it the percentage is returned.
service_idNoThe service_id of a train listed in an earlier result. With it, that train is checked directly.
ticket_typeNoAs printed: "Anytime Return", "Off-Peak Single", "Advance", "Annual Season", "Monthly Season", "Flexi Season". A return halves the single fare the amount is worked from. A season is valued per journey from its length; a season with no length gets no amount.
departure_timeNoRoughly when the train left the first station, UK time: "08:05", "8am", "around 8". Needed to find the train unless service_id is given.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations already covering the safety profile (readOnly, idempotent, openWorld), the description adds substantial behavioral detail: data coverage (last year, next-day, direct trains only), the data_not_available status shape with retryable/retry_after_seconds, background lookup with cached retries, and the privacy/retention note. This is rich context beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and inputs lead, with the return/error behavior following, so it is front-loaded. It is dense and runs long, but most sentences (retry semantics, coverage limits, retention) carry real information for a 9-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the full burden and delivers: it enumerates the returned fields (times, delay, operator, amount, deadline, claim pack, save details) and the multi-match service_id behavior. An agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents every parameter including formats and the amount-vs-percentage behavior. The description's parameter recap largely restates the schema, so the baseline of 3 is appropriate rather than a higher score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (checks a late or cancelled train) and resource (Great Britain National Rail running records), and states the outcome (works out Delay Repay). This clearly separates it from siblings like check_flight_compensation and get_delay_repay_rules.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives strong context: stations accept names/partial/codes, service_id lets you check a specific train, changes must be checked one train at a time, and no sign-in is needed. It never explicitly names an alternative tool or a when-not-to-use condition, so it falls short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_my_dataDelete all my Untap dataA
Destructive
Inspect

Deletes every booking, statement, saved commute and claim in the person’s Untap account, in two steps. A call with confirm=false deletes nothing and returns a summary of what would be deleted, with a confirmation_token valid for 5 minutes. A call with confirm=true and that token deletes the data permanently; each token works once. The account itself is kept so Untap can still be used; deleting the account too is done at untap.money/data. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNofalse returns a preview of what would be deleted and a confirmation_token, and deletes nothing. true deletes, and works only with an unexpired confirmation_token from a preview.
confirmation_tokenNoThe confirmation_token from a preview. Required when confirm is true; each token works once.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and non-idempotency, but the description adds substantial context beyond them: data is deleted permanently, a preview deletes nothing, tokens last 5 minutes and are single-use, and the account itself survives. The auth requirement is also disclosed. This is exactly the behavioral burden a destructive tool's description should carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four compact sentences, front-loaded with what is destroyed before the mechanics. Every sentence carries needed information (scope, two-step protocol, permanence, account retention, auth) with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an irreversible delete with no output schema, the description covers everything an agent needs: preview behavior, what the preview returns, token lifetime and reuse limits, permanence, the fact the account is retained, and the sign-in requirement. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the schema already documents both parameters including the confirm/token dependency. The description adds value beyond the schema by stating the 5-minute token validity window and reinforcing the dependency, though the rest largely restates schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (deletes) and the exact resource set (every booking, statement, saved commute and claim) scoped to the person's Untap account. It also names the multi-step nature up front, so an agent immediately understands this is not a simple one-shot delete. No sibling performs account-data deletion, so it is easily distinguished.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly describes the two-call protocol: confirm=false for preview, confirm=true with token to actually delete, plus token expiry and single use. It also routes elsewhere for the adjacent need ('deleting the account too is done at untap.money/data') and states the sign-in prerequisite, covering when and when-not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_money_owedFind money you may be owedA
Read-onlyIdempotent
Inspect

Takes a plain-language description of what happened (a late or cancelled train, a delayed or cancelled flight, a TfL overcharge, a parking ticket, a council tax, water or broadband problem) and returns the UK refund and compensation schemes Untap covers that may apply. For each one it gives the fact that decides it, the Untap check that covers it and Untap’s free guide. It also picks out any flight number, date, time or amount in the text. Matching is by keywords, not a full reading of the situation, so the list is a starting point rather than a verdict. No sign-in needed. Nothing is saved to an account. A record of the check, with no name, account or IP address, is kept for a year so answers can be verified.

ParametersJSON Schema
NameRequiredDescriptionDefault
situationYesWhat happened, in the person’s own words. For example: "my train from Brighton to Victoria was 40 minutes late on Monday" or "I think my council tax band is wrong".

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, non-destructive, idempotent and closed-world, but the description adds genuinely new behavioral context: keyword matching rather than full reading, no sign-in required, nothing saved to an account, and an anonymized check record retained for a year for verification. That is exactly the kind of limitation, privacy and retention detail annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, but front-loaded with what it takes and returns before the output shape, extraction, matching caveat and privacy notes. Each sentence carries distinct information, though the privacy/retention sentence adds density that could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully describes the return: applicable schemes, each with its deciding fact, the relevant Untap check and the free guide. Combined with the matching caveat and privacy/retention statements, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With one parameter at 100% schema coverage the baseline is 3, and the schema already supplies a definition plus examples. The description goes further by enumerating the kinds of text accepted and noting that flight numbers, dates, times and amounts are extracted from it, which adds meaning about how to phrase the input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource: takes a plain-language situation and returns the UK refund/compensation schemes that may apply, with the deciding fact, Untap check and guide. The scope enumeration (train, flight, TfL, parking, council tax, water, broadband) makes clear it spans the domains of the individual check_* siblings, though it never names a sibling to differentiate itself explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied — describe a situation to discover applicable schemes — and it cautions that matching is keyword-based so the list is 'a starting point rather than a verdict.' However it never states when to use this discovery tool versus the specific check_train_delay / check_flight_compensation / check_tfl_journeys siblings, nor any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_claim_instructionsHow to submit a train, flight or TfL claimA
Read-onlyIdempotent
Inspect

Returns how to submit one train, flight or TfL compensation claim on the company’s own form. Takes the claim type and the train operator or airline, with the journey date, ticket type, where it was booked and the airports as optional extras. Returns the eligibility rules for that company and claim type, the official claim page (marked unverified where Untap could not confirm it), numbered submission steps, each form field with where to find its value, the evidence to attach, the deadline (as a date when the journey date is given), any company rule on who may submit, what to expect after submitting and when to chase, the escalation route (operator to the Rail Ombudsman; airline to its dispute scheme, the CAA or a national enforcement body; TfL to London TravelWatch) and the sources with the dates they were checked. Covers every train operator in Untap’s Delay Repay engine, TfL and the airlines UK travellers fly most. Facts Untap has not verified come back marked as unknown rather than estimated. No sign-in needed. Nothing is saved to an account. A record of the check, with no name, account or IP address, is kept for a year so answers can be verified.

ParametersJSON Schema
NameRequiredDescriptionDefault
companyNoThe train operator or airline, by name or code as people say it: "Southern", "LNER", "easyJet", "BA", "U2". Not needed for TfL.
booked_viaNoWhere the ticket was bought: from the operator or airline itself, from a ticket retailer such as Trainline, through a travel agent, or as part of a package holiday.
claim_typeYesWhat the claim is for: a late or cancelled train, a delayed or cancelled flight, denied boarding, a TfL incomplete journey or another TfL overcharge.
ticket_typeNoTicket type as printed, such as "Anytime Return", "Advance Single" or "Season". Decides the rail return-ticket rule.
journey_dateNoDate of travel, YYYY-MM-DD. With it, the result gives the last day to claim as a date.
arrival_airportNoThree-letter arrival airport code, such as "LHR".
departure_airportNoThree-letter departure airport code, such as "CDG". Decides whether UK261 or EU261 applies, and with the arrival airport, the distance band.

TDQS

A3.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive behavior, but the description adds substantial context: coverage limits, that unverified facts return as unknown rather than estimated, no sign-in requirement, no account storage, and one-year anonymized retention of the check record. That is unusually rich disclosure for a read-oriented tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and every sentence earns its place, but the middle return-value sentence is a long unstructured run-on list. It is appropriately detailed for a no-output-schema tool, though tighter bullet-like structure would improve parseability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the necessary work by enumerating the returned eligibility rules, official claim page, numbered steps, form-field guidance, evidence, deadline, submitter rules, post-submission expectations, escalation routes, and sources. Coverage and verification limits are also stated, making the definition complete for this complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents every parameter, including which are required, their formats, and their claim-rule effects. The description restates the required versus optional grouping and parameter purposes without adding meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: returns how to submit one train, flight or TfL compensation claim on the company’s own form. It is distinguishable from check-style siblings by focusing on submission instructions rather than simply checking compensation, but it does not explicitly name or route against those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool returns but gives no when-to-use guidance, no prerequisites, and no explicit alternatives such as check_train_delay or get_delay_repay_rules. Usage is only implied by the purpose statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_delay_repay_rulesDelay Repay rules for a train operatorA
Read-onlyIdempotent
Inspect

Returns one train operator’s Delay Repay rules: the delay at which it starts paying, each payout tier, the claim deadline, the link to its claim form, any automatic or one-click scheme, and the date the rules were last checked against the operator’s own page. Accepts the operator’s name as people say it, such as Avanti, GWR or Southern. No sign-in needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
operatorYesTrain company name as people say it: "Avanti", "GWR", "Southern", "LNER", or a two-letter operator code.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description still adds real value with 'No sign-in needed' (auth requirement) and the presence of a 'last checked' freshness field. It stops short of describing behavior for an unknown operator or matching failures.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb and resource before the payload enumeration, and the two trailing sentences are short and purposeful. The long field list is dense but each clause describes a distinct returned value, so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden well by enumerating delay threshold, tiers, deadline, claim link, automatic scheme, and freshness date. It is complete for a single read-only lookup, missing only error/edge behavior for unrecognized operator names.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already supplies examples ('Avanti', 'GWR', 'Southern', 'LNER') and the two-letter code option. The description's 'as people say it, such as Avanti, GWR or Southern' largely restates that, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Returns) plus a precise resource (one train operator's Delay Repay rules) and enumerates the exact payload fields. No sibling tool overlaps this resource, so an agent can identify it immediately without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: the enumeration of rules, tiers, and deadlines makes clear this is a pre-claim lookup, and 'No sign-in needed' removes one barrier. However, it never states when to prefer this over check_train_delay or find_money_owed, nor any when-not condition, so guidance stays implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_commutesList saved commutesA
Read-onlyIdempotent
Inspect

Lists the person’s saved train routes with their ids, usual times, days and fares. Makes no National Rail lookups. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_stoppedNoInclude stopped routes so they can be restored.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds two things beyond them: the sign-in requirement (auth prerequisite) and the explicit absence of external National Rail calls, which clarifies data freshness rather than merely restating openWorldHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the core purpose front-loaded and constraints following. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only lister with no output schema and rich annotations, the description covers the essentials: what is returned, the auth requirement, and the absence of live lookups. The only omission is any mention of the include_stopped behavior, which the schema already supplies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter include_stopped is fully documented there, so the baseline is 3. The description adds nothing about when to pass include_stopped (e.g., to surface routes stopped via stop_commute), so it does not exceed the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Lists the person's saved train routes') and enumerates the returned fields (ids, usual times, days, fares), which cleanly separates it from siblings like list_my_claims or list_savings. An agent can identify it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Makes no National Rail lookups' and 'Requires sign-in to Untap' tell the agent when this is the right tool (static saved data, authenticated context) rather than a live-lookup sibling such as check_commute. It stops short of naming an explicit alternative, so it is clear context but not full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_my_claimsList my claimsA
Read-onlyIdempotent
Inspect

Lists the claims in the person’s Untap account with amounts, deadlines, the verdict and their progress (not sent, sent, paid, rejected or archived). By default it shows claims that are still open; include_closed adds paid, rejected and archived ones. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMost rows to return. Defaults to 25.
categoryNoRestricts the list to one category. When left out, all categories are listed.
include_closedNoAlso show claims marked paid, rejected or archived, and ones with nothing to claim.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. Beyond that, the description adds the meaningful status lifecycle (not sent, sent, paid, rejected, archived), the default filtering behavior, and the authentication requirement ('Requires sign-in to Untap') — useful context the annotations do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with zero padding. The core behavior and returned fields come first, then the include_closed toggle, then the auth prerequisite — well front-loaded and appropriately sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully names the fields returned (amounts, deadlines, verdict, progress) and flags that sign-in is required, which is what an agent needs before calling. Minor gaps remain around result ordering or pagination beyond the limit parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (limit, category, include_closed) are already documented in the schema; the 3 baseline applies. The description restates include_closed's effect and names the closed statuses, which slightly reinforces but does not extend the schema's own wording.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Lists) and resource (claims in the Untap account) and enumerates the returned data fields (amounts, deadlines, verdict, progress). It is clearly distinguishable from siblings like list_savings, list_commutes and find_money_owed, which cover different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the default behavior (open claims only) and the exact condition that widens the set via include_closed. It gives clear usage context, but does not contrast the tool against close alternatives such as find_money_owed or update_claim_status, so no explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_savingsList the person’s refund opportunitiesA
Read-onlyIdempotent
Inspect

Lists the savings rows in the person’s Untap account, filtered by category and status. Each row has the verdict status (claimable, pending_check, not_eligible and so on) and user_progress, what the person has recorded since: none, submitted (sent), received (paid) or archived. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of savings rows to return. Defaults to 25, capped at 100.
statusYesRestrict to a single status, or null for all.
categoryYesRestrict to a single category, or null for all categories.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds real value beyond them: the explicit 'Requires sign-in to Untap' auth requirement and an explanation of what each returned row carries (verdict status plus user_progress).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the core action and filters front-loaded before the auth note. No filler, though the 'and so on' phrasing adds a slight vagueness rather than cutting it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully describes the shape of returned rows and the auth requirement. It omits pagination/ordering behavior and does not reconcile the user_progress values with the status enum, but is otherwise adequate for a read-only list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description clarifies what the status values mean semantically, but it also introduces a 'user_progress' value set (none/submitted/received/archived) that does not match the schema's status enum, which risks confusing rather than clarifying the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Lists the savings rows in the person's Untap account, filtered by category and status'), which is clearly distinct from siblings like list_my_claims or list_commutes. However, it never explicitly contrasts itself with those sibling tools, so the differentiation is implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It notes the sign-in prerequisite and explains what the filter values represent, which implies when the tool is useful. But it never says when to prefer this over find_money_owed or list_my_claims, nor any exclusion conditions, leaving usage to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_claimSave a checked claim to your Untap accountAInspect

Saves the result of a train, flight or TfL check to the person’s Untap account, so it appears on their dashboard with its deadline. Accepts the save_claim arguments returned by a check, with the price paid added where the check listed it as missing. The verdict is worked out again from those facts rather than copied. A train journey that is already saved is returned as it is, not saved twice. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
tflNoFor category "tfl": the journeys, in the shape a TfL check returns in save_claim.arguments.tfl.
trainNoFor category "train": the train booking, in the shape a train check returns in save_claim.arguments.train, with ticket_price_pence set.
flightNoFor category "flight": the flight, in the shape a flight check returns in save_claim.arguments.flight, with ticket_price_pence set.
categoryYesWhich kind of check the claim came from.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false). The description adds genuine context the annotations cannot: sign-in requirement, that the verdict is recomputed from the supplied facts rather than copied, that the missing price must be supplied, and that an already-saved train journey is returned unchanged. The train dedup claim sits in mild tension with idempotentHint=false, but since the hint is general and the description scopes dedup to train only, this is a nuance rather than a contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences with no waste; the core action and destination lead, followed by input shape, recomputation behavior, dedup, and the auth prerequisite in descending order of importance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the write, the auth requirement, the input provenance, and the idempotency edge case. It does not describe what the returned claim object looks like (beyond the dedup case), which is the main remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with deeply documented nested objects, so the baseline is 3. The description adds value on top by explaining that the check's save_claim arguments are passed through and that ticket_price_pence must be filled in where the check omitted it, which is exactly the field the schema marks required for train/flight but not for tfl.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("saves"), the resource (the result of a train, flight or TfL check) and the destination/effect (the Untap account, dashboard, deadline). It clearly positions itself downstream of a check, but never names the sibling tools (add_train_journey, add_flight, update_claim_status) it must be chosen over, so sibling differentiation is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real usage context: it consumes the save_claim arguments a check returned, and it requires sign-in to Untap. It also notes the dedup case for train journeys. What is missing is an explicit "use this instead of add_train_journey/add_flight when you already ran a check" contrast against the near-identical add_* siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_commuteSave a usual train journeyA
Idempotent
Inspect

Saves or updates one direction of a usual train journey (a commute) in the person’s Untap account: stations, usual departure time, travel days and day-ticket fare. An outward and a homeward journey are two separate routes. Saving the same route and time again updates it. Nothing is checked automatically; a saved route is checked only on request. Day tickets only; season tickets are not supported. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesArrival station name or three-letter code.
fromYesDeparture station name or three-letter code.
labelNoOptional short name such as Morning commute.
weekdaysNoUsual travel days: Monday=1 through Sunday=7. Informational only; no automatic checks.
commute_idNoThe id of an existing commute in this account, to update or restore it. When left out, a new route is saved.
ticket_typeNoDay ticket type. For return, the price is the whole return fare. Season tickets are not supported by saved commutes.single
departure_timeYesUsual UK departure time, for example 08:05 or 8am.
ticket_price_penceNoUsual day-ticket price in pence, £24.50=2450. Optional, for when the fare is known and stays the same. A day-ticket price, not a weekly or monthly season price.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and a closed world. The description adds genuinely non-redundant context: sign-in is required, nothing is validated automatically (validation is on request only), and only day tickets are supported, with season tickets explicitly excluded. It does not describe the response, but the behavioral profile is well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and scope in the first clause, then adds constraints in compact sentences with no filler. Slightly dense as a single paragraph but every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation tool with no output schema and no nesting, the description covers auth, idempotency, ticket-type limits and the check-on-request behavior. The main gap is what the caller gets back on save versus update, which matters more here precisely because there is no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter including commute_id restore semantics and weekday numbering. The description only echoes the field list (stations, departure time, travel days, fare) without adding format or edge-case meaning beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair (saves or updates) plus the exact resource (one direction of a usual train journey / commute) and enumerates the fields it stores. It clearly separates outward vs. homeward as two distinct routes. It does not explicitly differentiate itself from the sibling add_train_journey, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives some routing guidance implicitly: saving the same route/time again updates rather than duplicates, and each direction is its own route. However it never says when to reach for this instead of add_train_journey, check_commute, or list_commutes, so the alternative-selection guidance is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_for_claimsScan emails for train, flight and TfL claimsA
Read-onlyIdempotent
Inspect

Reads up to 25 emails (sender, subject, date and plain-text body) and picks out the ones that point to a train, flight or TfL claim: booking confirmations, delay and cancellation notices, airline schedule changes and denied boarding, TfL incomplete journey and maximum fare emails, and claim acknowledgements and decisions. Detection is by sender domain, subject pattern and fixed phrases, with no language model. For each match it returns the type, the signals that matched, the booking reference, dates, flight number, stations or airports, times and amounts it could read, a confidence level, a deadline hint, and the Untap check that fits with its arguments filled in and any missing ones listed. Emails with no signal are listed by position. Each body is read up to 20,000 characters. Nothing from the emails is stored; the usage record holds counts only. No sign-in needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailsYesUp to 25 emails, each with its sender, subject, date and plain-text body.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds substantial context on top: detection is rule-based on sender domain, subject pattern and fixed phrases with 'no language model', bodies are truncated at 20,000 characters, nothing is stored and the usage record holds counts only, and unmatched emails are still listed by position.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is a single dense paragraph with the core action front-loaded in the first clause, and each subsequent sentence carries distinct information (detection method, return fields, truncation, storage, auth). It is long, but little of it is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must describe the return payload, and it does so thoroughly: match type, matched signals, booking reference, dates, flight number, stations/airports, times, amounts, confidence, deadline hint, and a pre-filled Untap check with missing arguments listed. An agent has everything needed to interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the single parameter is already documented; the description nevertheless adds meaning beyond the schema by restating the email fields and clarifying the 20,000-character body read limit, which the schema's 200,000 maxLength does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource ('Reads up to 25 emails ... and picks out the ones that point to a train, flight or TfL claim') and enumerates the claim categories it detects. This clearly separates it from the sibling add_*/check_*/list_* tools that act on already-identified claims.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the agent can infer this is the detection step that feeds save_claim, and 'No sign-in needed' hints at its standalone nature. However, no sibling is named and there is no explicit when-to-use/when-not guidance (e.g., versus check_train_delay or list_my_claims).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stop_commuteStop a saved commuteA
Idempotent
Inspect

Hides a saved train route from the active list. The route is kept and can be restored by saving it again with its commute_id. No claims or bookings change. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
commute_idYesThe id of a saved commute. The route is kept and can be restored.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=false and idempotentHint=true, so the safety profile is partly covered. The description adds real value beyond that: it clarifies that stopping is a reversible hide ('can be restored by saving it again'), that no claims or bookings are affected, and that sign-in to Untap is required. This is meaningful behavioral context an agent could not read from the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short, front-loaded sentences with no filler. The most important point (it is a hide, not a delete) comes first, followed by restoration, side-effect scope, and auth.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with no output schema, the description covers everything needed to invoke safely: reversibility, absence of side effects on claims/bookings, and the authentication requirement. No material gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and there is only one parameter, whose schema description already explains retention and restoration. The description repeats the commute_id restoration behavior but adds no syntax or format detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Hides a saved train route from the active list.' The word 'hides' precisely distinguishes this from a deletion, and the follow-up sentence confirms the route is retained. It does not explicitly name a sibling it complements, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the agent can infer this pauses a commute rather than removing it, and that re-saving with the same commute_id restores it. There is no explicit when-to-use versus when-not-to-use framing or named alternative among the many commute siblings (list_commutes, save_commute, check_commute).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_claim_statusUpdate a claim’s statusA
Idempotent
Inspect

Records progress on a claim in the person’s Untap account: sent (submitted to the operator or airline), paid (with the amount received, if known), rejected, or archived. Takes the claim_id given when the claim was saved or listed. This updates Untap’s record only; it does not contact the operator or airline. Requires sign-in to Untap.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoOptional short note, such as the operator’s reference or the reason given for a refusal.
statusYessent: submitted to the operator or airline. paid: money received. rejected: the claim was refused. archived: hide it without an outcome.
claim_idYesThe claim_id given when the claim was saved or listed.
amount_received_penceNoFor paid: the amount actually received, in pence. £12.40 = 1240.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare mutation (readOnlyHint=false), idempotency, and non-destructiveness. The description adds genuinely useful context beyond them: it explicitly states it does not contact the operator or airline and requires Untap sign-in. It stops short of covering error/failure behavior or partial-update semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the core action and status list front-loaded, then the identity of claim_id, then the scope and auth caveat. No redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, it covers the essential: what changes, which statuses exist, auth requirement, and the crucial limit that no external party is contacted. It does not describe the response or what happens to note/amount when status changes, a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented in the schema, including the enum meanings and the pence conversion example. The description restates the status set and mentions 'paid with the amount received', adding little beyond the schema; the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (records/updates) and resource (claim status in the person's Untap account) and enumerates the four possible statuses. It is clearly distinguishable from siblings like save_claim and list_my_claims, which create or read claims rather than mutate status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains when this applies (recording progress on an existing claim) and where the claim_id comes from (saved or listed), and scopes the effect to Untap's record only. It does not explicitly name alternative tools or exclusion conditions, but the context is clear enough to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updates
    • Changedcheck_flight_compensation1 field changed
      • changedInput schema / properties / price_paid / description
        Previous value: -"Optional. Not used for the amount, which is fixed in law, but needed to save the claim to an account."New value: +"Optional, in pounds: \"£180\" or 180. Not used for the amount, which is fixed in law, but needed to save the claim to an account."
    • Changedcheck_train_delay2 fields changed
      • changedInput schema / properties / price_paid / description
        Previous value: -"What the ticket cost: \"£24.50\", 24.50 or 2450 (pence). For a season ticket, the price of the whole season. Needed for a cash amount; without it the percentage is returned."New value: +"What one ticket cost, in pounds: \"£24.50\", 24.5 or 17 (read as £17.00). For a season ticket, the price of the whole season. Needed for a cash amount; without it the percentage is returned."
      • addedInput schema / properties / tickets
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maximum": 9,
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "How many tickets of this price are on the booking, one per passenger. Defaults to 1. The amount is per ticket times this."
        +}
  2. 3 tool updates
    • Changedadd_train_journey2 fields changed
      • addedInput schema / properties / season_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "weekly",
        +        "monthly",
        +        "quarterly",
        +        "six_monthly",
        +        "annual",
        +        "flexi"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Season tickets only: how long the season runs. The operator divides the season price into single journeys (for example annual 464, monthly 40, weekly 10, flexi 16) and pays a share of one journey. When left out, the result gives the percentage and the method but no amount."
        +}
      • changedInput schema / properties / ticket_type / description
        Previous value: -"Ticket type as printed. For \"return\" and \"open_return\" the single fare is half the price paid; every other type uses the full price as the single fare."New value: +"Ticket type as printed. For \"return\" and \"open_return\" the single fare is half the price paid; for \"season\" the amount is a share of one journey value (see season_type); every other type uses the full price as the single fare."
    • Changedcheck_train_delay2 fields changed
      • changedInput schema / properties / price_paid / description
        Previous value: -"What the ticket cost: \"£24.50\", 24.50 or 2450 (pence). Needed for a cash amount; without it the percentage is returned."New value: +"What the ticket cost: \"£24.50\", 24.50 or 2450 (pence). For a season ticket, the price of the whole season. Needed for a cash amount; without it the percentage is returned."
      • changedInput schema / properties / ticket_type / description
        Previous value: -"As printed: \"Anytime Return\", \"Off-Peak Single\", \"Advance\", \"Season\". A return halves the single fare the amount is worked from."New value: +"As printed: \"Anytime Return\", \"Off-Peak Single\", \"Advance\", \"Annual Season\", \"Monthly Season\", \"Flexi Season\". A return halves the single fare the amount is worked from. A season is valued per journey from its length; a season with no length gets no amount."
    • Changedsave_claim1 field changed
      • changedInput schema / properties / train / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "booking_reference": {
        -        "description": "Booking reference if available, otherwise null.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "legs": {
        -        "description": "Each journey on this booking, in travel order: one for a single, two for a return (outward first), more for a multi-stop booking. Untap works out Delay Repay for each journey and adds them up.",
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "actual_arrival": {
        -              "description": "Optional. Actual arrival for this journey as an ISO 8601 datetime, if known. When left out, Untap looks it up.",
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "arrival_station": {
        -              "description": "Full arrival station name, e.g. \"Edinburgh Waverley\".",
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "delay_minutes": {
        -              "anyOf": [
        -                {
        -                  "maximum": 1440,
        -                  "minimum": 0,
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "description": "Optional. Delay at arrival for this journey, in minutes, if known. When left out, Untap looks it up in National Rail records."
        -            },
        -            "departure_station": {
        -              "description": "Full departure station name, e.g. \"London Kings Cross\".",
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "operator_toc_code": {
        -              "description": "National Rail two-letter operator code for this journey: VT=Avanti West Coast, CC=c2c, CH=Chiltern Railways, EM=East Midlands Railway, GX=Gatwick Express, GN=Great Northern, GW=Great Western Railway, LE=Greater Anglia, NT=Northern Trains, SW=South Western Railway, SE=Southeastern, SN=Southern, TL=Thameslink, TP=TransPennine Express, AW=Transport for Wales, LM=West Midlands Railway, LN=London Northwestern Railway, XC=CrossCountry, GR=LNER, SR=ScotRail, LD=Lumo, HT=Hull Trains, CS=Caledonian Sleeper",
        -              "enum": [
        -                "VT",
        -                "CC",
        -                "CH",
        -                "EM",
        -                "GX",
        -                "GN",
        -                "GW",
        -                "LE",
        -                "NT",
        -                "SW",
        -                "SE",
        -                "SN",
        -                "TL",
        -                "TP",
        -                "AW",
        -                "LM",
        -                "LN",
        -                "XC",
        -                "GR",
        -                "SR",
        -                "LD",
        -                "HT",
        -                "CS"
        -              ],
        -              "type": "string"
        -            },
        -            "scheduled_arrival": {
        -              "description": "Scheduled arrival as ISO 8601 datetime.",
        -              "type": "string"
        -            },
        -            "scheduled_departure": {
        -              "description": "Scheduled departure as ISO 8601 datetime.",
        -              "type": "string"
        -            },
        -            "was_cancelled": {
        -              "description": "Optional. True when this journey was cancelled. When set, no National Rail lookup is made.",
        -              "type": [
        -                "boolean",
        -                "null"
        -              ]
        -            }
        -          },
        -          "required": [
        -            "operator_toc_code",
        -            "departure_station",
        -            "arrival_station",
        -            "scheduled_departure",
        -            "scheduled_arrival"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 8,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "ticket_price_pence": {
        -        "description": "Total fare paid in pence for the whole booking. £62.00 = 6200.",
        -        "maximum": 1000000,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "ticket_type": {
        -        "description": "Ticket type as printed. For \"return\" and \"open_return\" the single fare is half the price paid; every other type uses the full price as the single fare.",
        -        "enum": [
        -          "single",
        -          "return",
        -          "open_return",
        -          "advance",
        -          "anytime",
        -          "off_peak",
        -          "super_off_peak",
        -          "season",
        -          "other"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "ticket_price_pence",
        -      "ticket_type",
        -      "booking_reference",
        -      "legs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "booking_reference": {
        +        "description": "Booking reference if available, otherwise null.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "legs": {
        +        "description": "Each journey on this booking, in travel order: one for a single, two for a return (outward first), more for a multi-stop booking. Untap works out Delay Repay for each journey and adds them up.",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "actual_arrival": {
        +              "description": "Optional. Actual arrival for this journey as an ISO 8601 datetime, if known. When left out, Untap looks it up.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "arrival_station": {
        +              "description": "Full arrival station name, e.g. \"Edinburgh Waverley\".",
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "delay_minutes": {
        +              "anyOf": [
        +                {
        +                  "maximum": 1440,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Optional. Delay at arrival for this journey, in minutes, if known. When left out, Untap looks it up in National Rail records."
        +            },
        +            "departure_station": {
        +              "description": "Full departure station name, e.g. \"London Kings Cross\".",
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "operator_toc_code": {
        +              "description": "National Rail two-letter operator code for this journey: VT=Avanti West Coast, CC=c2c, CH=Chiltern Railways, EM=East Midlands Railway, GX=Gatwick Express, GN=Great Northern, GW=Great Western Railway, LE=Greater Anglia, NT=Northern Trains, SW=South Western Railway, SE=Southeastern, SN=Southern, TL=Thameslink, TP=TransPennine Express, AW=Transport for Wales, LM=West Midlands Railway, LN=London Northwestern Railway, XC=CrossCountry, GR=LNER, SR=ScotRail, LD=Lumo, HT=Hull Trains, CS=Caledonian Sleeper",
        +              "enum": [
        +                "VT",
        +                "CC",
        +                "CH",
        +                "EM",
        +                "GX",
        +                "GN",
        +                "GW",
        +                "LE",
        +                "NT",
        +                "SW",
        +                "SE",
        +                "SN",
        +                "TL",
        +                "TP",
        +                "AW",
        +                "LM",
        +                "LN",
        +                "XC",
        +                "GR",
        +                "SR",
        +                "LD",
        +                "HT",
        +                "CS"
        +              ],
        +              "type": "string"
        +            },
        +            "scheduled_arrival": {
        +              "description": "Scheduled arrival as ISO 8601 datetime.",
        +              "type": "string"
        +            },
        +            "scheduled_departure": {
        +              "description": "Scheduled departure as ISO 8601 datetime.",
        +              "type": "string"
        +            },
        +            "was_cancelled": {
        +              "description": "Optional. True when this journey was cancelled. When set, no National Rail lookup is made.",
        +              "type": [
        +                "boolean",
        +                "null"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "operator_toc_code",
        +            "departure_station",
        +            "arrival_station",
        +            "scheduled_departure",
        +            "scheduled_arrival"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 8,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "season_type": {
        +        "anyOf": [
        +          {
        +            "enum": [
        +              "weekly",
        +              "monthly",
        +              "quarterly",
        +              "six_monthly",
        +              "annual",
        +              "flexi"
        +            ],
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Season tickets only: how long the season runs. The operator divides the season price into single journeys (for example annual 464, monthly 40, weekly 10, flexi 16) and pays a share of one journey. When left out, the result gives the percentage and the method but no amount."
        +      },
        +      "ticket_price_pence": {
        +        "description": "Total fare paid in pence for the whole booking. £62.00 = 6200.",
        +        "maximum": 1000000,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "ticket_type": {
        +        "description": "Ticket type as printed. For \"return\" and \"open_return\" the single fare is half the price paid; for \"season\" the amount is a share of one journey value (see season_type); every other type uses the full price as the single fare.",
        +        "enum": [
        +          "single",
        +          "return",
        +          "open_return",
        +          "advance",
        +          "anytime",
        +          "off_peak",
        +          "super_off_peak",
        +          "season",
        +          "other"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "ticket_price_pence",
        +      "ticket_type",
        +      "booking_reference",
        +      "legs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  3. 2 tool updates
    • Addedget_claim_instructions
    • Addedscan_for_claims
  4. 14 tool updates
    • Changedadd_flight3 fields changed
      • changedInput schema / properties / actual_arrival / description
        Previous value: -"OPTIONAL. Actual arrival as ISO 8601 datetime, if the user told you. Otherwise leave undefined."New value: +"Optional. Actual arrival as an ISO 8601 datetime, if known."
      • changedInput schema / properties / delay_minutes / description
        Previous value: -"OPTIONAL. Delay duration in minutes, if the user told you."New value: +"Optional. Arrival delay in minutes, if known."
      • changedInput schema / properties / status / description
        Previous value: -"OPTIONAL. Pass only if the user explicitly told you what happened. Otherwise leave undefined and Untap will look up the flight via AeroDataBox."New value: +"Optional. What happened to the flight, if known. When left out, Untap looks the flight up in AeroDataBox flight-status records."
    • Changedadd_parking_fine2 fields changed
      • changedInput schema / properties / full_deadline / description
        Previous value: -"ISO date by which the full amount must be paid or appeal lodged."New value: +"Last date on the notice for paying the full amount or lodging an appeal, as an ISO date."
      • changedInput schema / properties / observed_notes / description
        Previous value: -"Short phrases supporting grounds of appeal, drawn from the notice or the user’s description."New value: +"Short phrases from the notice or the person’s account that may support an appeal, such as unclear signs, a broken machine or a few minutes over. The appeal-grounds engine matches against these; with none, it can only suggest general grounds."
    • Changedadd_tfl_journeys6 fields changed
      • addedInput schema / properties / journeys / items / properties / intended_destination
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 80,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Optional, for an incomplete journey with no touch out: the station the person was travelling to. With it, the refund is estimated as the fare charged minus the usual fare to that station. Without it, the figure is an upper limit equal to the whole charge."
        +}
      • changedInput schema / properties / journeys / items / properties / is_auto_corrected / description
        Previous value: -"OPTIONAL. True if the statement says TfL already auto-corrected this journey (e.g. \"Auto-completed\", \"Adjusted\")."New value: +"Optional. True when the statement says TfL has already corrected this journey (for example \"Auto-completed\" or \"Adjusted\")."
      • changedInput schema / properties / journeys / items / properties / is_daily_cap_hit / description
        Previous value: -"OPTIONAL. True if the statement explicitly marks this row as the daily-cap-reached entry."New value: +"Optional. True when the statement marks this row as the one where the daily cap was reached."
      • changedInput schema / properties / journeys / items / properties / is_hopper_free / description
        Previous value: -"OPTIONAL. True if the statement marks this fare as a free Hopper fare (second bus/tram tap within 60 min)."New value: +"Optional. True when the statement shows this fare as a free Hopper fare (a second bus or tram within 60 minutes)."
      • changedInput schema / properties / journeys / items / properties / is_weekly_cap_hit / description
        Previous value: -"OPTIONAL. True if the statement marks this row as a weekly-cap-reached entry."New value: +"Optional. True when the statement marks this row as the one where the weekly cap was reached."
      • changedInput schema / properties / journeys / items / properties / mode / description
        Previous value: -"Transport mode for this row. Use \"unknown\" only if the statement does not say."New value: +"Transport mode for this row, or \"unknown\" when the statement does not say."
    • Changedadd_train_journey6 fields changed
      • changedInput schema / properties / legs / description
        Previous value: -"Every leg of this booking. Single ticket = 1 leg. Return = 2 legs (outbound first, then return). Multi-stop bookings can have more legs in journey order. Untap runs Delay Repay eligibility per leg and sums the entitlements."New value: +"Each journey on this booking, in travel order: one for a single, two for a return (outward first), more for a multi-stop booking. Untap works out Delay Repay for each journey and adds them up."
      • changedInput schema / properties / legs / items / properties / actual_arrival / description
        Previous value: -"OPTIONAL. Per-leg actual arrival as ISO 8601 datetime if the user told you. Leave undefined to auto-check."New value: +"Optional. Actual arrival for this journey as an ISO 8601 datetime, if known. When left out, Untap looks it up."
      • changedInput schema / properties / legs / items / properties / delay_minutes / description
        Previous value: -"OPTIONAL. Per-leg delay in minutes if the user told you. Leave undefined to auto-check via HSP."New value: +"Optional. Delay at arrival for this journey, in minutes, if known. When left out, Untap looks it up in National Rail records."
      • changedInput schema / properties / legs / items / properties / operator_toc_code / description
        Previous value: -"TOC code for this leg. Must match one of the National Rail two-letter codes: VT=Avanti West Coast, CC=c2c, CH=Chiltern Railways, EM=East Midlands Railway, GX=Gatwick Express, GN=Great Northern, GW=Great Western Railway, LE=Greater Anglia, NT=Northern Trains, SW=South Western Railway, SE=Southeastern, SN=Southern, TL=Thameslink, TP=TransPennine Express, AW=Transport for Wales, LM=West Midlands Railway, LN=London Northwestern Railway, XC=CrossCountry, GR=LNER, SR=ScotRail, LD=Lumo, HT=Hull Trains, CS=Caledonian Sleeper"New value: +"National Rail two-letter operator code for this journey: VT=Avanti West Coast, CC=c2c, CH=Chiltern Railways, EM=East Midlands Railway, GX=Gatwick Express, GN=Great Northern, GW=Great Western Railway, LE=Greater Anglia, NT=Northern Trains, SW=South Western Railway, SE=Southeastern, SN=Southern, TL=Thameslink, TP=TransPennine Express, AW=Transport for Wales, LM=West Midlands Railway, LN=London Northwestern Railway, XC=CrossCountry, GR=LNER, SR=ScotRail, LD=Lumo, HT=Hull Trains, CS=Caledonian Sleeper"
      • changedInput schema / properties / legs / items / properties / was_cancelled / description
        Previous value: -"OPTIONAL. True if the user said this leg was cancelled. Skips the HSP lookup."New value: +"Optional. True when this journey was cancelled. When set, no National Rail lookup is made."
      • changedInput schema / properties / ticket_type / description
        Previous value: -"Ticket type as printed. \"return\" or \"open_return\" trigger half-fare-per-leg compensation; everything else uses the full ticket as the single-fare basis."New value: +"Ticket type as printed. For \"return\" and \"open_return\" the single fare is half the price paid; every other type uses the full price as the single fare."
    • Changedcheck_commute3 fields changed
      • changedInput schema / properties / commute_id / description
        Previous value: -"The id returned by save_commute or list_commutes."New value: +"The id of a saved commute."
      • changedInput schema / properties / date / description
        Previous value: -"Specific travel date requested by the person, preferably YYYY-MM-DD. Yesterday also works. Never assume they travelled."New value: +"The travel date to check, preferably YYYY-MM-DD. \"yesterday\" also works."
      • changedInput schema / properties / service_id / description
        Previous value: -"A candidate service_id from an earlier check, to confirm the actual train."New value: +"The service_id of a train listed in an earlier result. With it, that train is checked directly."
    • Changedcheck_flight_compensation1 field changed
      • changedInput schema / properties / what_happened / description
        Previous value: -"Only if the person has said what happened. Otherwise leave out and Untap looks it up."New value: +"What happened, if known. When left out, Untap looks it up in flight-status records."
    • Changedcheck_tfl_journeys3 fields changed
      • changedInput schema / properties / csv_text / description
        Previous value: -"The text of the CSV file from the TfL account’s journey history download."New value: +"The text of the CSV journey history downloaded from a TfL account. Takes priority over journeys."
      • changedInput schema / properties / journeys / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "bus_route": {
        -          "description": "Bus route number for bus rows, otherwise null.",
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "date": {
        -          "description": "Journey date as YYYY-MM-DD.",
        -          "type": "string"
        -        },
        -        "end_time": {
        -          "description": "Tap-out time as HH:MM, or null.",
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "fare_pence": {
        -          "description": "Charge for this row in pence. £2.20 = 220.",
        -          "maximum": 100000,
        -          "minimum": 0,
        -          "type": "integer"
        -        },
        -        "from_location": {
        -          "description": "Tap-in station / stop name, or null if not shown.",
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "is_auto_corrected": {
        -          "description": "OPTIONAL. True if the statement says TfL already auto-corrected this journey (e.g. \"Auto-completed\", \"Adjusted\").",
        -          "type": [
        -            "boolean",
        -            "null"
        -          ]
        -        },
        -        "is_daily_cap_hit": {
        -          "description": "OPTIONAL. True if the statement explicitly marks this row as the daily-cap-reached entry.",
        -          "type": [
        -            "boolean",
        -            "null"
        -          ]
        -        },
        -        "is_hopper_free": {
        -          "description": "OPTIONAL. True if the statement marks this fare as a free Hopper fare (second bus/tram tap within 60 min).",
        -          "type": [
        -            "boolean",
        -            "null"
        -          ]
        -        },
        -        "is_incomplete": {
        -          "description": "True if this journey has no tap-out recorded (e.g. label \"Incomplete\" or \"No exit\").",
        -          "type": "boolean"
        -        },
        -        "is_max_fare": {
        -          "description": "True if the statement labels this as a max-fare charge for a failed revenue inspection.",
        -          "type": "boolean"
        -        },
        -        "is_weekly_cap_hit": {
        -          "description": "OPTIONAL. True if the statement marks this row as a weekly-cap-reached entry.",
        -          "type": [
        -            "boolean",
        -            "null"
        -          ]
        -        },
        -        "mode": {
        -          "description": "Transport mode for this row. Use \"unknown\" only if the statement does not say.",
        -          "enum": [
        -            "tube",
        -            "bus",
        -            "overground",
        -            "elizabeth",
        -            "dlr",
        -            "tram",
        -            "cable_car",
        -            "thameslink",
        -            "unknown"
        -          ],
        -          "type": "string"
        -        },
        -        "start_time": {
        -          "description": "Tap-in time as HH:MM, or null.",
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "to_location": {
        -          "description": "Tap-out station / stop name, or null for incomplete journeys.",
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        }
        -      },
        -      "required": [
        -        "date",
        -        "start_time",
        -        "end_time",
        -        "mode",
        -        "from_location",
        -        "to_location",
        -        "bus_route",
        -        "fare_pence",
        -        "is_max_fare",
        -        "is_incomplete"
        -      ],
        -      "type": "object"
        -    },
        -    "maxItems": 500,
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "bus_route": {
        +          "description": "Bus route number for bus rows, otherwise null.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "date": {
        +          "description": "Journey date as YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "end_time": {
        +          "description": "Tap-out time as HH:MM, or null.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "fare_pence": {
        +          "description": "Charge for this row in pence. £2.20 = 220.",
        +          "maximum": 100000,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "from_location": {
        +          "description": "Tap-in station / stop name, or null if not shown.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "intended_destination": {
        +          "anyOf": [
        +            {
        +              "maxLength": 80,
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Optional, for an incomplete journey with no touch out: the station the person was travelling to. With it, the refund is estimated as the fare charged minus the usual fare to that station. Without it, the figure is an upper limit equal to the whole charge."
        +        },
        +        "is_auto_corrected": {
        +          "description": "Optional. True when the statement says TfL has already corrected this journey (for example \"Auto-completed\" or \"Adjusted\").",
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "is_daily_cap_hit": {
        +          "description": "Optional. True when the statement marks this row as the one where the daily cap was reached.",
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "is_hopper_free": {
        +          "description": "Optional. True when the statement shows this fare as a free Hopper fare (a second bus or tram within 60 minutes).",
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "is_incomplete": {
        +          "description": "True if this journey has no tap-out recorded (e.g. label \"Incomplete\" or \"No exit\").",
        +          "type": "boolean"
        +        },
        +        "is_max_fare": {
        +          "description": "True if the statement labels this as a max-fare charge for a failed revenue inspection.",
        +          "type": "boolean"
        +        },
        +        "is_weekly_cap_hit": {
        +          "description": "Optional. True when the statement marks this row as the one where the weekly cap was reached.",
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "mode": {
        +          "description": "Transport mode for this row, or \"unknown\" when the statement does not say.",
        +          "enum": [
        +            "tube",
        +            "bus",
        +            "overground",
        +            "elizabeth",
        +            "dlr",
        +            "tram",
        +            "cable_car",
        +            "thameslink",
        +            "unknown"
        +          ],
        +          "type": "string"
        +        },
        +        "start_time": {
        +          "description": "Tap-in time as HH:MM, or null.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "to_location": {
        +          "description": "Tap-out station / stop name, or null for incomplete journeys.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "date",
        +        "start_time",
        +        "end_time",
        +        "mode",
        +        "from_location",
        +        "to_location",
        +        "bus_route",
        +        "fare_pence",
        +        "is_max_fare",
        +        "is_incomplete"
        +      ],
        +      "type": "object"
        +    },
        +    "maxItems": 500,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / journeys / description
        Previous value: -"Journey rows read from the person’s TfL journey history. Send these or csv_text, not both."New value: +"Journey rows from a TfL contactless or Oyster journey history. Used when csv_text is not given."
    • Changedcheck_train_delay2 fields changed
      • changedInput schema / properties / departure_time / description
        Previous value: -"Roughly when the train left the first station, UK time: \"08:05\", \"8am\", \"around 8\". Leave out if unknown and Untap lists the day’s trains to choose from."New value: +"Roughly when the train left the first station, UK time: \"08:05\", \"8am\", \"around 8\". Needed to find the train unless service_id is given."
      • changedInput schema / properties / service_id / description
        Previous value: -"The service_id of a candidate returned by an earlier call, to confirm which train it was."New value: +"The service_id of a train listed in an earlier result. With it, that train is checked directly."
    • Changeddelete_my_data2 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Use false for the preview. Use true only after showing the preview and receiving confirmation in a new user message, with the preview token."New value: +"false returns a preview of what would be deleted and a confirmation_token, and deletes nothing. true deletes, and works only with an unexpired confirmation_token from a preview."
      • changedInput schema / properties / confirmation_token / description
        Previous value: -"The confirmation_token returned by the first call. Required when confirm is true."New value: +"The confirmation_token from a preview. Required when confirm is true; each token works once."
    • Changedlist_my_claims1 field changed
      • changedInput schema / properties / category / description
        Previous value: -"Only this category. Leave out for all."New value: +"Restricts the list to one category. When left out, all categories are listed."
    • Changedsave_claim6 fields changed
      • changedInput schema / properties / flight / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "actual_arrival": {
        -        "description": "OPTIONAL. Actual arrival as ISO 8601 datetime, if the user told you. Otherwise leave undefined.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "airline_iata": {
        -        "description": "Two-letter IATA airline code, e.g. \"BA\" for British Airways, \"U2\" for easyJet.",
        -        "maxLength": 2,
        -        "minLength": 2,
        -        "type": "string"
        -      },
        -      "arrival_iata": {
        -        "description": "Three-letter IATA arrival airport code, e.g. \"BCN\".",
        -        "maxLength": 3,
        -        "minLength": 3,
        -        "type": "string"
        -      },
        -      "booking_reference": {
        -        "description": "PNR / airline booking reference if available, otherwise null.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "delay_minutes": {
        -        "anyOf": [
        -          {
        -            "maximum": 2880,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "OPTIONAL. Delay duration in minutes, if the user told you."
        -      },
        -      "departure_iata": {
        -        "description": "Three-letter IATA departure airport code, e.g. \"LHR\".",
        -        "maxLength": 3,
        -        "minLength": 3,
        -        "type": "string"
        -      },
        -      "flight_number": {
        -        "description": "Flight number including the airline prefix, e.g. \"BA2551\".",
        -        "type": "string"
        -      },
        -      "passenger_name": {
        -        "description": "Passenger name as printed on the ticket, or null if not visible.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "scheduled_arrival": {
        -        "description": "Scheduled arrival as ISO 8601 datetime.",
        -        "type": "string"
        -      },
        -      "scheduled_departure": {
        -        "description": "Scheduled departure as ISO 8601 datetime.",
        -        "type": "string"
        -      },
        -      "status": {
        -        "anyOf": [
        -          {
        -            "enum": [
        -              "on_time",
        -              "delayed",
        -              "cancelled",
        -              "denied_boarding"
        -            ],
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "OPTIONAL. Pass only if the user explicitly told you what happened. Otherwise leave undefined and Untap will look up the flight via AeroDataBox."
        -      },
        -      "ticket_price_pence": {
        -        "description": "Total fare paid in pence.",
        -        "maximum": 50000000,
        -        "minimum": 1,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "airline_iata",
        -      "flight_number",
        -      "departure_iata",
        -      "arrival_iata",
        -      "scheduled_departure",
        -      "scheduled_arrival",
        -      "ticket_price_pence",
        -      "booking_reference",
        -      "passenger_name"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "actual_arrival": {
        +        "description": "Optional. Actual arrival as an ISO 8601 datetime, if known.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "airline_iata": {
        +        "description": "Two-letter IATA airline code, e.g. \"BA\" for British Airways, \"U2\" for easyJet.",
        +        "maxLength": 2,
        +        "minLength": 2,
        +        "type": "string"
        +      },
        +      "arrival_iata": {
        +        "description": "Three-letter IATA arrival airport code, e.g. \"BCN\".",
        +        "maxLength": 3,
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "booking_reference": {
        +        "description": "PNR / airline booking reference if available, otherwise null.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "delay_minutes": {
        +        "anyOf": [
        +          {
        +            "maximum": 2880,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Optional. Arrival delay in minutes, if known."
        +      },
        +      "departure_iata": {
        +        "description": "Three-letter IATA departure airport code, e.g. \"LHR\".",
        +        "maxLength": 3,
        +        "minLength": 3,
        +        "type": "string"
        +      },
        +      "flight_number": {
        +        "description": "Flight number including the airline prefix, e.g. \"BA2551\".",
        +        "type": "string"
        +      },
        +      "passenger_name": {
        +        "description": "Passenger name as printed on the ticket, or null if not visible.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "scheduled_arrival": {
        +        "description": "Scheduled arrival as ISO 8601 datetime.",
        +        "type": "string"
        +      },
        +      "scheduled_departure": {
        +        "description": "Scheduled departure as ISO 8601 datetime.",
        +        "type": "string"
        +      },
        +      "status": {
        +        "anyOf": [
        +          {
        +            "enum": [
        +              "on_time",
        +              "delayed",
        +              "cancelled",
        +              "denied_boarding"
        +            ],
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Optional. What happened to the flight, if known. When left out, Untap looks the flight up in AeroDataBox flight-status records."
        +      },
        +      "ticket_price_pence": {
        +        "description": "Total fare paid in pence.",
        +        "maximum": 50000000,
        +        "minimum": 1,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "airline_iata",
        +      "flight_number",
        +      "departure_iata",
        +      "arrival_iata",
        +      "scheduled_departure",
        +      "scheduled_arrival",
        +      "ticket_price_pence",
        +      "booking_reference",
        +      "passenger_name"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / flight / description
        Previous value: -"For category \"flight\": save_claim.arguments.flight from check_flight_compensation, with ticket_price_pence filled in."New value: +"For category \"flight\": the flight, in the shape a flight check returns in save_claim.arguments.flight, with ticket_price_pence set."
      • changedInput schema / properties / tfl / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "card_last4": {
        -        "description": "Last 4 digits of the contactless card, if shown.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "journeys": {
        -        "description": "Every journey on the statement. Up to 500 per call.",
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "bus_route": {
        -              "description": "Bus route number for bus rows, otherwise null.",
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "date": {
        -              "description": "Journey date as YYYY-MM-DD.",
        -              "type": "string"
        -            },
        -            "end_time": {
        -              "description": "Tap-out time as HH:MM, or null.",
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "fare_pence": {
        -              "description": "Charge for this row in pence. £2.20 = 220.",
        -              "maximum": 100000,
        -              "minimum": 0,
        -              "type": "integer"
        -            },
        -            "from_location": {
        -              "description": "Tap-in station / stop name, or null if not shown.",
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "is_auto_corrected": {
        -              "description": "OPTIONAL. True if the statement says TfL already auto-corrected this journey (e.g. \"Auto-completed\", \"Adjusted\").",
        -              "type": [
        -                "boolean",
        -                "null"
        -              ]
        -            },
        -            "is_daily_cap_hit": {
        -              "description": "OPTIONAL. True if the statement explicitly marks this row as the daily-cap-reached entry.",
        -              "type": [
        -                "boolean",
        -                "null"
        -              ]
        -            },
        -            "is_hopper_free": {
        -              "description": "OPTIONAL. True if the statement marks this fare as a free Hopper fare (second bus/tram tap within 60 min).",
        -              "type": [
        -                "boolean",
        -                "null"
        -              ]
        -            },
        -            "is_incomplete": {
        -              "description": "True if this journey has no tap-out recorded (e.g. label \"Incomplete\" or \"No exit\").",
        -              "type": "boolean"
        -            },
        -            "is_max_fare": {
        -              "description": "True if the statement labels this as a max-fare charge for a failed revenue inspection.",
        -              "type": "boolean"
        -            },
        -            "is_weekly_cap_hit": {
        -              "description": "OPTIONAL. True if the statement marks this row as a weekly-cap-reached entry.",
        -              "type": [
        -                "boolean",
        -                "null"
        -              ]
        -            },
        -            "mode": {
        -              "description": "Transport mode for this row. Use \"unknown\" only if the statement does not say.",
        -              "enum": [
        -                "tube",
        -                "bus",
        -                "overground",
        -                "elizabeth",
        -                "dlr",
        -                "tram",
        -                "cable_car",
        -                "thameslink",
        -                "unknown"
        -              ],
        -              "type": "string"
        -            },
        -            "start_time": {
        -              "description": "Tap-in time as HH:MM, or null.",
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "to_location": {
        -              "description": "Tap-out station / stop name, or null for incomplete journeys.",
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            }
        -          },
        -          "required": [
        -            "date",
        -            "start_time",
        -            "end_time",
        -            "mode",
        -            "from_location",
        -            "to_location",
        -            "bus_route",
        -            "fare_pence",
        -            "is_max_fare",
        -            "is_incomplete"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 500,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "period_end": {
        -        "description": "Statement period end date YYYY-MM-DD.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "period_start": {
        -        "description": "Statement period start date YYYY-MM-DD.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "card_last4",
        -      "period_start",
        -      "period_end",
        -      "journeys"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "card_last4": {
        +        "description": "Last 4 digits of the contactless card, if shown.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "journeys": {
        +        "description": "Every journey on the statement. Up to 500 per call.",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "bus_route": {
        +              "description": "Bus route number for bus rows, otherwise null.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "date": {
        +              "description": "Journey date as YYYY-MM-DD.",
        +              "type": "string"
        +            },
        +            "end_time": {
        +              "description": "Tap-out time as HH:MM, or null.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "fare_pence": {
        +              "description": "Charge for this row in pence. £2.20 = 220.",
        +              "maximum": 100000,
        +              "minimum": 0,
        +              "type": "integer"
        +            },
        +            "from_location": {
        +              "description": "Tap-in station / stop name, or null if not shown.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "intended_destination": {
        +              "anyOf": [
        +                {
        +                  "maxLength": 80,
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Optional, for an incomplete journey with no touch out: the station the person was travelling to. With it, the refund is estimated as the fare charged minus the usual fare to that station. Without it, the figure is an upper limit equal to the whole charge."
        +            },
        +            "is_auto_corrected": {
        +              "description": "Optional. True when the statement says TfL has already corrected this journey (for example \"Auto-completed\" or \"Adjusted\").",
        +              "type": [
        +                "boolean",
        +                "null"
        +              ]
        +            },
        +            "is_daily_cap_hit": {
        +              "description": "Optional. True when the statement marks this row as the one where the daily cap was reached.",
        +              "type": [
        +                "boolean",
        +                "null"
        +              ]
        +            },
        +            "is_hopper_free": {
        +              "description": "Optional. True when the statement shows this fare as a free Hopper fare (a second bus or tram within 60 minutes).",
        +              "type": [
        +                "boolean",
        +                "null"
        +              ]
        +            },
        +            "is_incomplete": {
        +              "description": "True if this journey has no tap-out recorded (e.g. label \"Incomplete\" or \"No exit\").",
        +              "type": "boolean"
        +            },
        +            "is_max_fare": {
        +              "description": "True if the statement labels this as a max-fare charge for a failed revenue inspection.",
        +              "type": "boolean"
        +            },
        +            "is_weekly_cap_hit": {
        +              "description": "Optional. True when the statement marks this row as the one where the weekly cap was reached.",
        +              "type": [
        +                "boolean",
        +                "null"
        +              ]
        +            },
        +            "mode": {
        +              "description": "Transport mode for this row, or \"unknown\" when the statement does not say.",
        +              "enum": [
        +                "tube",
        +                "bus",
        +                "overground",
        +                "elizabeth",
        +                "dlr",
        +                "tram",
        +                "cable_car",
        +                "thameslink",
        +                "unknown"
        +              ],
        +              "type": "string"
        +            },
        +            "start_time": {
        +              "description": "Tap-in time as HH:MM, or null.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "to_location": {
        +              "description": "Tap-out station / stop name, or null for incomplete journeys.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "date",
        +            "start_time",
        +            "end_time",
        +            "mode",
        +            "from_location",
        +            "to_location",
        +            "bus_route",
        +            "fare_pence",
        +            "is_max_fare",
        +            "is_incomplete"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 500,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "period_end": {
        +        "description": "Statement period end date YYYY-MM-DD.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "period_start": {
        +        "description": "Statement period start date YYYY-MM-DD.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "card_last4",
        +      "period_start",
        +      "period_end",
        +      "journeys"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / tfl / description
        Previous value: -"For category \"tfl\": save_claim.arguments.tfl from check_tfl_journeys."New value: +"For category \"tfl\": the journeys, in the shape a TfL check returns in save_claim.arguments.tfl."
      • changedInput schema / properties / train / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "booking_reference": {
        -        "description": "Booking reference if available, otherwise null.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "legs": {
        -        "description": "Every leg of this booking. Single ticket = 1 leg. Return = 2 legs (outbound first, then return). Multi-stop bookings can have more legs in journey order. Untap runs Delay Repay eligibility per leg and sums the entitlements.",
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "actual_arrival": {
        -              "description": "OPTIONAL. Per-leg actual arrival as ISO 8601 datetime if the user told you. Leave undefined to auto-check.",
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "arrival_station": {
        -              "description": "Full arrival station name, e.g. \"Edinburgh Waverley\".",
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "delay_minutes": {
        -              "anyOf": [
        -                {
        -                  "maximum": 1440,
        -                  "minimum": 0,
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "description": "OPTIONAL. Per-leg delay in minutes if the user told you. Leave undefined to auto-check via HSP."
        -            },
        -            "departure_station": {
        -              "description": "Full departure station name, e.g. \"London Kings Cross\".",
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "operator_toc_code": {
        -              "description": "TOC code for this leg. Must match one of the National Rail two-letter codes: VT=Avanti West Coast, CC=c2c, CH=Chiltern Railways, EM=East Midlands Railway, GX=Gatwick Express, GN=Great Northern, GW=Great Western Railway, LE=Greater Anglia, NT=Northern Trains, SW=South Western Railway, SE=Southeastern, SN=Southern, TL=Thameslink, TP=TransPennine Express, AW=Transport for Wales, LM=West Midlands Railway, LN=London Northwestern Railway, XC=CrossCountry, GR=LNER, SR=ScotRail, LD=Lumo, HT=Hull Trains, CS=Caledonian Sleeper",
        -              "enum": [
        -                "VT",
        -                "CC",
        -                "CH",
        -                "EM",
        -                "GX",
        -                "GN",
        -                "GW",
        -                "LE",
        -                "NT",
        -                "SW",
        -                "SE",
        -                "SN",
        -                "TL",
        -                "TP",
        -                "AW",
        -                "LM",
        -                "LN",
        -                "XC",
        -                "GR",
        -                "SR",
        -                "LD",
        -                "HT",
        -                "CS"
        -              ],
        -              "type": "string"
        -            },
        -            "scheduled_arrival": {
        -              "description": "Scheduled arrival as ISO 8601 datetime.",
        -              "type": "string"
        -            },
        -            "scheduled_departure": {
        -              "description": "Scheduled departure as ISO 8601 datetime.",
        -              "type": "string"
        -            },
        -            "was_cancelled": {
        -              "description": "OPTIONAL. True if the user said this leg was cancelled. Skips the HSP lookup.",
        -              "type": [
        -                "boolean",
        -                "null"
        -              ]
        -            }
        -          },
        -          "required": [
        -            "operator_toc_code",
        -            "departure_station",
        -            "arrival_station",
        -            "scheduled_departure",
        -            "scheduled_arrival"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 8,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "ticket_price_pence": {
        -        "description": "Total fare paid in pence for the whole booking. £62.00 = 6200.",
        -        "maximum": 1000000,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "ticket_type": {
        -        "description": "Ticket type as printed. \"return\" or \"open_return\" trigger half-fare-per-leg compensation; everything else uses the full ticket as the single-fare basis.",
        -        "enum": [
        -          "single",
        -          "return",
        -          "open_return",
        -          "advance",
        -          "anytime",
        -          "off_peak",
        -          "super_off_peak",
        -          "season",
        -          "other"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "ticket_price_pence",
        -      "ticket_type",
        -      "booking_reference",
        -      "legs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "booking_reference": {
        +        "description": "Booking reference if available, otherwise null.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "legs": {
        +        "description": "Each journey on this booking, in travel order: one for a single, two for a return (outward first), more for a multi-stop booking. Untap works out Delay Repay for each journey and adds them up.",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "actual_arrival": {
        +              "description": "Optional. Actual arrival for this journey as an ISO 8601 datetime, if known. When left out, Untap looks it up.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "arrival_station": {
        +              "description": "Full arrival station name, e.g. \"Edinburgh Waverley\".",
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "delay_minutes": {
        +              "anyOf": [
        +                {
        +                  "maximum": 1440,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Optional. Delay at arrival for this journey, in minutes, if known. When left out, Untap looks it up in National Rail records."
        +            },
        +            "departure_station": {
        +              "description": "Full departure station name, e.g. \"London Kings Cross\".",
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "operator_toc_code": {
        +              "description": "National Rail two-letter operator code for this journey: VT=Avanti West Coast, CC=c2c, CH=Chiltern Railways, EM=East Midlands Railway, GX=Gatwick Express, GN=Great Northern, GW=Great Western Railway, LE=Greater Anglia, NT=Northern Trains, SW=South Western Railway, SE=Southeastern, SN=Southern, TL=Thameslink, TP=TransPennine Express, AW=Transport for Wales, LM=West Midlands Railway, LN=London Northwestern Railway, XC=CrossCountry, GR=LNER, SR=ScotRail, LD=Lumo, HT=Hull Trains, CS=Caledonian Sleeper",
        +              "enum": [
        +                "VT",
        +                "CC",
        +                "CH",
        +                "EM",
        +                "GX",
        +                "GN",
        +                "GW",
        +                "LE",
        +                "NT",
        +                "SW",
        +                "SE",
        +                "SN",
        +                "TL",
        +                "TP",
        +                "AW",
        +                "LM",
        +                "LN",
        +                "XC",
        +                "GR",
        +                "SR",
        +                "LD",
        +                "HT",
        +                "CS"
        +              ],
        +              "type": "string"
        +            },
        +            "scheduled_arrival": {
        +              "description": "Scheduled arrival as ISO 8601 datetime.",
        +              "type": "string"
        +            },
        +            "scheduled_departure": {
        +              "description": "Scheduled departure as ISO 8601 datetime.",
        +              "type": "string"
        +            },
        +            "was_cancelled": {
        +              "description": "Optional. True when this journey was cancelled. When set, no National Rail lookup is made.",
        +              "type": [
        +                "boolean",
        +                "null"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "operator_toc_code",
        +            "departure_station",
        +            "arrival_station",
        +            "scheduled_departure",
        +            "scheduled_arrival"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 8,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "ticket_price_pence": {
        +        "description": "Total fare paid in pence for the whole booking. £62.00 = 6200.",
        +        "maximum": 1000000,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "ticket_type": {
        +        "description": "Ticket type as printed. For \"return\" and \"open_return\" the single fare is half the price paid; every other type uses the full price as the single fare.",
        +        "enum": [
        +          "single",
        +          "return",
        +          "open_return",
        +          "advance",
        +          "anytime",
        +          "off_peak",
        +          "super_off_peak",
        +          "season",
        +          "other"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "ticket_price_pence",
        +      "ticket_type",
        +      "booking_reference",
        +      "legs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / train / description
        Previous value: -"For category \"train\": save_claim.arguments.train from check_train_delay, with ticket_price_pence filled in."New value: +"For category \"train\": the train booking, in the shape a train check returns in save_claim.arguments.train, with ticket_price_pence set."
    • Changedsave_commute2 fields changed
      • changedInput schema / properties / commute_id / description
        Previous value: -"Update or restore an existing commute owned by this account. Omit to save a route."New value: +"The id of an existing commute in this account, to update or restore it. When left out, a new route is saved."
      • changedInput schema / properties / ticket_price_pence / description
        Previous value: -"Usual day-ticket price in pence, £24.50=2450. Omit if unknown or the fare varies. Do not supply a weekly or monthly season price."New value: +"Usual day-ticket price in pence, £24.50=2450. Optional, for when the fare is known and stays the same. A day-ticket price, not a weekly or monthly season price."
    • Changedstop_commute1 field changed
      • changedInput schema / properties / commute_id / description
        Previous value: -"The id returned by save_commute or list_commutes. The route is kept and can be restored."New value: +"The id of a saved commute. The route is kept and can be restored."
    • Changedupdate_claim_status1 field changed
      • changedInput schema / properties / claim_id / description
        Previous value: -"The claim_id from list_my_claims or save_claim."New value: +"The claim_id given when the claim was saved or listed."
  5. 18 tool updates
    • First observedadd_flight
    • First observedadd_parking_fine
    • First observedadd_tfl_journeys
    • First observedadd_train_journey
    • First observedcheck_commute
    • First observedcheck_flight_compensation
    • First observedcheck_tfl_journeys
    • First observedcheck_train_delay
    • First observeddelete_my_data
    • First observedfind_money_owed
    • First observedget_delay_repay_rules
    • First observedlist_commutes
    • First observedlist_my_claims
    • First observedlist_savings
    • First observedsave_claim
    • First observedsave_commute
    • First observedstop_commute
    • First observedupdate_claim_status

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.