Documentação oficial desta página · v0.20.6
OAuth por SSH / máquinas remotas
Alguns provedores do Hermes — Spotify e servidores MCP remotos (Linear, Sentry, Atlassian, Asana, Figma, …) — usam um fluxo OAuth de redirecionamento para loopback. O servidor de autorização redireciona seu navegador para http://127.0.0.1:<porta>/callback para que um pequeno ouvinte HTTP iniciado pelo Hermes pegue o código de autorização.
Isso funciona perfeitamente quando o Hermes e o seu navegador estão na mesma máquina. E quebra no instante em que não estão: o navegador do seu notebook tenta alcançar o 127.0.0.1 do seu notebook, mas o ouvinte está preso ao 127.0.0.1 do servidor remoto.
A solução é um encaminhamento local de SSH de uma linha. Para servidores MCP em um terminal interativo, muitas vezes dá para colar a URL de redirecionamento de volta (sem túnel).
O OAuth do xAI Grok (xai-oauth) usa código de dispositivo, não callback em loopback — abra a URL de verificação impressa em qualquer navegador e o Hermes fica consultando até a aprovação. Não precisa de túnel SSH. Veja OAuth do xAI Grok.
Resumo rápido
# Na sua máquina local (notebook), em um terminal separado:
ssh -N -L 43827:127.0.0.1:43827 usuario@maquina-remota
# Na sessão SSH que você já tem na máquina remota:
hermes auth spotify --no-browser
# → O Hermes imprime uma URL de autorização. Abra-a num navegador do seu notebook.
# → Seu navegador redireciona para 127.0.0.1:43827/callback, o túnel encaminha
# a requisição ao ouvinte remoto e o login se completa.
O Hermes imprime a porta exata em que se prendeu na linha Waiting for callback on ... — copie de lá. O Spotify usa a porta 43827 por padrão.
Quais provedores precisam disso
| Provedor | Porta de loopback | Precisa de túnel? |
|---|---|---|
| Spotify | 43827 (padrão) | Sim, quando o Hermes está remoto |
Servidores MCP (auth: oauth) | escolhida automaticamente por servidor | Sim, quando o Hermes está remoto (ou cole a URL de redirecionamento) |
xai-oauth (Grok SuperGrok) | não se aplica | Não — fluxo de código de dispositivo |
anthropic (Claude Pro/Max) | não se aplica | Não — fluxo de colar o código |
openai-codex (ChatGPT Plus/Pro) | não se aplica | Não — fluxo de código de dispositivo |
minimax, nous-portal | não se aplica | Não — fluxo de código de dispositivo |
Se o seu provedor não está na tabela, você não precisa de túnel.
Servidores MCP
Servidores MCP remotos (Linear, Sentry, Atlassian, Asana, Figma etc.) usam o mesmo fluxo de redirecionamento para loopback. O Hermes escolhe automaticamente uma porta livre por servidor e imprime a URL de autorização quando o fluxo OAuth começa — seja na inicialização (quando um servidor novo aparece em mcp_servers:), seja quando você roda hermes mcp login <servidor>.
Você tem dois jeitos de concluir isso de uma máquina remota:
Opção 1 — colar a URL de redirecionamento de volta (sem preparo, funciona em qualquer lugar). Em um terminal interativo, o Hermes pede que você cole a URL de redirecionamento, em paralelo com o ouvinte local. Depois de aprovar no navegador, o redirecionamento para http://127.0.0.1:<porta>/callback vai mostrar um erro de conexão — isso é esperado. Copie a URL inteira da barra de endereços do navegador e cole no prompt do Hermes:
MCP OAuth: authorization required.
Open this URL in your browser:
https://mcp.linear.app/authorize?response_type=code&...
Or paste the redirect URL here (or the ?code=...&state=... portion) and press Enter:
> https://mcp.linear.app/callback?code=abc123&state=xyz
Got authorization code from paste — completing flow.
Uma query string solta ?code=...&state=... também é aceita. Isso funciona para qualquer servidor MCP com auth: oauth e não exige mudança nenhuma na configuração de SSH.
Opção 2 — encaminhamento de porta por SSH (igual ao Spotify). O Hermes imprime a porta exata em que se prendeu na dica sobre sessão SSH. Abra um terminal separado no seu notebook:
ssh -N -L <porta>:127.0.0.1:<porta> usuario@maquina-remota
Depois abra a URL de autorização no navegador normalmente; o redirecionamento passa pelo túnel e o ouvinte o recebe. Use isso quando o fluxo precisa se completar sem ninguém acompanhando (por exemplo, uma reautenticação por script em que não dá para colar interativamente).
Pegadinha — a corrida de 30s na recarga de configuração. Se você editar o ~/.hermes/config.yaml para adicionar um servidor MCP com OAuth de dentro de uma sessão do Hermes já rodando, a CLI recarrega as conexões MCP automaticamente com um tempo limite de 30s. Isso não é tempo suficiente para concluir um fluxo OAuth interativo, e a recarga desiste. Use hermes mcp login <servidor> em um terminal novo — ele não tem esse teto e espera os 5 minutos completos até você colar de volta.
Por que o ouvinte não pode simplesmente escutar em 0.0.0.0
O Spotify e a maioria dos servidores OAuth de MCP validam o parâmetro redirect_uri contra uma lista de permissão. Os dois exigem a forma de loopback (http://127.0.0.1:<porta-exata>/callback). Prender o ouvinte a 0.0.0.0 ou a outra porta faria o servidor de autorização rejeitar a requisição como divergência de redirect_uri. O túnel SSH mantém a URI de loopback intacta de ponta a ponta.
Passo a passo: um salto de SSH
1. Suba o túnel a partir da sua máquina local
# Spotify (porta 43827)
ssh -N -L 43827:127.0.0.1:43827 usuario@maquina-remota
O -N quer dizer "não abra um shell remoto, só segure o túnel aberto". Deixe esse terminal rodando enquanto durar o login.
2. Em outra sessão SSH, rode o comando de autenticação
ssh usuario@maquina-remota
hermes auth spotify --no-browser
O Hermes detecta a sessão SSH, não abre o navegador sozinho e imprime uma URL de autorização mais uma linha Waiting for callback on http://127.0.0.1:<porta>/callback.
3. Abra a URL no navegador local
Copie a URL de autorização do terminal remoto e cole no navegador do seu notebook. Aprove a tela de consentimento. O servidor de autorização redireciona para http://127.0.0.1:<porta>/callback. Seu navegador bate no túnel, a requisição é encaminhada ao ouvinte remoto e o Hermes imprime Login successful!.
Você pode derrubar o túnel (Ctrl+C no primeiro terminal) assim que ver a linha de sucesso.
Passo a passo: através de um bastião
Se você chega ao Hermes por um bastião / máquina de salto, use o -J (ProxyJump) embutido do SSH:
ssh -N -L 43827:127.0.0.1:43827 -J usuario-salto@maquina-salto usuario@maquina-final
Isso encadeia uma conexão SSH pela máquina de salto sem colocar a porta de loopback no bastião. O 127.0.0.1:43827 local do seu notebook faz túnel direto até o 127.0.0.1:43827 da máquina remota final.
Em versões antigas do OpenSSH que não suportam -J, a forma longa é:
ssh -N \
-o "ProxyCommand=ssh -W %h:%p usuario-salto@maquina-salto" \
-L 43827:127.0.0.1:43827 \
usuario@maquina-final
Mosh, tmux, ssh ControlMaster
O túnel é uma propriedade da conexão SSH que está por baixo. Se você roda o Hermes dentro do tmux por cima de uma sessão mosh, a itinerância do mosh não carrega o encaminhamento -L. Abra uma sessão SSH comum separada só para o túnel -L — é essa conexão que precisa continuar viva durante o fluxo de autenticação. Sua sessão interativa mosh/tmux pode seguir rodando o Hermes normalmente.
Se você usa ssh -o ControlMaster=auto, os encaminhamentos de porta em uma conexão multiplexada compartilham o tempo de vida do mestre. Reinicie o mestre se o túnel não subir:
ssh -O exit usuario@maquina-remota
ssh -N -L 43827:127.0.0.1:43827 usuario@maquina-remota
Solução de problemas
bind [127.0.0.1]:43827: Address already in use
Alguma coisa no seu notebook já está usando essa porta. Ou o túnel anterior não fechou direito, ou um Hermes local também está escutando nela. Ache e mate o culpado:
# macOS / Linux
lsof -iTCP:43827 -sTCP:LISTEN
kill <PID>
Depois repita o comando ssh -L.
A autorização expirou esperando o callback local
O redirecionamento nunca chegou de volta ao ouvinte remoto. Confira se o túnel continua vivo (o ssh -N não mostra saída, então olhe o terminal de onde você o iniciou), confirme que você usou a porta da última linha Waiting for callback on ... (o Hermes pode pular para outra porta se a preferida estiver ocupada), reinicie o túnel se precisar e rode o comando de autenticação de novo.
Os tokens vão parar no ~/.hermes errado
Os tokens são gravados sob o usuário Linux que rodou hermes auth add .... Se o seu gateway / serviço systemd roda com outro usuário (por exemplo, root ou um usuário hermes dedicado), autentique-se como aquele usuário, para os tokens caírem no ~/.hermes/auth.json dele. Use sudo -u hermes -i ou equivalente.
Veja também
- OAuth do xAI Grok — código de dispositivo; sem túnel SSH
- Spotify (
Rodando por SSH) - Cliente MCP nativo (seção de OAuth)
-J/ ProxyJump do SSH (man page)