sbb-mcp
This server connects AI assistants to Swiss Federal Railways (SBB) data, enabling train schedule lookups, ticket pricing, and direct ticket purchasing.
search_stations: Find Swiss train stations, addresses, or points of interest by name.search_connections: Look up train connections between two stations, returning schedules with departure/arrival times, duration, and transfers.get_trip_details: Retrieve detailed info about a specific connection, including intermediate stops, platforms, and occupancy.get_more_connections: Load earlier or later trains for a previously searched route.get_prices: Fetch ticket prices with Half-Fare (Halbtax) and GA travelcard discounts, supporting multi-traveler/family pricing.get_ticket_link: Generate a direct purchase link to SBB.ch (or the SBB app on mobile), with reduction cards and family travelers applied automatically.save_profile/get_profile: Store and retrieve a user's local travel profile (name, date of birth, reduction card) for personalization.list_travelers: List travelers in a SwissTrip account for family pricing (requires aSWISSTRIP_TOKEN).
sbb-mcp
This package is now an alias for
swisstrip-mcp. New users should installswisstrip-mcpdirectly: it is the canonical SwissTrip MCP client. Thesbb-mcpname continues to work — it spawnsswisstrip-mcpas a child process — so existing integrations don't break.
Independent MCP client by SwissTrip — connects AI assistants to Swiss Federal Railways (SBB / CFF / FFS) data: train schedules, station search, ticket prices, and direct ticket purchase links via SBB's SMAPI.
Thin client. All SBB API access, ticketing, and profile sync run on the hosted SwissTrip server at https://mcp.swisstrip.app/mcp.
Install (recommended: use the canonical name)
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"swisstrip": {
"command": "npx",
"args": ["-y", "swisstrip-mcp"]
}
}
}Cursor
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"swisstrip": {
"command": "npx",
"args": ["-y", "swisstrip-mcp"]
}
}
}ChatGPT (Plus / Pro / Business / Enterprise with Developer Mode)
No install required. Add a custom connector pointing at:
https://mcp.swisstrip.app/mcpExisting sbb-mcp configurations
Already running npx -y sbb-mcp? Nothing changes — it still works and forwards to the same hosted service. To migrate to the canonical name, swap sbb-mcp → swisstrip-mcp in your client config when convenient.
Related MCP server: swiss-rail-mcp
Tools
search_stations— find Swiss stations, addresses, and points of interestsearch_connections— train schedules between two stationsget_trip_details— detailed trip with all intermediate stopsget_more_connections— earlier or later trains for a previous searchget_prices— ticket prices with Halbtax / GA discountsget_ticket_link— direct purchase link to SBB.chsave_profile/get_profile— save your travel profile locallylist_travelers— multi-traveler family pricing (requiresSWISSTRIP_TOKEN)
Optional configuration
Environment variable | Purpose |
| Sync your traveler profile from your SwissTrip account. Mint at https://swisstrip.app/settings/developer. |
| Override the hosted server URL. Default: |
| Same as above (legacy name, still supported). |
Why was this renamed?
sbb-mcp started as the canonical npm package. To protect against future trademark conflicts (the SBB acronym belongs to Schweizerische Bundesbahnen) the canonical implementation now lives at swisstrip-mcp, which is registered under the SwissTrip™ trademark. sbb-mcp and 8 other npm names (sbb-mcp-official, sbb-cff-ffs-mcp, swiss-rail-mcp, swiss-railways-mcp, swiss-train-mcp, swisstrip, swisstrip-ai, swisstrip-server) are 1-line spawners that depend on swisstrip-mcp.
This means: if any one of the SBB-themed names ever needs to be transferred or removed, every existing integration keeps running unchanged because they all forward to the canonical swisstrip-mcp.
License
Proprietary. See LICENSE. © 2026 SwissTrip.
For commercial licensing inquiries: fabsforward2@gmail.com.
Available Tools
9 toolsget_more_connectionsGet More ConnectionsARead-onlyIdempotent
Load earlier or later train connections for a previous search. Use the collection ID from search_connections results.
| Name | Required | Description | Default |
|---|---|---|---|
| collection_id | Yes | Collection ID from search_connections results | |
| direction | Yes | "next" for later trains, "previous" for earlier trains |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the safety profile is covered. The description adds context about pagination (earlier/later) but does not disclose additional behaviors like error handling or return format.
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?
Two concise sentences, front-loaded with the core purpose and immediate usage hint. Every word earns its place, with no fluff or repetition.
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 simple pagination tool with rich annotations and complete schema, the description is sufficient. It lacks an explicit note about return structure, but that is implied as consistent with search_connections results, and the sibling tools provide context.
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%, with both parameters (collection_id and direction) well-described in the schema. The description reinforces the source of collection_id but adds no new information beyond the schema.
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 clearly states the verb 'Load' and resource 'earlier or later train connections' for a previous search, distinguishing it from sibling tools like search_connections (which performs the initial search) and get_prices/get_trip_details (which retrieve other data).
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 explicitly says to use the collection ID from search_connections results, indicating the tool is a follow-up for pagination. It doesn't explicitly state when not to use other alternatives, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pricesGet PricesARead-onlyIdempotent
Get ticket prices for one or more train connections. Supports Half-Fare card (Halbtax) and GA travelcard discounts. When connected to SwissTrip (SWISSTRIP_TOKEN), pass traveler_names to get family pricing for multiple travelers.
| Name | Required | Description | Default |
|---|---|---|---|
| trip_ids | Yes | Trip IDs from search_connections results | |
| traveler_type | No | Traveler type (used when no traveler_names given) | ADULT |
| reduction_card | No | Swiss reduction card (used when no traveler_names given) | HALF_FARE |
| traveler_names | No | Names of SwissTrip travelers to price for (e.g. ["Fabian", "Anna"]). Requires SWISSTRIP_TOKEN. Each traveler's reduction card is applied automatically. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds useful behavioral context such as support for Half-Fare and GA discounts and family pricing via traveler_names, which goes beyond the 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?
The description is three sentences, front-loaded with the main purpose, and every sentence adds value. No wasted words.
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?
Given the tool has 4 parameters (1 required) and no output schema, the description explains reduction cards and traveler_names usage. It does not specify return format, but for a pricing tool it is reasonably complete.
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?
The schema has 100% description coverage, so the description does not need to add much. However, it clarifies the use of reduction_card options and traveler_names, adding meaning beyond the schema.
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 clearly states 'Get ticket prices for one or more train connections,' using a specific verb and resource. It distinguishes itself from sibling tools like get_trip_details or search_connections.
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?
The description explains when to use the tool (for pricing with reduction cards) and how to use it with 'traveler_names' for family pricing when connected to SwissTrip. It does not explicitly list alternatives but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileGet Travel ProfileARead-onlyIdempotent
Read the user's saved travel profile. Check this before showing prices to use correct reduction card. If no profile exists, ask the user for their details.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint false, idempotentHint. Description adds value by explaining the context (check before prices) and fallback (ask user). No contradictions 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?
Two sentences, front-loaded with action and purpose. No wasted words; every sentence serves a purpose.
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?
Given no input parameters and no output schema, the description fully explains the tool's purpose, when to use it, and how to handle missing data (profile not found). Complete for this simple 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?
Input schema has zero parameters so schema coverage is 100% and no param details needed. Per guidelines, 0 params baseline is 4. Description does not add param info, but it is unnecessary.
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 clearly states it reads the user's saved travel profile, specifies the verb 'Read', and distinguishes from siblings like save_profile (write) and list_travelers (different tool). It gives a specific use case: checking before showing prices.
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?
Explicitly says 'Check this before showing prices to use correct reduction card' and instructs what to do if no profile exists: 'ask the user for their details'. Provides clear when-to-use and fallback behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ticket_linkGet Ticket LinkARead-only
Get a direct purchase link to buy a train ticket on SBB.ch. Only call this when the user wants to buy a specific ticket. On mobile with SBB app installed, opens directly in the app with Halbtax/GA applied automatically. Pass traveler_names for family tickets when connected to SwissTrip.
| Name | Required | Description | Default |
|---|---|---|---|
| trip_id | Yes | Trip ID to purchase | |
| from_name | Yes | Origin station name (e.g. "Zürich HB") | |
| from_id | Yes | Origin station ID (e.g. "8503000") | |
| to_name | Yes | Destination station name (e.g. "Bern") | |
| to_id | Yes | Destination station ID (e.g. "8507000") | |
| date | Yes | Travel date YYYY-MM-DD | |
| time | Yes | Departure time HH:MM | |
| traveler_type | No | Traveler type (used when no traveler_names given) | ADULT |
| reduction_card | No | Swiss reduction card (used when no traveler_names given) | HALF_FARE |
| traveler_names | No | SwissTrip traveler names for family tickets. Requires SWISSTRIP_TOKEN. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true and destructiveHint=false, which the description supports by stating it retrieves a purchase link. The description adds context on mobile app behavior (opens directly with Halbtax/GA) and the need for SWISSTRIP_TOKEN with traveler_names, going beyond 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?
Three well-structured sentences. The first sentence states core purpose, the second clarifies invocation context, and the third adds a special case. No redundant 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?
Given 10 parameters, no output schema, and annotations provide safety profile, the description covers key behaviors (purchase link retrieval, mobile app integration, SwissTrip requirement). It does not explicitly describe the return format (URL) but 'Get a direct purchase link' strongly implies it. Missing error handling info, but overall sufficient for selection and invocation.
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 description coverage is 100%, but the description adds meaningful nuance: 'Pass traveler_names for family tickets when connected to SwissTrip' and implies that reduction_card/traveler_type are defaults when traveler_names absent. This augments the schema.
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 clearly states the tool's purpose: 'Get a direct purchase link to buy a train ticket on SBB.ch.' It uses a specific verb and resource, distinguishing it from siblings like get_prices or get_trip_details.
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?
Explicitly says 'Only call this when the user wants to buy a specific ticket.' Provides conditional guidance for mobile app use and when to pass traveler_names, though does not contrast with alternative sibling tools beyond this.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trip_detailsGet Trip DetailsARead-onlyIdempotent
Get detailed information about a specific train connection including all intermediate stops, platforms, and occupancy. Use a trip ID from search_connections results.
| Name | Required | Description | Default |
|---|---|---|---|
| trip_id | Yes | Trip ID from search_connections results |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the agent knows it's a safe read. The description adds context about the kind of details returned (stops, platforms, occupancy) but does not disclose other behavioral aspects like pagination or error handling. This meets the baseline for annotation-covered tools.
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?
Two sentences capture the purpose and usage context with no wasted words. The description is front-loaded with the primary action and the second sentence provides essential guidance on obtaining the trip ID. It is optimally concise.
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?
Given the low complexity (single parameter), rich annotations, and a description that lists the type of information returned, the description is complete for an agent to use correctly. It lacks an output schema but the description gives enough detail about what to expect. There is no need for additional explanation of return values because the description already enumerates examples.
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% and the schema describes trip_id as 'Trip ID from search_connections results'. The description reinforces this by instructing to use a trip ID from search_connections, adding a small amount of shared context. Since the schema already carries the semantic load, this is the appropriate baseline.
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 clearly states the tool's function: 'Get detailed information about a specific train connection' with specific examples (intermediate stops, platforms, occupancy). It uses a strong verb and specifies the resource, and the mention of 'trip ID from search_connections' differentiates it from sibling tools by tying it to a prior search step.
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?
The description provides clear context: this should be used after obtaining a trip ID from search_connections. It tells the agent when to use it, but does not explicitly state alternatives or when not to use it, so it doesn't meet the full 'when/when-not/alternatives' standard.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_travelersList TravelersARead-onlyIdempotent
List all travelers in the user's SwissTrip account (self, partner, kids). Each traveler has their own reduction card. Use their names with get_prices for family trip pricing. Requires SWISSTRIP_TOKEN.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, destructive, idempotent hints. Description adds that each traveler has a reduction card and requires SWISSTRIP_TOKEN, which supplements without contradiction.
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?
Three sentences that front-load purpose, add context, and provide usage advice. Every sentence earns its place.
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 parameterless list tool with no output schema, the description fully covers purpose, return content, and integration hint.
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?
Input schema has no parameters; schema coverage is 100%. Description adds no parameter details, but none are needed.
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?
Clearly states 'List all travelers' with specific categories (self, partner, kids), distinguishing it from siblings like get_prices or get_profile.
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?
Provides explicit guidance to use names with get_prices for family trip pricing, but does not mention alternatives or when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_profileSave Travel ProfileAIdempotent
Save the user's travel profile locally for future sessions. Call this after asking the user for their details (name, date of birth, reduction card). Data is stored at ~/.sbb-mcp/profile.json.
| Name | Required | Description | Default |
|---|---|---|---|
| first_name | No | First name (for ticket booking) | |
| last_name | No | Last name (for ticket booking) | |
| date_of_birth | No | Date of birth YYYY-MM-DD (for age-based pricing) | |
| reduction_card | No | Swiss reduction card: HALF_FARE (Halbtax), GA (General Abonnement), or NONE | |
| reduction_card_valid_until | No | Reduction card expiry date YYYY-MM-DD (ask the user when their Halbtax/GA expires) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotentHint=true (write operation). Description adds concrete behavioral context: data stored at ~/.sbb-mcp/profile.json, persistence across sessions. No contradictions.
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?
Two concise sentences, front-loaded with purpose and usage guidance, zero wasted words.
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?
Covers storage location and usage context, but omits details about return behavior (since no output schema), overwrite behavior, and error cases. Adequate but not fully complete.
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% with detailed parameter descriptions. Description merely summarizes fields without adding new semantic meaning beyond what schema provides. Baseline 3 appropriate.
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 clearly states the verb 'Save', the resource 'travel profile', and the context ('locally for future sessions'). It distinguishes from sibling 'get_profile' by implying this is the write counterpart.
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?
Explicitly states when to call: 'after asking the user for their details'. Does not explicitly mention when not to use or alternative tools, but sibling context provides differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_connectionsSearch ConnectionsARead-onlyIdempotent
Find train connections between two Swiss stations. Returns schedules with departure/arrival times, duration, transfers, and trip IDs for pricing.
| Name | Required | Description | Default |
|---|---|---|---|
| from | Yes | Origin station name or ID (e.g. "Zurich HB" or "8503000") | |
| to | Yes | Destination station name or ID (e.g. "Bern" or "8507000") | |
| date | No | Travel date in YYYY-MM-DD format (default: today) | |
| time | No | Departure time in HH:MM format (default: now) | |
| arrival_time | No | If true, the time parameter is treated as desired arrival time |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds value by specifying the return format (schedules, times, duration, transfers, trip IDs) and implies the operation is non-destructive, which aligns with annotations. No contradictions.
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?
Two sentences, completely free of fluff, front-loaded with the action and resource. Every word adds value.
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?
Given the simplicity of the tool, the annotations, and the schema, the description provides all necessary context: it states the operation, the target (Swiss stations), and the return data. No output schema is needed as the description covers the key fields.
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% with parameter descriptions. The description does not add extra semantic information beyond the schema. Baseline 3 is appropriate as the schema already documents each parameter well.
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 clearly states the tool's purpose: finding train connections between two Swiss stations. It specifies the returned data (schedules, times, duration, transfers, trip IDs) and distinguishes itself from siblings like 'search_stations' and 'get_more_connections' by focusing on connections specifically.
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?
The description implies usage for initial connection searches between stations but does not explicitly state when not to use it or mention alternative tools like 'get_more_connections'. The context is clear, but explicit alternatives are missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_stationsSearch StationsARead-onlyIdempotent
Search for Swiss train stations, addresses, or points of interest by name. Returns station IDs needed for other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Station name to search for (e.g. "Zurich", "Bern", "Interlaken") | |
| limit | No | Maximum number of results |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, and idempotentHint. Description adds value by stating the tool returns station IDs needed for other tools, but lacks details on rate limits or result format.
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?
Single sentence, concise, front-loaded with action verb and specific resource. No redundant 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?
No output schema; description only mentions 'returns station IDs' but omits details on the output structure (e.g., list, fields). Could provide more context for agent to parse results.
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% with clear descriptions for both parameters (query and limit). Description does not add additional parameter meaning beyond the schema.
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?
Description clearly states verb 'Search', resource 'Swiss train stations, addresses, or points of interest', and notes that it returns station IDs needed for other tools. This distinguishes it from sibling tools like search_connections.
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?
Implies use as a prerequisite for other tools by mentioning station IDs, but does not explicitly state when to use vs alternatives or when not to use.
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.
9 tool updates
v0.5.0- First observed
get_more_connections - First observed
get_prices - First observed
get_profile - First observed
get_ticket_link - First observed
get_trip_details - First observed
list_travelers - First observed
save_profile - First observed
search_connections - First observed
search_stations
TDQS
Scored across 9 tools
Each tool targets a distinct aspect: station search, connection search, trip details, pricing, ticket link, loading more connections, profile read/save, and traveler listing. No overlapping purposes.
All tools follow a consistent verb_noun pattern with underscores (e.g., search_connections, get_prices, list_travelers), making them predictable and easy to navigate.
9 tools is well-scoped for a Swiss railway assistant, covering search, planning, pricing, purchase, and profile management without bloat or deficiency.
Covers core workflows: station search, connection search, trip details, pricing, purchase link, and profile. Minor gap in real-time delay information, but overall complete for travel planning and purchasing.
Maintenance
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)
DB Rail MCP — German + European rail and public transport, keyless.
iRail MCP — Belgian rail (SNCB/NMBS) real-time via the community iRail API
Related MCP Servers
- AlicenseAqualityDmaintenanceSwiss open data MCP server — transport, weather, geodata, companies, etc,. Zero API keys.76179 npm22MIT
- AlicenseAqualityDmaintenanceA zero-authentication MCP server for Swiss public transport, enabling users to query train connections, disruptions, station facilities, and plan journeys using natural language.12MIT
- AlicenseAqualityDmaintenanceMCP server for Swiss public transport — connections, stationboards, real-time delays, and direct booking links for SBB.41MIT
- AlicenseNot gradedqualityBmaintenanceEnables querying Swiss public transport data (stations, departures, connections) from the Transport Open Data API via natural language through an MCP gateway.0MIT