OAuth para clientes MCP customizados
Se você está construindo seu próprio cliente MCP (CLI, SDK, plugin de IDE), esta página descreve nossa implementação OAuth: padrões que suportamos, endpoints, regras de redirect_uri e como depurar erros comuns. Usuários do Claude.ai e ChatGPT não precisam desta página — use o Quickstart no lugar.
Padrões que implementamos
mcp-telegram.com está totalmente em conformidade com as especificações OAuth nas quais o ecossistema MCP se baseia — sem extensões proprietárias, sem segredos compartilhados embutidos nos clientes.
Endpoints
Authorization code flow com PKCE
Fluxo padrão RFC 6749 §4.1 + RFC 7636. Sem surpresas — se sua biblioteca OAuth lida com "authorization code + PKCE", vai funcionar.
Registre seu cliente
POST /oauth/register com { redirect_uris: ["http://127.0.0.1:«porta»/callback"], client_name: "nome-do-seu-cliente" }. O servidor retorna client_id + client_secret (o secret é opcional para clientes PKCE públicos, mas não atrapalha recebê-lo).
Gere o par PKCE
Gere um code_verifier aleatório de 43-128 caracteres, depois calcule code_challenge = BASE64URL(SHA256(code_verifier)). Guarde o verifier localmente para o passo 4.
Abra /oauth/authorize no navegador
Redirecione o usuário para /oauth/authorize?response_type=code&client_id=...&redirect_uri=...&state=...&code_challenge=...&code_challenge_method=S256. O servidor exibe um QR code; o usuário escaneia no app do Telegram para autenticar.
Receba o authorization code
Depois do scan do QR, o servidor redireciona para seu redirect_uri com ?code=...&state=.... Verifique se o parâmetro state bate com o que você enviou.
Troque o code por um token
POST /oauth/token com grant_type=authorization_code, code, redirect_uri, code_verifier, client_id. Você recebe um access_token (TTL de 10 anos — veja Token lifetime abaixo) e um refresh_token. Use o access_token como Authorization: Bearer ... nas requisições para /mcp.
Regras de matching de redirect_uri
Seguimos rigorosamente o RFC 8252 §7.3 e §8.4. O algoritmo de matching depende de o URI registrado ser ou não um literal de IP loopback.
Loopback (http://127.0.0.1 ou http://[::1])
Se você registrou um URI loopback, o redirect_uri no momento do authorize precisa bater exatamente em scheme, host, path e query — mas a porta pode ser diferente. Isso é exigido pelo RFC 8252 §7.3 porque clientes nativos vinculam uma porta efêmera atribuída pelo SO que pode mudar entre execuções.
- Registrado http://127.0.0.1:36201/callback bate com http://127.0.0.1:50000/callback no authorize ✅
- Registrado http://127.0.0.1:36201/callback NÃO bate com http://127.0.0.1:50000/different-path — o path tem que ser exato
- Registrado http://[::1]:36201/cb NÃO bate com http://127.0.0.1:36201/cb — loopback IPv4 e IPv6 são identificadores separados
HTTPS (https://seu-dominio.example/...)
Correspondência byte-a-byte exata, incluindo path, query e porta (RFC 6749 §3.1.2). Sem flexibilidade.
localhost (NÃO recomendado)
Tratamos http://localhost como um hostname comum — match exato obrigatório, sem flexibilidade de porta. O RFC 8252 §8.3 recomenda usar literais de IP (127.0.0.1 / [::1]) em vez de localhost porque a resolução de DNS depende da implementação.
Erros comuns
Clientes testados
Confirmado que interoperam com nosso servidor. Se você construir algo novo e funcionar, manda um PR para a gente adicionar aqui.
Múltiplas contas Telegram em uma única conexão OAuth
A partir da v2.32.0, uma única conexão OAuth pode manter várias identidades do Telegram e alternar entre elas com uma chamada de ferramenta — sem ciclo de Disconnect/Connect, sem registrar um novo cliente.
Listar o que está vinculado
Chame telegram-accounts-list. Você verá sua conta primary (vinculada ao OAuth) marcada com ⭐ se estiver ativa, além de quaisquer contas secundárias que você tenha adicionado.
Vincular outra conta
Chame telegram-accounts-add com um label opcional (ex.: "testing"). A ferramenta retorna uma URL de uso único (TTL 10 minutes) — abra-a em qualquer dispositivo e escaneie o QR com a conta Telegram que você quer adicionar.
Alternar a conta ativa
Chame telegram-accounts-switch com identifier=label, @username, account_id ou 'primary'. A próxima chamada telegram-* já usa essa conta imediatamente. Sem reconectar.
Desvincular uma conta secundária
Chame telegram-accounts-remove identifier=… em uma conta secundária. A conta Telegram em si NÃO é deslogada — apenas o vínculo aqui é removido. A conta primary não pode ser removida desta forma; use o fluxo de Disconnect do seu cliente para sair completamente.
Cada conexão OAuth é isolada: contas que você vincula via Hermes ficam invisíveis para Claude.ai ou ChatGPT, mesmo que seja a mesma identidade Telegram. Para conectar contas diferentes a clientes MCP diferentes, registre cada cliente separadamente e use telegram-accounts-add dentro da sessão de cada um.