Readback
FreeNot checkedWindows-first, dual-provider (Inworld + ElevenLabs) voice output for Claude Code. Reads Claude's replies aloud, tuned from a GUI panel.
About
Windows-first, dual-provider (Inworld + ElevenLabs) voice output for Claude Code. Reads Claude's replies aloud, tuned from a GUI panel.
README
Voice output for Claude Code. Flip it on and Claude reads its replies aloud, so you can rest your eyes or keep half an ear on a long run instead of watching the terminal scroll. Flip it off and it stops immediately, mid-sentence if the phone rings.
- 🪟 Windows-first. Plays through built-in PowerShell audio, with zero external dependencies. (Most Claude voice tools are macOS-only.)
- 🎚️ Two providers. Inworld (hundreds of voices, cheap) and ElevenLabs, switchable in a click.
- 🖥️ GUI-tunable. A little control panel for voice, model, speed and
expression, with a live voice picker and in-app key entry. No
.envfiddling. - ⚡ Streaming. Splits replies into sentences and starts talking on the first one, so audio kicks in fast even on long messages.
- 🔀 Multi-session. Running several Claude projects at once? Their replies queue and read in order instead of cutting each other off. Voice off still silences everything instantly.
Unofficial community tool. Not affiliated with, or endorsed by, Anthropic, Inworld, or ElevenLabs.
Already using it? See the changelog. 0.4.0 fixes several
real bugs, including "voice off doesn't stop playback" and a case where the
panel toggle appeared to work while changing nothing. git pull to update.
How it works
Three cooperating pieces sharing one state file:
| Piece | Role |
|---|---|
| MCP server | in-chat toggle: voice_on / voice_off / set_provider / set_voice / say / list_voices |
| Stop hook | the actual voice: auto-speaks each reply while enabled |
| Control panel | localhost:7717 web cockpit for provider / voice / model / tuning + live preview |
The hook and MCP toggle work whether or not the panel is open.
Setup (Windows, Node 18+)
git clone https://github.com/Deltawerks/readback
cd readback
npm install
npm run panel # opens the control panel in your browser
In the panel: pick a provider, paste that provider's API key, choose a voice, and hit ▶ to hear it. Then wire it into Claude Code:
npm run register # writes .mcp.json + hooks-snippet.json for this folder
1. MCP server (the in-chat toggle). Auto-loads whenever you work in this
folder. To get it in every project, run the claude mcp add line that
register prints.
2. Auto-speak hook (the part that actually talks). Open your Claude Code
settings at C:\Users\<you>\.claude\settings.json and add the hooks block from
the hooks-snippet.json that register just wrote. If that settings file
doesn't exist yet, paste the snippet in as the whole file. If it does exist, add
"hooks" alongside whatever is already in there:
{
"yourExistingSettings": "stay exactly as they are",
"hooks": {
"Stop": [
{ "hooks": [ { "type": "command", "command": "node", "args": ["C:\\path\\to\\readback\\hook\\stop-hook.js"], "timeout": 15 } ] }
]
}
}
Use the path from your generated snippet, not the one above. Then restart Claude Code, say "voice on", and the next reply should speak.
Optional: npm run shortcut drops a "Readback" icon on your Desktop that
opens the panel in one click.
Quick smoke test, no Claude Code required:
npm run say "readback is online"
npm run voices # list the active provider's voices
Day to day (and after a reboot)
Nothing to restart. Claude Code launches the MCP server itself, and the hook is just a line in its settings file, so both come back on their own after a reboot.
The control panel is optional and on-demand: a settings GUI, not a background
service. Voice keeps working whether or not it's open, because the hook reads
your saved settings from disk. Launch it (Desktop icon or npm run panel) when
you want to switch voice, provider or speed, then close it again.
Using it
- In chat: say "voice on" and replies start speaking. "voice off" silences instantly, including whatever's playing right then.
- Multiple projects at once: their replies line up and read one after another instead of stomping each other. "voice off" (or the panel's Stop button) clears the whole queue at once, for when the phone rings.
- In the panel: switch provider, pick a voice, drag speed / expression, hit ▶ to preview. The panel's Speak/preview takes over immediately (it's you, at the keyboard); only the automatic per-reply speech queues.
Keys are stored per-user outside the repo: %APPDATA%\Readback\secret.json
on Windows (~/.config/readback/ elsewhere), so cloning into a shared or
cloud-synced folder can't sync your key with it. Override the location with
READBACK_STATE_DIR. Replies are cleaned before speaking (code blocks dropped,
links flattened, markdown/emoji stripped). Extremely long replies are capped
with a spoken "the rest is on screen", but the cap is deliberately high so it
acts as a backstop rather than clipping normal replies. Set
READBACK_MAX_CHARS if you want a shorter ceiling on how long a read can run.
Upgrading from an earlier version? Your key and settings are copied to the new location automatically on first run. The originals are left in the repo's
.readback/folder (gitignored), so nothing is lost if you roll back. Delete that folder once you've confirmed things still work.
Notes & limits
- Windows only (PowerShell
SoundPlayerplayback). No STT / voice input. - Speech is provider-agnostic WAV under the hood (Inworld LINEAR16; ElevenLabs PCM wrapped in a WAV header), so the streaming player never cares which provider you're on.
- The panel is loopback-only (
127.0.0.1), rejects cross-origin requests, and bundles its own logo + fonts, so the page itself loads nothing from the internet. - Synthesis does call out, by design: your cleaned, truncated reply text and your API key go to whichever provider you picked (Inworld or ElevenLabs) over HTTPS, and nowhere else. Readback has no servers, no telemetry, no analytics, and no update check.
- It costs money per character spoken. Readback defaults to the cheapest
sensible model (Inworld
tts-1.5-mini, $5 per million characters;maxis double that for a bit more richness). Worth knowing: if you add the hook to your globalsettings.json, it speaks in every project where voice is on, which adds up faster than you'd guess. Keep it per-project, or toggle voice off when you're not listening. - Trouble? Check
readback.login%LOCALAPPDATA%\Readbackon Windows (throwaway data is kept out of the roaming profile), or alongside the state dir otherwise.
License
MIT. See LICENSE.
Installing Readback
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/Deltawerks/readbackFAQ
Is Readback MCP free?
Yes, Readback MCP is free — one-click install via Unyly at no cost.
Does Readback need an API key?
No, Readback runs without API keys or environment variables.
Is Readback hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Readback in Claude Desktop, Claude Code or Cursor?
Open Readback on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectCompare Readback with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
