Uber MCP
Servidor MCP no oficial para Uber: solicita viajes, monitorea trayectos y revisa la actividad a través de cualquier asistente de IA mediante stdio o HTTP+OAuth.
Documentación
Servidor Uber MCP 
Servidor no oficial de Model Context Protocol para Uber: solicita viajes, observa un viaje en curso, explora el historial de actividad y paga a través de cualquier asistente de IA que hable MCP.
No está afiliado a Uber. Envuelve la API web del pasajero para uso personal.
Qué hace este servidor MCP
Este servidor MCP brinda a los asistentes de IA (Claude Code, Claude Desktop, Cursor, Codex, etc.) acceso a tu cuenta de Uber. Expone 35 herramientas que permiten a una IA:
- 🚗 Listar productos disponibles (UberX, Comfort, Black, Reserve, …) con precios y ETAs en tiempo real
- 🔍 Autocompletar direcciones de recogida / destino, resolver coordenadas, refinar puntos de acceso al recinto
- 📦 Solicitar y cancelar viajes, observar el estado del viaje hasta que llegue el conductor
- 💬 Leer y enrutar a través de los hilos de chat con el conductor
- 💳 Listar opciones de pago, construir el resultado de la acción de pago y despachar el viaje
- 📜 Explorar actividades pasadas y futuras, detalles completos del viaje, recibos fiscales y deudas
- 🎁 Obtener ofertas promocionales clasificadas, estado de membresía de Uber One y banners de la pantalla de inicio
- 🧭 Herramienta compuesta de un solo paso para ir de "dos direcciones" a un viaje confirmado
Dos modos de autenticación
| Modo | Transporte | Inicio de sesión | Mejor para |
|---|---|---|---|
| HTTP + OAuth 2.1 | HTTP transmisible | Inicio de sesión real de Uber (Google / correo electrónico / OTP) en un Chromium del lado del servidor transmitido a tu navegador como un <canvas> | Implementaciones multiusuario, MCP remoto, compartir con amigos |
| stdio | Entrada / salida estándar | Cookies exportadas de un inicio de sesión HTTP único en un archivo .env | Configuración local de un solo usuario, la más rápida de conectar |
Puedes ejecutar cualquiera de los dos modos de forma independiente; las mismas definiciones de herramientas respaldan ambos.
¿Por qué un navegador remoto en lugar de un flujo de pegar tu token?
La web del pasajero de Uber está protegida por PerimeterX (huella de dispositivo de ~40 KB generada por JS en el navegador) y Arkose Labs (FunCaptcha). Reproducir eso del lado del servidor está fuera de alcance, y X-Frame-Options: SAMEORIGIN en auth.uber.com bloquea el enfoque obvio de iframe. La política de mismo origen + cookies HttpOnly también descartan la captura del lado del cliente.
Solución: cuando accedes a /login/start, el servidor MCP lanza un Chromium real a través de Playwright, navega a auth.uber.com y transmite fotogramas JPEG a través de WebSocket a un <canvas> en tu navegador. Tu entrada regresa por el mismo socket y se envía a través del CDP de Chromium. PerimeterX y Arkose ven un navegador real; tú ves y operas la página de inicio de sesión oficial de Uber; el servidor MCP captura las cookies resultantes (incluidas las HttpOnly) en el momento en que la redirección posterior al inicio de sesión aterriza en m.uber.com/go/home.
Cero copiar y pegar. Cero extensión de navegador. Inicio de sesión real de Uber.
Requisitos previos
- Node.js ≥ 20
- Una cuenta de Uber activa
- Para el modo HTTP+OAuth: nada más —
npm installdescarga Chromium a través del pasopostinstallde Playwright - Para el modo stdio: cookies de un inicio de sesión HTTP exitoso (ver más abajo)
Verifica tu instalación con node -v y npm -v.
Instalación
1. Clonar y compilar
git clone https://github.com/AriOliv/uber-mcp.git
cd uber-mcp
npm install # also installs Chromium for Playwright (~170 MB)
npm run build
2. Elegir un modo
Opción A — HTTP + OAuth 2.1 (recomendado)
# Generate a JWT signing secret (≥32 chars)
echo "MCP_JWT_SECRET=$(openssl rand -hex 32)" >> .env
echo "PORT=3001" >> .env
# Run with auto-reload
npm run dev
Luego registra el servidor con tu cliente.
Claude Code
claude mcp add --transport http uber http://localhost:3001/mcp
Ejecuta /mcp dentro de Claude Code → haz clic en uber → se abrirá una ventana del navegador con un <canvas> que muestra la pantalla de inicio de sesión oficial de Uber, transmitida en vivo desde el servidor. Inicia sesión normalmente (Google o correo electrónico+OTP). Cuando aterrices en m.uber.com/go/home, el MCP captura las cookies, acuña un código OAuth y redirige de vuelta a tu cliente.
Cursor
Agrega a ~/.cursor/mcp.json:
{
"mcpServers": {
"uber": {
"type": "http",
"url": "http://localhost:3001/mcp"
}
}
}
Cursor activará el flujo OAuth en el primer uso.
Codex
codex mcp add --transport http uber http://localhost:3001/mcp
Opción B — stdio (usuario único)
El modo stdio reutiliza las cookies capturadas por un inicio de sesión HTTP único.
- Inicia
npm run devuna vez y completa el inicio de sesión en el lienzo. - Con
NODE_ENVsin configurar (el valor predeterminado), accede aGET /debug/userspara confirmar tuuserSub. - Lee el encabezado de cookies de los registros del servidor (o abre DevTools en
m.uber.comy copiaCookie:de cualquier solicitud). - Colócalos en
.env:
cp .env.example .env
# fill in UBER_COOKIE_HEADER, UBER_USER_SUB, UBER_CITY_ID, UBER_SESSION_TYPE
Claude Desktop
Edita ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) o %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"uber": {
"command": "node",
"args": ["/absolute/path/to/uber-mcp/build/index.js"],
"env": {
"UBER_COOKIE_HEADER": "jwt-session=...; udi-id=...; ...",
"UBER_USER_SUB": "ed1b0c3a-...",
"UBER_CITY_ID": "458",
"UBER_SESSION_TYPE": "desktop_session"
}
}
}
}
Claude Code (stdio)
claude mcp add --transport stdio uber \
--env "UBER_COOKIE_HEADER=jwt-session=...; udi-id=...; ..." \
--env UBER_USER_SUB=ed1b0c3a-... \
--env UBER_CITY_ID=458 \
--env UBER_SESSION_TYPE=desktop_session \
-- node /absolute/path/to/uber-mcp/build/index.js
[!NOTE] Las sesiones de Uber duran ~24 h. No hay un punto final de actualización: cuando la cookie expire, simplemente accede a
/login/startnuevamente para capturar un nuevo conjunto.
Herramientas disponibles
📍 Recogida / Destino
| Herramienta | Descripción |
|---|---|
uber_pudo_search | Búsqueda de autocompletado de direcciones — recogida o destino |
uber_pudo_resolve | Resolver un ID de lugar a coordenadas y dirección completa |
uber_pudo_refine | Refinar dentro de un recinto (terminales de aeropuerto, puntos de acceso múltiples) |
uber_navigation_route | Polilínea / ruta giro a giro entre origen y destinos |
🚗 Productos y reservas
| Herramienta | Descripción |
|---|---|
uber_status_get | Ciudad, viaje actual, vehículos cercanos — también una sonda de autenticación |
uber_products_list | UberX / Comfort / Black con tarifas en tiempo real + ETAs |
uber_pre_plus_ones_get | Información del recinto + UX de primera vez para una recogida |
uber_reservation_data_get | Rangos de tiempo de reserva + disponibilidad de Uber Reserve |
uber_offers_ranked | Ofertas promocionales clasificadas en una ciudad |
uber_pre_checkout_actions_get | Acciones previas al pago (construidas automáticamente en el siguiente paso) |
uber_trip_request | Envoltorio inteligente — construye automáticamente checkoutActionResult si falta |
uber_cancellation_info_get | Tarifas de cancelación / mensajería |
uber_trip_cancel | Cancelar un viaje activo |
uber_ride_book_quick | De un solo paso: búsqueda → resolución → productos → solicitud de viaje |
uber_trip_status_watch | Consultar uber_status_get hasta que clientStatus cambie |
📜 Historial de actividad
| Herramienta | Descripción |
|---|---|
uber_activities_list | Actividades pasadas + futuras (riders.uber.com) |
uber_activities_upcoming | Próximas a través de REST (www.uber.com) |
uber_activities_past | Pasadas a través de REST (www.uber.com) |
uber_trip_get | Detalles completos de un solo viaje |
uber_receipt_get | Recibo detallado — desglose de tarifas, distancia, duración |
uber_receipt_send_email | Enviar un recibo por correo electrónico |
uber_invoice_status_get | Factura fiscal / estado de NF-e (Brasil) |
uber_arrears_get | Saldo de pago pendiente |
💬 Chat con el conductor
| Herramienta | Descripción |
|---|---|
uber_thread_by_tracking_get | Encontrar el UUID del hilo de chat por UUID del viaje |
uber_thread_get | Leer mensajes en un hilo de chat |
👤 Perfil
| Herramienta | Descripción |
|---|---|
uber_user_riders_get | Perfil completo: nombre, perfiles de pago, Uber Cash, membresías |
uber_user_current | Perfil rápido a través de REST |
uber_user_travel_status | Si el usuario está actualmente en un viaje |
uber_membership_attributes | Estado de Uber One + elegibilidad de beneficios |
uber_navlinks_get | Enlaces de navegación web |
uber_tax_forms_check | Si los formularios de impuestos (equivalente a 1099) están disponibles |
💳 Pagos y promociones
| Herramienta | Descripción |
|---|---|
uber_payment_options_list | Métodos de pago guardados del centro de pagos |
uber_promo_pill_get | Banner promocional de la pantalla de inicio |
uber_product_suggestions_list | Tipos de productos sugeridos según el historial |
uber_map_hero_products | Productos destacados en la pantalla de inicio del mapa |
Ejemplos de indicaciones
Una vez conectado, pregúntale a tu asistente de IA:
"qual o status da minha corrida atual?"
"quanto custa um UberX da Av. Paulista até o aeroporto de Congonhas agora?"
"peça um Comfort da minha posição até a Rua Tabapuã, 82, Itaim"
"liste meus 5 últimos trajetos com motorista e valor"
"existe algum cupom ativo na minha conta hoje?"
"o motorista chegou? me avise quando o status mudar de ACCEPTED para ON_TRIP"
[!TIP] El compuesto
uber_ride_book_quickmaneja todo el baile de reserva internamente: búsqueda de recogida, resolución, búsqueda de destino, resolución, productos, previo al pago, solicitud de viaje. Útil cuando solo quieres decir "resérvame un viaje de X a Y".
[!CAUTION]
uber_trip_requestyuber_ride_book_quickcargan el método de pago del usuario y despachan un conductor real. Siempre confirma con el usuario antes de llamar.
Arquitectura
┌──────────────────┐ OAuth 2.1 ┌──────────────────────┐ Cookies + JWT ┌─────────────────┐
│ AI assistant │◄────────────────►│ uber-mcp server │◄────────────────────►│ Uber API │
│ (Claude/Cursor) │ /mcp endpoint │ (Express + MCP) │ m.uber.com │ (rider web) │
└──────────────────┘ └──────────────────────┘ riders.uber.com └─────────────────┘
│ ▲ www.uber.com
│ │ payments.uber.com
▼ │
┌──────────────────────────┐
│ /login/start │ HTML — canvas + WS
│ (browser of the user) │ ◄──────────►
└──────────────────────────┘ JPEG frames
▲ + input events
│ CDP screencast
▼
┌──────────────────────────┐
│ Playwright Chromium │ drives auth.uber.com
│ (server‑side, headless) │ PX + Arkose see real Chrome
└──────────────────────────┘
- Transporte sin estado: cada llamada a
/mcpcrea unStreamableHTTPServerTransport+McpServernuevo vinculado a la sesión del usuario autenticado — maneja usuarios concurrentes sin sesiones fijas. - Navegador remoto del lado del servidor: un Playwright Chromium por sesión de inicio de sesión. CDP
Page.startScreencasttransmite fotogramas JPEG a través de WebSocket; CDPInput.dispatch{Mouse,Key}Eventreenvía la entrada del usuario. Capacidad limitada porMAX_BROWSER_SESSIONS. - Calentamiento de subdominio: después de la redirección posterior al inicio de sesión en
m.uber.com, el servidor visita silenciosamenteriders.uber.com,www.uber.comypayments.uber.compara materializar sus cookies de sesión específicas del dominio antes de capturar el paquete. - Autenticación basada en cookies, sin actualización: Uber no expone un punto final de actualización. Cuando
jwt-sessionexpire (≈24 h), el usuario vuelve a acceder a/login/start. - OAuth 2.1 + PKCE S256, JWTs HS256 vinculados a la audiencia, tokens de actualización rotativos opacos (para la capa MCP, separados de la sesión de Uber).
uber_trip_requestinteligente: construye automáticamentepayment.checkoutActionResulta partir degetPreCheckoutActionssi falta — los agentes solo necesitan pasar elmetadeuber_products_listmáspaymentProfileUUID.
Desarrollo
npm run dev # http-server with auto-reload (tsx watch)
npm run dev:stdio # stdio with auto-reload
npm run build # tsc → build/
npm run typecheck # tsc --noEmit
Estructura del proyecto:
src/
index.ts tool definitions + executeTool dispatcher + stdio entry
http-server.ts Express + OAuth + Streamable HTTP + WS upgrade
http/
store.ts in-memory OAuth + UberCredentials + browser session stores
provider.ts OAuthServerProvider implementation
session-provider.ts SessionTokenProvider + expiry pruning loop
login-router.ts entry shell ("Continue" button)
remote-browser.ts RemoteBrowserSession (Playwright + CDP + warm‑up)
remote-browser-router.ts /login/start + WS /login/ws/:sessionId
Seguridad y descargo de responsabilidad
- 🔒 En modo HTTP, las cookies de Uber viven solo en memoria — nunca se escriben en disco. Reinicio del proceso = volver a iniciar sesión.
- 🚫 No confirmes
.env, archivos HAR ni capturas de DevTools — contienen cookies de sesión. El.gitignorebloquea todos los lugares comunes. - ⚠️ No oficial. Uber no publica una API pública orientada al consumidor. Esto envuelve los puntos finales del sitio web del pasajero, que pueden cambiar sin previo aviso. Úsalo bajo tu propio criterio y respeta los Términos de servicio de Uber.
- 🛡️ El flujo del navegador remoto puede mostrar desafíos de PerimeterX o Arkose durante el inicio de sesión. Son resolubles a través del lienzo (hacer clic en imágenes, arrastrar rompecabezas, etc.) — la reputación de tu IP importa: las IPs residenciales reciben menos desafíos que las IPs de centros de datos.
- 💸
uber_trip_requestyuber_ride_book_quickmueven dinero real. Siempre confirma con el usuario antes de llamar.
Contribuciones
Las incidencias y solicitudes de extracción son bienvenidas. Al abrir una incidencia, incluye:
- Salida de
npm run typecheck - Si estás usando el modo stdio o HTTP+OAuth
- Solicitud/respuesta redactada (sin cookies) al informar una falla de API
Licencia
Publicado bajo la Licencia MIT.
Hecho por Ari y Claude, también conocido como Claudão.