Skip to main content
Glama

Dorthin, wo nicht gesucht wird

Wir stellen eine Reise mit Umstieg zusammen, wenn es kein direktes Ticket gibt.

Die Suche eines beliebigen Dienstes beantwortet die Frage „Gibt es ein Ticket von A nach B?“. Wenn es keine direkte Verbindung gibt, ist die Ausgabe leer – und der Nutzer geht. Dabei kann man hinkommen, und beide benötigten Tickets werden dort ebenfalls verkauft.

Lebendiges Beispiel. Die Anfrage „Moskau → Uglitsch“ vom 20. August 2026 im MCP Tutu:

search_multitransport → 0 вариантов
search_bus            → 0 вариантов
search_rail           → 0 вариантов

Unsere Antwort auf dieselbe Anfrage:

Москва → Ярославль   автобус 09:00 → 13:00    863 ₽
пересадка в Ярославле — 40 минут
Ярославль → Углич    автобус 13:40 → 16:25    616 ₽
                                       итого  1 479 ₽, на месте в 16:25

Beide Tickets verkauft Tutu. Deren Suche wird diese Route nie anzeigen.

So funktioniert es

запрос «Москва → Плёс»
   ↓
MCP Туту: прямой поиск → 0 вариантов, регион «Ивановская область»
   ↓
узлы-кандидаты: справочник «регион → центр» + предложения агента
   ↓
для каждого узла: сначала плечо «узел → цель», затем «откуда → узел»
   ↓
код сводит стыковки: отбрасывает рейсы, на которые не успеть, считает запас и сумму
   ↓
карточки маршрутов

Die Suche steuert ein Agent: Er entscheidet selbst, welche Städte und Daten er prüft, und der Nutzer sieht seine Arbeit als Verlauf auf dem Bildschirm. Aber Umstiege, Preise und Ranking berechnet der Code – das Modell wird nicht an die Arithmetik gelassen, genau dort machen Agenten Fehler. Schwere Antworten von Tutu gehen nicht durch das Modell: Es erhält Identifikatoren der gefundenen Streckenabschnitte und kurze Zusammenfassungen, während die vollständigen Daten direkt in die Oberfläche gehen.

Wenn man am gewählten Tag nicht abreisen kann, schickt das Backend den Agenten zusätzlich nach Hotels: Es wird der nächstgelegene Abreisetag gesucht und eine Unterkunft für genau so viele Nächte ausgewählt, wie man warten muss.

Wenn der Agent nicht verfügbar ist oder an ein Limit stößt, wechselt die Oberfläche stillschweigend auf die deterministische Suche – der Bildschirm zeigt in jedem Fall ein Ergebnis.

Related MCP server: mcp-sbb-transport

Start

npm install
cp .env.example .env          # вписать OPENROUTER_API_KEY (необязательно)
npm run db:up                 # Postgres в Docker
npm run migrate               # схема базы
npm run warm                  # прогрев кэша реальными ответами Туту
npm run dev                   # http://localhost:3100

OPENROUTER_API_KEY ist optional: Ohne ihn wird die Städte-Hinweisfunktion deaktiviert, die Suche arbeitet mit dem Regionenverzeichnis.

Befehle

Befehl

Funktion

npm run dev

Anwendung auf http://localhost:3100

npm run route -- Moskau Uglitsch 2026-08-20

Routenzusammenstellung in der Konsole

npm run warm

Cache-Vorwärmung aus src/modules/tutu/fixtures/

npm run cache

Was sich gerade im Cache befindet

npm run smoke

Prüfung der Live-Verbindung mit MCP Tutu

npm run db:up / db:down

Postgres in Docker

npm run migrate

Prisma-Migrationen

npm run lint

ESLint

Struktur

Der gesamte Code liegt in src/, im Stammverzeichnis nur die Konfiguration. Die Oberfläche ist in einem Ordner zusammengefasst, die Logik ist nach Modulen aufgeteilt – nach Sinn, nicht nach Dateityp:

src/
  app/                роутинг Next: страница и три API — тонкие, только вызовы модулей
    api/agent/          агентный поиск потоком
    api/route/          детерминированный поиск (страховка)
    api/stay/           гостиницы

  frontend/           всё, что видно в браузере
    components/route/   форма, календарь, подсказки, лента, карточки, гостиницы
    hooks/              чтение потока агента, определение города
    design.ts           палитра и подписи из макета
    format.ts, geo.ts   форматирование и расстояния
    config.ts           константы интерфейса

  modules/            логика, зависимости однонаправленные: agent → routing → tutu
    tutu/               клиент MCP, кэш, типы, прокси, снятые ответы (fixtures)
    routing/            сборка маршрутов, справочники регионов и городов
    agent/              цикл, инструменты, промпт, ошибки, ретраи, состояние

  lib/                клиент Prisma

Warum es innerhalb der Module keine Schichten domain/, infra/, api/ gibt. Eine solche Aufteilung ist bei Zehntausenden von Zeilen und anderthalb Dutzend Domänen gerechtfertigt. Hier gibt es ein einziges Szenario: Schichten würden Ordner mit je einer Datei und ein leeres contract/ ergeben. Wenn ein Modul tausend Zeilen überschreitet, entstehen sie rund um die vorhandenen Dateien.

Arbeit mit MCP Tutu

Verbindung: https://mcp.tutu.ru/mcp, streamable HTTP, keine Autorisierung erforderlich.

Zwei technische Entscheidungen, ohne die das nicht funktioniert:

Antworten wiegen ~26 KB. Die Tools sind so umhüllt, dass das vollständige JSON in die Oberfläche geht und als Karten gezeichnet wird, während an das Sprachmodell eine komprimierte Zusammenfassung über toModelOutput geht. Messung bei einer echten Suche: 26 305 → 1 971 Zeichen, Einsparung 93 %.

Der Server hat ein striktes Rate Limit. Etwa fünfzig aufeinanderfolgende Anfragen haben uns den Zugang zur gesamten Domäne auf TCP-Ebene für mehrere Stunden gesperrt. Deshalb: view: 'compact', Antwort-Cache in Postgres, nicht mehr als zwei Knoten pro Suche, und vor der Demo – Cache-Vorwärmung aus fixtures/ mit dem Befehl npm run warm. Wenn der Server nicht verfügbar ist, zeigt der Bildschirm das, was im Cache liegt, und stürzt nicht ab.

Stack

Next.js 16 (App Router) · TypeScript · @ai-sdk/mcp · Prisma 7 + Postgres 18 · Tailwind 4 + shadcn/ui · OpenRouter (optional)

Dokumente

  • SPECIFICATION.md — das Produkt als Ganzes: Problem, Belege, Technik, Regelwerk

  • SCREEN-SPEC.md — Bildschirmspezifikation für das Layout

  • USER-GUIDE.md — Benutzerhandbuch

  • fixtures/README.md — was die gespeicherten Antworten sind und wozu sie dienen

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables multi-modal travel planning for India, aggregating flights, trains, buses, cabs, and personal vehicles across 117 cities with multi-leg routing and weighted scoring.
    2
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Live intercity bus-trip search across Ukraine and Europe — real-time prices, seats, carriers, cheapest-day-of-month calendar, and trip details with passenger discounts. Read-only, no API key; also available as a hosted remote endpoint at https://mcp.soloway.com.ua/mcp.
    MIT

View all related MCP servers

Related MCP Connectors

  • Real-time transit stops, routes, arrivals, vehicle positions, and schedules via OneBusAway APIs.

  • Transitland MCP — global GTFS aggregator

  • Plan door-to-door trips across French trains, buses, transit and flights.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/nyxandro/tutu-hackathon'

If you have feedback or need assistance with the MCP directory API, please join our Discord server