http://127.0.0.1:<port>/callback so a tiny HTTP listener started by Mibyan can grab the authorization code.
This works perfectly when Mibyan and your browser are on the same machine. It breaks the moment they aren’t: your laptop’s browser tries to reach 127.0.0.1 on your laptop, but the listener is bound to 127.0.0.1 on the remote server.
The fix is a one-line SSH local-forward. For MCP servers on an interactive terminal, you can often paste the redirect URL back instead (no tunnel).
xAI Grok OAuth (xai-oauth) uses OAuth device code, not a loopback callback — open the printed verification URL in any browser and Mibyan polls until approval. No SSH tunnel is required. See xAI Grok OAuth.
TL;DR
Waiting for callback on ... line — copy it from there. Spotify defaults to port 43827.
Which Providers Need This
If your provider isn’t in the table, you don’t need a tunnel.
MCP Servers
Desktop Skills → MCP: the native app receives the callback on your computer and relays it to the selected connection and profile, so this flow does not need an SSH callback tunnel ordashboard.public_url. Tokens stay on the owning
backend profile. Leaving the MCP tab or changing its scope cancels pending
sign-in. If Desktop asks you to update the backend, update it before retrying;
it does not fall back to a remote HTTP callback. The terminal workflows below
are unchanged.
Remote MCP servers (Linear, Sentry, Atlassian, Asana, Figma, etc.) use the same loopback redirect flow. Mibyan auto-picks a free port per server and prints the authorize URL when the OAuth flow kicks off — either at startup (when a new server appears in mcp_servers:) or when you run mibyan mcp login <server>.
You have two ways to complete it from a remote host:
Option 1 — paste the redirect URL back (no setup, works anywhere). On an interactive terminal, Mibyan prompts you to paste the redirect URL alongside running the local listener. After approving in your browser, the redirect to http://127.0.0.1:<port>/callback will show a connection error — that’s expected. Copy the full URL from the browser’s address bar and paste it at the Mibyan prompt:
?code=...&state=... query string is accepted too. This works for any MCP server with auth: oauth and requires no SSH config changes.
Option 2 — SSH port forward (same as Spotify). Mibyan prints the exact port it bound to in the SSH-session hint. Open a separate terminal on your laptop:
~/.mibyan/config.yaml to add an OAuth MCP server from inside a running Mibyan session, the CLI auto-reloads MCP connections with a 30s timeout. That’s not enough time to complete an interactive OAuth flow, and the reload will give up. Use mibyan mcp login <server> from a fresh terminal instead — it has no such cap and waits the full 5 min for you to paste back.
Why the listener can’t just bind 0.0.0.0
Spotify and most MCP OAuth servers validate theredirect_uri parameter against an allowlist. Both require the loopback form (http://127.0.0.1:<exact-port>/callback). Binding the listener to 0.0.0.0 or a different port would cause the auth server to reject the request as a redirect_uri mismatch. The SSH tunnel keeps the loopback URI intact end-to-end.
Step-by-step: single SSH hop
1. Start the tunnel from your local machine
-N means “don’t open a remote shell, just hold the tunnel open.” Keep this terminal running for the duration of the login.
2. In a separate SSH session, run the auth command
Waiting for callback on http://127.0.0.1:<port>/callback line.
3. Open the URL in your local browser
Copy the authorize URL from the remote terminal and paste it into the browser on your laptop. Approve the consent screen. The auth server redirects tohttp://127.0.0.1:<port>/callback. Your browser hits the tunnel, the request is forwarded to the remote listener, and Mibyan prints Login successful!.
You can tear down the tunnel (Ctrl+C in the first terminal) once you see the success line.
Step-by-step: through a jump box
If you reach Mibyan through a bastion / jump host, use SSH’s built-in-J (ProxyJump):
127.0.0.1:43827 on your laptop tunnels straight through to 127.0.0.1:43827 on the final remote host.
For older OpenSSH that doesn’t support -J, the long form is:
Mosh, tmux, ssh ControlMaster
The tunnel is a property of the underlying SSH connection. If you’re running Mibyan insidetmux over a mosh session, the mosh roaming doesn’t carry the -L forwarding. Open a separate plain SSH session only for the -L tunnel — that’s the connection that has to stay alive during the auth flow. Your interactive mosh/tmux session can keep running Mibyan normally.
If you use ssh -o ControlMaster=auto, port forwards on a multiplexed connection share the master’s lifetime. Restart the master if the tunnel doesn’t come up:
Troubleshooting
bind [127.0.0.1]:43827: Address already in use
Something on your laptop is already using that port. Either the previous tunnel didn’t shut down cleanly, or a local Mibyan is also listening on it. Find and kill the offender:
ssh -L command.
Authorization timed out waiting for the local callback
The redirect never made it back to the remote listener. Check the tunnel is still alive (ssh -N doesn’t show output, so look at the terminal you started it from), confirm you used the port from the latest Waiting for callback on ... line (Mibyan may auto-bump if the preferred port is busy), restart the tunnel if needed, and re-run the auth command.
Tokens land in the wrong ~/.mibyan
The tokens are written under the Linux user that ran mibyan auth add .... If your gateway / systemd service runs as a different user (e.g. root or a dedicated mibyan user), authenticate as that user so the tokens land in their ~/.mibyan/auth.json. sudo -u mibyan -i or equivalent.
See Also
- xAI Grok OAuth — device code; no SSH tunnel
- Spotify (
Running over SSH) - Native MCP client (OAuth section)
- SSH
-J/ ProxyJump (man page)

