読み上げMCPサーバー:AIエージェントに声で話させる
コーディングエージェントやAIアシスタントは何分も作業するので、終わったかどうか画面を見張ることになりがちです。小さなMCPサーバーがあれば、エージェントが「ビルドが終わりました。テストが2件失敗しています」と声で教えてくれます。
Model Context Protocol(MCP)は、Claude Code、Claude Desktop、Cursorなどのクライアントがツールを呼び出すためのオープンな標準です。このガイドでは、約30行のPythonでspeakツールをつくります。無料のSuperClonicaエンジンとその声でオフラインで読み上げるか、モデルを動かしたくないマシンではSuperClonicaの音声合成APIを使います。
インストール
Python 3.10以降が必要です。MCPのPython SDKとエンジンをインストールします:
pip install mcp superclonica-cpu
エンジンは初回にSupertonic 3のモデル(約400 MB)をダウンロードし、その後は普通のCPUでオフラインで動きます。Linuxではalsa-utilsのaplayで音を再生します。WindowsとmacOSでは追加のものは不要です。
サーバー
これをtts_mcp.pyとして保存します。speakというツールを1つ登録し、テキストを読み上げてスピーカーで再生し、終わったことをエージェントに返します:
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()モデルは最初の呼び出しで読み込まれるので、エージェントはすぐに起動し、最初の1文だけ数秒長くかかります。コードはmcpパッケージのバージョン2向けで、FastMCPはMCPServerに改名されています。バージョン1ではmcp.server.fastmcpからFastMCPをインポートしてください。エージェントはdocstringを読んでツールを呼ぶタイミングを決めるので、使ってほしい場面をそこに書きましょう。
Claude Code、Claude Desktop、Cursorにつなぐ
Claude Codeでは1つのコマンドでサーバーを追加できます:
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"}
}
}
}あとは、たとえばプロジェクトの指示に「タスクが終わったときや私の入力が必要なときは、短い1文でspeakを呼んで」と書いて、話すタイミングを伝えます。
APIを使う同じツール
400 MBのモデルを置きたくないノートパソコンでは、SuperClonicaの音声合成APIで読み上げます。speakの合成の2行をこの関数の呼び出しに置き換え、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で使えます。無料キーは1日1分で、1文のステータス通知なら十分です。
声を選ぶ
TTS_VOICEには内蔵の10の声(M1〜M5、F1〜F5)か、SuperClonicaカタログの声のファイルのパスを指定します。落ち着いたナレーター、宇宙船のコンピューター、ゲームのキャラクターなどです。無料の声はアカウントなしでダウンロードできます。まず声のページで試聴し、テスト文を読み上げてみてください。