The separation between 'all buses on this line', 'all buses approaching this stop' and 'buses of this line approaching this stop' looks redundant until you are standing at a stop that four routes serve — the third one is the answer, and it is a distinct tool rather than a filter you have to construct. Coverage is honest about its edges: ESHOT is the live layer, the rail and tram tools are timetables and distances, and journey planning across modes is listed as future work rather than implied.
An MCP server over İzmir's open transport data. It connects to the ESHOT datasets on the city's open data portal and adds the rail and tram networks, so questions about a specific stop, line or journey are answered from live and published data rather than from a model's memory of a timetable.
- Every bus currently approaching a given stop id — `duraga_yaklasan_otobusleri_getir`
- Live positions of all buses on a line — `hattin_anlik_otobus_konumlarini_getir`
- Only the buses of one line approaching one stop, which is the question people actually ask — `hattin_duraga_yaklasan_otobuslerini_getir`
- Stops and lines found by name or by text in the route — `durak_ara`, `hat_ara`, `hat_detaylarini_ara`
- Bus timetables by line number, and the route's latitude and longitude geometry — `hat_sefer_saatlerini_ara`, `hat_guzergah_koordinatlarini_getir`
- The nearest stops or İZBAN stations to a coordinate, with the browser able to supply your own position — `en_yakin_duraklari_bul`, `konumumu_al`
- İZBAN: stations searched by name, departure times between two stations, and the fare under the distance-based pricing scheme — `izban_istasyon_ara`, `izban_sefer_saatlerini_getir`, `izban_tutar_hesapla`
- Metro: the full station list, all departure times, and the distance in metres between two stations — `metro_istasyonlarini_getir`, `metro_sefer_saatlerini_getir`, `metro_istasyonlari_arasi_mesafe_hesapla`
- Trams: lines, the stations on a line, its departures, and distances between stops on the Karşıyaka, Konak and Çiğli lines — `tramvay_hatlarini_getir`, `tramvay_istasyonlarini_getir`, `tramvay_seferlerini_getir`, `karsiyaka_tram_duraklar_arasi_mesafe_hesapla`, `konak_tram_1_duraklar_arasi_mesafe_hesapla`, `konak_tram_2_duraklar_arasi_mesafe_hesapla`, `cigli_tram_duraklar_arasi_mesafe_hesapla`
No account and no key — the data comes from the city's public open data portal. The quickest path is npm: a client entry running `npx` against the `izmir-ulasim-mcp` package, from `izmir-ulasim-mcp` (1.1.4). To run the Python source instead, Python 3.11+ with requests, mcp-cli, fastmcp, pandas, numpy, flask, pyarrow and fastparquet; `uv sync` or `pip install -r requirements.txt`, then point the client at `izmir_ulasim_main.py`. One tool reads your precise location through the browser, so grant that only when you want a nearest-stop answer.
Build from source — clone the repository and build it, then point your client at the binary
