Faceabot Rail Finland (VR)
Server Details
Finnish trains (VR, Helsinki commuter): live direct trains and departures. Free, no key.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 3 tools
Each tool targets a distinct scope: finding stations, departures from a single station, and connections between two stations. There is mild overlap between fi_station_departures and fi_train_connections (both return times, tracks, delays, cancellations), but the one-station vs two-station distinction keeps them separable.
All names share a consistent 'fi_' prefix and snake_case formatting, which is good. However, the verb pattern is inconsistent: fi_find_station is verb_noun while fi_station_departures and fi_train_connections are noun phrases, breaking a uniform convention.
Three tools is on the lean side but reasonable for a focused Finnish rail lookup server. Each tool earns its place with a clear use case, though the surface is thin enough that it borders on minimal.
The set covers the main rail workflows: station lookup, station departures, and point-to-point connections. A notable gap is the explicit 'direct trains only' limitation (no transfer/multi-leg itineraries) and the lack of train-number/detail lookups, which could hinder some agent requests.
Available Tools
3 toolsfi_find_stationFind a Finnish stationARead-onlyIdempotentInspect
Finds Finnish passenger stations matching a word (Finnish or Swedish name), with their short codes. Use when: a station name is ambiguous or misspelled. Example: {"query":"Helsinki"}
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Part of the station name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds two useful behavioral facts beyond them: matching works against both Finnish and Swedish spellings, and results come back with short codes. Result limits/ordering are not mentioned, but that is a minor gap given annotation coverage.
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 short lines, front-loaded with the purpose, then the trigger condition, then a concrete example. No sentence is redundant and nothing is buried.
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 no output schema, the description correctly discloses what comes back (matching stations plus their short codes), which is the key missing piece. It does not say whether results are ranked or capped, a small omission for a search tool that could return many matches.
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 already explains "Part of the station name", so the baseline is 3. The description adds value by clarifying that matching is word-based and language-flexible (Finnish or Swedish), and the {"query":"Helsinki"} example concretely shows a single-token query works.
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: finds Finnish passenger stations by name fragment, and notes it also surfaces the short codes used elsewhere. The station-lookup resource is clearly distinct from the sibling tools (fi_station_departures, fi_train_connections), though the description never names those siblings to draw the contrast explicitly.
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 when: a station name is ambiguous or misspelled" gives an explicit trigger condition, which is exactly the right context for a fuzzy name resolver. It does not state when not to use it (e.g., when the code is already known and a trip query can be issued directly), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fi_station_departuresNext trains from a Finnish stationARead-onlyIdempotentInspect
Next train departures from one Finnish station: time, train, destination, track, live delay, cancellations. Use when: someone is at (or going to) a station in Finland. Example: {"station":"Helsinki"}
| Name | Required | Description | Default |
|---|---|---|---|
| results | No | ||
| station | Yes | Station name or short code |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuine behavioral value by disclosing the payload contents — live delay and cancellation data — which is important since no output schema exists. It omits the result-count cap (default 8, max 20) and any freshness/rate-limit context.
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 tight lines: capability plus returned fields first, then the usage condition, then a copy-pasteable example. No filler sentences and the most decision-relevant information is front-loaded.
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 no output schema, the field enumeration (time, train, destination, track, delay, cancellations) usefully compensates. The main gap is the undocumented 'results' limit and no guidance on resolving station names, but for a two-parameter read tool this is close to 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 50%: 'station' is documented in the schema and the example ({"station":"Helsinki"}) reinforces the expected format. The 'results' parameter has no schema description and the description does not explain it, so half the parameters remain unilluminated beyond their names.
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 ('next train departures from one Finnish station') and enumerates the returned fields (time, train, destination, track, live delay, cancellations). It does not explicitly name or contrast with the siblings fi_find_station or fi_train_connections, but the single-station departures-board framing makes it functionally distinguishable.
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 'Use when: someone is at (or going to) a station in Finland' line gives a concrete situational cue for invoking the tool. It stops short of stating when NOT to use it or routing to alternatives (e.g. fi_find_station for name resolution, fi_train_connections for A-to-B journeys).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fi_train_connectionsDirect Finnish trains between two stations (VR)ARead-onlyIdempotentInspect
Direct trains between two Finnish stations (VR long-distance and Helsinki commuter trains): departure and arrival times, tracks, live delays, cancellations. Direct trains only (no transfers). Use when: someone travels by train in Finland (e.g. Helsinki to Tampere). Example: {"from":"Helsinki","to":"Tampere"}
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Arrival station or short code | |
| date | No | Optional day YYYY-MM-DD (Finnish time). Default: today | |
| from | Yes | Departure station (Helsinki, Tampere, Turku, Oulu, Lentoasema = Helsinki Airport…) or its short code (HKI) | |
| time | No | Optional time HH:MM (Finnish time). Default: now | |
| results | No | ||
| time_is | No | departure |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive, so the safety profile is covered. The description adds meaningful behavioral context beyond that: it specifies 'Direct trains only (no transfers)' and that results include live delays and cancellations. It does not disclose rate limits or output structure, but with annotations present this is a strong addition.
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 compact and front-loaded: purpose and returned data come first, followed by a crucial scope constraint, then usage context and a minimal example. Every sentence earns its place with no redundancy.
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 read-only tool with no output schema, the description adequately covers what is returned (times, tracks, delays, cancellations) and when to use it. It omits details about the output list structure and does not reference sibling tools, but it is complete enough to call 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 description coverage is 67%: the schema already documents the from, to, date, and time parameters well, while results and time_is lack descriptions. The description's example shows expected values for from/to but adds no semantic detail for the undocumented parameters, so it does little 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 resource (direct trains between two Finnish stations) and enumerates the returned data (departure/arrival times, tracks, live delays, cancellations). It also names the train operators covered. However, it does not explicitly distinguish this tool from its siblings (fi_find_station, fi_station_departures), so it falls short of a 5.
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 'Use when' line gives a clear context (someone travels by train in Finland, e.g. Helsinki to Tampere) and the example reinforces it. But there are no when-not conditions or named alternatives, so the agent receives no explicit routing guidance versus sibling tools.
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.
3 tool updates
- First observed
fi_find_station - First observed
fi_station_departures - First observed
fi_train_connections
Related MCP Connectors
Irish trains and DART: live direct trains in the next 90 minutes, departures. Free, no key.
31Norwegian trains, buses and ferries: live trips and departures (Entur). Free, no key.
31Swiss trains and public transport: live connections and departures. Official data, free, no key.
31Belgian trains for AI agents: live journeys, departures, delays, disruptions. Free, no key.
51
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides Estonian public transport timetables, trip planning, stop search, and real-time vehicle tracking.8MIT

mcp-db-railofficial
AlicenseNot gradedqualityBmaintenanceEnables keyless access to German and European rail and public transport data, including station search, live departures and arrivals, and multi-leg journey planning with real-time updates.7 npmMIT- AlicenseNot gradedqualityBmaintenanceProvides live vessel positions from Fintraffic's AIS receivers in Finnish and Baltic waters, with tools to query vessels near a point, count vessels in an area, and get details by MMSI. No authentication required.13 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables querying live departure and arrival boards, delays, platforms, cancellations, crowding, stop-by-stop progress, and journey planning with up to one change for Lombardy's regional rail network, using public open data without an API key.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.