kyutai-tts-mcp
Local-only voice for any MCP client (Claude Code, Claude Desktop, Cursor, etc.) via Kyutai Pocket TTS. No cloud, no API keys, no rate limits.
- 🇫🇷 French (Estelle), 🇬🇧 English (Alba), plus Spanish, German, Italian, Portuguese, Dutch
- TTFA ~80–200 ms thanks to native streaming via the pocket-tts Python API
- Multi-language at runtime — pass
language=perspeak()call, models load lazily and cache - ~4-5× real-time generation on Apple Silicon / Intel CPU
- Non-blocking
speak(), gap-free playback viasounddevicewrite-mode - ~600 MB venv, ~1 GB model cache per language
Install
uvx kyutai-tts-mcp --help
Or persistent:
uv tool install kyutai-tts-mcp
Then add to your MCP client's .mcp.json:
{
"mcpServers": {
"kyutai-tts": {
"command": "uvx",
"args": ["kyutai-tts-mcp", "--language", "french_24l"]
}
}
}
Replace french_24l with english, spanish_24l, german_24l,
italian_24l, portuguese_24l, or dutch_24l for your default language. Per-call
language= overrides this default.
MCP tools
| Tool | Purpose |
|---|---|
speak(text, voice?, language?, interrupt?) |
Generate audio for text and queue it for background playback. Returns immediately, streaming generation. By default, calls queue and play sequentially (including across turns). Pass interrupt=True to abort current playback and clear the queue first. Pass language= to switch model on the fly. |
stop_speaking() |
Stop current playback, drop queue, cancel in-flight generation. Use for explicit "mute" requests. For mid-turn interruption + new speech, use speak(..., interrupt=True) instead. |
status() |
Report loaded languages, queue depths, sample rate, last error. |
Configuration
The default language is set via --language (CLI) or KYUTAI_TTS_LANGUAGE
(env var). Other knobs (all env):
KYUTAI_TTS_VOICE— default voice nameKYUTAI_TTS_DEVICE— PyTorch device (defaultcpu;mpsnot supported)KYUTAI_TTS_QUANTIZE— set to1for int8 quantizationKYUTAI_TTS_MAX_TOKENS— max tokens per streaming chunk (default50)
Voice cloning
Pocket-tts can clone a voice from a short audio sample. The cloning runs 100 % locally — your audio never leaves the machine — but the cloning-enabled model checkpoint is gated on Hugging Face. One-time setup:
- Accept the terms at huggingface.co/kyutai/pocket-tts
uv tool install huggingface-hub && hf auth loginrm -rf ~/.cache/huggingface/hub/models--kyutai--pocket-ttsto force re-downloading the cloning-enabled checkpoint
Then either pass the audio file directly to speak(voice="/path/to.wav"),
or pre-extract it as a .safetensors for instant loading:
uvx kyutai-tts-mcp extract-voice \
--audio ~/voices/yours.wav \
--out ~/voices/yours.safetensors \
--language french_24l \
--truncate
Then speak(voice="/path/to/yours.safetensors"). Full guide and recording
recommendations: main repo.
Claude Code users
If you're on Claude Code (CLI, desktop, or via Cursor), you can install
the bundled plugin (MCP wiring + /voice-mode skill) in one shot:
/plugin marketplace add Vincweb/kyutai-tts-mcp
/plugin install kyutai-tts@vincweb-tools
See the main repo for architecture details, voice catalog, and a side-by-side comparison with voxtral-mcp.
Requirements
- macOS (Apple Silicon recommended; Intel works — the model is CPU-only)
- Python 3.10 – 3.13
- ~1 GB free RAM per loaded language
License
MIT. Kyutai pocket-tts itself is under its own permissive licence (see upstream).
Metadata
Release files for kyutai-tts-mcp 0.8.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| kyutai_tts_mcp-0.8.0.tar.gz | 117.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| kyutai_tts_mcp-0.8.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 128.0 kB
Release files / kyutai_tts_mcp-0.8.0.tar.gz
| Download URL | kyutai_tts_mcp-0.8.0.tar.gz |
|---|---|
| Size | 117.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
36114c42cf001f0b120b83ce9ab32e4742f81e33346ba048b802d6941fb74fb7
|
|
BLAKE2b-256 checksum How to use checksums |
a8b5c0496f3b114daef8a4630bacbc0f3d578f36de2c61cf8acff1d02257adb9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency logRelease files / kyutai_tts_mcp-0.8.0-py3-none-any.whl
| Download URL | kyutai_tts_mcp-0.8.0-py3-none-any.whl |
|---|---|
| Size | 10.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
86efea2da554e9344e80a1b0736d3ee5ace9366b47c3fc2b9fdf2529a8b8337a
|
|
BLAKE2b-256 checksum How to use checksums |
fa24bc5892fb32da2feecc1d63df8ab31d5acb38a44724960ff75a18ece41ba8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency log