claude-voice-bridge
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@claude-voice-bridgeWhat projects are available?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
claude-voice-bridge
Talk to Claude Code, hands-free. A ~450-line bridge that exposes headless
Claude Code (claude -p) as a remote MCP server, plus a one-tap browser voice
client built on OpenAI's Realtime API (gpt-realtime-2.1 — the same voice
tech as ChatGPT).
iPhone/Mac Safari ──WebRTC audio──▶ OpenAI gpt-realtime-2.1
│ (MCP tool calls over HTTPS)
▼
Tailscale Funnel ▶ this bridge (127.0.0.1:8765)
│ spawns
▼
claude -p <task> --output-format stream-json
in an allow-listed project directoryWhat's in this repo
server.py— the bridge itself: MCP server + OpenAI Realtime secret minting + task/tmux orchestrationstatic/— the voice client page and a live-status watch pageplayground/— a tiny example project the bridge is allowed to touch, plus a demo transcript paneltests/,test_client.py— an end-to-end MCP smoke test and a fakeclaudeCLI stand-in for testing without real credentials/API calls
Not in this repo (external dependencies you install/configure yourself):
the Claude Code CLI itself,
tmux (used for native/interactive mode — see below), the
Claude in Chrome browser extension (an independent tool
some Claude Code setups use for browser automation; this bridge doesn't
orchestrate it directly, Claude Code does), and Tailscale. This repo is the
glue between voice input and a Claude Code session — not a bundle of those
tools.
Why not ChatGPT's own voice mode? Verified 2026-07-17: ChatGPT voice (GPT-Live) cannot invoke connectors — built-in or custom MCP — and custom-GPT Actions are also skipped in voice. The Realtime API is OpenAI's supported way to get the same voice models with tool calling. (The bridge still works as a ChatGPT text-chat connector; see below.)
Related MCP server: kje-mcp
Requirements
macOS with the Claude Code CLI installed and authenticated (
claudeon PATH or a known path)Python 3.11+
An OpenAI account with Realtime API access
Tailscale with Funnel enabled, to reach the bridge from your phone off your home network (optional if you only use it on localhost)
tmux, if you want native/interactive mode (see below) — not required for headless mode
Setup
git clone https://github.com/<you>/claude-voice-bridge.git
cd claude-voice-bridge
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp config.example.json config.json
chmod 600 config.json
# edit config.json:
# - "token": generate a long random string, e.g. `openssl rand -hex 16`
# - "openai_api_key": your OpenAI key
# - "projects": name -> absolute path allowlist for what Claude Code may touch
# - "claude_bin": absolute path to your claude binaryRe-auth the CLI (once). Either:
run
claude /loginin a terminal, orrun
claude setup-tokenand paste the long-lived token intoconfig.jsonas"claude_oauth_token": "..."(best for unattended use — survives future keychain drift).
(Optional) Expose it off-network:
tailscale funnel --set-path /<your-token> 8765, then setpublic_baseinconfig.jsonto the funnel hostname it prints.Start the bridge:
./run.sh(keep the terminal tab open, or see "Run at login" below).Open the voice page (Safari on iPhone or Mac): the
voice pageURL printed at server start — tap Connect, allow the mic, talk.
The Tailscale Funnel route persists across reboots; only run.sh needs
restarting.
Talking to it
"What projects can you work on?"
"In the playground project, build a snake game in a single HTML file."
"How's it going?" / "What's the status?"
"What did it change?" (final outcome)
"Tell it to also add a high-score display." (resumes the same session)
"Stop the task."
"Use opus for this one" / "let it run shell commands" (maps to
model/allow_bash).
Tasks run in the background for minutes; start one, chat or hang up, ask for
updates whenever. Claude Code ends every task with a SPOKEN: summary written
to be read aloud.
Endpoints (all under the secret path token from config.json)
path | what |
| voice client page |
| POST → mints an ephemeral OpenAI Realtime secret (session config incl. MCP lives server-side here) |
| the MCP endpoint (streamable HTTP, stateless JSON) |
| liveness + task states |
Native mode (default)
With "mode": "native" in config, voice requests don't run headless — they
land in a REAL interactive Claude Code session running in tmux, surfaced in a
Terminal window on the Mac (tmux attach -t cv-<project> from anywhere too).
Three-way collaboration: you watch the native TUI and can type into it
directly (Claude Code queues input mid-run), the voice agent injects prompts
via tmux and reads replies from the live session transcript, and each project
is one continuous session with full context. "Stop" from voice sends an
interrupt (Escape) to the window. background: true requests still run
headless and invisible. Set "mode": "headless" to revert entirely.
MCP tools
claude_code(request, project?, model?, effort?, background?) — the front
door. ANY request goes through it: questions, inspections, debugging, code
changes. It waits up to wait_s (90s): quick things return the answer
directly in say; longer work converts to a background task (state
running). background: true skips the wait. project optional — omitted
requests root at home (your home directory) and Claude Code roams from
there.
Supporting tools: list_projects · claude_status(task_id?) ·
claude_result(task_id?) · claude_reply(message, task_id?) (resumes the
same session with full context, same wait-or-background behavior) ·
claude_stop(task_id?).
All tools return a say field written for speech plus structured detail;
task_id defaults to the most recent task. Finished tasks carry
session_id and a resume_command (cd <project> && claude --resume <id>)
— voice sessions are ordinary Claude Code sessions in ~/.claude/projects/,
so you can adopt any of them interactively at your desk.
ChatGPT text-chat connector (optional second consumer)
ChatGPT (web, Plus/Pro) → Settings → Apps & Connectors → Advanced settings →
enable Developer mode → create connector with the /<token>/mcp URL, no
auth. Works in text conversations (including keyboard dictation); write tools
require a per-conversation confirmation tap. Voice mode will ignore it — see
above.
config.json
key | meaning |
| secret path segment gating everything (rotate: change it, re-run the funnel command with the new path, remove the old: |
| name → directory allowlist; Claude Code only ever runs inside these |
|
|
|
|
| extra always-allowed tools, e.g. |
| optional long-lived headless token from |
| used only to mint ephemeral Realtime secrets |
|
|
| absolute path to the claude binary ( |
Realtime voice cost ballpark: ~$0.04–0.10/min flagship, ~1/3 on mini — separate from Claude usage.
Security model — read this before exposing it
If you funnel this to the public internet, the token path is the entire gate on code execution. There's no additional login, MFA, or IP allowlist by default — anyone who obtains the URL can drive Claude Code inside your allow-listed project directories. Treat the URL exactly like a password: don't paste it into chat logs, screenshots, or public issues.
config.jsonshould staychmod 600and must never be committed (see.gitignore).permission_modeinconfig.jsoncontrols the blast radius. The shipped example defaults toacceptEdits(file edits inside the allow-listed project auto-approve; shell commands do not, unless you addBashtoallowed_tools). Settingpermission_modetobypassPermissionsremoves all permission checks — voice tasks then get an unconfirmed shell, and the token path becomes the only thing standing between the public internet and full code execution on your machine. Only do this if you understand and accept that tradeoff.projectsis an allowlist, not a sandbox. Claude Code can read/write anywhere inside a listed directory (and, if shell access is enabled, run arbitrary commands as your user). Don't point it at anything you wouldn't hand a well-meaning but unsupervised script.Rotate the token if you ever suspect it leaked: change
tokeninconfig.json, re-run the funnel command with the new path, then remove the old route (tailscale funnel --set-path /<old-token> off).Kill switches:
tailscale funnel --set-path /<token> off(removes just this route), or stop the server (Ctrl-Conrun.sh, or kill the process).Secrets that must never be committed:
token,openai_api_key,claude_oauth_token— all live only in your localconfig.json, which is gitignored. Useconfig.example.jsonas the template.
Run at login (optional)
launchd + zsh can't read ~/Desktop (TCC) — use the compiled ad-hoc-signed
runner-binary trick already validated on the PokerAdvisor auto-trigger, with
run.sh as the target. Or just keep a terminal tab.
Troubleshooting
"Failed to authenticate: OAuth session expired" in task results → step 1 above.
rt-secret 4xx → OpenAI key invalid, or
realtime_modelname has drifted; check the error JSON the endpoint returns.Voice page won't connect on iPhone → must be real Safari (not an in-app webview), and audio may route to the speaker instead of AirPods — known iOS WebRTC quirk.
Transcript only shows the assistant → by design (input transcription is off to keep the session config minimal); add
audio.input.transcriptionin_mint_secretif wanted.Per-task raw stream-json logs live in
tasks/task-N.jsonl.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityFmaintenanceAn MCP server that orchestrates AI coding assistants (Claude Code CLI and Gemini CLI) to perform complex programming tasks autonomously, allowing remote control of your local development environment from anywhere.15142MIT
- Flicense-qualityCmaintenanceMCP server that enables Claude.ai to interact with Jim Brain's persistent memory, project state, and vault, and to dispatch headless Claude Code build sessions on a VPS.
- Alicense-qualityFmaintenanceAn MCP server that exposes your local Claude Code CLI over HTTP+SSE, enabling any MCP-compatible client to use your Claude Code MAX/PRO subscription remotely.161MIT
- Alicense-qualityBmaintenanceMCP server that lets an AI agent delegate tasks to Claude Code on a remote Mac via SSH over Tailscale. Persistent sessions, 200k context, full Mac filesystem access.MIT
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Cloud-hosted MCP server for durable AI memory
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/shepard5/claude-voice-bridge'
If you have feedback or need assistance with the MCP directory API, please join our Discord server