Skip to main content
Glama

찾아지지 않는 곳으로

직행 티켓이 없을 때, 환승으로 여정을 조합합니다.

어떤 서비스의 검색도 "A에서 B로 가는 티켓이 있는가"라는 질문에 답합니다. 직행 연결편이 없으면 결과는 비어 있고 — 사용자는 떠나갑니다. 하지만 갈 수 있는 방법이 있고, 필요한 두 티켓 모두 같은 곳에서 판매되고 있습니다.

실제 사례. MCP Tutu에서 2026년 8월 20일 "모스크바 → 우글리치" 요청:

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

같은 요청에 대한 우리의 답변:

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

두 티켓 모두 Tutu가 판매합니다. 그들의 검색은 이 경로를 절대 보여주지 않습니다.

작동 방식

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

검색은 에이전트가 제어합니다. 에이전트가 어떤 도시와 날짜를 확인할지 스스로 결정하고, 사용자는 화면의 피드로 그 작업 과정을 볼 수 있습니다. 하지만 환승, 가격, 순위는 코드가 계산합니다 — 모델은 산술에 접근할 수 없습니다. 바로 그 부분에서 에이전트가 실수하기 때문입니다. Tutu의 무거운 응답은 모델을 통과하지 않습니다. 모델은 찾은 구간의 식별자와 짧은 요약만 받고, 전체 데이터는 인터페이스로 직접 전달됩니다.

선택한 날짜에 출발할 수 없으면, 백엔드가 에이전트를 호텔 검색으로 보냅니다: 가장 가까운 출발일을 찾고, 기다려야 하는 밤 수만큼 정확히 숙박을 선택합니다.

에이전트를 사용할 수 없거나 한도에 도달하면, 인터페이스는 조용히 결정론적 검색으로 전환됩니다 — 화면은 어떤 경우에도 결과를 표시합니다.

Related MCP server: mcp-sbb-transport

실행

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는 선택 사항입니다. 없으면 도시 힌트가 비활성화되고, 검색은 지역 디렉토리로 작동합니다.

명령어

명령어

기능

npm run dev

http://localhost:3100에서 애플리케이션

npm run route -- Москва Углич 2026-08-20

콘솔에서 경로 조합

npm run warm

src/modules/tutu/fixtures/에서 캐시 예열

npm run cache

현재 캐시에 있는 내용

npm run smoke

MCP Tutu와의 실시간 연결 확인

npm run db:up / db:down

Docker의 Postgres

npm run migrate

Prisma 마이그레이션

npm run lint

ESLint

구조

모든 코드는 src/에 있고, 루트에는 설정만 있습니다. 인터페이스는 한 폴더로 구성되고, 로직은 파일 유형이 아닌 의미에 따라 모듈로 나뉩니다:

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

모듈 내부에 domain/, infra/, api/ 레이어가 없는 이유. 이러한 구분은 수만 줄의 코드와 15개 이상의 도메인에서 정당화됩니다. 여기에는 하나의 시나리오만 있습니다. 레이어를 만들면 파일 하나짜리 폴더와 빈 contract/가 생길 뿐입니다. 모듈이 천 줄을 넘어서면 기존 파일 주위에 레이어가 생길 것입니다.

MCP Tutu 작업

연결: https://mcp.tutu.ru/mcp, streamable HTTP, 인증 불필요.

이것 없이는 작동하지 않는 두 가지 엔지니어링 결정:

응답 크기가 약 26KB입니다. 도구는 전체 JSON이 인터페이스로 전달되어 카드로 그려지고, 언어 모델에는 toModelOutput을 통한 압축 요약만 전달되도록 래핑되어 있습니다. 실제 검색 측정: 26,305 → 1,971자, 93% 절약.

서버에 엄격한 rate limit이 있습니다. 약 50개의 연속 요청으로 TCP 수준에서 몇 시간 동안 전체 도메인에 대한 접근이 차단되었습니다. 따라서: view: 'compact', Postgres의 응답 캐시, 검색당 최대 2개 노드, 데모 전에는 npm run warm 명령으로 fixtures/에서 캐시를 예열합니다. 서버를 사용할 수 없으면 화면은 캐시에 있는 내용을 표시하고 충돌하지 않습니다.

스택

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

문서

  • SPECIFICATION.md — 제품 전체: 문제, 증거, 기술, 규정

  • SCREEN-SPEC.md — 퍼블리싱을 위한 화면 사양

  • USER-GUIDE.md — 사용자 가이드

  • fixtures/README.md — 저장된 응답이 무엇이고 왜 필요한지

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