Stockholm public transport (SL): live departures, trips to addresses with exits, disruptions.
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.
Find Stockholm public transport (SL) stops by name and return their ids, names and transport modes. Use it to get the siteId for get_departures, or a stop id for plan_trip. Not for street addresses: pass those to plan_trip as text instead. A name can match several stops ('Arlanda' gives the train station and bus stops): pick by name and modes, or ask the user. Typos are fine, abbreviations are not: write 'Tekniska högskolan', not 'KTH'. Returns one line per stop: '<id>: <town>, <name> (<modes>)'.
Stop or station name, e.g. 'Slussen' or 'Arlanda'. Typos are fine, abbreviations are not.
Maximum number of stops to return
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http sl-mcp https://sl-mcp.miltonlindblad.workers.dev/mcp
Find Stockholm public transport (SL) stops by name and return their ids, names and transport modes. Use it to get the siteId for get_departures, or a stop id for plan_trip. Not for street addresses: pass those to plan_trip as text instead. A name can match several stops ('Arlanda' gives the train station and bus stops): pick by name and modes, or ask the user. Typos are fine, abbreviations are not: write 'Tekniska högskolan', not 'KTH'. Returns one line per stop: '<id>: <town>, <name> (<modes>)'.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of stops to return |
| query* | string | Stop or station name, e.g. 'Slussen' or 'Arlanda'. Typos are fine, abbreviations are not. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 5,
"maximum": 10,
"minimum": 1,
"description": "Maximum number of stops to return"
},
"query": {
"type": "string",
"minLength": 1,
"description": "Stop or station name, e.g. 'Slussen' or 'Arlanda'. Typos are fine, abbreviations are not."
}
}
}List live departures from one SL stop, soonest first: line, mode, final destination, direction (1 or 2), platform or bus stop letter, minutes or clock time, delay, cancellation and SL's notes. Use it for 'when does the next X leave from Y'. To get from A to B, use plan_trip; for announced track work or broken lifts, use get_disruptions. Real-time data from SL: at most 3 departures per line and direction, up to 3 hours ahead. `towards` matches the final destination only: for a station on the way (e.g. 'mot T-Centralen' from Slussen), leave it out and pick the direction from the results. An unknown siteId gives no departures, not an error.
| Argument | Type | Description |
|---|---|---|
| line | string | Only this line number, e.g. '14' or '43X' |
| limit | integer | Maximum number of departures |
| siteId* | integer | Stop id from find_stop |
| minutes | integer | How many minutes ahead to look, at most 180 |
| towards | string | Only departures whose final destination contains this, e.g. 'Ropsten' |
| transportMode | string | Only this mode |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"siteId"
],
"properties": {
"line": {
"type": "string",
"description": "Only this line number, e.g. '14' or '43X'"
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 30,
"minimum": 1,
"description": "Maximum number of departures"
},
"siteId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Stop id from find_stop"
},
"minutes": {
"type": "integer",
"default": 60,
"maximum": 180,
"minimum": 1,
"description": "How many minutes ahead to look, at most 180"
},
"towards": {
"type": "string",
"description": "Only departures whose final destination contains this, e.g. 'Ropsten'"
},
"transportMode": {
"enum": [
"METRO",
"BUS",
"TRAIN",
"TRAM",
"SHIP",
"FERRY"
],
"type": "string",
"description": "Only this mode"
}
}
}List disruptions SL has announced: track work, closed entrances, broken lifts and replacement buses, with the lines affected and until when. Use it to check a line or the stops of a trip before travelling, e.g. lifts for a wheelchair. For live delays and cancelled departures, use get_departures instead. The text is in Swedish, so translate it if needed, and is cut at 800 characters. Results are cached for 1 minute, as SL asks. Leave both filters out to list everything.
| Argument | Type | Description |
|---|---|---|
| lines | array | Only these line numbers, e.g. ['13', '14'], or metro colours, e.g. ['grön linje'] |
| transportMode | string | Only this mode |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"lines": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only these line numbers, e.g. ['13', '14'], or metro colours, e.g. ['grön linje']"
},
"transportMode": {
"enum": [
"METRO",
"BUS",
"TRAIN",
"TRAM",
"SHIP",
"FERRY"
],
"type": "string",
"description": "Only this mode"
}
}
}Plan trips by SL public transport between two stops or street addresses, leaving or arriving at a given time. Returns up to 3 trips, plus walking all the way when that takes at most 30 min. Each ride lists line, direction, platform, stops, crowding and delay; each walk lists minutes and the station exit (uppgång). Use it for 'how do I get to X' and 'when must I leave'; for departures from one stop, use get_departures. Addresses are fuzzy matched, so the result starts with what each one matched. Times are Stockholm time. Unknown stops, the same stop twice and times outside the timetable give a clear error. SL cannot plan step-free trips: for a wheelchair or pram, use prefer 'least walking' and check get_disruptions for broken lifts at the stops.
| Argument | Type | Description |
|---|---|---|
| to* | any | Destination: a stop id from find_stop, or a street address |
| from* | any | Start: a stop id from find_stop, or a street address like 'Götgatan 76, Stockholm' |
| time | string | Stockholm time as YYYY-MM-DDTHH:MM. Leave out to leave now. |
| modes | array | Only these modes, e.g. ['boat'] for 'by boat'. Leave out for all. |
| prefer | string | What to optimise for: fastest (default), fewest changes or least walking |
| arriveBy | boolean | true: arrive by `time`. false: leave at `time`. |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 3, 2026.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"from",
"to"
],
"properties": {
"to": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "string",
"minLength": 1
}
],
"description": "Destination: a stop id from find_stop, or a street address"
},
"from": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "string",
"minLength": 1
}
],
"description": "Start: a stop id from find_stop, or a street address like 'Götgatan 76, Stockholm'"
},
"time": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$",
"description": "Stockholm time as YYYY-MM-DDTHH:MM. Leave out to leave now."
},
"modes": {
"type": "array",
"items": {
"enum": [
"commuter train",
"metro",
"tram",
"bus",
"boat",
"train"
],
"type": "string"
},
"minItems": 1,
"description": "Only these modes, e.g. ['boat'] for 'by boat'. Leave out for all."
},
"prefer": {
"enum": [
"fastest",
"fewest changes",
"least walking"
],
"type": "string",
"default": "fastest",
"description": "What to optimise for: fastest (default), fewest changes or least walking"
},
"arriveBy": {
"type": "boolean",
"default": false,
"description": "true: arrive by `time`. false: leave at `time`."
}
}
}