Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Lviv Public Transport

REMOTE · API.LAD.LVIV.UA

Lviv public transport MCP: stops, timetables, routes, and live vehicle positions. No API key.

Available components

−1 this week 85 Trust /100

Last scanned (11 hours ago)

Scores higher than 91% of remote servers

Reachable. Last reached 4 Nov 2026.

Category Maps and Location

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security74
Transport & Reachability100
Schema Quality & AI Usability77
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 3572 tokens (~274/item across 13 items; 9 tools + 4 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 9 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 11 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 0
    • MCP protocol: Implements a current MCP spec version (2026-07-28). functional
    • MCP protocol version: 2025-11-25 → 2026-07-28 functional
    • Server version: 1.8.10 → 1.8.11 functional
  • 3 Nov 26 −1
    • The server changed its declared name: com.lad.lviv/timetable-api → io.github.vbhjckfd/timetable-api-node security
    • New resource “routes” functional
    • Server version: 1.8.9 → 1.8.10 functional
    • Server version: 1.8.8 → 1.8.9 functional
  • 2 Nov 26 0
    • Server version: 1.8.7 → 1.8.8 functional
  • 1 Nov 26 0
    • Server version: 1.8.6 → 1.8.7 functional
  • 29 Oct 26 0
    • Server version: 1.8.5 → 1.8.6 functional
  • 26 Oct 26 0
    • Server version: 1.8.4 → 1.8.5 functional
  • 25 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “find_routes_between” rewrote its description, which is the text the model reads security
    • Tool “get_route_realtime” rewrote its description, which is the text the model reads security
    • Schema quality: 221 → 295 ▼ functional
    • Schema quality: 2439 → 2730 ▼ functional
    • Server version: 1.8.2 → 1.8.4 functional
    • Server version: 1.7.11 → 1.8.2 functional
    • New tool “get_disruptions” functional
    • “find_routes_between” added an optional parameter “arrive_by” cosmetic
    • “find_routes_between” added an optional parameter “depart_at” cosmetic
    • “find_routes_between” added an optional parameter “from_lat” cosmetic
    • “find_routes_between” added an optional parameter “from_lng” cosmetic
    • “find_routes_between” added an optional parameter “to_lat” cosmetic
    • “find_routes_between” added an optional parameter “to_lng” cosmetic
    • “get_nearby_vehicles” added an optional parameter “lowfloor_only” cosmetic
    • “get_route_realtime” added an optional parameter “direction” cosmetic
    • “get_stop_realtime” added an optional parameter “lowfloor_only” cosmetic
    • “find_routes_between” reworded the description of “from_stop_id” cosmetic
    • “find_routes_between” reworded the description of “to_stop_id” cosmetic
    • “find_routes_between” made “from_stop_id” optional cosmetic
    • “find_routes_between” made “to_stop_id” optional cosmetic
  • 24 Oct 26 0
    • Tool “get_disruptions” was removed ▼ security
    • The server rewrote its instructions, which are the text every model session reads security
    • Schema quality: 2730 → 2439 ▲ functional
    • Server version: 1.8.0 → 1.7.11 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Probed https://api.lad.lviv.ua/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=lad.lviv.ua CN=WE1,O=Google Trust Services,C=US 28 Sept 2026 27 Dec 2026 ECDSA 256 ECDSA-SHA256 2f1e673a12fdef7f13e452c9ae7ef39b
SANs: lad.lviv.ua, *.lad.lviv.ua
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of api.lad.lviv.ua. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
ua. present 51024, 51024 13, 13 Verified
lviv.ua. present 21256 13 Verified
lad.lviv.ua. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
x-content-type-options nosniff
x-frame-options SAMEORIGIN
referrer-policy same-origin

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://api.lad.lviv.ua/mcp Verified 200
http (plaintext) http://api.lad.lviv.ua/mcp HTTPS enforced 301 https://api.lad.lviv.ua/mcp
MCP tools · 9 exposed · ~2,394 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
find_routes_between ~750

Lists the routes from one place to another: which stop to board, where to get off, the direction's destination, stops in between, and the walk at each end — best first, walking counted. Each end is a stop ID (`from_stop_id`) or coordinates (`from_lat` + `from_lng`), e.g. an address the user gave; a point covers every stop within a 600 m walk of it. `options` are direct routes. `transfer_options` have exactly one interchange (never more): ride `legs[0]`, walk `transfer_walk_meters` (within a 300 m stop cluster, 0 when it is the same stop) to `legs[1].board_stop`, ride `legs[1]`. They are listed when there is no direct route or when they beat the best direct one. Every option carries `schedule`: by the timetable, when to leave, when each leg boards and alights, when you arrive, and `total_minutes` door to door. Plan for now by default, or pass `depart_at` or `arrive_by` ("HH:MM" Lviv time today, or ISO 8601). When planning for now, options also carry `next_departures`: the live next departures of the first leg from its boarding stop, so no separate `get_stop_realtime` call is needed. `map_stops` holds the best trip's stops in riding order, each with a `role` (board, transfer — or transfer_alight + transfer_board when the interchange is a walk — and alight). Use when the user asks how to get from A to B, which bus/tram goes from one place to another, how long it takes, or when to leave to be somewhere on time. A stop end covers every stop within a 300 m walk of it, since a line's two directions often stop on opposite sides of a street under different names; `board_stop` says where to actually wait. Routes the city has suspended, and stops a detour skips, are left out. `walk_meters` is set when the two ends are within a 300 m walk of each other: no ride is searched then, so tell the user to walk. Otherwise both lists empty means the trip needs two or more transfers. Get stop IDs with `search_stops` or `get_stops_around_location`.

NameTypeReqDescription
arrive_bystring–Arrive by this time: "HH:MM" Lviv time today, or ISO 8601. Not together with `depart_at`.
depart_atstring–Leave at this time: "HH:MM" Lviv time today, or ISO 8601. Default now. Not together with `arrive_by`.
from_latnumber–Decimal latitude of the start point, WGS84 (e.g. 49.842 for central Lviv).
from_lngnumber–Decimal longitude of the start point, WGS84 (e.g. 24.031 for central Lviv).
from_stop_idinteger–Stop ID where the trip starts. Give this or `from_lat` + `from_lng`.
to_latnumber–Decimal latitude of the destination, WGS84 (e.g. 49.842 for central Lviv).
to_lngnumber–Decimal longitude of the destination, WGS84 (e.g. 24.031 for central Lviv).
to_stop_idinteger–Stop ID where the trip ends. Give this or `to_lat` + `to_lng`.
NameTypeReqDescription
dataobjectyes–
ui_blocksarrayyes–
viewstringyes–

No examples provided.

get_disruptions ~175

Lists closures, detours and moved stops the city announced that are in force today: affected routes, the streets a detour uses, routes to take instead of a suspended one, reason, dates and source. The GTFS stop lists and timetables do not reflect any of this. Use when the user asks about road works, closures, detours, or why a route is not running or a vehicle is off its usual path. Pass `route` and/or `stop_id` to get only the entries touching them; omit both for the whole city.

NameTypeReqDescription
routestring–Only disruptions on this route, by short name (e.g. "Т30", "А34"). Omit for all routes.
stop_idinteger–Only disruptions at this stop. Omit for all stops.
NameTypeReqDescription
dataobjectyes–
ui_blocksarrayyes–
viewstringyes–

No examples provided.

get_nearby_vehicles ~290

Returns live vehicles near a point, nearest first, each with its route, destination, and distance. Use when the user asks "what transport is near me right now?" or wants a live map around a location. Narrow with `route` when the user cares about one line; prefer `get_route_realtime` for a whole route and `get_stop_realtime` for arrival times at a stop. Requires decimal latitude and longitude (WGS84).

NameTypeReqDescription
latitudenumberyesDecimal latitude of the centre point, WGS84 (e.g. 49.842 for central Lviv).
limitinteger–Maximum vehicles to return, nearest first (1–50, default 15). `total` reports how many were in range.
longitudenumberyesDecimal longitude of the centre point, WGS84 (e.g. 24.031 for central Lviv).
lowfloor_onlyboolean–Only low-floor vehicles (step-free: wheelchairs, prams). Timetable entries without a tracked vehicle are left out, since their floor is unknown. Default false.
radius_metersinteger–Search radius in metres (100–1000, default 500).
routestring–Only vehicles on this route, by short name (e.g. "Т30", "А1"). Omit for all routes.
NameTypeReqDescription
dataobjectyes–
ui_blocksarrayyes–
viewstringyes–

No examples provided.

get_route_realtime ~242

Returns every vehicle currently running on a route: position, the destination it is heading to, and its next stop with estimated arrival. `headways` sums up each direction: how many vehicles run, the live gaps between consecutive vehicles in minutes (front to back), and how often the timetable says it should run right now. Use when the user asks "where is my tram/bus right now?", how many vehicles are running, how far the next one is, or how often a route runs. Pass `direction` (0 or 1, as in `get_route_static`'s `stops`) to get only one way. Prefer `get_stop_realtime` when the user is at a stop and wants arrival times there. Requires a route short name (e.g. "T30", "32A") or numeric external ID.

NameTypeReqDescription
directioninteger–Only vehicles heading this way: 0 or 1, the index into get_route_static's `stops`. Omit for both.
route_namestringyesRoute short name (e.g. "T30", "32A") or numeric external ID.
NameTypeReqDescription
dataobjectyes–
ui_blocksarrayyes–
viewstringyes–

No examples provided.

get_route_static ~195

Returns static route data: name, long name, vehicle type, colour, the ordered stop list for both directions, and the timetable of departures from the first stop (workday, Saturday and Sunday). Use when the user asks which stops a route serves, where it goes, or its scheduled departure times. Set `include_shapes` only when you will draw the route on a map — the polylines are large and carry nothing a text answer needs. Do NOT use this for live vehicle positions — use `get_route_realtime` instead. Requires a route short name (e.g. "T30", "32A") or numeric external ID.

NameTypeReqDescription
include_shapesboolean–Include route polylines ([lat, lng] points per direction) for map drawing. Default false.
route_namestringyesRoute short name (e.g. "T30", "32A") or numeric external ID.
NameTypeReqDescription
dataobjectyes–
ui_blocksarrayyes–
viewstringyes–

No examples provided.

get_stop_realtime ~175

Returns live arrivals at a stop: route, destination, vehicle type, minutes until arrival, and each vehicle's position. Use this as the **default tool** when the user asks about arrivals, departures, or the next bus/tram at a specific stop. Requires a numeric stop ID (shown on stop signage); use `search_stops` when you have a stop name, or `get_stops_around_location` when you have coordinates.

NameTypeReqDescription
lowfloor_onlyboolean–Only low-floor arrivals (step-free: wheelchairs, prams). Timetable entries without a tracked vehicle are left out, since their floor is unknown. Default false.
stop_idintegeryesMunicipal stop code shown on stop signage (e.g. 707). Accepts a positive integer or an equivalent digit-only string.
NameTypeReqDescription
dataobjectyes–
ui_blocksarrayyes–
viewstringyes–

No examples provided.

get_stops_around_location ~227

Finds stops near a geographic point, returning each stop's numeric ID, name, coordinates, walking distance, and the routes serving it. Use this as the **first step** when the user gives an address or coordinates and you need stop IDs for `get_stop_realtime` or `find_routes_between`. Use `search_stops` instead when the user gives a stop name. Default radius is 1 000 m; narrow it (e.g. 300 m) for dense urban areas or widen it (up to 3 000 m) for rural locations.

NameTypeReqDescription
latitudenumberyesDecimal latitude of the search centre, WGS84 (e.g. 49.842 for central Lviv).
longitudenumberyesDecimal longitude of the search centre, WGS84 (e.g. 24.031 for central Lviv).
radius_metersinteger–Search radius in metres (50–3000, default 1000). Use ~300 for dense urban intersections, up to 3000 for suburban or rural areas.
NameTypeReqDescription
dataobjectyes–
ui_blocksarrayyes–
viewstringyes–

No examples provided.

get_vehicle_info ~145

Returns details for one vehicle by ID: position, route, destination, license plate, and its upcoming stops with names and estimated arrival times. Use when the user wants to follow a particular vehicle, e.g. "where does this tram go next?" or "when will it reach X?". Vehicle IDs come from `get_route_realtime`, `get_nearby_vehicles`, or `get_stop_realtime` results. Do NOT use this to get all vehicles on a route — use `get_route_realtime` instead.

NameTypeReqDescription
vehicle_idstringyesVehicle ID as returned by get_route_realtime, get_nearby_vehicles, or get_stop_realtime.
NameTypeReqDescription
dataobjectyes–
ui_blocksarrayyes–
viewstringyes–

No examples provided.

search_stops ~195

Finds stops by name (Ukrainian or English transliteration, case-insensitive, partial match) and returns each stop's numeric ID, coordinates, and the routes serving it. Use this as the **first step** when the user names a stop or landmark stop (e.g. "Опера", "Rynok", "Головний вокзал") and you need a stop ID for `get_stop_realtime` or `find_routes_between`. One name usually covers both sides of the street under different IDs; each is returned, and the `routes` list tells them apart. Use `get_stops_around_location` instead when you have coordinates rather than a name.

NameTypeReqDescription
limitinteger–Maximum stops to return (1–25, default 10).
querystringyesStop name or part of it, e.g. "Ринок", "opera", "Стрийська".
NameTypeReqDescription
dataobjectyes–
ui_blocksarrayyes–
viewstringyes–

No examples provided.

Install

How do I install the Lviv Public Transport MCP server?

Lviv Public Transport is a hosted endpoint at https://api.lad.lviv.ua/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · api.lad.lviv.ua

# add to Claude Code
claude mcp add --transport http vbhjckfd-timetable-api-node 'https://api.lad.lviv.ua/mcp'
Common questions

What is the Lviv Public Transport MCP server?

Lviv Public Transport is an MCP server listed in the public MCP registry as io.github.vbhjckfd/timetable-api-node. Lviv public transport MCP: stops, timetables, routes, and live vehicle positions. No API key. This page covers its hosted endpoint (https://api.lad.lviv.ua/mcp).

Is the Lviv Public Transport MCP server safe to use?

Lviv Public Transport scores 85 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Lviv Public Transport MCP server expose?

Lviv Public Transport exposes 9 tools: get_stop_realtime, search_stops, find_routes_between, get_route_static, get_route_realtime, and 4 more. Their descriptions and schemas cost roughly 2,394 tokens of context every time the server is loaded.

Does the Lviv Public Transport MCP server require authentication?

No. We connected to Lviv Public Transport without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the Lviv Public Transport MCP server still maintained?

Lviv Public Transport is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.