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 
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
| Modo | Transporte | Login | Melhor para |
|---|---|---|---|
| HTTP + OAuth 2.1 | HTTP Streamable | Login 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 |
| stdio | Entrada / saída padrão | Cookies exportados de um login HTTP único em um arquivo .env | Configuraçã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 installbaixa o Chromium via etapapostinstalldo 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.
- Inicie
npm run devuma vez e conclua o login no canvas. - Com
NODE_ENVnão definido (padrão), acesseGET /debug/userspara confirmar seuuserSub. - Leia o cabeçalho de cookie nos logs do servidor (ou abra o DevTools em
m.uber.come copieCookie:de qualquer requisição). - 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/startnovamente para capturar um novo conjunto.
Ferramentas Disponíveis
📍 Embarque / Desembarque
| Ferramenta | Descrição |
|---|---|
uber_pudo_search | Busca de endereço com autocomplete — embarque ou desembarque |
uber_pudo_resolve | Resolve um ID de local para coordenadas e endereço completo |
uber_pudo_refine | Refina dentro de um local (terminais de aeroporto, pontos de acesso múltiplos) |
uber_navigation_route | Rota com polilinha / passo a passo entre origem e destinos |
🚗 Produtos & Reservas
| Ferramenta | Descrição |
|---|---|
uber_status_get | Cidade, viagem atual, veículos próximos — também uma sonda de autenticação |
uber_products_list | UberX / Comfort / Black com tarifas em tempo real + ETAs |
uber_pre_plus_ones_get | Informações do local + UX de primeira viagem para um embarque |
uber_reservation_data_get | Faixas de horário de reserva + disponibilidade do Uber Reserve |
uber_offers_ranked | Ofertas promocionais ranqueadas em uma cidade |
uber_pre_checkout_actions_get | Ações de pré-checkout (construídas automaticamente na próxima etapa) |
uber_trip_request | Wrapper inteligente — constrói checkoutActionResult automaticamente se ausente |
uber_cancellation_info_get | Taxas de cancelamento / mensagens |
uber_trip_cancel | Cancela uma viagem ativa |
uber_ride_book_quick | Em uma etapa: busca → resolve → produtos → trip_request |
uber_trip_status_watch | Consulta uber_status_get até clientStatus mudar |
📜 Histórico de Atividades
| Ferramenta | Descrição |
|---|---|
uber_activities_list | Atividades passadas + futuras (riders.uber.com) |
uber_activities_upcoming | Futuras via REST (www.uber.com) |
uber_activities_past | Passadas via REST (www.uber.com) |
uber_trip_get | Detalhes completos de uma única viagem |
uber_receipt_get | Recibo detalhado — detalhamento da tarifa, distância, duração |
uber_receipt_send_email | Envia recibo por e-mail |
uber_invoice_status_get | Fatura fiscal / status NF‑e (Brasil) |
uber_arrears_get | Saldo de pagamento pendente |
💬 Chat com o Motorista
| Ferramenta | Descrição |
|---|---|
uber_thread_by_tracking_get | Encontra o UUID do tópico de chat pelo UUID da viagem |
uber_thread_get | Lê mensagens em um tópico de chat |
👤 Perfil
| Ferramenta | Descrição |
|---|---|
uber_user_riders_get | Perfil completo: nome, perfis de pagamento, Uber Cash, assinaturas |
uber_user_current | Perfil rápido via REST |
uber_user_travel_status | Se o usuário está atualmente em uma viagem |
uber_membership_attributes | Estado do Uber One + elegibilidade a benefícios |
uber_navlinks_get | Links de navegação web |
uber_tax_forms_check | Se formulários fiscais (equivalente ao 1099) estão disponíveis |
💳 Pagamentos & Promoções
| Ferramenta | Descrição |
|---|---|
uber_payment_options_list | Métodos de pagamento salvos no hub de pagamentos |
uber_promo_pill_get | Banner promocional da tela inicial |
uber_product_suggestions_list | Tipos de produto sugeridos com base no histórico |
uber_map_hero_products | Produtos 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_quicklida 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_requesteuber_ride_book_quickcobram 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
/mcpcria um novoStreamableHTTPServerTransport+McpServervinculado à 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.startScreencasttransmite quadros JPEG via WebSocket; CDPInput.dispatch{Mouse,Key}Eventencaminha a entrada do usuário. Capacidade limitada porMAX_BROWSER_SESSIONS. - Aquecimento de subdomínio: após o redirecionamento pós-login em
m.uber.com, o servidor visita silenciosamenteriders.uber.com,www.uber.comepayments.uber.compara 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-sessionexpira (≈24 h), o usuário acessa/login/startnovamente. - 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_requestinteligente: constróipayment.checkoutActionResultautomaticamente a partir degetPreCheckoutActionsse ausente — os agentes só precisam passar ometadeuber_products_listmaispaymentProfileUUID.
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.gitignorebloqueia 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_requesteuber_ride_book_quickmovimentam 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.