MCP 서버

Spick Me — Swiss public transport

ch.spickme/swiss-public-transport
지도 및 위치 여행 및 호스피탈리티 공개 · 연결 가능 MCP 2025-11-25

이 MCP로 할 수 있는 일

Plans Swiss public-transport journeys and day trips, provides departures, place lookup, travel-time matrices, and reachable-area calculations.

departures
Departure board for a Swiss station or stop
List the next departures from one station or stop, as the board on the platform would: time, line, direction, platform and kind of vehicle. 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. For getting somewhere specific, use plan_journey instead — it knows about changes and arrival times. Inputs: station is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofstrasse 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus"), 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. 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; live delays and cancellations are not included. Example: {"station": "Luzern", "time": "2026-09-26T17:30", "limit": 8}
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': ['station'], 'properties': {'time': {'type': 'string', 'description': 'When the board starts. Omit for now.'}, 'limit': {'type': 'integer', 'default': 12, 'maximum': 40, 'minimum': 1, 'description': 'How many departures to list.'}, 'station': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'The station or stop whose board to show.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['station', 'departures', 'data'], 'properties': {'data': {'type': 'object'}, 'station': {'type': 'object'}, 'departures': {'type': 'array', 'items': {'type': 'object', 'required': ['departure', 'line', 'direction', 'mode'], 'properties': {'line': {'type': 'string'}, 'mode': {'type': 'string'}, 'stop': {'type': 'string'}, 'platform': {'type': 'string'}, 'departure': {'type': 'string', 'format': 'date-time'}, 'direction': {'type': 'string'}}}}}}
find_place
Find a station, stop, address or place in Switzerland
Look 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. Inputs: query is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofstrasse 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus"), 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.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': ['query'], 'properties': {'near': {'type': 'object', 'required': ['latitude', 'longitude'], 'properties': {'latitude': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Decimal degrees north.'}, 'longitude': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Decimal degrees east.'}}, 'description': 'Where the user is, if known: prefers nearer matches among equally good ones.', 'additionalProperties': False}, 'limit': {'type': 'integer', 'default': 5, 'maximum': 10, 'minimum': 1, 'description': 'How many candidates to return, best first.'}, 'query': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'The name, address or coordinate to look up.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['query', 'candidates', 'data'], 'properties': {'data': {'type': 'object'}, 'query': {'type': 'string'}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'required': ['place_id', 'name', 'kind', 'latitude', 'longitude'], 'properties': {'kind': {'enum': ['station', 'stop', 'address', 'street', 'locality', 'place', 'coordinate'], 'type': 'string'}, 'name': {'type': 'string'}, 'latitude': {'type': 'number'}, 'place_id': {'type': 'string'}, 'longitude': {'type': 'number'}}}}}}
plan_day_out
Plan a day out with several stops in Switzerland
Plan a whole day of public transport with time spent at each stop: the train there, the hours somewhere, the connection on, and the way home — each leg timed from when the previous stay actually ends. This is Spick Me's day-out planner; no plain journey planner answers this in one call. 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 ("Bahnhofstrasse 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus"), 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. 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. Example: {"start": "Bern", "stops": [{"place": "Grindelwald", "stay_minutes": 240, "note": "hike"}, {"place": "Interlaken Ost", "stay_minutes": 90, "note": "dinner"}], "departure": "2026-09-26T08:00"}
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': ['start', 'stops'], 'properties': {'end': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Where the day ends; defaults to start.'}, 'start': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Where the day starts.'}, 'stops': {'type': 'array', 'items': {'type': 'object', 'required': ['place'], 'properties': {'note': {'type': 'string', 'maxLength': 200, 'description': 'What the stay is for, e.g. "lunch"; shown in the answer.'}, 'place': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'A place to visit.'}, 'leave_at': {'type': 'string', 'pattern': '^[0-2]?[0-9]:[0-5][0-9]$', 'description': 'Move on at this time of day ("HH:MM") instead of after a length of stay; the next such time, so a night away works.'}, 'stay_minutes': {'type': 'integer', 'maximum': 20160, 'minimum': 0, 'description': 'How long to stay; 0 passes through. Default 120.'}}, 'additionalProperties': False}, 'maxItems': 12, 'minItems': 1, 'description': 'The places to visit, in order.'}, 'departure': {'type': 'string', 'description': 'When the day starts. Omit for now.'}, 'transfer_time_factor': {'type': 'number', 'maximum': 3, 'minimum': 0.5, 'description': "How much time to allow for changing trains, as a multiple of the timetable's minimum change times: 1 (default) is the timetable's own; 1.5 for luggage, children or reduced mobility; 0.7 for a fast walker. Between 0.5 and 3."}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['legs', 'stays', 'data'], 'properties': {'back': {'type': 'string'}, 'data': {'type': 'object'}, 'legs': {'type': 'array', 'items': {'type': 'object'}}, 'stays': {'type': 'array', 'items': {'type': 'object'}}, 'leaving': {'type': 'string'}, 'minutes_travelling': {'type': 'integer'}}}
plan_journey
Plan a public-transport journey in Switzerland
Find the best connections by train, tram, bus, boat and mountain railway between two places in Switzerland, from Spick Me's own routing engine 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", "when is the next train to …", "I need to be in Bern by 9". Every journey comes with a picture_url: a link that opens a ready-made image of the connection the user can look at or share — offer it when a picture would help. Inputs: from and to are each A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofstrasse 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus"), 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; 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). limit is how many alternatives to return (1–8, default 4). All times are planned timetable times with their Swiss offset; live delays are not included, so say so when it matters. Example: {"from": "Winterthur", "to": "Bern", "departure": "2026-09-26T07:00"}
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': ['from', 'to'], 'properties': {'to': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Where the journey ends.'}, 'via': {'type': 'array', 'items': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'A place to pass through on the way.'}, 'maxItems': 3, 'description': 'Stations or stops the journey must pass through, in order. With via, one best journey is returned.'}, 'from': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Where the journey starts.'}, 'limit': {'type': 'integer', 'default': 4, 'maximum': 8, 'minimum': 1, 'description': 'How many alternative journeys to return.'}, 'arrival': {'type': 'string', 'description': 'Arrive by this time. Give this or departure, not both.'}, 'departure': {'type': 'string', 'description': 'Leave at or after this time. Omit both departure and arrival for now.'}, 'max_transfers': {'type': 'integer', 'maximum': 8, 'minimum': 0, 'description': 'The most changes of vehicle allowed; 0 for direct connections only.'}, 'transfer_time_factor': {'type': 'number', 'maximum': 3, 'minimum': 0.5, 'description': "How much time to allow for changing trains, as a multiple of the timetable's minimum change times: 1 (default) is the timetable's own; 1.5 for luggage, children or reduced mobility; 0.7 for a fast walker. Between 0.5 and 3."}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['from', 'to', 'journeys', 'data'], 'properties': {'to': {'type': 'object'}, 'data': {'type': 'object'}, 'from': {'type': 'object'}, 'journeys': {'type': 'array', 'items': {'type': 'object', 'required': ['departure', 'arrival', 'duration_minutes', 'transfers', 'legs'], 'properties': {'legs': {'type': 'array', 'items': {'type': 'object'}}, 'arrival': {'type': 'string', 'format': 'date-time'}, 'departure': {'type': 'string', 'format': 'date-time'}, 'transfers': {'type': 'integer'}, 'picture_url': {'type': 'string', 'format': 'uri'}, 'duration_minutes': {'type': 'integer'}}}}, 'interpreted': {'type': 'array', 'items': {'type': 'object'}}, 'walk_instead': {'type': 'object'}}}
reachable_area
Everywhere reachable by public transport within a time budget
List 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. One call answers what would otherwise be hundreds of journey searches. 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. Inputs: from is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofstrasse 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus"), 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. 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}
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': ['from'], 'properties': {'from': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Where to start.'}, 'limit': {'type': 'integer', 'default': 50, 'maximum': 5000, 'minimum': 1, 'description': 'How many places to list, nearest first.'}, 'departure': {'type': 'string', 'description': 'When to leave. Omit for now.'}, 'max_minutes': {'type': 'integer', 'default': 60, 'maximum': 480, 'minimum': 5, 'description': 'The time budget in minutes, waiting included.'}, 'max_transfers': {'type': 'integer', 'maximum': 8, 'minimum': 0, 'description': 'The most changes of vehicle allowed.'}, 'transfer_time_factor': {'type': 'number', 'maximum': 3, 'minimum': 0.5, 'description': "How much time to allow for changing trains, as a multiple of the timetable's minimum change times: 1 (default) is the timetable's own; 1.5 for luggage, children or reduced mobility; 0.7 for a fast walker. Between 0.5 and 3."}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['from', 'places', 'total_reachable', 'truncated', 'data'], 'properties': {'data': {'type': 'object'}, 'from': {'type': 'object'}, 'places': {'type': 'array', 'items': {'type': 'object', 'required': ['place_id', 'name', 'minutes', 'arrival'], 'properties': {'name': {'type': 'string'}, 'arrival': {'type': 'string'}, 'minutes': {'type': 'integer'}, 'latitude': {'type': 'number'}, 'place_id': {'type': 'string'}, 'longitude': {'type': 'number'}}}}, 'departure': {'type': 'string'}, 'truncated': {'type': 'boolean'}, 'max_minutes': {'type': 'integer'}, 'total_reachable': {'type': 'integer'}}}
travel_time_matrix
Public-transport travel times between many origins and destinations
Compute the public-transport travel time in minutes from each of several origins to each of several destinations in Switzerland, for one departure time. One search per origin, however many destinations — built 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. Inputs: origins and destinations are lists of places, each A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofstrasse 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus"), 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. Planned timetable; live delays are not included. Example: {"origins": ["Winterthur", "Baden", "Zug"], "destinations": ["Zürich HB", "Zürich Oerlikon"], "departure": "2026-09-28T07:30"}
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': ['origins', 'destinations'], 'properties': {'origins': {'type': 'array', 'items': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'An origin.'}, 'minItems': 1, 'description': 'Where each row of the matrix starts.'}, 'departure': {'type': 'string', 'description': 'When to leave. Omit for now.'}, 'destinations': {'type': 'array', 'items': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'A destination.'}, 'minItems': 1, 'description': 'Where each column of the matrix ends.'}, 'max_transfers': {'type': 'integer', 'maximum': 8, 'minimum': 0, 'description': 'The most changes of vehicle allowed.'}, 'transfer_time_factor': {'type': 'number', 'maximum': 3, 'minimum': 0.5, 'description': "How much time to allow for changing trains, as a multiple of the timetable's minimum change times: 1 (default) is the timetable's own; 1.5 for luggage, children or reduced mobility; 0.7 for a fast walker. Between 0.5 and 3."}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['origins', 'destinations', 'minutes', 'data'], 'properties': {'data': {'type': 'object'}, 'minutes': {'type': 'array', 'items': {'type': 'array', 'items': {'type': ['integer', 'null']}}}, 'origins': {'type': 'array', 'items': {'type': 'object'}}, 'departure': {'type': 'string'}, 'destinations': {'type': 'array', 'items': {'type': 'object'}}}}
추가됨
travel_time_matrix
2026년 10월 4일 2:40 AM
추가됨
reachable_area
2026년 10월 4일 2:40 AM
추가됨
plan_day_out
2026년 10월 4일 2:40 AM
추가됨
departures
2026년 10월 4일 2:40 AM
추가됨
plan_journey
2026년 10월 4일 2:40 AM
추가됨
find_place
2026년 10월 4일 2:40 AM