Spick Me — Swiss public transport
ch.spickme/swiss-public-transportVersion 1.2.0Swiss trains, trams, buses, boats: door-to-door journeys with pictures, boards, days out, reach maps
Status
Responds62 msAnswered our handshake without sign-in.- Last checked
- Nov 14, 2026, 13:42 UTC
- Latency
- 62 ms
- Remotes responding
- 1 of 1
- Sign-in
- No sign-in
- Hosting
- EU hosting detected (detected, not a legal statement)
- Registry data as of
- Nov 14, 2026, 22:14 UTC
Data from the official MCP Registry, checked by run.zero. How we check
Connect
Streamable HTTP
https://spickme.ch/mcpResponds62 msNo sign-in
Claude Code
claude mcp add --transport http swiss-public-transport https://spickme.ch/mcpClaude Desktop and claude.ai
Settings > Connectors > Add custom connector
Name: swiss-public-transport
Remote MCP server URL: https://spickme.ch/mcpCursor
{
"mcpServers": {
"swiss-public-transport": {
"url": "https://spickme.ch/mcp"
}
}
}VS Code
code --add-mcp '{"name":"swiss-public-transport","type":"http","url":"https://spickme.ch/mcp"}'Built your own server? run.zero hosts MCP servers on European infrastructure.
Tools
12 tools
Read-only | Idempotent | Open world | ||
|---|---|---|---|---|
departuresList the next departures from one station or stop, as the board on the platform would: time, line, direction, platform, kind of vehicle, and the next stops it calls at.
Use it for "what leaves from Bern in the next hour", "when is the next tram from Bellevue", or to see how often a place is served. With to, it lists only what calls at that station later, each with its arrival time there — "trains from Olten to Zürich HB" — including trains whose destination is further on. For connections that may need a change, or door to door, use plan_journey. The answer's open_url opens the station's live board on spickme.ch.
Inputs: station is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofplatz 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus Zürich"), a town's name in English, French or Italian ("Geneva", "Lucerne"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. If it is an address or coordinate, the nearest stop is used and named in the answer. to (optional) is a station the departures must call at, read the same way. time is when the board starts; Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now. limit is how many departures (1–40, default 12).
Times are planned timetable times with their Swiss offset. With live: true each departure carries live: its delay in minutes and whether it is cancelled, and the answer the operators' notices about it.
Example: {"station": "Luzern", "time": "2026-09-26T17:30", "limit": 8} | No | Yes | Yes | No |
find_placeLook up what a place name means in the Swiss public-transport network: stations and stops, street addresses, and named places (a university, a museum, a mountain), ranked best first, each with a stable place_id.
Use it when the user names a place you are not sure of, when another tool answered that a name is ambiguous, or to get coordinates for a place. You do not need it before plan_journey or departures for ordinary names — those tools accept names directly and say how they read them. A station or stop in Switzerland carries a page_url: its page on spickme.ch, with its departures, its lines and the places it reaches directly.
Inputs: query is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofplatz 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus Zürich"), a town's name in English, French or Italian ("Geneva", "Lucerne"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. limit is how many candidates to return (1–10, default 5). near is an optional latitude/longitude that breaks ties between equally good matches.
Example: {"query": "Winterthur Spital"} returns the stop "Winterthur, Kantonsspital" with its place_id, which you can pass to plan_journey as from or to. | No | Yes | Yes | No |
last_way_homeFind the last public-transport connection tonight from where someone is to where they are going, the few before it, and what still runs after one in the morning (night trains and night buses), in Switzerland. When nothing goes tonight, the first connection after five in the morning.
Use it for "when is the last train from Zürich to Bern tonight", "how late can I stay in Lausanne and still get home to Vevey", "is there a night bus from Bellevue to Witikon on Saturday". A plain plan_journey search asked for a late departure lists what leaves after it, and one asked to arrive by midnight misses the connection that leaves at 00:02; this tool asks the timetable the way the night needs. For any other time of day, use plan_journey.
Inputs: from is where the person is, to where they are going home to; each is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofplatz 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus Zürich"), a town's name in English, French or Italian ("Geneva", "Lucerne"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. departure is the earliest they could leave: Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now. ("the last train tonight" from a dinner: the time the dinner might end, or omit for now). bicycle: true keeps to rides that carry bicycles; avoid_tilting: true keeps off tilting trains. Both are rules for the search, so it finds the connection that keeps them rather than striking trains out of the usual answer.
The regular service is taken to end at one in the morning, and the night at five: last is the latest connection leaving before one, earlier the three before it, after_1am everything leaving between one and five. When nothing leaves before one | No | Yes | Yes | No |
line_infoDescribe one public-transport line in Switzerland — a train (S24, IC5, RE33), a tram or bus line (tram 11, bus 31), a boat or a mountain railway — by its directions and the stops of each with the minutes to them, how many trips it makes on a working day, a Saturday and a Sunday with the first, the last and how often it runs, and its page and whole timetable as a PDF to print or save.
Use it for "where does the S24 go", "how often does tram 11 in Zürich run on Sundays", "when is the first and last IC5", "give me the timetable of the S6 as a PDF". For a station's lines and works, station_info; for a journey, plan_journey.
Inputs: line is the line's label as on the vehicle or the board ("S24", "IC 5", "11", "Bus 31"). near narrows a label used in several places: a station or town it calls at, A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofplatz 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus Zürich"), a town's name in English, French or Italian ("Geneva", "Lucerne"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. Without near, the busiest line of that label is described and the others are listed with their towns.
The days are read from the published timetable for the four weeks from today, each kind of day from an ordinary one of them; times are planned.
Example: {"line": "S24", "near": "Zug"} | No | Yes | Yes | No |
meeting_pointSuggest railway stations in Switzerland where two to ten people starting from different places can meet by public transport, each with every person's travel time. Two rankings: fairest (the longest journey as short as it can be, and nobody travelling much longer than the others) and least_travel (everybody's minutes added up, keeping to places in between). Well-connected stations get a small bonus, and the suggestions are spread out rather than five suburbs of one town.
Use it for "where should I meet my friend from Basel if I'm in Chur", "a good place for the four of us from Bern, Luzern, Zürich and Basel to meet for lunch", "halfway between Geneva and Lausanne". For the travel times between given places, use travel_time_matrix; for the journey to the place chosen, plan_journey. Each suggestion carries plan_urls, one per person, opening their connections to it on spickme.ch; with two people, open_url opens the meet page with a map.
Inputs: people is the list of starting places in any order (2–10), each A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofplatz 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus Zürich"), a town's name in English, French or Italian ("Geneva", "Lucerne"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. departure is when everybody leaves: Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now. limit is how many suggestions per ranking (1–8, default 5). max_transfers caps changes.
Minutes are from the departure to the arrival at the meeting station, waiting for the first vehicle included, on that day's planned timetable; live delays are not included. A person's own station is never suggested.
Example: {"people": ["Basel", "Chur"], "departure": | No | Yes | Yes | No |
museums_to_visitList the museums and galleries in Switzerland that can be reached by public transport from one place within a travel budget, each with the minutes to its door (the walk from the stop included), that day's opening hours, and whether a visit of the length asked for fits before it closes.
Use it for "which museums can I visit from Bern this afternoon", "a rainy-day museum within an hour of Zürich", "an art museum near Lausanne open on Monday", or "what is there to see from Olten in two hours". For the journey to one museum, use plan_journey with its address; for a day with several stops, plan_day_out. The answer's open_url opens the same question on spickme.ch's museums page, and each museum's plan_url opens the visit as a day out there and back, to change and share.
Inputs: from is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofplatz 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus Zürich"), a town's name in English, French or Italian ("Geneva", "Lucerne"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. departure is when to leave: Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now. visit_minutes is the time wanted inside (10–360, default 50). max_minutes is the most travel time to the door (5–360, default 90). kinds narrows to art, gallery, history, science, technology, museum (general) or other. limit is how many to list (1–60, default 15). lang is the language of the museums' names (de, fr, it or en; default the name in the language of the place).
Each museum has a status: "fits" (open when you arrive, or opens later, with the whole visit before closing), "short" (open, but not for the whole visit; closes is given), "closed" (closed by then, that day or that sea | No | Yes | Yes | No |
plan_day_outPlans a multi-stop day with a stay at each stop, timing each leg from when the previous stay ends: the train there, the hours somewhere, the connection on, and the way home.
Use it for "a day trip from Bern to Grindelwald with four hours hiking, then dinner in Interlaken", "visit Thun, Spiez and Interlaken today", or an evening out and back. For a single A-to-B trip, use plan_journey.
Inputs: start is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofplatz 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus Zürich"), a town's name in English, French or Italian ("Geneva", "Lucerne"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. stops is the list of places in order (1–12), each with stay_minutes (default 120; 0 means pass through without stopping) or leave_at ("HH:MM", move on at that time — a night away works: the next such time), and an optional note. end defaults to start, which makes it a round trip. max_transfers caps the changes on each stretch. bicycle: true keeps to rides that carry bicycles; avoid_tilting: true keeps off tilting trains. Both are rules for the search, so it finds the connection that keeps them rather than striking trains out of the usual answer. departure is when the day starts: Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now.
Each leg comes with a picture_url that opens an image of that connection, and the answer's open_url opens the whole day on spickme.ch, where a stay can be changed, the day re-planned for another date, and the plan shared. Each leg also carries its track record from the days before, as plan_journey's journeys do: on how many of them it ran smoothly, how punctual each train was where you get off, and how often each chan | No | Yes | Yes | No |
plan_journeyFind the best connections by train, tram, bus, boat and mountain railway between two places in Switzerland, over the official Swiss timetable. Door to door: an address or a named place works as well as a station, and the walk to and from the nearest stops is included.
Use it for "how do I get from A to B", "the next connections from Olten to Zürich", "when is the next train to …", "I need to be in Bern by 9" — it gives departure and arrival times, changes and platforms. Prefer it to the departure board for any question with a destination. Every journey comes with a picture_url: a link that opens a ready-made image of the connection, for looking at or sharing. The answer's open_url opens the same search on spickme.ch, where the connections are shown with their live delays.
Inputs: from and to are each A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofplatz 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus Zürich"), a town's name in English, French or Italian ("Geneva", "Lucerne"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. Give departure (leave at or after) or arrival (be there by), not both; with arrival, the answer also brings the first connection arriving up to 30 minutes after it, for a user who said "around"; both are Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now. via is up to three stations or stops the journey must pass through (then one best journey is returned); to stop somewhere on the way, use plan_day_out. max_transfers caps the number of changes (0 = direct only). bicycle: true keeps to rides that carry bicycles; avoid_tilting: true keeps off tilting trains. Both are rules for the search, so it finds the connection that keeps them rather than str | No | Yes | Yes | No |
reachable_areaList every station and stop in Switzerland reachable from one place within a number of minutes by public transport, nearest first, with the earliest arrival at each.
Use it for "where can I get to from Bern in 45 minutes", "which towns are within an hour's commute of Zug", catchment areas and isochrones. For the travel time between specific places, use travel_time_matrix; for how to make a particular journey, plan_journey. The answer's open_url opens the area as a map on spickme.ch, with every place reached and a picture of it to share.
Inputs: from is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofplatz 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus Zürich"), a town's name in English, French or Italian ("Geneva", "Lucerne"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. (an address or coordinate is snapped to its nearest stop, which the answer names). departure is when to leave: Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now. max_minutes is the time budget (default 60), waiting for the first vehicle included. limit is how many places to list (default 50). max_transfers caps changes. include: ["museums"] also lists the museums reachable in the same time, with that day's hours where known (museums_to_visit has the full question, with a visit length).
Minutes are timetable minutes from the departure time given, on that day's planned timetable; live delays are not included.
Example: {"from": "Bern", "departure": "2026-09-28T07:30", "max_minutes": 45} | No | Yes | Yes | No |
station_infoDescribe one station or stop in Switzerland as its page on spickme.ch does: the lines that call there, each with its page and its whole timetable as a PDF to print; the planned changes of the coming weeks (works, a replacement bus and the stop it leaves from, departures that do not run, end early or leave at another minute, extra departures, holidays that run as a Sunday); and the connections the timetable builds there, line to line, with the minutes allowed, what missing one costs, and how often each held over the last weeks.
Use it for "are there any works at Olten next week", "is the train replaced by a bus this weekend", "which lines stop at Bern, Wankdorf", "can I get a PDF timetable of the S24", "does the change from the IR to the bus in Langnau usually work". For what leaves in the next hour, use departures; for a journey, plan_journey; for one line's stops and how often it runs, line_info.
Inputs: station is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofplatz 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus Zürich"), a town's name in English, French or Italian ("Geneva", "Lucerne"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. (an address or coordinate is taken to its nearest station). date is the first day the planned changes are read from: Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now. lines is how many lines to list, busiest first (1–80, default 25).
The planned changes are the published timetable's, compared with an ordinary week; live disruptions are not in them (departures with live: true has those). The connections' record is of past days, recorded from live data, not a forecast.
Example: {"station": "Olten"} | No | Yes | Yes | No |
timetable_changeList what changes in Swiss public transport at the timetable change in December, from a comparison of this year's published timetable with next year's: lines with more or fewer trips on a weekday, a Saturday or a Sunday, new and discontinued lines, stops added to or dropped from a line, first and last trips that move, direct connections between two stations that start or end or get quicker, stops that open, close or are renamed.
Use it for "what changes at Olten in December", "will the S24 still run next year", "what is new in canton Bern from 13 December", "does my bus 31 get more trips". For the planned works of the coming weeks, use station_info; for a journey after the change, plan_journey with a date after it.
Inputs: give one or more of place (a station, stop or town: entries whose stops or communes include it), line (a line's label: "S24", "31"), canton (two letters: "BE", "VD"); with none, the largest changes in the country. limit is how many entries (1–50, default 12).
An operator whose lines are not in next year's file yet is listed in operators_not_yet_published, and its lines are left out rather than called discontinued; an entry marked uncertain may be a gap in next year's data. The comparison is redone every week until the change.
Example: {"place": "Olten"} | No | Yes | Yes | No |
travel_time_matrixCompute the public-transport travel time in minutes from each of several origins to each of several destinations in Switzerland, for one departure time. For comparing locations: which office site is best reached from where staff live, which flat has the shortest commutes, how well a venue is connected.
Use it when there are several places on either side. For one pair with the actual connection, use plan_journey; for everywhere reachable, reachable_area. Each origin in the answer carries a reach_url: the places reachable from it, as a map on spickme.ch.
Inputs: origins and destinations are lists of places, each A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofplatz 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus Zürich"), a town's name in English, French or Italian ("Geneva", "Lucerne"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. (addresses and coordinates are snapped to their nearest stop, named in the answer). departure: Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now. max_transfers caps changes.
The answer is minutes[i][j] from origins[i] to destinations[j], waiting for the first vehicle included, or null where no connection exists that day. A place that cannot be read (an ambiguous or unknown name) is left out of origins, destinations and minutes and listed in unresolved with its candidates; the rest is answered. Planned timetable; live delays are not included.
Example: {"origins": ["Winterthur", "Baden", "Zug"], "destinations": ["Zürich HB", "Zürich Oerlikon"], "departure": "2026-09-28T07:30"} | No | Yes | Yes | No |
Details
- Registry status
- Active
- Published
- Oct 25, 2026
- Updated
- Oct 25, 2026
- Repository
- Not given
- Categories (suggested)
- CommunicationSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
- GDPR
- Not declared