SL – Stockholm public transport MCP
An open-source MCP server that provides real-time Stockholm public transport data via SL's open APIs. It allows AI assistants to search for stops, retrieve live departures with platform and delay info, check for announced disruptions, and plan trips between stops or street addresses, supporting queries in Swedish or English.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://sl-mcp.miltonlindblad.workers.dev/mcpWhat its tools do
4 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (4)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Search for a public transport stop by name
- Get live departures from a specific stop
- Check for announced disruptions on lines
- Plan a trip between two locations
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- sl-mcp 0.3.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 4 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- 2 advertised
{
"tools": {
"listChanged": true
},
"prompts": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
4 advertised
find_stop — Find stop
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>)'.
{
"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."
}
}
}{
"readOnlyHint": true,
"openWorldHint": true
}get_departures — Get departures
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.
{
"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"
}
}
}{
"readOnlyHint": true,
"openWorldHint": true
}get_disruptions — Get disruptions
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.
{
"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"
}
}
}{
"readOnlyHint": true,
"openWorldHint": true
}plan_trip — Plan trip
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.
{
"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`."
}
}
}{
"readOnlyHint": true,
"openWorldHint": true
}Prompts
2 advertised
trip — Plan a trip
How to get from one place to another by SL, optionally arriving by a given time
- from
- Start: a stop, station or street address, e.g. 'Sundbyberg' (required)
- to
- Destination: a stop, station or street address, e.g. 'Götgatan 76' (required)
- arriveBy
- Arrive by this time, e.g. '09:00' or 'tomorrow 08:30'
departures — Next departures
The next departures from one SL stop or station
- stop
- Stop or station, e.g. 'Slussen' (required)
Resources
Not advertised
90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 2 of 2 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 338 ms
- 95th percentile latency
- 338 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 338 ms · metadata changed · 4 tool(s), 2 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http sl-stockholm-public-transport-mcp https://sl-mcp.miltonlindblad.workers.dev/mcpCodex
codex mcp add sl-stockholm-public-transport-mcp --url https://sl-mcp.miltonlindblad.workers.dev/mcpCursor
{
"mcpServers": {
"sl-stockholm-public-transport-mcp": {
"url": "https://sl-mcp.miltonlindblad.workers.dev/mcp"
}
}
}Cline
{
"mcpServers": {
"sl-stockholm-public-transport-mcp": {
"type": "streamableHttp",
"url": "https://sl-mcp.miltonlindblad.workers.dev/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"sl-stockholm-public-transport-mcp": {
"type": "http",
"url": "https://sl-mcp.miltonlindblad.workers.dev/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http sl-stockholm-public-transport-mcp https://sl-mcp.miltonlindblad.workers.dev/mcpClaude Desktop
https://sl-mcp.miltonlindblad.workers.dev/mcpWindsurf
{
"mcpServers": {
"sl-stockholm-public-transport-mcp": {
"serverUrl": "https://sl-mcp.miltonlindblad.workers.dev/mcp"
}
}
}Let your agent find its tools
Find servers like SL – Stockholm public transport MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.