Uber MCP

Servidor MCP não oficial para Uber — solicite corridas, acompanhe viagens e navegue pela atividade através de qualquer assistente de IA via stdio ou HTTP+OAuth.

Documentação

Servidor Uber MCP

License: MIT Node.js TypeScript MCP

Servidor não oficial do Model Context Protocol para Uber — solicite corridas, acompanhe uma viagem em andamento, navegue pelo histórico de atividades e pague por meio de qualquer assistente de IA que fale MCP.

Não afiliado à Uber. Utiliza a API web do passageiro para uso pessoal.

O Que Este Servidor MCP Faz

Este servidor MCP dá aos assistentes de IA (Claude Code, Claude Desktop, Cursor, Codex, etc.) acesso à sua conta Uber. Ele expõe 35 ferramentas que permitem que uma IA:

  • 🚗 Liste produtos disponíveis (UberX, Comfort, Black, Reserve, …) com preços e ETAs em tempo real
  • 🔍 Autocomplete de endereços de embarque/desembarque, resolva coordenadas, refine pontos de acesso de locais
  • 📦 Solicite e cancele corridas, acompanhe o status da viagem até o motorista chegar
  • 💬 Leia e encaminhe conversas com o motorista
  • 💳 Liste opções de pagamento, monte o resultado da ação de checkout e despache a viagem
  • 📜 Navegue por atividades passadas e futuras, detalhes completos da viagem, recibos fiscais e pendências
  • 🎁 Obtenha ofertas promocionais ranqueadas, estado da assinatura Uber One e banners da tela inicial
  • 🧭 Ferramenta composta de uma única etapa para ir de "dois endereços" a uma viagem confirmada

Dois Modos de Autenticação

ModoTransporteLoginMelhor para
HTTP + OAuth 2.1HTTP StreamableLogin real da Uber (Google / e‑mail / OTP) em um Chromium no servidor transmitido ao seu navegador como um <canvas>Implantações multiusuário, MCP remoto, compartilhamento com amigos
stdioEntrada / saída padrãoCookies exportados de um login HTTP único em um arquivo .envConfiguração local de usuário único, mais rápida de conectar

Você pode executar qualquer um dos modos de forma independente; as mesmas definições de ferramentas servem para ambos.

Por que um navegador remoto em vez de um fluxo de colar seu token?

A web do passageiro da Uber é protegida por PerimeterX (~40 KB de impressão digital do dispositivo gerada por JS no navegador) e Arkose Labs (FunCaptcha). Reproduzir isso no servidor está fora do escopo, e X-Frame-Options: SAMEORIGIN em auth.uber.com bloqueia a abordagem óbvia de iframe. A política de mesma origem + cookies HttpOnly também descartam a captura no lado do cliente.

Solução: quando você acessa /login/start, o servidor MCP inicia um Chromium real via Playwright, navega até auth.uber.com e transmite quadros JPEG via WebSocket para um <canvas> no seu navegador. Sua entrada volta pelo mesmo socket e é despachada via CDP do Chromium. PerimeterX e Arkose veem um navegador real; você vê e opera a página oficial de login da Uber; o servidor MCP captura os cookies resultantes (incluindo os HttpOnly) no momento em que o redirecionamento pós-login chega em m.uber.com/go/home.

Zero copiar e colar. Zero extensão de navegador. Login real da Uber.

Pré-requisitos

  • Node.js ≥ 20
  • Uma conta Uber ativa
  • Para o modo HTTP+OAuth: nada mais — npm install baixa o Chromium via etapa postinstall do Playwright
  • Para o modo stdio: cookies de um login HTTP bem-sucedido (veja abaixo)

Verifique sua instalação com node -v e npm -v.

Instalação

1. Clone e compile

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. Escolha um modo

Opção 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

Em seguida, registre o servidor no seu cliente.

Claude Code
claude mcp add --transport http uber http://localhost:3001/mcp

Execute /mcp dentro do Claude Code → clique em uber → abrirá uma janela do navegador com um <canvas> mostrando a tela oficial de login da Uber, transmitida ao vivo do servidor. Faça login normalmente (Google ou e‑mail+OTP). Quando você chegar em m.uber.com/go/home, o MCP captura os cookies, gera um código OAuth e redireciona de volta ao seu cliente.

Cursor

Adicione em ~/.cursor/mcp.json:

{
  "mcpServers": {
    "uber": {
      "type": "http",
      "url": "http://localhost:3001/mcp"
    }
  }
}

O Cursor acionará o fluxo OAuth no primeiro uso.

Codex
codex mcp add --transport http uber http://localhost:3001/mcp

Opção B — stdio (usuário único)

O modo stdio reutiliza cookies capturados por um login HTTP único.

  1. Inicie npm run dev uma vez e conclua o login no canvas.
  2. Com NODE_ENV não definido (padrão), acesse GET /debug/users para confirmar seu userSub.
  3. Leia o cabeçalho de cookie nos logs do servidor (ou abra o DevTools em m.uber.com e copie Cookie: de qualquer requisição).
  4. Coloque-os em .env:
cp .env.example .env
# fill in UBER_COOKIE_HEADER, UBER_USER_SUB, UBER_CITY_ID, UBER_SESSION_TYPE
Claude Desktop

Edite ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) ou %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] As sessões da Uber duram ~24 h. Não há endpoint de renovação — quando o cookie expirar, basta acessar /login/start novamente para capturar um novo conjunto.

Ferramentas Disponíveis

📍 Embarque / Desembarque

FerramentaDescrição
uber_pudo_searchBusca de endereço com autocomplete — embarque ou desembarque
uber_pudo_resolveResolve um ID de local para coordenadas e endereço completo
uber_pudo_refineRefina dentro de um local (terminais de aeroporto, pontos de acesso múltiplos)
uber_navigation_routeRota com polilinha / passo a passo entre origem e destinos

🚗 Produtos & Reservas

FerramentaDescrição
uber_status_getCidade, viagem atual, veículos próximos — também uma sonda de autenticação
uber_products_listUberX / Comfort / Black com tarifas em tempo real + ETAs
uber_pre_plus_ones_getInformações do local + UX de primeira viagem para um embarque
uber_reservation_data_getFaixas de horário de reserva + disponibilidade do Uber Reserve
uber_offers_rankedOfertas promocionais ranqueadas em uma cidade
uber_pre_checkout_actions_getAções de pré-checkout (construídas automaticamente na próxima etapa)
uber_trip_requestWrapper inteligente — constrói checkoutActionResult automaticamente se ausente
uber_cancellation_info_getTaxas de cancelamento / mensagens
uber_trip_cancelCancela uma viagem ativa
uber_ride_book_quickEm uma etapa: busca → resolve → produtos → trip_request
uber_trip_status_watchConsulta uber_status_get até clientStatus mudar

📜 Histórico de Atividades

FerramentaDescrição
uber_activities_listAtividades passadas + futuras (riders.uber.com)
uber_activities_upcomingFuturas via REST (www.uber.com)
uber_activities_pastPassadas via REST (www.uber.com)
uber_trip_getDetalhes completos de uma única viagem
uber_receipt_getRecibo detalhado — detalhamento da tarifa, distância, duração
uber_receipt_send_emailEnvia recibo por e-mail
uber_invoice_status_getFatura fiscal / status NF‑e (Brasil)
uber_arrears_getSaldo de pagamento pendente

💬 Chat com o Motorista

FerramentaDescrição
uber_thread_by_tracking_getEncontra o UUID do tópico de chat pelo UUID da viagem
uber_thread_getLê mensagens em um tópico de chat

👤 Perfil

FerramentaDescrição
uber_user_riders_getPerfil completo: nome, perfis de pagamento, Uber Cash, assinaturas
uber_user_currentPerfil rápido via REST
uber_user_travel_statusSe o usuário está atualmente em uma viagem
uber_membership_attributesEstado do Uber One + elegibilidade a benefícios
uber_navlinks_getLinks de navegação web
uber_tax_forms_checkSe formulários fiscais (equivalente ao 1099) estão disponíveis

💳 Pagamentos & Promoções

FerramentaDescrição
uber_payment_options_listMétodos de pagamento salvos no hub de pagamentos
uber_promo_pill_getBanner promocional da tela inicial
uber_product_suggestions_listTipos de produto sugeridos com base no histórico
uber_map_hero_productsProdutos em destaque na tela inicial do mapa

Exemplos de Prompts

Depois de conectado, pergunte ao seu assistente 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] O composto uber_ride_book_quick lida com todo o fluxo de reserva internamente — busca de embarque, resolução, busca de desembarque, resolução, produtos, pré-checkout, solicitação de viagem. Útil quando você só quer dizer "reserve uma corrida de X para Y".

[!CAUTION] uber_trip_request e uber_ride_book_quick cobram o método de pagamento do usuário e despacham um motorista real. Sempre confirme com o usuário antes de chamar.

Arquitetura

┌──────────────────┐    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 sem estado: cada chamada /mcp cria um novo StreamableHTTPServerTransport + McpServer vinculado à sessão do usuário autenticado — lida com usuários concorrentes sem sessões fixas.
  • Navegador remoto no servidor: um Chromium Playwright por sessão de login. CDP Page.startScreencast transmite quadros JPEG via WebSocket; CDP Input.dispatch{Mouse,Key}Event encaminha a entrada do usuário. Capacidade limitada por MAX_BROWSER_SESSIONS.
  • Aquecimento de subdomínio: após o redirecionamento pós-login em m.uber.com, o servidor visita silenciosamente riders.uber.com, www.uber.com e payments.uber.com para materializar os cookies de sessão específicos do domínio antes de capturar o pacote.
  • Autenticação baseada em cookies, sem renovação: a Uber não expõe um endpoint de renovação. Quando jwt-session expira (≈24 h), o usuário acessa /login/start novamente.
  • OAuth 2.1 + PKCE S256, JWTs HS256 vinculados ao público, tokens de renovação opacos rotativos (para a camada MCP, separados da sessão da Uber).
  • uber_trip_request inteligente: constrói payment.checkoutActionResult automaticamente a partir de getPreCheckoutActions se ausente — os agentes só precisam passar o meta de uber_products_list mais paymentProfileUUID.

Desenvolvimento

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

Estrutura do projeto:

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

Segurança & Aviso Legal

  • 🔒 No modo HTTP, os cookies da Uber ficam apenas na memória — nunca gravados em disco. Reiniciar o processo = refazer login.
  • 🚫 Não envie .env, arquivos HAR ou capturas do DevTools — eles contêm cookies de sessão. O .gitignore bloqueia todos os pontos comuns.
  • ⚠️ Não oficial. A Uber não publica uma API pública voltada ao consumidor. Isso envolve os endpoints do site do passageiro, que podem mudar sem aviso. Use por sua conta e risco e respeite os Termos de Serviço da Uber.
  • 🛡️ O fluxo de navegador remoto pode exibir desafios PerimeterX ou Arkose durante o login. Eles são solucionáveis pelo canvas (clicar em imagens, arrastar quebra-cabeças, etc.) — a reputação do seu IP importa: IPs residenciais recebem menos desafios que IPs de datacenter.
  • 💸 uber_trip_request e uber_ride_book_quick movimentam dinheiro real. Sempre confirme com o usuário antes de chamar.

Contribuindo

Issues e PRs são bem-vindos. Ao abrir uma issue, inclua:

  • Saída de npm run typecheck
  • Se você está usando o modo stdio ou HTTP+OAuth
  • Requisição/resposta editada (sem cookies) ao relatar uma falha de API

Licença

Lançado sob a Licença MIT.


Feito por Ari e Claude, também conhecido como Claudão.