The useful design choice is aggregation: you configure whichever providers you have keys for, and each becomes a tool, with personas sitting on top so the model picks a voice by name rather than by id. Keys live in a config file outside the repo, so the same binary serves every client on the machine without pasting secrets into each one.
A Go MCP server that takes text from the model, synthesizes it with a remote or local text-to-speech provider, and pipes the audio straight to the host system's native audio driver.
- Playback on the host itself, not a file you have to open afterwards
- A command tool exposed automatically for each provider you have configured
- Persona routing — map a semantic name to a provider and voice so the model calls `speak_as_persona` instead of juggling voice ids
- Generated audio cached to an XDG cache directory, so a repeated line does not cost a second synthesis
- Provider choice across FishAudio, ElevenLabs, Neets AI, PlayHT, Cartesia, OpenAI, Azure and local APIs
Download the prebuilt binary for your OS from the releases page, or build from source with Go 1.22+. The server reads an .env file from your OS configuration directory — %APPDATA%\tts-mcp\.env on Windows, ~/.config/tts-mcp/.env on Linux, ~/Library/Application Support/tts-mcp/.env on macOS — holding a key per provider, such as `FISHAUDIO_API_KEY` or `ELEVENLABS_API_KEY`. The bundled `tts-mcp-config` CLI writes that file for you.
