Agentic MCP Itinerary
Uses Gemini Flash as the internal LLM agent to orchestrate travel itinerary creation, refinement, and confirmation through parallel fan-out to downstream MCP services.
Implements a LangGraph agent with StateGraph and parallel fan-out capabilities to coordinate multiple downstream MCP servers for comprehensive travel itinerary management.
Deployed on Railway with RAILPACK builder, providing HTTP/SSE endpoints for MCP communication, OAuth 2.1 authentication, and health monitoring.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Agentic MCP ItineraryPlan a 4-day trip to Tokyo with flights and hotels, budget $2500."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Agentic MCP Itinerary — PoC
Un MCP server que internamente corre un agente LLM (Gemini Flash + LangGraph) y orquesta múltiples MCP servers downstream. El cliente (Claude Desktop, ChatGPT) ve una interfaz limpia con estado persistente entre iteraciones.
Concepto
Claude Desktop / ChatGPT
│
│ MCP (HTTP/SSE + OAuth 2.1)
▼
┌─────────────────────────────────────┐
│ travel-agent (este repo) │
│ FastMCP server + LangGraph agent │
│ │
│ ┌──────┐ ┌────────┐ ┌──────────┐│
│ │Vuelos│ │Hoteles │ │Actividad.││ ← MCP mocks STDIO
│ └──────┘ └────────┘ └──────────┘│
└─────────────────────────────────────┘¿Por qué esto es difer? Ninguna empresa ofrece todavía un "agente vertical empaquetado como MCP server". Este PoC demuestra el patrón: el cliente solo ve 4-5 tools limpias, pero detrás hay un agente con memoria, fan-out paralelo y estado persistente.
Stack
Componente | Tecnología |
Servidor MCP expuesto | FastMCP 3.1.1 ( |
Agente interno | LangGraph ( |
Modelo LLM | Gemini Flash ( |
Auth | OAuth 2.1 Authorization Code Flow + JWT HS256 |
Checkpointing |
|
MCP downstream | MCP SDK oficial ( |
Mocks | 3 FastMCP servers STDIO (vuelos, hoteles, actividades) |
Deploy | Railway (RAILPACK + pyproject.toml) |
Tools expuestas (API pública)
Tool | Parámetros | Descripción |
|
| Crea un draft completo (vuelos + hotel + actividades en paralelo) |
|
| Refina un borrador existente |
|
| Recupera el estado actual |
| — | Lista todos los itinerarios activos |
|
| Confirma y genera |
Deploy en Railway
URLs
Health: https://travel-agent-production-c1c4.up.railway.app/health
MCP endpoint: https://travel-agent-production-c1c4.up.railway.app/mcp
OAuth metadata: https://travel-agent-production-c1c4.up.railway.app/.well-known/oauth-authorization-server
Login form: https://travel-agent-production-c1c4.up.railway.app/oauth/authorize
IDs Railway
Proyecto:
e50da57f-ee0b-47a3-81a3-55556fe6de0dServicio:
09065312-ac84-4876-b9c9-dd5d6439f1d4Environment:
09b3f0c9-e5ad-4f61-b351-275bbcffd5ad
Variables de entorno requeridas
Variable | Descripción |
| API key de Google Gemini |
| Usuario para el login OAuth |
| Contraseña para el login OAuth |
| Secreto para firmar JWT (generado con |
| URL pública del servidor (para construir redirect URIs) |
Auth: OAuth 2.1 Authorization Code Flow
Flujo completo
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 MCPImplementación
server/auth.py:SimpleOAuthProvider(extiendeOAuthProviderde FastMCP)JWT HS256, 1h de validez
Auth codes: 5 min de validez
PKCE (S256) soportado
/healthpermanece público sin auth
Configurar Claude Desktop
Edita ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"travel-agent": {
"type": "http",
"url": "https://travel-agent-production-c1c4.up.railway.app/mcp"
}
}
}Sin
headers— Claude Desktop gestiona el OAuth flow automáticamente. La primera vez abrirá el browser para el login.
Desarrollo local
Requisitos
pip install -e ".[dev]"Arrancar servidor
PYTHONPATH=server MCP_USERNAME=alexguerra MCP_PASSWORD=tu_pass \
MCP_JWT_SECRET=dev_secret python3 server/main.pySmoke test
PYTHONPATH=server python3 tests/smoke_test.pyVerificar sintaxis
PYTHONPATH=server python3 -m py_compile server/main.py server/auth.py server/agent.pyEstructura del proyecto
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)Historial de decisiones clave
Decisión | Alternativa descartada | Motivo |
RAILPACK + pyproject.toml | nixpacks | nixpacks falla en pip dentro de env inmutable |
OAuth 2.1 Authorization Code | Static Bearer token | Claude Desktop gestiona OAuth nativo; más producción-ready |
JWT HS256 en memoria | DB de tokens | PoC — sin estado persistente entre reinicios |
FastMCP 3.1.1 | Auth manual con Starlette | FastMCP integra el flow con el transport MCP |
| SQLite/Redis | Suficiente para PoC local; fácil migrar a SqliteSaver |
Gemini Flash | Claude Haiku | Codex tenía conflicto de credenciales con Anthropic |
Próximos pasos (post-PoC)
Test en Claude Desktop — verificar OAuth flow completo
Persistencia real —
SqliteSavero Postgres para estado entre reiniciosDownstream MCP reales — reemplazar mocks por APIs reales (Amadeus, Booking, etc.)
Multi-usuario — DB de users en lugar de env vars
Rate limiting — por token JWT
Telemetría — LangSmith o similar para trazar el agente interno
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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/AlexGHerrera/agentic-mcp-itinerary'
If you have feedback or need assistance with the MCP directory API, please join our Discord server