Skip to main content
Glama

rozkład-mcp 🚆🚌

Polskie rozkłady jazdy dla Twojego agenta AI. Serwer MCP z rozkładami wszystkich pociągów w Polsce, autobusów PKS i (opcjonalnie) komunikacji miejskiej – z wyszukiwaniem połączeń z przesiadkami, tablicą odjazdów i opóźnieniami na żywo.

Działa z Claude, ChatGPT, Cursorem, VS Code, Codexem i każdym klientem MCP. Bez klucza API, bez rejestracji, za darmo – tylko otwarte dane.

Ty:     Jak dostanę się jutro rano ze Zbąszynia do Kórnika?
Agent:  Najszybciej: 8:22 IC „Zielonogórzanin” do Poznania Gł. (peron 3),
        4 min pieszo na dworzec autobusowy, 9:15 PKS Poznań linia 212 → Kórnik 9:46.
        Alternatywa bez autobusu: 7:30 KW → Zbąszynek → EIC → Poznań → PKM4, Kórnik 9:09.

Co potrafi

Narzędzie

Do czego

plan_journey

Połączenia A → B z przesiadkami pociąg ↔ autobus, „wyjazd po” albo „przyjazd do”, limit przesiadek, wybór środków transportu. Miejsce = stacja, całe miasto („Kraków”) albo współrzędne.

departures

Tablica odjazdów/przyjazdów z peronami i opóźnieniami; filtr „tylko w kierunku Poznania”.

trip_details

Cały przebieg pociągu (po numerze: 3510, IC 3510, nazwie: Podhalanin albo ref) z opóźnieniem na każdej stacji, odwołaniami i objazdami.

find_stops / nearby_stops

Wyszukiwanie stacji (literówki i brak polskich znaków OK) oraz przystanków w pobliżu punktu.

data_sources

Jakie dane są załadowane, do kiedy ważne, licencje i wymagane atrybucje.

Pokrycie (domyślnie): wszyscy przewoźnicy kolejowi koordynowani przez PKP PLK – PKP Intercity, Polregio, Koleje Mazowieckie, SKM Trójmiasto, SKM Warszawa, Koleje Śląskie, Dolnośląskie, Wielkopolskie, Małopolskie, ŁKA, Arriva, RegioJet, Leo Express – plus WKD, PKS Poznań, PKS Kalisz i przewoźnicy kaliscy, Sindbad, Kombus. Opcjonalnie komunikacja miejska ~20 miast (Warszawa, Kraków, Poznań, Trójmiasto, GZM, Szczecin, Lublin, Białystok…). Pełna lista: feeds/feeds.json.

Opóźnienia na żywo: pociągi (dane PKP PLK). Ceny biletów: niedostępne.

Related MCP server: transport-gzm

Najszybciej: publiczny serwer (bez instalacji)

Adres MCP: https://rozklad.compabase.com/mcp (Streamable HTTP, bez logowania, limit 60 zapytań/min na IP).

  • Claude (web/desktop): Ustawienia → Connectors → Add custom connector → wklej adres.

  • ChatGPT: Settings → Connectors (tryb deweloperski) → dodaj serwer MCP z tym adresem.

  • Claude Code: claude mcp add --transport http rozklad https://rozklad.compabase.com/mcp

  • Cursor / VS Code: {"mcpServers": {"rozklad": {"url": "https://rozklad.compabase.com/mcp"}}}

Serwer hostuje Compabase pro publico bono. Przy intensywnym użyciu albo gdy chcesz komunikację miejską – uruchom lokalnie (niżej).

Instalacja lokalna

Potrzebujesz Node.js ≥ 20. Zanim paczka trafi na npm, zamiast rozklad-mcp w poleceniach poniżej użyj github:ContentWriterco/rozklad-mcp (np. npx -y github:ContentWriterco/rozklad-mcp). Pierwsze uruchomienie pobiera ~40 MB rozkładów (potem cache i automatyczne odświeżanie co 12 h).

Claude Desktop

Settings → Developer → Edit Config i dopisz:

{
  "mcpServers": {
    "rozklad": {
      "command": "npx",
      "args": ["-y", "rozklad-mcp"]
    }
  }
}

Claude Code

claude mcp add rozklad --scope user -- npx -y rozklad-mcp

Cursor / Windsurf

~/.cursor/mcp.json (Windsurf: ~/.codeium/windsurf/mcp_config.json) – ten sam JSON co dla Claude Desktop.

VS Code (Copilot)

.vscode/mcp.json:

{ "servers": { "rozklad": { "type": "stdio", "command": "npx", "args": ["-y", "rozklad-mcp"] } } }

OpenAI Codex CLI

~/.codex/config.toml:

[mcp_servers.rozklad]
command = "npx"
args = ["-y", "rozklad-mcp"]
tool_timeout_sec = 120

Zdalnie (HTTP) – ChatGPT, agenci w chmurze, n8n

npx -y rozklad-mcp --http --port 3000 --host 0.0.0.0
# endpoint: http://twoj-serwer:3000/mcp   (Streamable HTTP, bezstanowy)   health: /health

albo Docker:

docker build -t rozklad-mcp .
docker run -p 3000:3000 -v rozklad-cache:/data rozklad-mcp

Z kodu źródłowego

git clone https://github.com/ContentWriterco/rozklad-mcp && cd rozklad-mcp
npm install && npm run build
node dist/index.js plan "Zbąszyń" "Kraków" --date jutro --time 7:00

Konfiguracja

Zmienne środowiskowe (w JSON-ie klienta: "env": { "ROZKLAD_FEEDS": "trains,regional,city:Poznań" }):

Zmienna

Domyślnie

Opis

ROZKLAD_FEEDS

trains,regional

Grupy (trains, regional/pks, city), pojedyncze feedy (warszawa), miasta (city:Kraków), regiony (region:wielkopolskie), all, wykluczenia (-sindbad).

ROZKLAD_EXTRA_FEEDS

–

Własne pliki GTFS: moj-pks=https://…/gtfs.zip;inny=https://…

ROZKLAD_FEEDS_FILE

–

Własny rejestr feedów (np. w forku dla jednego regionu).

ROZKLAD_MIN_TRANSFER

4

Minimalny czas przesiadki (min).

ROZKLAD_MAX_WALK_M

500

Maks. dojście pieszo między przystankami przy przesiadce.

ROZKLAD_REFRESH_HOURS

12

Jak często sprawdzać nowe rozkłady.

ROZKLAD_LIVE

1

0 wyłącza opóźnienia na żywo.

ROZKLAD_CACHE_DIR

cache systemu

Gdzie trzymać pobrane rozkłady.

Pamięć: domyślny zestaw (pociągi + PKS) ≈ 400–600 MB RAM i ~3 s startu. Komunikacja miejska dużych miast jest cięższa (Warszawa sama ≈ +600 MB), dlatego włączasz ją świadomie, np. trains,regional,city:Warszawa.

CLI (bez agenta)

rozklad-mcp plan "Warszawa" "Gdańsk" --date piątek --time 16:00
rozklad-mcp plan "Zbąszyń" "Gdańsk Główny" --time 9:00 --arrive-by
rozklad-mcp departures "Poznań Główny" --direction Wrocław --duration 180
rozklad-mcp trip "IC 3510" --date jutro
rozklad-mcp stops "szklarska"
rozklad-mcp sources

Skąd dane? (i dlaczego bez klucza)

Wszystko pochodzi z otwartych danych publikowanych przez przewoźników i zarządców (ponowne wykorzystywanie informacji sektora publicznego, Krajowy Punkt Dostępowy MMTIS):

Serwer nie scrapuje stron przewoźników. Odpowiedzi zawierają wymagane atrybucje źródeł. Dane bywają niekompletne (np. zmiany w ostatniej chwili, autobusowa komunikacja zastępcza) – przed ważną podróżą sprawdź u przewoźnika.

Brakuje Twojego PKS-u albo miasta? 🙋

To najprostszy i najcenniejszy sposób, żeby pomóc. Większość PKS-ów nie publikuje jeszcze danych – ale coraz więcej musi (rozporządzenie UE 2017/1926). Jeśli znasz link do pliku GTFS:

  1. dopisz wpis do feeds/feeds.json (szablon w CONTRIBUTING.md),

  2. npm run check-feeds – sprawdzi, czy link działa,

  3. otwórz Pull Request.

Nie programujesz? Otwórz zgłoszenie „Dodaj przewoźnika” z linkiem albo nazwą firmy – albo napisz do przewoźnika, żeby opublikował GTFS w KPD.

Szukamy pomocy: Wrocław (blokuje pobieranie automatyczne), Łódź (brak stałego linku), PKS-y w całej Polsce, opóźnienia na żywo dla autobusów (GTFS-Realtime).

Jak to działa

  • GTFS (pociągi + autobusy + miasta) łączony w jedną sieć w pamięci; przystanki tej samej stacji grupowane, przystanki w promieniu 500 m łączone przejściem pieszym – stąd przesiadki pociąg ↔ PKS na dworcach.

  • Wyszukiwanie: Connection Scan Algorithm w wariancie wielokryterialnym (czas przyjazdu × liczba przesiadek) – kilkadziesiąt ms na zapytanie dla całej Polski.

  • Opóźnienia: GTFS-RT/JSON z danymi PKP PLK, cache 90 s.

  • Zero natywnych zależności (działa na macOS/Windows/Linux/ARM), ~3 tys. linii TypeScriptu – łatwo zrozumieć i rozbudować.

Rozwój

npm install
npm test            # build + testy (bez internetu, na syntetycznej sieci)
npm run check-feeds # czy wszystkie linki w rejestrze działają
ROZKLAD_LOG=debug node dist/index.js plan "A" "B"

Pomysły na rozwój: ceny biletów, GTFS-Realtime dla miast (Poznań, Gdańsk, Szczecin publikują), komunikacja zastępcza z komunikatów PLK, mapy tras (shapes), utrwalony indeks dla szybszego startu.

Licencja

Kod: MIT. Dane: na licencjach źródeł – patrz data_sources i feeds/feeds.json. Projekt niezależny, niezwiązany z Grupą PKP ani przewoźnikami.


English

rozklad-mcp is an MCP server that gives AI agents Polish public transport timetables: every train in Poland (all carriers dispatched by PKP PLK), PKS/regional buses that publish open data, and optionally urban transit in ~20 cities. Tools: plan_journey (multi-criteria connection scan with train↔bus transfers, depart-after / arrive-by, coordinates as endpoints), departures, trip_details (live delays & cancellations), find_stops, nearby_stops, data_sources. No API key: it uses open GTFS data (PKP PLK via mkuran.pl, carriers' own feeds). Install with npx -y rozklad-mcp in any MCP client, or run --http for a remote Streamable HTTP endpoint. Station names work with or without Polish diacritics; a bare town name means all of its stops. Contributions of new feeds are very welcome – see CONTRIBUTING.md.

Available Tools

6 tools
data_sourcesData sources, coverage and licencesB
Read-only
Inspect

Which carriers/feeds are loaded, their validity dates, licences and required attribution; which feeds can be enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and openness profile is covered structurally. The description adds scope context (validity dates, licence/attribution metadata) beyond the annotations, but says nothing about response format, freshness of the data, or why open-world behavior matters here. Adequate but not rich.

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?

A single compact sentence with no redundancy, and the most important content (which feeds are loaded) is front-loaded. The telegraphic noun-phrase style is slightly less readable than a full sentence but costs no extra tokens.

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 zero-parameter, read-only metadata tool with no output schema, the description effectively does the work of documenting the return payload by naming the fields the agent will get back. It would be complete if it also signalled that no arguments are accepted, but overall it covers what an agent needs to call it.

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 zero parameters, so there is no parameter semantics to explain, which is the baseline-4 case. Nothing in the description misleads about inputs.

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 names a concrete domain and enumerates the exact content returned: loaded carriers/feeds, validity dates, licences, required attribution, and enable-able feeds. It is clearly distinguishable from the journey/departure/stop siblings, though it is written as a noun fragment rather than a verb-led statement of what the tool does.

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?

There is no explicit when-to-use guidance, no prerequisites, and no named alternatives. The phrase 'which feeds can be enabled' hints at a provenance-checking workflow before plan_journey, but the agent must infer that entirely; nothing in the text tells it when this tool is the right choice over the siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

departuresStation departures / arrivals boardA
Read-only
Inspect

Departure (or arrival) board for a station or stop: time, live delay, train/bus line, platform, destination and main stops. Optionally only services going towards a given place.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate: "YYYY-MM-DD", "today", "tomorrow", a weekday ("friday", "piątek") or "DD.MM". Default: today.
liveNo
timeNoLocal time "HH:MM" (Europe/Warsaw). Default: now (today) or 04:00 (other days).
limitNoMax rows (default 30).
modesNoRestrict to these modes, e.g. ["train"] or ["train","bus"]. Default: all loaded.
stationYesStation or stop name, e.g. 'Kraków Główny', 'Zbąszyń'
arrivalsNoShow arrivals instead of departures.
directionNoOnly services that later call at this place, e.g. 'Poznań'.
duration_minutesNoTime window (default 120).

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and external-data profile is covered. The description adds useful content by listing what the board surfaces (live delay, platform, main stops) and the direction filter, but says nothing about freshness of 'live' data, rate limits, or result ordering.

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?

Two sentences, front-loaded with the core purpose and followed by the optional scoping filter; no filler. The field enumeration is dense but earns its place by telling the agent what comes back.

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 read-only board with strong schema coverage, the description adequately covers what the tool returns and the main optional filter. Remaining gaps (live-data freshness, pagination beyond the default limit) are largely handled by the schema defaults.

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 89%, so the schema already documents nearly every parameter including date formats, mode enums, limits and the time window. The description only echoes the direction filter ('services going towards a given place'), adding little beyond what the schema states.

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 states a specific verb+resource: a departure/arrival board for a named station or stop, and enumerates the fields returned (time, delay, line, platform, destination). It implicitly distinguishes itself from siblings like find_stops and nearby_stops, though it never names them explicitly.

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 implied — use it when you know the station and want its board — and the direction filter is flagged as optional. There is no explicit when-not guidance or pointer to alternatives such as plan_journey for full itineraries, so the agent must infer the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_stopsFind stations and stopsA
Read-only
Inspect

Search stations/stops by name (fuzzy, diacritics optional). Shows modes, coordinates and source feeds.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
modesNoRestrict to these modes, e.g. ["train"] or ["train","bus"]. Default: all loaded.
queryYesName or part of it, e.g. 'warszawa centr', 'Szklarska'

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavior beyond that: fuzzy matching, diacritics being optional, and the fields returned (modes, coordinates, source feeds), which is valuable since there is no output schema. It stops short of describing result ordering, limits, or what an empty match looks like.

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?

Two compact sentences with no filler. The core action is front-loaded, and the parenthetical detail and return-field note are tightly packed into the second clause.

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 three-parameter read-only search with no output schema, the description covers the action, matching semantics, and return fields. What is missing is limit/default behavior and routing to the sibling tools, but no output schema exists so return documentation need not be exhaustive.

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 coverage is 67%: query and modes are documented in the schema, while limit (1-50) has no description anywhere. The description adds real semantic value for query by specifying fuzzy matching and diacritics behavior, which the schema does not, so it slightly compensates but does not close the limit gap.

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 states a specific verb and resource ('Search stations/stops by name') and qualifies the matching semantics as fuzzy with optional diacritics. It implicitly contrasts with the proximity-based sibling nearby_stops by emphasizing name matching, but never names that 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 Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the 'by name' qualifier suggests when this is appropriate versus nearby_stops, but there is no explicit when-to-use, when-not-to-use, or named alternative. An agent must infer the routing from the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nearby_stopsStops near a locationB
Read-only
Inspect

Stations and stops within a radius of coordinates (e.g. after geocoding an address).

ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lonYes
modesNoRestrict to these modes, e.g. ["train"] or ["train","bus"]. Default: all loaded.
radius_mNoDefault 800 m

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the operation read-only and open-world, so the safety profile is covered. The description adds that results are spatial and tied to coordinates, but omits result limits, pagination, or whether all modes are included by default.

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 definition is a single front-loaded sentence with no wasted clauses. It is appropriately brief for a simple lookup, though the absence of any second sentence leaves useful context unstated.

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?

For a relatively simple spatial tool with annotations and no output schema, the description is minimally adequate. It implies the return type (stations and stops) but does not cover filtering behavior or practical limits, leaving some gaps for an agent invoking it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 50% schema description coverage and no parameter details in the description, the text mentions coordinates and a radius only conceptually. It does not explain the modes filter, radius defaults/bounds, or coordinate constraints, adding little 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?

The description states a clear resource (stations and stops) and spatial scope (within a radius of coordinates), which distinguishes it from generic stop lookups. It does not explicitly differentiate itself from sibling tools like find_stops, 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical 'e.g. after geocoding an address' implies a common workflow, but the description never states when to use this tool versus find_stops or how it complements plan_journey. Usage context is only implied, not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_journeyPlan a journey (train / bus)A
Read-only
Inspect

Find connections between two places in Poland, including changes between trains and buses (PKS). from/to accept a station name ("Poznań Główny"), a town ("Zakopane" = all its stops) or coordinates "52.40,16.91". Returns several options with times, platforms, operators, changes and live delays (today).

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesDestination: station, town or 'lat,lon'
dateNoDate: "YYYY-MM-DD", "today", "tomorrow", a weekday ("friday", "piątek") or "DD.MM". Default: today.
fromYesOrigin: station, town or 'lat,lon'
liveNoInclude live delays (default true).
timeNoLocal time "HH:MM" (Europe/Warsaw). Default: now (today) or 04:00 (other days).
modesNoRestrict to these modes, e.g. ["train"] or ["train","bus"]. Default: all loaded.
resultsNoNumber of options (default 5).
arrive_byNoIf true, `time` is the latest arrival time instead of the earliest departure.
max_transfersNoMaximum number of changes (default 3, 0 = direct only).
min_transfer_minutesNoMinimum time for a change (default 4).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint and openWorldHint, so safety is covered externally, and the description adds genuinely useful behavior: the return payload (times, platforms, operators, changes) and the time-sensitivity caveat that live delays only apply 'today'. It also discloses the Poland-only coverage boundary, which is not in any structured field.

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?

Two dense sentences with no filler; the core capability leads and the return/time-sensitivity details follow. Every clause carries information an agent needs to select and call the tool.

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 10-parameter, no-output-schema tool with only two annotations, the description adequately covers scope, accepted inputs and the shape of the result. It does not address no-connection or error outcomes, and transfer/arrive_by semantics are left entirely to the schema, but nothing essential to correct invocation is missing.

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 100%, so the schema already documents every parameter including formats, defaults and enum values for 'modes'. The description largely restates the from/to input forms ('station name', 'town', coordinates) already present in the schema properties, with only the 'Zakopane = all its stops' clarification adding marginal meaning.

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?

States a specific verb+resource ('Find connections between two places in Poland') and immediately scopes it to multi-modal routing including train/bus changes, which clearly separates it from siblings like departures and trip_details. The geographic scope (Poland) and the accepted origin/destination forms are stated up front.

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 implied rather than declared: the description positions this as a point-to-point planner, so an agent can infer it is the right tool for route planning versus departures/trip_details. However, no sibling is named and no when-not-to-use condition is given, so routing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trip_detailsTrain / trip details with live delayA
Read-only
Inspect

All stops of one train or bus run with times, platforms and live delays/cancellations. Identify it by ref (from plan_journey/departures) or by train number/name (e.g. '3510', 'IC 3510', 'Podhalanin') plus date.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoTrip ref like 'polish-trains:PLK_IC_2026_123@2026-10-20'
dateNoDate: "YYYY-MM-DD", "today", "tomorrow", a weekday ("friday", "piątek") or "DD.MM". Default: today.
liveNo
trainNoTrain number or name

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-data exposure are covered structurally. The description adds that results include live delays and cancellations, which is useful behavioral context about data freshness, but it says nothing about error behavior, ambiguity handling, or rate limits.

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?

Two sentences: the first front-loads what the tool returns, the second explains how to identify the trip. No filler, and the most decision-relevant information (output contents) comes first.

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 no output schema, the description correctly carries the burden of describing the return payload (stops, times, platforms, live status). It does not address what happens if neither `ref` nor `train` is supplied, nor the meaning of the `live` flag, leaving minor gaps for a zero-required-parameter tool.

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 75%, so the schema already documents `ref`, `date`, and `train`. The description still adds value: it explains where `ref` comes from and gives accepted train formats ('3510', 'IC 3510', 'Podhalanin'), clarifying matching semantics. The `live` boolean remains undocumented in both places, which caps this below 5.

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 names a specific resource (all stops of one train/bus run) and enumerates the returned fields (times, platforms, live delays/cancellations), so the agent immediately knows what this returns versus the summary-level sibling tools. It also points at plan_journey/departures as the origin of the `ref`, distinguishing it from those tools.

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?

It gives two concrete ways to identify the trip — by `ref` from plan_journey/departures, or by train number/name plus date — which is real invocation guidance. It stops short of stating when *not* to use it (e.g., for journey planning, use plan_journey), so it lacks explicit exclusions.

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. 6 tool updatesv0.1.0
    • First observeddata_sources
    • First observeddepartures
    • First observedfind_stops
    • First observednearby_stops
    • First observedplan_journey
    • First observedtrip_details

TDQS

A3.8/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a clearly distinct purpose: journey planning, departure boards, trip details, stop search by name, stop search by coordinates, and data source metadata. The boundaries are well defined, and descriptions clarify how tools relate (e.g., ref from plan_journey/departures). No tool overlaps significantly with another.

Naming Consistency4/5

All names use snake_case consistently, which aids readability. However, the set mixes verb-led names (plan_journey, find_stops) with noun-led names (data_sources, departures, trip_details, nearby_stops), a minor deviation from a single pattern.

Tool Count5/5

Six tools are well-scoped for a journey-planning server covering routing, stop lookup, real-time boards, trip details, and metadata. Each tool has a clear, non-redundant role without obvious padding or missing essentials.

Completeness4/5

The surface covers core operations: find stops, plan journeys, get departures/arrivals, inspect trip details, and discover data sources. Minor gaps exist, such as no dedicated tool for service alerts/disruptions or line-level schedule queries, but agents can work around these using available tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides real-time Belgian rail (SNCB/NMBS) data via the iRail API, enabling AI agents to query train schedules and live information.
    15 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to access real-time public transport data for Moscow and the Moscow region, aggregating and reconciling information from multiple sources. Provides tools for finding stops, live arrival boards, vehicle tracking, route details, and ETA calculations.
    MIT