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

License: MIT Node.js TypeScript 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

ModoTransporteInicio de sesiónMejor para
HTTP + OAuth 2.1HTTP transmisibleInicio 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
stdioEntrada / salida estándarCookies exportadas de un inicio de sesión HTTP único en un archivo .envConfiguració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 install descarga Chromium a través del paso postinstall de 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.

  1. Inicia npm run dev una vez y completa el inicio de sesión en el lienzo.
  2. Con NODE_ENV sin configurar (el valor predeterminado), accede a GET /debug/users para confirmar tu userSub.
  3. Lee el encabezado de cookies de los registros del servidor (o abre DevTools en m.uber.com y copia Cookie: de cualquier solicitud).
  4. 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/start nuevamente para capturar un nuevo conjunto.

Herramientas disponibles

📍 Recogida / Destino

HerramientaDescripción
uber_pudo_searchBúsqueda de autocompletado de direcciones — recogida o destino
uber_pudo_resolveResolver un ID de lugar a coordenadas y dirección completa
uber_pudo_refineRefinar dentro de un recinto (terminales de aeropuerto, puntos de acceso múltiples)
uber_navigation_routePolilínea / ruta giro a giro entre origen y destinos

🚗 Productos y reservas

HerramientaDescripción
uber_status_getCiudad, viaje actual, vehículos cercanos — también una sonda de autenticación
uber_products_listUberX / Comfort / Black con tarifas en tiempo real + ETAs
uber_pre_plus_ones_getInformación del recinto + UX de primera vez para una recogida
uber_reservation_data_getRangos de tiempo de reserva + disponibilidad de Uber Reserve
uber_offers_rankedOfertas promocionales clasificadas en una ciudad
uber_pre_checkout_actions_getAcciones previas al pago (construidas automáticamente en el siguiente paso)
uber_trip_requestEnvoltorio inteligente — construye automáticamente checkoutActionResult si falta
uber_cancellation_info_getTarifas de cancelación / mensajería
uber_trip_cancelCancelar un viaje activo
uber_ride_book_quickDe un solo paso: búsqueda → resolución → productos → solicitud de viaje
uber_trip_status_watchConsultar uber_status_get hasta que clientStatus cambie

📜 Historial de actividad

HerramientaDescripción
uber_activities_listActividades pasadas + futuras (riders.uber.com)
uber_activities_upcomingPróximas a través de REST (www.uber.com)
uber_activities_pastPasadas a través de REST (www.uber.com)
uber_trip_getDetalles completos de un solo viaje
uber_receipt_getRecibo detallado — desglose de tarifas, distancia, duración
uber_receipt_send_emailEnviar un recibo por correo electrónico
uber_invoice_status_getFactura fiscal / estado de NF-e (Brasil)
uber_arrears_getSaldo de pago pendiente

💬 Chat con el conductor

HerramientaDescripción
uber_thread_by_tracking_getEncontrar el UUID del hilo de chat por UUID del viaje
uber_thread_getLeer mensajes en un hilo de chat

👤 Perfil

HerramientaDescripción
uber_user_riders_getPerfil completo: nombre, perfiles de pago, Uber Cash, membresías
uber_user_currentPerfil rápido a través de REST
uber_user_travel_statusSi el usuario está actualmente en un viaje
uber_membership_attributesEstado de Uber One + elegibilidad de beneficios
uber_navlinks_getEnlaces de navegación web
uber_tax_forms_checkSi los formularios de impuestos (equivalente a 1099) están disponibles

💳 Pagos y promociones

HerramientaDescripción
uber_payment_options_listMétodos de pago guardados del centro de pagos
uber_promo_pill_getBanner promocional de la pantalla de inicio
uber_product_suggestions_listTipos de productos sugeridos según el historial
uber_map_hero_productsProductos 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_quick maneja 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_request y uber_ride_book_quick cargan 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 /mcp crea un StreamableHTTPServerTransport + McpServer nuevo 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.startScreencast transmite fotogramas JPEG a través de WebSocket; CDP Input.dispatch{Mouse,Key}Event reenvía la entrada del usuario. Capacidad limitada por MAX_BROWSER_SESSIONS.
  • Calentamiento de subdominio: después de la redirección posterior al inicio de sesión en m.uber.com, el servidor visita silenciosamente riders.uber.com, www.uber.com y payments.uber.com para 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-session expire (≈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_request inteligente: construye automáticamente payment.checkoutActionResult a partir de getPreCheckoutActions si falta — los agentes solo necesitan pasar el meta de uber_products_list más paymentProfileUUID.

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 .gitignore bloquea 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_request y uber_ride_book_quick mueven 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.