Skip to content
Alpha — Headcode is currently in alpha. APIs and data may change without notice.

MCP tools

Headcode exposes every one of its data APIs as an MCP tool over a stateless Streamable HTTP endpoint at /mcp, in addition to the REST API documented elsewhere in this site. Each tool mirrors exactly one REST endpoint and requires the same data scope as that endpoint - see Authentication and Plans and rate limits for how scopes are granted.

This catalogue lists all 25 registered tools.

Get a single UK rail disruption’s full detail by its id. Mirrors GET /v1/disruptions/{id}. To discover disruption ids, use list_disruptions.

PropertyValue
Required scopedisruptions:read
MirrorsGET /v1/disruptions/{id}

Input schema

{
"additionalProperties": false,
"properties": {
"id": {
"description": "Disruption id, as returned by list_disruptions.",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
}

Look up a single UK rail operational location’s detail - name, type, STANOX, and WGS84/OSGB36 coordinates - by TIPLOC. Mirrors GET /v1/locations/{tiploc}. To discover a TIPLOC, use search_locations.

PropertyValue
Required scopereference:read
MirrorsGET /v1/locations/{tiploc}

Input schema

{
"additionalProperties": false,
"properties": {
"tiploc": {
"description": "TIPLOC code identifying the location, e.g. KNGX.",
"type": "string"
}
},
"required": [
"tiploc"
],
"type": "object"
}

List active Darwin operations alarms - infrastructure-level signalling/train-describer alarms, each with a kind, the TD area affected (if applicable), when it was raised, and whether/when it has been cleared. Paginated via limit/offset. Mirrors GET /v1/operations/alarms.

PropertyValue
Required scopeoperations:read
MirrorsGET /v1/operations/alarms

Input schema

{
"additionalProperties": false,
"properties": {
"limit": {
"description": "Maximum number of alarms to return. Default 20.",
"type": [
"null",
"integer"
]
},
"offset": {
"description": "Number of alarms to skip, for pagination. Default 0.",
"type": [
"null",
"integer"
]
}
},
"type": "object"
}

Get the latest Darwin connection heartbeat - when it was received, its status code, and an optional status message - indicating whether the upstream Darwin feed connection is healthy. Mirrors GET /v1/operations/heartbeat.

PropertyValue
Required scopeoperations:read
MirrorsGET /v1/operations/heartbeat

Input schema

{
"additionalProperties": false,
"type": "object"
}

Look up a single UK rail Train Operating Company (TOC) by its two-character code (e.g. GW for Great Western Railway). Mirrors GET /v1/operators/{code}.

PropertyValue
Required scopereference:read
MirrorsGET /v1/operators/{code}

Input schema

{
"additionalProperties": false,
"properties": {
"code": {
"description": "Two-character TOC code, e.g. GW.",
"type": "string"
}
},
"required": [
"code"
],
"type": "object"
}

Aggregate UK rail punctuality metrics - merged P50/P90 arrival and departure lateness, on-time percentage, cancellation rate, and sample size - for a station or route over a date range, computed from daily rollups. Dimension selector: supply tpl (station) OR origin+destination (route), never both and never neither. from/to (YYYY-MM-DD) bound the inclusive date range and are both required; to must not be before from. operator narrows the metrics to a single TOC; omitted merges all operators. baseline selects the timetable used (‘public’ or ‘working’, default ‘public’). Mirrors GET /v1/performance.

PropertyValue
Required scopeperformance:read
MirrorsGET /v1/performance

Input schema

{
"additionalProperties": false,
"properties": {
"baseline": {
"description": "Timetable baseline: 'public' or 'working'. Default 'public'.",
"type": [
"null",
"string"
]
},
"destination": {
"description": "Route destination TIPLOC. Requires origin; mutually exclusive with tpl.",
"type": [
"null",
"string"
]
},
"from": {
"description": "Inclusive start of the date range, YYYY-MM-DD. Required.",
"type": [
"null",
"string"
]
},
"operator": {
"description": "Narrow the metrics to a single TOC/operator code. Omitted merges all operators.",
"type": [
"null",
"string"
]
},
"origin": {
"description": "Route origin TIPLOC. Requires destination; mutually exclusive with tpl.",
"type": [
"null",
"string"
]
},
"to": {
"description": "Inclusive end of the date range, YYYY-MM-DD. Required; must not be before from.",
"type": [
"null",
"string"
]
},
"tpl": {
"description": "Station TIPLOC. Mutually exclusive with origin/destination - supply this, or origin+destination, never both.",
"type": [
"null",
"string"
]
}
},
"type": "object"
}

Look up a single UK rail train service’s full detail - calling points with live status, formation (coaches), associations (joins/splits), and cancel/late reasons - by its Darwin RID (Run ID), which uniquely identifies a service on a specific day (e.g. 202605141A45). Mirrors GET /v1/services/{service_id}. To find a service’s RID first, use search_services or a station board tool (station_departures etc, whose rows carry the RID).

PropertyValue
Required scopeservices:read
MirrorsGET /v1/services/{service_id}

Input schema

{
"additionalProperties": false,
"properties": {
"service_id": {
"description": "Darwin RID (Run ID) uniquely identifying the service on a specific day, e.g. 202605141A45.",
"type": "string"
}
},
"required": [
"service_id"
],
"type": "object"
}

Get the platform train order for a UK rail station: which train is 1st/2nd/3rd to use each platform, derived from real-time Darwin data. Each platform lists up to three upcoming trains in order. Optionally filter to a single platform. Mirrors GET /v1/train-orders/{station_id}. Station identifier is a CRS code (e.g. KGX); matching is case-insensitive.

PropertyValue
Required scopetrain-order:read
MirrorsGET /v1/train-orders/{station_id}

Input schema

{
"additionalProperties": false,
"properties": {
"platform": {
"description": "Filter to a specific platform, e.g. '1'. When omitted, all platforms at the station are returned.",
"type": [
"null",
"string"
]
},
"station_id": {
"description": "Station CRS code (e.g. KGX). Matching is case-insensitive.",
"type": "string"
}
},
"required": [
"station_id"
],
"type": "object"
}

List current UK rail disruptions (station messages and train alerts sourced from Darwin), optionally filtered by affected station, affected service, or disruption type. Mirrors GET /v1/disruptions. To fetch a single disruption’s full detail by id, use get_disruption.

PropertyValue
Required scopedisruptions:read
MirrorsGET /v1/disruptions

Input schema

{
"additionalProperties": false,
"properties": {
"limit": {
"description": "Maximum number of results to return. Default 50.",
"type": [
"null",
"integer"
]
},
"service": {
"description": "Filter to disruptions affecting this service (Darwin RID).",
"type": [
"null",
"string"
]
},
"station": {
"description": "Filter to disruptions affecting this station. Accepts a station identifier such as a CRS code.",
"type": [
"null",
"string"
]
},
"type": {
"description": "Filter by disruption type: station_message or train_alert.",
"type": [
"null",
"string"
]
}
},
"type": "object"
}

List all UK rail Train Operating Companies (TOCs), with their two-character code, full name, and business/sector codes. Mirrors GET /v1/operators. To look up a single operator by code, use get_operator.

PropertyValue
Required scopereference:read
MirrorsGET /v1/operators

Input schema

{
"additionalProperties": false,
"type": "object"
}

List the static reference table of disruption reason codes and their human-readable descriptions. Mirrors GET /v1/reference/reason-codes. Takes no input.

PropertyValue
Required scopereference:read
MirrorsGET /v1/reference/reason-codes

Input schema

{
"additionalProperties": false,
"type": "object"
}

Lightweight fuzzy-match station lookup returning only station name and CRS code, for autocomplete-style use where full station detail is not needed. Matches by case-insensitive prefix or trigram similarity against the free-text query. Mirrors GET /v1/crs. For the full station profile use lookup_station or search_stations.

PropertyValue
Required scopereference:read
MirrorsGET /v1/crs

Input schema

{
"additionalProperties": false,
"properties": {
"limit": {
"description": "Maximum number of results to return. Default 10; must be between 1 and 25 or the call is rejected.",
"type": [
"null",
"integer"
]
},
"query": {
"description": "Free-text search string, matched by case-insensitive prefix or trigram similarity against station names.",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
}

Look up a single UK rail station’s full profile - name, identifiers, WGS84/OSGB36 location, operator, platforms, and nearby interchange links - by any known identifier: CRS code (e.g. KGX), TIPLOC (e.g. KNGX), STANOX (e.g. 10101), NLC, URL slug (e.g. london-kings-cross), ATCO, or UIC. Mirrors GET /v1/stations/{id}. Use this to resolve an identifier or inspect a station’s metadata; for live boards use station_departures/station_arrivals/station_board instead.

PropertyValue
Required scopereference:read
MirrorsGET /v1/stations/{id}

Input schema

{
"additionalProperties": false,
"properties": {
"id": {
"description": "Station identifier: CRS code (e.g. KGX), TIPLOC (e.g. KNGX), STANOX (e.g. 10101), NLC, URL slug (e.g. london-kings-cross), ATCO, or UIC.",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
}

Search UK rail operational locations (a superset of passenger stations, including junctions, sidings, depots, signal boxes, and timing points) by free-text name, by location type, or by geographic proximity (lat/lng/radius). Supply query, OR lat+lng - never both. Mirrors GET /v1/locations. For a single location’s detail by TIPLOC, use get_location.

PropertyValue
Required scopereference:read
MirrorsGET /v1/locations

Input schema

{
"additionalProperties": false,
"properties": {
"lat": {
"description": "Latitude for a spatial search (WGS84). Requires lng; mutually exclusive with query.",
"type": [
"null",
"number"
]
},
"limit": {
"description": "Maximum number of results to return. Default 20.",
"type": [
"null",
"integer"
]
},
"lng": {
"description": "Longitude for a spatial search (WGS84). Requires lat; mutually exclusive with query.",
"type": [
"null",
"number"
]
},
"offset": {
"description": "Number of results to skip, for pagination. Default 0.",
"type": [
"null",
"integer"
]
},
"query": {
"description": "Free-text search against location names. Mutually exclusive with lat/lng - supply one or the other, never both.",
"type": [
"null",
"string"
]
},
"radius": {
"description": "Maximum distance in metres from the lat/lng point. Default 1000. Requires lat/lng.",
"type": [
"null",
"integer"
]
},
"type": {
"description": "Filter by location type: junction, siding, depot, signal_box, timing_point, or unknown.",
"type": [
"null",
"string"
]
}
},
"type": "object"
}

List UK rail train services for a scheduled start date (date is required). With uid (six-character CIF UID), looks up that schedule’s service(s) on the date with full detail (calling points, formation, associations). Without uid, lists all retained services for the date (historical discovery), filterable by toc/origin/destination/headcode; each row carries identity fields plus its origin and destination calling points with scheduled times only - use get_service to drill into full detail for a specific result. Mirrors GET /v1/services. Only dates within the retention window (~13 months) are available; older dates are rejected.

PropertyValue
Required scopeservices:read
MirrorsGET /v1/services

Input schema

{
"additionalProperties": false,
"properties": {
"date": {
"description": "Scheduled start date to list services for, as YYYY-MM-DD. Required. Must be within the retention window (~13 months); older dates are rejected.",
"type": "string"
},
"destination": {
"description": "Filter to services terminating at this location. Accepts a TIPLOC or any station identifier (CRS, etc). Only used in historical discovery mode (uid omitted).",
"type": [
"null",
"string"
]
},
"headcode": {
"description": "Filter by four-character headcode (signalling train identity). Only used in historical discovery mode (uid omitted).",
"type": [
"null",
"string"
]
},
"limit": {
"description": "Maximum number of results to return. Default 20, clamped to 1-100.",
"type": [
"null",
"integer"
]
},
"offset": {
"description": "Number of results to skip, for pagination. Default 0.",
"type": [
"null",
"integer"
]
},
"origin": {
"description": "Filter to services originating at this location. Accepts a TIPLOC or any station identifier (CRS, etc). Only used in historical discovery mode (uid omitted).",
"type": [
"null",
"string"
]
},
"toc": {
"description": "Filter by two-character ATOC operator code. Only used in historical discovery mode (uid omitted).",
"type": [
"null",
"string"
]
},
"uid": {
"description": "Six-character CIF UID. When supplied, returns that schedule's service(s) on date with full detail (calling points, formation, associations). When omitted, lists all retained services for date instead (historical discovery, identity + origin/destination calling points only).",
"type": [
"null",
"string"
]
}
},
"type": "object"
}

Search UK rail stations by free-text name (trigram fuzzy matching tolerates partial or misspelled queries) or by geographic proximity (lat/lng/radius). Supply query, OR lat+lng - never both. Returns a paginated list of full station profiles. Mirrors GET /v1/stations. For a lightweight name+CRS-only autocomplete result, use lookup_crs instead.

PropertyValue
Required scopereference:read
MirrorsGET /v1/stations

Input schema

{
"additionalProperties": false,
"properties": {
"lat": {
"description": "Latitude for a spatial search (WGS84). Requires lng; mutually exclusive with query.",
"type": [
"null",
"number"
]
},
"limit": {
"description": "Maximum number of results to return. Default 20.",
"type": [
"null",
"integer"
]
},
"lng": {
"description": "Longitude for a spatial search (WGS84). Requires lat; mutually exclusive with query.",
"type": [
"null",
"number"
]
},
"offset": {
"description": "Number of results to skip, for pagination. Default 0.",
"type": [
"null",
"integer"
]
},
"query": {
"description": "Free-text search against station names (trigram fuzzy matching tolerates partial/misspelled queries). Mutually exclusive with lat/lng - supply one or the other, never both.",
"type": [
"null",
"string"
]
},
"radius": {
"description": "Maximum distance in metres from the lat/lng point. Default 1000. Only used when lat/lng are supplied.",
"type": [
"null",
"integer"
]
}
},
"type": "object"
}

Live arrival board for a UK rail station, derived from real-time Darwin service and status data, covering a time_window-minute window starting time_offset minutes from now. Mirrors GET /v1/stations/{id}/arrivals. For a past day’s board use station_history_arrivals instead. Station identifier accepts CRS/TIPLOC/STANOX/NLC/slug/ATCO/UIC.

PropertyValue
Required scopeboards:read
MirrorsGET /v1/stations/{id}/arrivals

Input schema

{
"additionalProperties": false,
"properties": {
"calling_at": {
"description": "Filter by calling station TIPLOC.",
"type": [
"null",
"string"
]
},
"destination": {
"description": "Filter by destination station. Accepts the same identifier formats as id.",
"type": [
"null",
"string"
]
},
"expand": {
"description": "When true, each row includes the full service detail (calling points, formation, associations) under a service key. Default false.",
"type": [
"null",
"boolean"
]
},
"id": {
"description": "Station identifier: CRS code (e.g. KGX), TIPLOC, STANOX, NLC, URL slug, ATCO, or UIC.",
"type": "string"
},
"limit": {
"description": "Maximum board rows to return. Default 20, clamped to 1-100.",
"type": [
"null",
"integer"
]
},
"platform": {
"description": "Filter by platform number.",
"type": [
"null",
"string"
]
},
"time_offset": {
"description": "Shift the query window by this many minutes from now; negative values look into the past. Default 0, clamped to -120..119.",
"type": [
"null",
"integer"
]
},
"time_window": {
"description": "Duration of the query window in minutes. Default 120, clamped to 1-120.",
"type": [
"null",
"integer"
]
},
"toc": {
"description": "Filter by TOC/operator code.",
"type": [
"null",
"string"
]
}
},
"required": [
"id"
],
"type": "object"
}

Live combined departure and arrival board for a UK rail station in one call: the response carries a departures array and an arrivals array, each covering a time_window-minute window starting time_offset minutes from now. Mirrors GET /v1/stations/{id}/board. For a past day’s board use station_history_board instead. Station identifier accepts CRS/TIPLOC/STANOX/NLC/slug/ATCO/UIC.

PropertyValue
Required scopeboards:read
MirrorsGET /v1/stations/{id}/board

Input schema

{
"additionalProperties": false,
"properties": {
"destination": {
"description": "Filter by destination station. Accepts the same identifier formats as id.",
"type": [
"null",
"string"
]
},
"expand": {
"description": "When true, each row includes the full service detail (calling points, formation, associations) under a service key. Default false.",
"type": [
"null",
"boolean"
]
},
"id": {
"description": "Station identifier: CRS code (e.g. KGX), TIPLOC, STANOX, NLC, URL slug, ATCO, or UIC.",
"type": "string"
},
"limit": {
"description": "Maximum board rows to return, per direction. Default 20, clamped to 1-100.",
"type": [
"null",
"integer"
]
},
"platform": {
"description": "Filter by platform number.",
"type": [
"null",
"string"
]
},
"time_offset": {
"description": "Shift the query window by this many minutes from now; negative values look into the past. Default 0, clamped to -120..119.",
"type": [
"null",
"integer"
]
},
"time_window": {
"description": "Duration of the query window in minutes. Default 120, clamped to 1-120.",
"type": [
"null",
"integer"
]
},
"toc": {
"description": "Filter by TOC/operator code.",
"type": [
"null",
"string"
]
}
},
"required": [
"id"
],
"type": "object"
}

Live departure board for a UK rail station, derived from real-time Darwin service and status data, covering a time_window-minute window starting time_offset minutes from now. Mirrors GET /v1/stations/{id}/departures. For a past day’s board use station_history_departures instead. Station identifier accepts CRS/TIPLOC/STANOX/NLC/slug/ATCO/UIC.

PropertyValue
Required scopeboards:read
MirrorsGET /v1/stations/{id}/departures

Input schema

{
"additionalProperties": false,
"properties": {
"calling_at": {
"description": "Filter by calling station TIPLOC.",
"type": [
"null",
"string"
]
},
"destination": {
"description": "Filter by destination station. Accepts the same identifier formats as id.",
"type": [
"null",
"string"
]
},
"expand": {
"description": "When true, each row includes the full service detail (calling points, formation, associations) under a service key. Default false.",
"type": [
"null",
"boolean"
]
},
"id": {
"description": "Station identifier: CRS code (e.g. KGX), TIPLOC, STANOX, NLC, URL slug, ATCO, or UIC.",
"type": "string"
},
"limit": {
"description": "Maximum board rows to return. Default 20, clamped to 1-100.",
"type": [
"null",
"integer"
]
},
"platform": {
"description": "Filter by platform number.",
"type": [
"null",
"string"
]
},
"time_offset": {
"description": "Shift the query window by this many minutes from now; negative values look into the past. Default 0, clamped to -120..119.",
"type": [
"null",
"integer"
]
},
"time_window": {
"description": "Duration of the query window in minutes. Default 120, clamped to 1-120.",
"type": [
"null",
"integer"
]
},
"toc": {
"description": "Filter by TOC/operator code.",
"type": [
"null",
"string"
]
}
},
"required": [
"id"
],
"type": "object"
}

Daily station footfall (passenger entry/exit counts) for a UK rail station. Mirrors GET /v1/stations/{id}/footfall. Station identifier accepts CRS/TIPLOC/STANOX/NLC/slug/ATCO/UIC.

PropertyValue
Required scopefootfall:read
MirrorsGET /v1/stations/{id}/footfall

Input schema

{
"additionalProperties": false,
"properties": {
"id": {
"description": "Station identifier: CRS code (e.g. KGX), TIPLOC, STANOX, NLC, URL slug, ATCO, or UIC.",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
}

Arrivals for a UK rail station on a past day (date is required). Rows carry aimed, actual, and last-known expected times for that day. Use from/to to narrow to an intra-day wall-clock window. Mirrors GET /v1/stations/{id}/history/arrivals. Only dates within the retention window (~13 months) are available; older dates are rejected. For the current live board use station_arrivals instead.

PropertyValue
Required scopehistory:read
MirrorsGET /v1/stations/{id}/history/arrivals

Input schema

{
"additionalProperties": false,
"properties": {
"calling_at": {
"description": "Filter by calling station TIPLOC.",
"type": [
"null",
"string"
]
},
"date": {
"description": "The past day to return, as YYYY-MM-DD. Must be within the retention window (~13 months); older dates are rejected.",
"type": "string"
},
"destination": {
"description": "Filter by destination station. Accepts the same identifier formats as id.",
"type": [
"null",
"string"
]
},
"expand": {
"description": "When true, each row includes the full service detail (calling points, formation, associations) under a service key. Default false.",
"type": [
"null",
"boolean"
]
},
"from": {
"description": "Inclusive start of the intra-day window, 24-hour wall-clock HH:MM. Defaults to 00:00.",
"type": [
"null",
"string"
]
},
"id": {
"description": "Station identifier: CRS code (e.g. KGX), TIPLOC, STANOX, NLC, URL slug, ATCO, or UIC.",
"type": "string"
},
"limit": {
"description": "Maximum board rows to return. Default 20, clamped to 1-100.",
"type": [
"null",
"integer"
]
},
"platform": {
"description": "Filter by platform number.",
"type": [
"null",
"string"
]
},
"to": {
"description": "Inclusive end of the intra-day window, 24-hour wall-clock HH:MM. Defaults to end of day. Must not be earlier than from.",
"type": [
"null",
"string"
]
},
"toc": {
"description": "Filter by TOC/operator code.",
"type": [
"null",
"string"
]
}
},
"required": [
"id",
"date"
],
"type": "object"
}

Combined departure and arrival board for a UK rail station on a past day (date is required): the response carries a departures array and an arrivals array. Rows carry aimed, actual, and last-known expected times for that day. Use from/to to narrow to an intra-day wall-clock window. Mirrors GET /v1/stations/{id}/history/board. Only dates within the retention window (~13 months) are available; older dates are rejected. For the current live board use station_board instead.

PropertyValue
Required scopehistory:read
MirrorsGET /v1/stations/{id}/history/board

Input schema

{
"additionalProperties": false,
"properties": {
"date": {
"description": "The past day to return, as YYYY-MM-DD. Must be within the retention window (~13 months); older dates are rejected.",
"type": "string"
},
"destination": {
"description": "Filter by destination station. Accepts the same identifier formats as id.",
"type": [
"null",
"string"
]
},
"expand": {
"description": "When true, each row includes the full service detail (calling points, formation, associations) under a service key. Default false.",
"type": [
"null",
"boolean"
]
},
"from": {
"description": "Inclusive start of the intra-day window, 24-hour wall-clock HH:MM. Defaults to 00:00.",
"type": [
"null",
"string"
]
},
"id": {
"description": "Station identifier: CRS code (e.g. KGX), TIPLOC, STANOX, NLC, URL slug, ATCO, or UIC.",
"type": "string"
},
"limit": {
"description": "Maximum board rows to return, per direction. Default 20, clamped to 1-100.",
"type": [
"null",
"integer"
]
},
"platform": {
"description": "Filter by platform number.",
"type": [
"null",
"string"
]
},
"to": {
"description": "Inclusive end of the intra-day window, 24-hour wall-clock HH:MM. Defaults to end of day. Must not be earlier than from.",
"type": [
"null",
"string"
]
},
"toc": {
"description": "Filter by TOC/operator code.",
"type": [
"null",
"string"
]
}
},
"required": [
"id",
"date"
],
"type": "object"
}

Departures for a UK rail station on a past day (date is required). Rows carry aimed, actual, and last-known expected times for that day. Use from/to to narrow to an intra-day wall-clock window. Mirrors GET /v1/stations/{id}/history/departures. Only dates within the retention window (~13 months) are available; older dates are rejected. For the current live board use station_departures instead.

PropertyValue
Required scopehistory:read
MirrorsGET /v1/stations/{id}/history/departures

Input schema

{
"additionalProperties": false,
"properties": {
"calling_at": {
"description": "Filter by calling station TIPLOC.",
"type": [
"null",
"string"
]
},
"date": {
"description": "The past day to return, as YYYY-MM-DD. Must be within the retention window (~13 months); older dates are rejected.",
"type": "string"
},
"destination": {
"description": "Filter by destination station. Accepts the same identifier formats as id.",
"type": [
"null",
"string"
]
},
"expand": {
"description": "When true, each row includes the full service detail (calling points, formation, associations) under a service key. Default false.",
"type": [
"null",
"boolean"
]
},
"from": {
"description": "Inclusive start of the intra-day window, 24-hour wall-clock HH:MM. Defaults to 00:00.",
"type": [
"null",
"string"
]
},
"id": {
"description": "Station identifier: CRS code (e.g. KGX), TIPLOC, STANOX, NLC, URL slug, ATCO, or UIC.",
"type": "string"
},
"limit": {
"description": "Maximum board rows to return. Default 20, clamped to 1-100.",
"type": [
"null",
"integer"
]
},
"platform": {
"description": "Filter by platform number.",
"type": [
"null",
"string"
]
},
"to": {
"description": "Inclusive end of the intra-day window, 24-hour wall-clock HH:MM. Defaults to end of day. Must not be earlier than from.",
"type": [
"null",
"string"
]
},
"toc": {
"description": "Filter by TOC/operator code.",
"type": [
"null",
"string"
]
}
},
"required": [
"id",
"date"
],
"type": "object"
}

Get the next scheduled departure(s) from an origin station to one or more destination stations - the tool for questions like “when’s the next train from Paddington to Reading?”. destinations is a comma-separated list of identifiers (CRS/TIPLOC/slug/etc); the response is keyed by each destination requested, in the form supplied. Mirrors GET /v1/stations/{id}/next.

PropertyValue
Required scopeboards:read
MirrorsGET /v1/stations/{id}/next

Input schema

{
"additionalProperties": false,
"properties": {
"destinations": {
"description": "Comma-separated list of destination station identifiers (CRS, TIPLOC, slug, etc). At least one valid identifier is required.",
"type": "string"
},
"expand": {
"description": "When true, each row includes the full service detail (calling points, formation, associations) under a service key. Default false.",
"type": [
"null",
"boolean"
]
},
"id": {
"description": "Origin station identifier: CRS code (e.g. KGX), TIPLOC, STANOX, NLC, URL slug, ATCO, or UIC.",
"type": "string"
},
"limit": {
"description": "Maximum number of services to return per destination. Default 1, clamped to 1-10.",
"type": [
"null",
"integer"
]
}
},
"required": [
"id",
"destinations"
],
"type": "object"
}

Non-stopping trains for a UK rail station: services that pass through the station without calling, covering a time_window-minute window starting time_offset minutes from now. Unlike station_departures/station_arrivals, these trains do not stop at the station, so rows carry only the working (not public) pass time. Results are at station/TIPLOC granularity only - there is no filtering by physical running line (Fast/Slow/Up/Down); that would require a new data source and is a Future Enhancement, not delivered by this tool. Mirrors GET /v1/stations/{id}/passing. Station identifier accepts CRS/TIPLOC/STANOX/NLC/slug/ATCO/UIC.

PropertyValue
Required scopeboards:read
MirrorsGET /v1/stations/{id}/passing

Input schema

{
"additionalProperties": false,
"properties": {
"calling_at": {
"description": "Filter by calling station TIPLOC.",
"type": [
"null",
"string"
]
},
"destination": {
"description": "Filter by destination station. Accepts the same identifier formats as id.",
"type": [
"null",
"string"
]
},
"expand": {
"description": "When true, each row includes the full service detail (calling points, formation, associations) under a service key. Default false.",
"type": [
"null",
"boolean"
]
},
"id": {
"description": "Station identifier: CRS code (e.g. KGX), TIPLOC, STANOX, NLC, URL slug, ATCO, or UIC.",
"type": "string"
},
"limit": {
"description": "Maximum board rows to return. Default 20, clamped to 1-100.",
"type": [
"null",
"integer"
]
},
"time_offset": {
"description": "Shift the query window by this many minutes from now; negative values look into the past. Default 0, clamped to -120..119.",
"type": [
"null",
"integer"
]
},
"time_window": {
"description": "Duration of the query window in minutes. Default 120, clamped to 1-120.",
"type": [
"null",
"integer"
]
},
"toc": {
"description": "Filter by TOC/operator code.",
"type": [
"null",
"string"
]
}
},
"required": [
"id"
],
"type": "object"
}