Live UK rail boards, journey planning, train history, units, lifts, disruptions, punctuality.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Current 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.
How many to return, 1-30.
Words to match in the disruption, e.g. 'Leeds', 'A61', 'line 36'.
Operator NOC code, e.g. 'FLDS' for First Leeds.
Current 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.
| Argument | Type | Description |
|---|---|---|
| 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. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 10,
"description": "How many to return, 1-30."
},
"query": {
"type": [
"string",
"null"
],
"default": null,
"description": "Words to match in the disruption, e.g. 'Leeds', 'A61', 'line 36'."
},
"operatorCode": {
"type": [
"string",
"null"
],
"default": null,
"description": "Operator NOC code, e.g. 'FLDS' for First Leeds."
}
}
}Today'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.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many operators to return, 1-30, most journeys first. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 15,
"description": "How many operators to return, 1-30, most journeys first."
}
}
}Next 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.
| Argument | Type | Description |
|---|---|---|
| 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. |
| stop* | string | Stop name with town, optionally a stop letter, or a stop code: e.g. 'Trafalgar Square London stop X', '490015196OF'. |
{
"type": "object",
"required": [
"stop"
],
"properties": {
"to": {
"type": [
"string",
"null"
],
"default": null,
"description": "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."
},
"stop": {
"type": "string",
"description": "Stop name with town, optionally a stop letter, or a stop code: e.g. 'Trafalgar Square London stop X', '490015196OF'."
}
}
}TransitRadar'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.
| Argument | Type | Description |
|---|---|---|
| date* | string | Completed date, yyyy-MM-dd, e.g. '2026-09-26'. |
| operators | integer | How many operators to include, largest first, 1-40. |
{
"type": "object",
"required": [
"date"
],
"properties": {
"date": {
"type": "string",
"description": "Completed date, yyyy-MM-dd, e.g. '2026-09-26'."
},
"operators": {
"type": "integer",
"default": 12,
"description": "How many operators to include, largest first, 1-40."
}
}
}Every 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.
| Argument | Type | Description |
|---|---|---|
| date | string | null | Date, yyyy-MM-dd. Defaults to today (UK time). |
| from* | string | Station to travel from: name or CRS code. |
| 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. |
{
"type": "object",
"required": [
"from"
],
"properties": {
"date": {
"type": [
"string",
"null"
],
"default": null,
"description": "Date, yyyy-MM-dd. Defaults to today (UK time)."
},
"from": {
"type": "string",
"description": "Station to travel from: name or CRS code."
},
"time": {
"type": [
"string",
"null"
],
"default": null,
"description": "Leave after this time, HH:mm UK time. Defaults to now."
},
"limit": {
"type": "integer",
"default": 25,
"description": "How many destinations to return, 1-50, soonest arrival first."
},
"maxMinutes": {
"type": [
"integer",
"null"
],
"default": null,
"description": "Only destinations reached within this many minutes of departure."
}
}
}Current 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.
| Argument | Type | Description |
|---|---|---|
| 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'. |
{
"type": "object",
"properties": {
"text": {
"type": [
"string",
"null"
],
"default": null,
"description": "Text to match in the notice, e.g. 'Whitehaven', 'signalling'."
},
"limit": {
"type": "integer",
"default": 15,
"description": "Maximum notices to return, 1-30."
},
"operatorName": {
"type": [
"string",
"null"
],
"default": null,
"description": "Operator name or code, e.g. 'Northern' or 'NT'."
}
}
}Search 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.
| Argument | Type | Description |
|---|---|---|
| date | string | null | Date to search, yyyy-MM-dd. Defaults to today (UK time). |
| query* | string | Search text, e.g. 'GWR 1A20', '09:45 from Bath Spa', 'York to Leeds'. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"date": {
"type": [
"string",
"null"
],
"default": null,
"description": "Date to search, yyyy-MM-dd. Defaults to today (UK time)."
},
"query": {
"type": "string",
"description": "Search text, e.g. 'GWR 1A20', '09:45 from Bath Spa', 'York to Leeds'."
}
}
}Look 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.
| Argument | Type | Description |
|---|---|---|
| date | string | null | Date, yyyy-MM-dd. Defaults to today (UK time). |
| number* | string | Five- or six-digit unit or vehicle number, e.g. '360107'. |
{
"type": "object",
"required": [
"number"
],
"properties": {
"date": {
"type": [
"string",
"null"
],
"default": null,
"description": "Date, yyyy-MM-dd. Defaults to today (UK time)."
},
"number": {
"type": "string",
"description": "Five- or six-digit unit or vehicle number, e.g. '360107'."
}
}
}Full 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.
| Argument | Type | Description |
|---|---|---|
| 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). |
| planningId* | string | Planning ID / UID, e.g. 'C04207'. Get one from find_train or station_departures. |
{
"type": "object",
"required": [
"planningId"
],
"properties": {
"date": {
"type": [
"string",
"null"
],
"default": null,
"description": "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)."
},
"planningId": {
"type": "string",
"description": "Planning ID / UID, e.g. 'C04207'. Get one from find_train or station_departures."
}
}
}GB 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.
| Argument | Type | Description |
|---|---|---|
| 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'. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 20,
"description": "Maximum trains to return, 1-50, cancellations first, then the latest."
},
"minLate": {
"type": "integer",
"default": 5,
"description": "Minutes late to count as late, 1-120. Default 5."
},
"operatorName": {
"type": [
"string",
"null"
],
"default": null,
"description": "Operator name or code, e.g. 'Northern' or 'NT'."
}
}
}Plan 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.
| Argument | Type | Description |
|---|---|---|
| to* | 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). |
| from* | string | Where from: station, bus stop with town, stop code, or 'lat,lon'. |
| time | string | null | Leave after this time, HH:mm UK time. Defaults to now. |
| results | integer | How many journeys to return, 1-5. |
{
"type": "object",
"required": [
"from",
"to"
],
"properties": {
"to": {
"type": "string",
"description": "Where to: station, bus stop with town, stop code, or 'lat,lon'."
},
"date": {
"type": [
"string",
"null"
],
"default": null,
"description": "Date, yyyy-MM-dd. Defaults to today (UK time)."
},
"from": {
"type": "string",
"description": "Where from: station, bus stop with town, stop code, or 'lat,lon'."
},
"time": {
"type": [
"string",
"null"
],
"default": null,
"description": "Leave after this time, HH:mm UK time. Defaults to now."
},
"results": {
"type": "integer",
"default": 3,
"description": "How many journeys to return, 1-5."
}
}
}Plan 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.
| Argument | Type | Description |
|---|---|---|
| to* | string | Station to travel to: name or CRS code. |
| date | string | null | Date, yyyy-MM-dd. Defaults to today (UK time). |
| from* | string | Station to travel from: name or CRS code. |
| time | string | null | Leave after this time, HH:mm UK time. Defaults to now. |
| results | integer | How many journeys to return, 1-5. |
{
"type": "object",
"required": [
"from",
"to"
],
"properties": {
"to": {
"type": "string",
"description": "Station to travel to: name or CRS code."
},
"date": {
"type": [
"string",
"null"
],
"default": null,
"description": "Date, yyyy-MM-dd. Defaults to today (UK time)."
},
"from": {
"type": "string",
"description": "Station to travel from: name or CRS code."
},
"time": {
"type": [
"string",
"null"
],
"default": null,
"description": "Leave after this time, HH:mm UK time. Defaults to now."
},
"results": {
"type": "integer",
"default": 3,
"description": "How many journeys to return, 1-5."
}
}
}Find 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.
| Argument | Type | Description |
|---|---|---|
| query* | string | Station name or code, e.g. 'kings cross', 'Leeds', 'MAN'. |
| includeJunctions | boolean | Also return junctions, yards and other non-station timing points. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"description": "Station name or code, e.g. 'kings cross', 'Leeds', 'MAN'."
},
"includeJunctions": {
"type": "boolean",
"default": false,
"description": "Also return junctions, yards and other non-station timing points."
}
}
}Live 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.
| Argument | Type | Description |
|---|---|---|
| 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'. |
| station* | string | Station name, CRS code (KGX) or TIPLOC. |
| includeNonPassenger | boolean | Include empty stock, freight and staff trains. |
{
"type": "object",
"required": [
"station"
],
"properties": {
"to": {
"type": [
"string",
"null"
],
"default": null,
"description": "Optional second station (name or CRS): only trains that call there after this one on departures, or before it on arrivals."
},
"rows": {
"type": "integer",
"default": 10,
"description": "How many trains to return, 1-30."
},
"type": {
"type": "string",
"default": "departures",
"description": "'departures' (default) or 'arrivals'."
},
"station": {
"type": "string",
"description": "Station name, CRS code (KGX) or TIPLOC."
},
"includeNonPassenger": {
"type": "boolean",
"default": false,
"description": "Include empty stock, freight and staff trains."
}
}
}Details 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.
| Argument | Type | Description |
|---|---|---|
| station* | string | Station name, CRS code (KGX) or TIPLOC. |
{
"type": "object",
"required": [
"station"
],
"properties": {
"station": {
"type": "string",
"description": "Station name, CRS code (KGX) or TIPLOC."
}
}
}How 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.
| Argument | Type | Description |
|---|---|---|
| days | integer | How many days back to look, 1-60. |
| planningId* | string | Planning ID / UID, e.g. 'P24061'. |
{
"type": "object",
"required": [
"planningId"
],
"properties": {
"days": {
"type": "integer",
"default": 28,
"description": "How many days back to look, 1-60."
},
"planningId": {
"type": "string",
"description": "Planning ID / UID, e.g. 'P24061'."
}
}
}