Estonian Transport MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Estonian Transport MCPShow me departures from Viru Keskus"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Estonian Transport MCP
An MCP server for Estonian public transport — timetables, trip planning, stop search, and real-time vehicle tracking.
Tools
Tool | Description |
| Search for stops by name (e.g. "Viru", "Balti jaam") |
| Get upcoming departures from a stop, with real-time predictions |
| Plan a trip between two coordinates with date/time options |
| Find stops within a radius of a location |
| Get route details including all stop patterns |
| Get full schedule of a specific trip — all stops with arrival/departure times |
| Real-time GPS positions of Tallinn buses, trams, and trolleybuses |
Related MCP server: Auckland Transport MCP Server
Prerequisites
This server runs via uvx, a zero-install Python package runner. Install uv first:
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# or via Homebrew
brew install uvNo other setup needed — uvx automatically downloads dependencies on first run.
Usage
Claude Code
Add to your MCP settings (.claude/settings.json or project-level .mcp.json):
{
"mcpServers": {
"estonian-transport": {
"command": "uvx",
"args": ["estonian-transport-mcp"]
}
}
}Claude Desktop
Config file location:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Add to the mcpServers section:
{
"mcpServers": {
"estonian-transport": {
"command": "uvx",
"args": ["estonian-transport-mcp"]
}
}
}Note: Claude Desktop may not find
uvxin its PATH. If the server fails to start, replace"uvx"with the full path. Find it by runningwhich uvxin your terminal, then use that path:{ "mcpServers": { "estonian-transport": { "command": "/Users/yourname/.local/bin/uvx", "args": ["estonian-transport-mcp"] } } }
Restart Claude Desktop after saving the config.
Remote server (HTTP)
Run as an HTTP server for remote access (e.g. from claude.ai/code on mobile):
estonian-transport-mcp --transport streamable-http --port 8000Then connect to it from any MCP client using the URL http://your-server:8000/mcp.
Example deployment with systemd on a VPS:
[Unit]
Description=Estonian Transport MCP
After=network.target
[Service]
ExecStart=/home/user/.local/bin/estonian-transport-mcp --transport streamable-http --port 8000
Restart=always
User=user
[Install]
WantedBy=multi-user.targetManual testing
# stdio mode (default)
uvx estonian-transport-mcp
# HTTP mode
uvx estonian-transport-mcp --transport streamable-http --port 8000Test interactively with the MCP Inspector:
npx @modelcontextprotocol/inspector uvx estonian-transport-mcpData Sources & APIs
Peatus.ee — OpenTripPlanner GraphQL API
Endpoint:
https://api.peatus.ee/routing/v1/routers/estonia/index/graphqlProtocol: GraphQL over HTTP POST
Authentication: None (open access)
Maintained by: Transpordiamet (Estonian Transport Administration)
Coverage: All Estonian public transport — buses, trams, trolleybuses, trains, and ferries nationwide
Data: Stop search, departure times, trip planning, route patterns, real-time arrival predictions
Based on: OpenTripPlanner with Digitransit
Underlying data: National GTFS feed consolidated from all Estonian transport operators
Used by tools: search_stops, get_departures, plan_trip, nearby_stops, get_route
Tallinn Transport — Real-Time Vehicle GPS
Endpoint:
https://transport.tallinn.ee/gps.txtProtocol: Plain-text CSV over HTTP GET
Authentication: None (open access)
Update frequency: ~10 seconds
Coverage: Tallinn city only — buses, trams, and trolleybuses operated by TLT (Tallinna Linnatransport)
Data: Vehicle type, line number, GPS coordinates (WGS84 microdegrees), heading, vehicle ID, destination
Format: Each line is one vehicle:
type,line,lon,lat,,heading,vehicle_id,status,unknown,destinationVehicle types:
1= trolleybus,2= bus,3= tramCoordinates: integer microdegrees (divide by 1,000,000 for decimal degrees)
Heading
999= unknown
Used by tools: tallinn_vehicles
Tech Stack
Python with FastMCP (
mcp[cli])httpx for async HTTP requests
Transport: stdio (standard MCP transport for local integrations)
Available Tools
8 toolsget_departuresA
Get upcoming departures from a specific stop.
Args: stop_id: GTFS stop ID (e.g. '1:4173'). Use search_stops to find IDs. limit: Number of departures to return (default 15, max 50) date: Date to get departures for, YYYY-MM-DD (default: today) time: Time to get departures from, HH:MM (default: now)
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| time | No | ||
| limit | No | ||
| stop_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It usefully discloses defaults (today, now, 15) and a max cap (50), which are behavioral constraints beyond the schema. However, it says nothing about whether results include realtime vs scheduled data, error behavior for invalid stops, or pagination.
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 one-line purpose is front-loaded and the Args block is compact and scannable. No filler sentences, though the format is slightly mechanical rather than prose-efficient.
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 4-parameter query tool with no annotations but an existing output schema, the description covers all parameters with formats and defaults, and points to search_stops for ID discovery. Missing only edge-case behavior (invalid IDs, realtime vs scheduled), which is a minor gap.
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 0%, so the description must compensate, and it does: it gives the GTFS stop ID format with an example ('1:4173'), the date format YYYY-MM-DD, the time format HH:MM, and the limit bounds (default 15, max 50). This is meaningfully richer than the bare schema titles.
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?
Clear verb+resource: 'Get upcoming departures from a specific stop.' An agent can distinguish it from plan_trip or get_trip_stops. It does not explicitly name which sibling to use instead, but the purpose is unambiguous.
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 routes the agent to search_stops to obtain the required stop_id, which is a real usage prerequisite. It lacks when-not guidance (e.g. use plan_trip for door-to-door itineraries), so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_routeB
Get details about a transport route including its stops.
Args: route_id: GTFS route ID (e.g. '1:1'). Find these from stop search results.
| Name | Required | Description | Default |
|---|---|---|---|
| route_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 'Get' implies a read-only operation and it names the return contents (route details plus stops), but there is no disclosure of permissions, rate limits, pagination, or error behavior for an operation with zero 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?
The purpose is front-loaded in a single sentence, and the parameter note is short and directly actionable. The 'Args:' block is slightly boilerplate but the content inside it is non-redundant, so 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?
An output schema exists, so the return shape is discoverable and the agent has enough to invoke the tool with a valid ID. However, with no annotations and no sibling routing guidance, the definition is adequate but not complete for a tool sitting among several related transit lookups.
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 0% — the schema only says 'Route Id' as a string — so the description must carry the semantics, and it does: it identifies the format (GTFS route ID), gives a concrete example ('1:1'), and tells the agent where to source the value. This adds genuine 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?
States a specific verb and resource ('Get details about a transport route including its stops'), which is clear on its own. It does not explicitly differentiate from the closest sibling, get_trip_stops, which also returns stop information, leaving the route-vs-trip distinction to be inferred.
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?
Usage is only implied: the agent is told where to obtain the ID ('Find these from stop search results'), which is useful workflow guidance, but there is no statement of when this tool should be preferred over siblings like get_trip_stops or plan_trip, nor any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trip_stopsA
Get the full schedule of a specific trip — all stops with arrival/departure times.
Use this to trace a bus/tram/train along its route and see when it arrives at each stop. Trip IDs can be found in get_departures output.
Args: trip_id: GTFS trip ID (e.g. '1:155_20250329_1_1'). Found in get_departures results.
| Name | Required | Description | Default |
|---|---|---|---|
| trip_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. The verb 'Get' and the stated return content imply a read-only retrieval, and the description says it returns all stops with arrival/departure times. However, it does not explicitly cover read-only safety, error behavior, timezone semantics, or data freshness.
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 front-loaded with the core action and is appropriately sized for a one-parameter retrieval tool. The trip ID source is repeated in both the usage line and the Args section, which is a minor redundancy but does not harm clarity.
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 details need not be fully specified. The description still usefully states that the result contains all stops with arrival/departure times and documents the only parameter's source. It is nearly complete, with only minor gaps around edge cases and error behavior.
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 one required parameter with 0% description coverage, so the description must compensate. It does so fully by naming the trip_id parameter, explaining it is a GTFS trip ID, providing an example format, and telling the agent where to find valid values in get_departures results.
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: getting the full schedule of a specific trip, including all stops and arrival/departure times. This distinguishes it from general stop or departure tools, though it does not explicitly contrast with siblings like get_route or get_departures beyond noting where trip IDs originate.
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?
Clearly says to use this tool to trace a vehicle along its route and see arrival times at each stop, and explains that trip IDs are found in get_departures output. It gives clear context but does not explicitly state when not to use it or contrast it with other route-planning siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nearby_stopsB
Find public transport stops near a given location.
Args: lat: Latitude lon: Longitude radius: Search radius in meters (default 500, max 2000)
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | ||
| lon | Yes | ||
| radius | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden, and it says nothing about authentication, rate limits, result ordering, or whether the lookup is a safe read. Aside from the radius cap, it offers no behavioral context beyond the bare purpose.
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?
One front-loaded purpose sentence followed by a compact argument list; there is no filler or redundancy. Every line 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?
With an output schema present, return values need not be explained, and a 3-parameter geospatial lookup is relatively simple. Still, the absence of any guidance on result limits or how it differs from search_stops leaves the definition only minimally adequate.
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 0%, so the description must compensate, and it only partly does: lat/lon are merely restated as 'Latitude'/'Longitude', though the radius units (meters) and the max 2000 constraint are genuine additions 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?
States a specific verb (Find) and resource (public transport stops) with the scope 'near a given location', which is clear. It does not, however, distinguish itself from the sibling search_stops, leaving the agent to guess which search tool to pick.
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?
Usage is only implied by the name and the phrase 'near a given location' – an agent can infer this is a proximity/geospatial lookup. There is no explicit when-to-use statement, no exclusions, and no reference to the overlapping sibling search_stops.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_tripA
Plan a public transport trip between two locations in Estonia.
Args: from_place: Origin — stop name (e.g. 'Viru', 'Balti jaam') or coordinates ('59.437,24.745') to_place: Destination — stop name or coordinates date: Travel date YYYY-MM-DD (default: today) time: Travel time HH:MM (default: now) arrive_by: If true, time is desired arrival time num_results: Number of itinerary options (default 3) max_walk_distance: Maximum walking distance in meters (default: ~2000) max_transfers: Maximum number of transfers (default: no limit) transfer_penalty: Penalty per transfer in seconds — higher values prefer fewer transfers (default: 0)
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| time | No | ||
| to_place | Yes | ||
| arrive_by | No | ||
| from_place | Yes | ||
| num_results | No | ||
| max_transfers | No | ||
| transfer_penalty | No | ||
| max_walk_distance | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the burden and does so reasonably: it documents defaults (today, now, 3 results, ~2000m walk limit, no transfer limit, 0 penalty), explains arrive_by semantics, and clarifies transfer_penalty behavior. It doesn't discuss rate limits, permissions, or failure modes, but for a read-only planning tool this is substantial behavioral disclosure.
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 a clear purpose sentence, then a structured Args block. Every line addresses a parameter. The only minor inefficiency is that the Arg lines are terse notes rather than flowing prose, but they are information-dense with no wasted sentences.
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 9-parameter planning tool with an output schema (so return values needn't be explained), the description covers all inputs adequately, including defaults and semantics for behavior-affecting options. It could mention that results are itineraries or any geographic limitations, but otherwise it is complete enough for an agent to invoke 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 0%, so the description must compensate fully—and it does. All 9 parameters get meaningful explanations: from_place/to_place accept stop names or coordinates with examples, date/time formats are given, and transfer_penalty's effect on routing preference is explained. This goes well beyond type signatures.
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 states a specific verb+resource+scope: 'Plan a public transport trip between two locations in Estonia.' This clearly distinguishes it from siblings like get_departures or search_stops, which handle departure/stop lookup rather than full trip planning.
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?
Usage context is implied by 'Plan a public transport trip between two locations in Estonia,' but there are no explicit when/when-not guidelines or named alternatives. An agent must infer that this is the tool for A-to-B routing versus, say, get_route.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_stopsB
Search for Estonian public transport stops by name.
Args: name: Stop name to search for (e.g. 'Viru', 'Balti jaam', 'Tartu')
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It states it searches stops by name but omits whether it is read-only, whether results are paginated, how matching works (exact vs. partial), or any authentication or rate-limit details.
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 two lines and front-loaded with the core purpose, followed by a parameter breakdown and examples. Every part earns its place with no filler or 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?
Given the tool's low complexity, a single required parameter, and the presence of an output schema (so return values need not be described), the definition is nearly complete. It still lacks usage guidance relative to sibling tools and behavioral details like match semantics, but these are minor gaps for a simple search.
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 provides no parameter description (0% coverage), so the description must compensate. It does so by explaining that 'name' is the stop name to search for and giving realistic examples ('Viru', 'Balti jaam', 'Tartu'), which adds meaningful context beyond the bare string type.
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 a specific verb (Search) and resource (Estonian public transport stops) with the scope 'by name'. It distinguishes from location-based siblings like nearby_stops implicitly, but does not name any alternative 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?
No when-to-use or when-not-to-use guidance is provided. It does not mention alternatives such as nearby_stops or how to choose between them. The only implicit cue is 'by name', which is not enough to count as usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_versionA
Return the version of this MCP server.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It says nothing about side effects or that the operation is a side-effect-free read, though for a version query there is little behavior to disclose.
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?
A single front-loaded sentence with zero filler. Every word 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?
With an output schema present, the return value need not be explained, and the zero-parameter signature needs no elaboration. Only the absence of any usage context keeps this from being fully complete for its complexity level.
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 tool takes no parameters, and the description correctly specifies none. Baseline of 4 applies for a parameterless tool.
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 ('Return') and resource ('the version of this MCP server'), making the purpose unambiguous. It does not explicitly contrast itself with siblings, though the transit-oriented siblings make the distinction obvious by domain.
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?
No explicit when/when-not guidance or alternatives are given. For a zero-argument diagnostic tool the intended use (querying server version) is strongly implied by the name and description, so this lands at minimum-viable rather than misleading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tallinn_vehiclesA
Get real-time GPS positions of Tallinn public transport vehicles.
Args: vehicle_type: Filter by type: 'bus', 'tram', or 'trolleybus' (default: all) line: Filter by line/route number (e.g. '2', '17', '42A')
| Name | Required | Description | Default |
|---|---|---|---|
| line | No | ||
| vehicle_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose that positions are real-time and that vehicle_type defaults to all, which is genuinely useful. However, it says nothing about data freshness, coordinate system, rate limits, or the shape of the response beyond what the output schema already covers.
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 one-sentence purpose followed by a compact Args block; no filler. The args section is slightly schema-like but each line earns its place by adding undocumented filter semantics.
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 only two optional parameters, both documented, and an output schema present so return values need no explanation, the definition is nearly complete. Minor gaps remain regarding what the GPS payload contains (coordinates, vehicle IDs, timestamps), but the essentials for calling the tool are present.
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 0%, and the description fully compensates: it names both parameters, enumerates the accepted vehicle_type values ('bus', 'tram', 'trolleybus'), states the default, and gives concrete line examples ('2', '17', '42A'). An agent can invoke this correctly without opening 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 first sentence states a specific verb and resource: 'Get real-time GPS positions of Tallinn public transport vehicles', including the city and the real-time qualifier. It is clear what the tool returns, though it does not distinguish itself from siblings like get_route or get_departures.
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 never says when to use this tool versus the many sibling tools (get_route, get_departures, search_stops). The filter documentation implies a lookup pattern, but no context, prerequisites, or alternatives are offered.
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.
8 tool updates
v1.4.0- First observed
get_departures - First observed
get_route - First observed
get_trip_stops - First observed
nearby_stops - First observed
plan_trip - First observed
search_stops - First observed
server_version - First observed
tallinn_vehicles
TDQS
Scored across 8 tools
Most tools have clearly distinct purposes (stop search vs. departure lookup vs. trip planning). However, search_stops and nearby_stops both return stops, and get_departures and get_trip_stops both return schedule data, which could cause occasional confusion.
Names consistently use snake_case and mostly follow a verb_noun pattern (search_stops, get_departures, plan_trip). Two tools (nearby_stops, tallinn_vehicles) and server_version use noun phrases, a minor deviation.
8 tools is well within the ideal 3–15 range for a public transport data server. Each tool covers a distinct capability without redundancy.
The surface covers stop discovery, departures, trip planning, route/trip details, and real-time vehicles. Missing a direct route search/list tool and service alerts, but core workflows are achievable.
Maintenance
Related MCP Connectors
Lviv public transport MCP: stops, timetables, routes, and live vehicle positions. No API key.
Real-time transit stops, routes, arrivals, vehicle positions, and schedules via OneBusAway APIs.
Read-only public transit departures, stop search, and city coverage for bus and train users.
Stockholm transit: realtime departures, trip planning, disruptions and personal commute status.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides real-time bus and train information across 10+ cities in Malaysia, including live vehicle tracking, arrival predictions, stop search, and route discovery for public transit systems.3MIT
- AlicenseNot gradedqualityDmaintenanceEnables searching for Auckland public transport stops and retrieving real-time transit schedules and timetables using the Auckland Transport API with GTFS standardized data.MIT
- FlicenseNot gradedqualityDmaintenanceProvides real-time and scheduled bus information for Montevideo's public transport system.1-
- FlicenseNot gradedqualityDmaintenanceEnables querying Swiss public transport (trains, buses, trams, boats) for stations, connections, and station boards via the opendata.ch API.-