Spick Me — Swiss public transport
Server Details
Swiss trains, trams, buses and boats: journeys door to door, departures, day trips, travel-time maps
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 6 tools
Each tool targets a distinct task (station board, place lookup, A-to-B journey, multi-stop day plan, isochrone, many-to-many matrix), and the descriptions explicitly cross-reference the others with 'use X instead' guidance. Overlaps such as departures vs plan_journey or reachable_area vs travel_time_matrix are pre-empted in the text.
All names are lowercase snake_case with no camelCase mixing, which keeps them predictable. However the pattern is not uniformly verb_noun: find_place, plan_journey and plan_day_out are verb-led, while departures, reachable_area and travel_time_matrix are noun phrases.
Six tools is well-scoped for a Swiss transit server, and each one covers a genuinely different question shape rather than duplicating another. Nothing feels padded or conspicuously absent from the count.
The surface covers station boards, place resolution, door-to-door routing, day planning, reachability and commute matrices — a strong lifecycle set. Minor gaps remain: no live delay/disruption or fare/ticket information and no way to fetch details of a previously returned connection beyond the picture_url.
Available Tools
6 toolsdeparturesDeparture board for a Swiss station or stopARead-onlyIdempotentInspect
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}
| Name | Required | Description | Default |
|---|---|---|---|
| time | No | When the board starts. Omit for now. | |
| limit | No | How many departures to list. | |
| station | Yes | The station or stop whose board to show. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| station | Yes | |
| departures | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, the description discloses the important caveat that times are planned timetable times without live delays or cancellations, and that an ambiguous name returns candidates rather than guessing. It does not mention rate limits, auth needs, or result ordering, but the freshness caveat is the key behavioral fact an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then usage, then inputs, then caveats and an example. The input paragraph is dense with useful detail rather than filler, though it is longer than strictly necessary and repeats the 1–40/default range already in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format need not be explained. The description covers what the tool does, when to use it versus plan_journey, all input formats, time semantics, and the planned-vs-live data caveat — everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, yet the description adds substantial meaning: accepted station formats (name, address, named place, 'geo:lat,lon', find_place place_id), the nearest-stop fallback for addresses/coordinates, and time interpretation rules (ISO 8601, offsets converted, bare '08:00' means today/tomorrow, omit for now). This goes well past the schema's terse field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('List the next departures from one station or stop') and immediately contrasts itself with the sibling plan_journey. It also defines scope (one station, next departures) which distinguishes it from reachable_area and travel_time_matrix.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete user phrasings ('what leaves from Bern in the next hour', 'when is the next tram from Bellevue'), states an alternative use case for discovering service frequency, and explicitly routes the 'getting somewhere specific' case to plan_journey. When-to-use and when-to-use-something-else are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_placeFind a station, stop, address or place in SwitzerlandARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| near | No | Where the user is, if known: prefers nearer matches among equally good ones. | |
| limit | No | How many candidates to return, best first. | |
| query | Yes | The name, address or coordinate to look up. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| query | Yes | |
| candidates | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description is free to add the genuinely useful behavior: results are ranked best-first, each carries a stable place_id, and an ambiguous name returns candidates rather than a guessed single answer. It stops short of describing error handling or result shape, but the output schema covers returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then usage, then a labelled Inputs section and a worked example, so an agent can skim to what it needs. Slightly verbose in places ('Names are read the way a rider types them') but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it supplies everything else an agent needs: when to call it, when not to, accepted input formats, tie-breaking via near, and an end-to-end example showing the place_id flowing into plan_journey.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema's terse 'The name, address or coordinate to look up' by enumerating accepted query forms with real examples ('geo:47.3769,8.5417', 'stop:8503000') and clarifying that limit is 1-10 with default 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('look up what a place name means in the Swiss public-transport network') and enumerates the resource types it covers: stations/stops, street addresses, named places, coordinates, place_ids. This clearly separates it from plan_journey, departures, and the other routing siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggers ('when the user names a place you are not sure of', 'when another tool answered that a name is ambiguous', 'to get coordinates') and an explicit non-trigger ('You do not need it before plan_journey or departures for ordinary names'), even explaining why those siblings handle names themselves.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_day_outPlan a day out with several stops in SwitzerlandARead-onlyIdempotentInspect
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"}
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Where the day ends; defaults to start. | |
| start | Yes | Where the day starts. | |
| stops | Yes | The places to visit, in order. | |
| departure | No | When the day starts. Omit for now. | |
| transfer_time_factor | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| back | No | |
| data | Yes | |
| legs | Yes | |
| stays | Yes | |
| leaving | No | |
| minutes_travelling | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (read-only, idempotent, non-destructive, closed-world), and the description adds behavior they cannot: ambiguous place names return candidates rather than a guess, end defaults to start making a round trip, departure defaults to now, and a bare '08:00' is interpreted as today. It also notes each leg carries a picture_url. That is meaningful operational context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then routing, then input semantics, then an example — a sensible order with no filler sentences. It is on the long side, and the extensive start-format enumeration overlaps schema documentation, but each block carries usable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and the description still notes the per-leg picture_url. Combined with defaults, disambiguation behavior, and the worked JSON example, an agent has everything needed to construct a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further than the schema on several parameters: it enumerates the accepted forms for start (station name, address, named place, 'geo:lat,lon', place_id from find_place), restates the 1–12 stop limit, and clarifies leave_at's night-away semantics. It omits transfer_time_factor, which only the schema documents, so it does not fully compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Plan a whole day of public transport with time spent at each stop') and unpacks what a day plan contains — outbound train, stay, connection, return — which is a distinct capability from a point-to-point planner. It explicitly contrasts itself with plain journey planners and with the sibling plan_journey, so an agent can separate the two without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete use cases (multi-stop day trip, three towns in a day, evening out and back) and an explicit exclusion: 'For a single A-to-B trip, use plan_journey.' The when-to-use and when-not-to-use conditions are both stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_journeyPlan a public-transport journey in SwitzerlandARead-onlyIdempotentInspect
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"}
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Where the journey ends. | |
| via | No | Stations or stops the journey must pass through, in order. With via, one best journey is returned. | |
| from | Yes | Where the journey starts. | |
| limit | No | How many alternative journeys to return. | |
| arrival | No | Arrive by this time. Give this or departure, not both. | |
| departure | No | Leave at or after this time. Omit both departure and arrival for now. | |
| max_transfers | No | The most changes of vehicle allowed; 0 for direct connections only. | |
| transfer_time_factor | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | |
| data | Yes | |
| from | Yes | |
| journeys | Yes | |
| interpreted | No | |
| walk_instead | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses non-obvious behaviors: ambiguous names return candidates rather than a guess, via reduces output to one best journey, and results are planned timetable times with Swiss offsets with no live delay data — with the instruction to say so when it matters. It also explains the picture_url artifact and when to offer it. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and usage, then inputs, then a single example — a logical order with no wasted sentences. It is on the long side and the picture_url sentence borders on promotional, but each paragraph carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-parameter planning tool with an output schema, the description covers everything an agent must know to call it correctly: formats, time semantics, mutual exclusions, alternatives limit, and the absence of real-time data. Return-value detail is legitimately delegated to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real value beyond the schema: accepted input formats for from/to (station, address, named place, 'geo:lat,lng', 'stop:8503000'), the departure/arrival mutual exclusion, ISO 8601 Swiss local time with offset conversion, and the bare '08:00 means today' rule. Only transfer_time_factor is left to the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Find the best connections by train, tram, bus, boat and mountain railway between two places in Switzerland') and names the data source (Spick Me's routing engine over the official Swiss timetable). This is clearly distinguishable from siblings like travel_time_matrix, reachable_area and plan_day_out, which it also explicitly routes away from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete triggering phrases ('how do I get from A to B', 'I need to be in Bern by 9') and an explicit exclusion: to stop somewhere along the way, use plan_day_out instead. It also tells the agent how to obtain a place_id (find_place) and what an ambiguous name does (returns candidates, no guessing).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reachable_areaEverywhere reachable by public transport within a time budgetARead-onlyIdempotentInspect
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}
| Name | Required | Description | Default |
|---|---|---|---|
| from | Yes | Where to start. | |
| limit | No | How many places to list, nearest first. | |
| departure | No | When to leave. Omit for now. | |
| max_minutes | No | The time budget in minutes, waiting included. | |
| max_transfers | No | The most changes of vehicle allowed. | |
| transfer_time_factor | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| from | Yes | |
| places | Yes | |
| departure | No | |
| truncated | Yes | |
| max_minutes | No | |
| total_reachable | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description adds material behavior: results are timetable minutes on the planned timetable with live delays excluded, an address or coordinate is snapped and the answer names the stop, and an ambiguous name returns candidates rather than guessing. These are exactly the traits an agent cannot infer from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior and the routing alternatives before the input detail, and a worked example closes it usefully. It is on the long side and the parenthetical asides could be tightened, but each sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and the description nonetheless covers the behavior an agent needs: defaults (60 minutes, 50 results), waiting included in the budget, and the timetable-only caveat. Complete for a six-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value beyond the schema: accepted 'from' formats (station name, address, named place, 'geo:lat,lon', 'stop:8503000' place_id), ISO 8601 departure semantics including offset conversion and the bare '08:00' meaning today. It omits transfer_time_factor, which the description never mentions, so it is not fully additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (every station/stop reachable) with scope and ordering ('nearest first, with the earliest arrival at each'). It explicitly distinguishes itself from travel_time_matrix and plan_journey, so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete user-intent examples ('where can I get to from Bern in 45 minutes', catchment areas, isochrones) and names the alternatives with the condition that selects them ('for travel time between specific places use travel_time_matrix; for how to make a particular journey, plan_journey'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
travel_time_matrixPublic-transport travel times between many origins and destinationsARead-onlyIdempotentInspect
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"}
| Name | Required | Description | Default |
|---|---|---|---|
| origins | Yes | Where each row of the matrix starts. | |
| departure | No | When to leave. Omit for now. | |
| destinations | Yes | Where each column of the matrix ends. | |
| max_transfers | No | The most changes of vehicle allowed. | |
| transfer_time_factor | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| minutes | Yes | |
| origins | Yes | |
| departure | No | |
| destinations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, yet the description adds real operational context: one search per origin regardless of destination count (cost shape), ambiguous names return candidates rather than guessing, addresses/coordinates are snapped to their nearest stop, planned timetable only with no live delays, and null where no connection exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation, then cleanly segmented into usage, inputs, output, and a worked example. Dense and well organized, though the illustrative 'which office site / which flat / how well a venue is connected' clause is mildly redundant with the preceding 'built for comparing locations'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, open-world, computed tool with an output schema, the description still supplies the return semantics (minutes[i][j], waiting for the first vehicle included, null for no connection) and the timetable caveat. Nothing needed to invoke it correctly is missing; transfer_time_factor is left to the schema, which documents it thoroughly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaning the schema lacks: the full accepted place grammar (stop name, address, named place, 'geo:lat,lon', find_place place_id), departure-time parsing rules (ISO 8601, offsets/Z converted, bare '08:00' means today or tomorrow if long past, omit for now), and the row/column meaning of the answer. This goes well beyond the terse schema strings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('compute the public-transport travel time... from each of several origins to each of several destinations'), plus scope (Switzerland, one departure time) and the matrix shape. It explicitly distinguishes itself from plan_journey and reachable_area, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it when there are several places on either side' gives the positive condition, and it names the two alternatives with their selecting conditions: plan_journey for one pair with the actual connection, reachable_area for everywhere reachable. That is explicit when-to-use plus when-not-to-use routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
- First observed
departures - First observed
find_place - First observed
plan_day_out - First observed
plan_journey - First observed
reachable_area - First observed
travel_time_matrix
Related MCP Connectors
Canonical SwissTrip MCP — independent SBB/CFF/FFS schedules, prices, and ticket links by SwissTrip.
Swiss Transport MCP — wraps Transport Open Data API (free, no auth)
Swiss weather and federal geodata from MeteoSwiss and swisstopo on data.geo.admin.ch — find…
Plan journeys by train, bus, tram, metro and ferry across 42 European countries.
Related MCP Servers
- FlicenseAqualityFmaintenanceIndependent MCP client by swsistrip for Swiss Federal Railways (SBB/CFF/FFS) — all schedules, prices, ticket links via SBB's official SMAPI.975 npm3-
- AlicenseNot gradedqualityBmaintenanceProvides real-time Swiss railway information including departures, connections, train composition, occupancy forecasts, disruptions, and pricing, accessible via natural language in over 100 languages.MIT
- AlicenseAqualityDmaintenanceConnects AI assistants to Swiss Federal Railways (SBB/CFF/FFS) data: train schedules, station search, ticket prices, and direct ticket purchase links.660 npm-
- FlicenseNot gradedqualityDmaintenanceEnables querying Swiss public transport (trains, buses, trams, boats) for stations, connections, and station boards via the opendata.ch API.-
Glama MCP Gateway
Add one secure layer between your agents and this server.