TransitRadar — UK trains and buses
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Live UK rail boards, journey planning, train history, units, lifts, disruptions, punctuality.
| Author | uk.co.transitradar |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 2244 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"TransitRadar — UK trains and buses": {
"url": "https://transitradar.co.uk/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (16)
plan_journeyread-onlyPlan a GB rail journey between two stations from the timetable, including changes: the next few ways to get there after a time, each with departure, arrival, number of changes and every train to catch with where to board and alight. This is the timetable, not live running; for live times on a direct train use station_departures with 'to', and for one train's progress use get_train with its planning ID.
Parameters:
from(required) — string — Station to travel from: name or CRS code.to(required) — string — Station to travel to: name or CRS code.date— ['string', 'null'] — Date, yyyy-MM-dd. Defaults to today (UK time).time— ['string', 'null'] — Leave after this time, HH:mm UK time. Defaults to now.results— integer — How many journeys to return, 1-5.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
bus_performanceread-onlyToday's bus punctuality estimate for Great Britain, nationally and by operator: journeys counted, the share on time, early and late, and the average delay. Each bus journey is counted once, judged on arrival near its last stop, and only in the roughly 25 urban areas we sample, so it is an ESTIMATE of how buses are running, not an official figure. 'On time' follows the GB bus standard: up to 1 minute early or 5 minutes 59 late; running early counts against it.
Parameters:
limit— integer — How many operators to return, 1-30, most journeys first.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
late_trainsread-onlyGB passenger trains running late right now, and trains booked to be running now that are cancelled (wholly or part of the way). Each train has its route, how late it is, where it last reported, where it calls next, the reason Darwin gives, and a Delay Repay link once a claim is worth making. Optionally filter by operator (name or two-letter code) or set the lateness threshold.
Parameters:
limit— integer — Maximum trains to return, 1-50, cancellations first, then the latest.minLate— integer — Minutes late to count as late, 1-120. Default 5.operatorName— ['string', 'null'] — Operator name or code, e.g. 'Northern' or 'NT'.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
disruptionsread-onlyCurrent GB rail incidents and planned engineering work from National Rail's KnowledgeBase: what is affected, the operators, the dates and a link to National Rail's notice. Optionally filter by operator (name or two-letter code) or by any text, such as a station, line or reason.
Parameters:
text— ['string', 'null'] — Text to match in the notice, e.g. 'Whitehaven', 'signalling'.limit— integer — Maximum notices to return, 1-30.operatorName— ['string', 'null'] — Operator name or code, e.g. 'Northern' or 'NT'.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
train_historyread-onlyHow one timetabled train has actually run over recent days, by its planning ID (from find_train, station_departures or get_train): each day's delay at its final destination, cancellations and any reason given, plus the share on time. Delay is measured where the train ends, not at any station along the way. History follows the planning ID, which changes when the timetable changes, so a newly timetabled train has little history; days the train did not run are simply absent.
Parameters:
planningId(required) — string — Planning ID / UID, e.g. 'P24061'.days— integer — How many days back to look, 1-60.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
get_trainread-onlyFull details of one train by its planning ID (UID, e.g. 'C04207'): every public calling point with booked, expected and actual times, platforms and per-stop cancellations, plus — for today's trains — where it was last reported and how late. A cancellation can apply to only some stops. 'lastReport' is the last place signalling or movement data placed the train, not a GPS position. Reasons are National Rail's own words.
Parameters:
planningId(required) — string — Planning ID / UID, e.g. 'C04207'. Get one from find_train or station_departures.date— ['string', 'null'] — Date the train runs, yyyy-MM-dd. Defaults to today (UK time). Past dates return recorded times where the archive holds them (about 14 days of per-stop detail).
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
bus_stop_departuresread-onlyNext buses from a bus stop anywhere in Great Britain. Takes a stop name with its town or area; many stops share a name across the country, so 'Trafalgar Square' alone can land in Greater Manchester while 'Trafalgar Square London' finds Charing Cross. A stop letter can follow, e.g. 'Trafalgar Square London stop X'. A stop's ATCO/NaPTAN code also works. Live predictions in London (TfL); elsewhere the timetable, so a 'scheduled' time is not a live estimate. With 'to', only buses that go on to that stop are listed, each with its scheduled time there: the answer to 'next bus from Trafalgar Square to Brixton Station'. Those boards always come from the timetable, with the live bus and its delay where it can be identified. Other matching stops are returned alongside.
Parameters:
stop(required) — string — Stop name with town, optionally a stop letter, or a stop code: e.g. 'Trafalgar Square London stop X', '490015196OF'.to— ['string', 'null'] — Optional stop the bus must go on to, with its town: e.g. 'Brixton Station London'. Every stop of that name there counts unless a stop letter is given.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
station_inforead-onlyDetails of a GB railway station: address, managing operator, facilities, step-free access, industry codes (CRS, TIPLOC, STANOX, NLC) and, where Network Rail publishes it, the live status of each public lift. Lift status is 'In service', 'Out of service' or 'Data not available'; the last means the status is not known, and Network Rail's wording for it advises checking before travel. A station with no lifts listed is not necessarily a station without lifts; it may not report live status yet.
Parameters:
station(required) — string — Station name, CRS code (KGX) or TIPLOC.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
station_departuresread-onlyLive departure or arrival board for a GB railway station, from National Rail's Darwin feed: booked time, expected time, actual time once reported, platform, operator and any delay or cancellation reason. With 'to', only trains that also call at that station are listed, each with its booked, expected and actual time there: the live answer to 'next train from Bolton to Darwen'. On an arrivals board, 'to' is where the train came from. An expected time equal to the booked one means no revision has been published, which usually means running to plan. A missing expected time is not a statement that the train is on time. Reasons are National Rail's own wording.
Parameters:
station(required) — string — Station name, CRS code (KGX) or TIPLOC.to— ['string', 'null'] — Optional second station (name or CRS): only trains that call there after this one on departures, or before it on arrivals.rows— integer — How many trains to return, 1-30.type— string — 'departures' (default) or 'arrivals'.includeNonPassenger— boolean — Include empty stock, freight and staff trains.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
daily_performanceread-onlyTransitRadar's own record of one completed day on GB passenger rail: how many trains ran, how many were cancelled, the share of recorded arrivals within five minutes at their destination, the same share counting each cancellation as a failure, per-operator figures, and the commonest delay and cancellation reasons. Measured at the destination, so it is stricter than, and not comparable with, the industry's published PPM. Available from 2026-08-06 up to yesterday; where fewer than half of arrivals were recorded, no punctuality figure is given.
Parameters:
date(required) — string — Completed date, yyyy-MM-dd, e.g. '2026-09-26'.operators— integer — How many operators to include, largest first, 1-40.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
bus_disruptionsread-onlyCurrent and planned bus disruptions in Great Britain from the Bus Open Data Service (SIRI-SX): diversions, closed stops, roadworks and events, each with the operators and lines affected and the stops named. Filter by operator code (NOC) or by a word matched against the text, e.g. a town, road or line. Rail incidents are the separate 'disruptions' tool.
Parameters:
limit— integer — How many to return, 1-30.query— ['string', 'null'] — Words to match in the disruption, e.g. 'Leeds', 'A61', 'line 36'.operatorCode— ['string', 'null'] — Operator NOC code, e.g. 'FLDS' for First Leeds.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
find_trainread-onlySearch the GB rail timetable for specific trains. The query combines terms: an operator and a headcode ('LNER 1S09', 'EMR 1H26'), a time and a station ('12:19 from Corby' — matched within about ten minutes either side), two stations ('Corby to St Pancras', which also finds trains calling at both), or a planning ID / UID ('C12345', or its first few characters). A headcode alone is not unique: the same four characters run in several parts of the country at once, so results for one headcode can be different trains, told apart by origin and destination. Returns planning IDs to pass to get_train.
Parameters:
query(required) — string — Search text, e.g. 'GWR 1A20', '09:45 from Bath Spa', 'York to Leeds'.date— ['string', 'null'] — Date to search, yyyy-MM-dd. Defaults to today (UK time).
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
plan_door_to_doorread-onlyPlan a GB journey that may combine trains, buses and short walks, between railway stations, bus stops or coordinates, from the timetables. Each place can be a station name or CRS code, a bus stop with its town (e.g. 'Briggate Leeds'), a stop code, or 'lat,lon'. Returns the next few ways after a time with every leg: mode, line or train, where to board and alight, and times. Timetabled, not live. For rail only, plan_journey is simpler.
Parameters:
from(required) — string — Where from: station, bus stop with town, stop code, or 'lat,lon'.to(required) — string — Where to: station, bus stop with town, stop code, or 'lat,lon'.date— ['string', 'null'] — Date, yyyy-MM-dd. Defaults to today (UK time).time— ['string', 'null'] — Leave after this time, HH:mm UK time. Defaults to now.results— integer — How many journeys to return, 1-5.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
direct_destinationsread-onlyEvery station reachable from a GB railway station WITHOUT CHANGING TRAINS on a date, after a time, each with the train that gets there soonest (a later but faster train beats an earlier slow one), sorted by arrival. Includes places reached by staying aboard a train that divides or joins another en route: those rows carry an 'association' naming where, and the passenger must be in the right portion. Timetabled times, not live. Use plan_journey when a change of train is acceptable or a destination is already known.
Parameters:
from(required) — string — Station to travel from: name or CRS code.date— ['string', 'null'] — Date, yyyy-MM-dd. Defaults to today (UK time).time— ['string', 'null'] — Leave after this time, HH:mm UK time. Defaults to now.limit— integer — How many destinations to return, 1-50, soonest arrival first.maxMinutes— ['integer', 'null'] — Only destinations reached within this many minutes of departure.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
find_unitread-onlyLook up a GB passenger train unit or carriage by the five- or six-digit number painted on it (e.g. '360107'): which service it is working now, the other services it is booked to work today, and the last calling point it was reported at. This comes from the operator's rolling-stock allocation, which is a plan and may be wrong during disruption. The position is the last calling point reported, not a live GPS fix — the train is somewhere beyond it.
Parameters:
number(required) — string — Five- or six-digit unit or vehicle number, e.g. '360107'.date— ['string', 'null'] — Date, yyyy-MM-dd. Defaults to today (UK time).
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
search_stationsread-onlyFind GB railway stations by name or code. Returns each station's three-letter CRS code (e.g. KGX), its TIPLOC and whether it has step-free access. The CRS code is what the other station tools accept.
Parameters:
query(required) — string — Station name or code, e.g. 'kings cross', 'Leeds', 'MAN'.includeJunctions— boolean — Also return junctions, yards and other non-station timing points.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.