MCP-сервер озвучки текста: пусть ваш AI-агент говорит вслух
Агенты для кода и AI-ассистенты работают минутами, и приходится то и дело поглядывать в окно, не закончили ли они. С маленьким MCP-сервером агент просто скажет это вслух: «Сборка готова, два теста падают».
Model Context Protocol (MCP) — открытый стандарт, через который Claude Code, Claude Desktop, Cursor и другие клиенты вызывают инструменты. В этом руководстве мы соберём инструмент speak примерно в 30 строк Python. Он озвучивает текст офлайн бесплатным движком SuperClonica любым его голосом или через API озвучки SuperClonica — на машине, где не хочется держать модель.
Установка
Нужен Python 3.10 или новее. Установите Python SDK для MCP и движок:
pip install mcp superclonica-cpu
При первом запуске движок скачивает модель Supertonic 3, около 400 МБ, а дальше работает офлайн на обычном процессоре. В Linux сервер играет звук через aplay из пакета alsa-utils; в Windows и macOS ничего дополнительно не нужно.
Сервер
Сохраните это как tts_mcp.py. Файл регистрирует один инструмент, speak: он озвучивает текст, проигрывает его в колонках и сообщает агенту, что готово:
import os, subprocess, sys, tempfile
from mcp.server.mcpserver import MCPServer
from superclonica import Superclonica
VOICE = os.environ.get("TTS_VOICE", "F1") # M1..M5, F1..F5 or a voice file from the catalog
server = MCPServer("speak")
tts = None
def play(path):
if sys.platform == "win32":
import winsound
winsound.PlaySound(path, winsound.SND_FILENAME)
elif sys.platform == "darwin":
subprocess.run(["afplay", path], check=True)
else:
subprocess.run(["aplay", "-q", path], check=True)
@server.tool()
def speak(text: str, language: str = "en") -> str:
"""Say a short message out loud to the user, for example when a long task is done."""
global tts
tts = tts or Superclonica()
audio, _ = tts.synthesize(text[:500], voice=VOICE, lang=language)
path = os.path.join(tempfile.gettempdir(), "mcp-speak.wav")
tts.save(path, audio)
play(path)
return "spoken"
if __name__ == "__main__":
server.run()Модель загружается при первом вызове, поэтому агент стартует быстро, а дольше на несколько секунд звучит только первая фраза. Код написан для второй версии пакета mcp, где FastMCP переименован в MCPServer; в первой версии импортируйте FastMCP из mcp.server.fastmcp. Агент решает, когда вызывать инструмент, по его docstring, поэтому опишите там нужный сценарий.
Подключение к Claude Code, Claude Desktop или Cursor
В Claude Code сервер добавляется одной командой:
claude mcp add speak -- python /full/path/to/tts_mcp.py
В Claude Desktop добавьте его в claude_desktop_config.json; Cursor читает такой же блок mcpServers из своего mcp.json. Укажите полный путь к Python, в который установлены пакеты:
{
"mcpServers": {
"speak": {
"command": "/full/path/to/python",
"args": ["/full/path/to/tts_mcp.py"],
"env": {"TTS_VOICE": "F1"}
}
}
}Затем скажите агенту, когда говорить, например в инструкциях проекта: «Когда закончишь задачу или тебе нужен мой ответ, вызови speak с одной короткой фразой».
Тот же инструмент через API
На ноутбуке, где не хочется держать модель на 400 МБ, озвучивайте текст через API озвучки SuperClonica: в speak замените две строки синтеза вызовом этой функции и задайте SUPERCLONICA_KEY и VOICE_ID.
import os, requests
API = "https://superclonica.com/api/v1/speech"
VOICE_ID = os.environ["VOICE_ID"] # the ID on the page of a catalog voice
def voice_to_file(text, language, path):
answer = requests.post(API, timeout=120,
headers={"Authorization": "Bearer " + os.environ["SUPERCLONICA_KEY"]},
json={"text": text, "voice": VOICE_ID, "language": language, "format": "wav"})
answer.raise_for_status()
with open(path, "wb") as file:
file.write(answer.content)Любой голос каталога работает по ID со своей страницы, на любом тарифе. Бесплатный ключ даёт минуту звука в день — с запасом для статусных сообщений в одну фразу.
Выбор голоса
В TTS_VOICE укажите один из десяти встроенных голосов, M1–M5 и F1–F5, или путь к файлу голоса из каталога SuperClonica: спокойного диктора, бортовой компьютер или игрового персонажа. Бесплатные голоса каталога скачиваются без аккаунта. Сначала послушайте голос и озвучьте тестовую фразу на его странице.