Skip to main content
Glama
a-rank

Estonian Transport MCP

by a-rank

Estonian Transport MCP

An MCP server for Estonian public transport — timetables, trip planning, stop search, and real-time vehicle tracking.

Tools

Tool

Description

search_stops

Search for stops by name (e.g. "Viru", "Balti jaam")

get_departures

Get upcoming departures from a stop, with real-time predictions

plan_trip

Plan a trip between two coordinates with date/time options

nearby_stops

Find stops within a radius of a location

get_route

Get route details including all stop patterns

get_trip_stops

Get full schedule of a specific trip — all stops with arrival/departure times

tallinn_vehicles

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 uv

No 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.json

  • Windows: %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 uvx in its PATH. If the server fails to start, replace "uvx" with the full path. Find it by running which uvx in 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 8000

Then 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.target

Manual testing

# stdio mode (default)
uvx estonian-transport-mcp

# HTTP mode
uvx estonian-transport-mcp --transport streamable-http --port 8000

Test interactively with the MCP Inspector:

npx @modelcontextprotocol/inspector uvx estonian-transport-mcp

Data Sources & APIs

Peatus.ee — OpenTripPlanner GraphQL API

  • Endpoint: https://api.peatus.ee/routing/v1/routers/estonia/index/graphql

  • Protocol: 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.txt

  • Protocol: 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,destination

    • Vehicle types: 1 = trolleybus, 2 = bus, 3 = tram

    • Coordinates: 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 tools
get_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)

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo
timeNo
limitNo
stop_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
route_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
trip_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lonYes
radiusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo
timeNo
to_placeYes
arrive_byNo
from_placeYes
num_resultsNo
max_transfersNo
transfer_penaltyNo
max_walk_distanceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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')

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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')

ParametersJSON Schema
NameRequiredDescriptionDefault
lineNo
vehicle_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 8 tool updatesv1.4.0
    • First observedget_departures
    • First observedget_route
    • First observedget_trip_stops
    • First observednearby_stops
    • First observedplan_trip
    • First observedsearch_stops
    • First observedserver_version
    • First observedtallinn_vehicles

TDQS

A3.7/5.0

Scored across 8 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

8 tools is well within the ideal 3–15 range for a public transport data server. Each tool covers a distinct capability without redundancy.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers