elevenlabs-voice-mcp
# elevenlabs-voice-mcp
A tiny [Model Context Protocol](https://modelcontextprotocol.io) server that gives
Claude a voice through the [ElevenLabs](https://elevenlabs.io) text-to-speech API.
It exposes two tools over stdio so any MCP client (Claude Code, Claude Desktop) can
**speak its responses out loud** or **discover voices** — operated in plain English:
| Tool | What it does |
| --- | --- |
| `list_voices` | List the voices available on your ElevenLabs account (id + name + labels). |
| `text_to_speech` | Turn text into an MP3 with a chosen voice/model, save it, and play it. |
Multilingual by default (`eleven_multilingual_v2`), so Polish reads correctly too.
## Why
I build agentic systems with Claude and MCP. This wires ElevenLabs into that world
as a first-class tool: instead of a one-off API script, Claude itself can decide to
speak, pick a voice, and read something back — the same MCP pattern I use elsewhere,
pointed at ElevenLabs' audio models.
## Setup
```bash
npm install
npm run build # or: npm run dev (runs from source via tsx)
export ELEVENLABS_API_KEY=sk_... # free key: elevenlabs.io → Profile → API Keys
npm start
```
### Use it from Claude Code
```bash
claude mcp add elevenlabs-voice -- node /absolute/path/to/dist/index.js
# (set ELEVENLABS_API_KEY in your environment first)
```
Or add it to your Claude Desktop config:
```json
{
"mcpServers": {
"elevenlabs-voice": {
"command": "node",
"args": ["/absolute/path/to/elevenlabs-voice-mcp/dist/index.js"],
"env": { "ELEVENLABS_API_KEY": "sk_..." }
}
}
}
```
Then just ask Claude: *"list the ElevenLabs voices"* or *"say 'cześć, świecie' out loud."*
## Notes
- A free ElevenLabs account includes enough monthly characters to try this out.
- Playback uses the OS default (`afplay` on macOS, `aplay` on Linux, PowerShell on
Windows); generation still works headless if no player is present.
- Override the default voice/model with `ELEVENLABS_VOICE_ID` / `ELEVENLABS_MODEL_ID`,
or per call via the tool arguments.
## License
MIT
TDQS
Scored across 2 tools
The two tools have completely distinct purposes: one lists available voices, the other converts text to speech. There is no overlap or ambiguity in their functions.
Both tools use snake_case, but the pattern differs: 'list_voices' is a clear verb_noun construction, while 'text_to_speech' is a noun phrase describing the action. This is a minor inconsistency, but both names are intuitive and readable.
With only two tools, the server feels minimal. While both tools are essential for the primary TTS workflow, the scope is narrow and might be insufficient for users expecting voice management capabilities.
The core workflow of listing voices and generating speech is covered. However, missing operations like fetching individual voice details or managing voices create minor gaps that agents could work around by using the list result.