Skip to main content
Glama

Агентный MCP-маршрут — PoC

MCP-сервер, который внутренне запускает LLM-агента (Gemini Flash + LangGraph) и координирует работу нескольких подчиненных MCP-серверов. Клиент (Claude Desktop, ChatGPT) видит чистый интерфейс с сохранением состояния между итерациями.

Концепция

Claude Desktop / ChatGPT
        │
        │  MCP (HTTP/SSE + OAuth 2.1)
        ▼
┌─────────────────────────────────────┐
│         travel-agent (este repo)    │
│  FastMCP server + LangGraph agent   │
│                                     │
│  ┌──────┐  ┌────────┐  ┌──────────┐│
│  │Vuelos│  │Hoteles │  │Actividad.││  ← MCP mocks STDIO
│  └──────┘  └────────┘  └──────────┘│
└─────────────────────────────────────┘

Почему это отличается? Ни одна компания еще не предлагает «вертикального агента, упакованного как MCP-сервер». Этот PoC демонстрирует паттерн: клиент видит только 4-5 чистых инструментов, но за ними стоит агент с памятью, параллельным fan-out и сохранением состояния.


Related MCP server: ts-travel-mcp-server

Стек

Компонент

Технология

Публичный MCP-сервер

FastMCP 3.1.1 (streamable-http)

Внутренний агент

LangGraph (StateGraph + параллельный fan-out)

LLM-модель

Gemini Flash (gemini-2.0-flash)

Авторизация

OAuth 2.1 Authorization Code Flow + JWT HS256

Чекпоинты

MemorySaver (в памяти, достаточно для PoC)

Подчиненные MCP

Официальный MCP SDK (mcp.client.stdio)

Заглушки (Mocks)

3 FastMCP-сервера STDIO (авиабилеты, отели, мероприятия)

Развертывание

Railway (RAILPACK + pyproject.toml)


Доступные инструменты (Публичный API)

Инструмент

Параметры

Описание

create_itinerary

requirements: str

Создает полный черновик (авиабилеты + отель + мероприятия параллельно)

refine_itinerary

itinerary_id: str, change_request: str

Уточняет существующий черновик

get_itinerary

itinerary_id: str

Получает текущее состояние

list_itineraries

Выводит список всех активных маршрутов

confirm_itinerary

itinerary_id: str

Подтверждает и генерирует confirmation_code


Развертывание на Railway

URL-адреса

Идентификаторы Railway

  • Проект: e50da57f-ee0b-47a3-81a3-55556fe6de0d

  • Сервис: 09065312-ac84-4876-b9c9-dd5d6439f1d4

  • Окружение: 09b3f0c9-e5ad-4f61-b351-275bbcffd5ad

Необходимые переменные окружения

Переменная

Описание

GEMINI_API_KEY

API-ключ Google Gemini

MCP_USERNAME

Имя пользователя для OAuth-логина

MCP_PASSWORD

Пароль для OAuth-логина

MCP_JWT_SECRET

Секрет для подписи JWT (генерируется через secrets.token_urlsafe(32))

MCP_BASE_URL

Публичный URL сервера (для формирования redirect URI)


Авторизация: OAuth 2.1 Authorization Code Flow

Полный поток

1. Claude Desktop detecta el MCP server
2. Descubre /.well-known/oauth-authorization-server
3. Redirige al usuario a /authorize
4. El servidor redirige a /oauth/authorize (form de login HTML)
5. Usuario introduce user/pass → POST /oauth/authorize
6. Servidor valida credenciales (MCP_USERNAME / MCP_PASSWORD)
7. Emite auth code → redirect a Claude Desktop
8. Claude Desktop intercambia code → JWT en /token
9. JWT usado como Bearer en todas las llamadas MCP

Реализация

  • server/auth.py: SimpleOAuthProvider (расширяет OAuthProvider из FastMCP)

  • JWT HS256, срок действия 1 час

  • Коды авторизации: срок действия 5 минут

  • Поддержка PKCE (S256)

  • /health остается публичным без авторизации


Настройка Claude Desktop

Отредактируйте ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "travel-agent": {
      "type": "http",
      "url": "https://travel-agent-production-c1c4.up.railway.app/mcp"
    }
  }
}

Без headers — Claude Desktop автоматически управляет потоком OAuth. При первом запуске он откроет браузер для входа.


Локальная разработка

Требования

pip install -e ".[dev]"

Запуск сервера

PYTHONPATH=server MCP_USERNAME=alexguerra MCP_PASSWORD=tu_pass \
  MCP_JWT_SECRET=dev_secret python3 server/main.py

Smoke-тест

PYTHONPATH=server python3 tests/smoke_test.py

Проверка синтаксиса

PYTHONPATH=server python3 -m py_compile server/main.py server/auth.py server/agent.py

Структура проекта

agentic-mcp-itinerary/
├── server/
│   ├── main.py          # FastMCP server (4 tools + OAuth + /health)
│   ├── auth.py          # SimpleOAuthProvider (OAuth 2.1 + JWT)
│   ├── agent.py         # LangGraph graph con fan-out paralelo
│   ├── state.py         # ItineraryState TypedDict + checkpointer
│   └── tools/
│       ├── flights.py   # Cliente MCP → mock vuelos
│       ├── hotels.py    # Cliente MCP → mock hoteles
│       └── activities.py # Cliente MCP → mock actividades
├── mocks/
│   ├── flights_mcp.py   # Mock server vuelos (FastMCP STDIO)
│   ├── hotels_mcp.py    # Mock server hoteles (FastMCP STDIO)
│   └── activities_mcp.py # Mock server actividades (FastMCP STDIO)
├── tests/
│   └── smoke_test.py    # Test end-to-end básico
├── docs/
│   └── OAUTH_PLAN.md    # Spec del OAuth (referencia de diseño)
├── pyproject.toml       # Deps para RAILPACK
├── railway.toml         # Builder=RAILPACK, startCommand
└── claude_desktop_config.json  # Config para Claude Desktop (sin Bearer manual)

История ключевых решений

Решение

Отклоненная альтернатива

Причина

RAILPACK + pyproject.toml

nixpacks

nixpacks вызывает ошибки при установке pip в неизменяемом окружении

OAuth 2.1 Authorization Code

Статический Bearer-токен

Claude Desktop поддерживает нативный OAuth; более готово к продакшену

JWT HS256 в памяти

БД токенов

PoC — нет необходимости в сохранении состояния после перезагрузки

FastMCP 3.1.1 OAuthProvider

Ручная авторизация через Starlette

FastMCP интегрирует поток с транспортом MCP

MemorySaver

SQLite/Redis

Достаточно для локального PoC; легко мигрировать на SqliteSaver

Gemini Flash

Claude Haiku

У Codex был конфликт учетных данных с Anthropic


Следующие шаги (после PoC)

  • [ ] Тестирование в Claude Desktop — проверка полного потока OAuth

  • [ ] Реальная персистентностьSqliteSaver или Postgres для сохранения состояния между перезапусками

  • [ ] Реальные подчиненные MCP — замена заглушек на реальные API (Amadeus, Booking и т.д.)

  • [ ] Многопользовательский режим — БД пользователей вместо переменных окружения

  • [ ] Ограничение частоты запросов (Rate limiting) — по JWT-токену

  • [ ] Телеметрия — LangSmith или аналоги для отслеживания работы внутреннего агента

Related MCP Connectors

Related MCP Servers