ガイド

読み上げ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カタログの声のファイルのパスを指定します。落ち着いたナレーター、宇宙船のコンピューター、ゲームのキャラクターなどです。無料の声はアカウントなしでダウンロードできます。まず声のページで試聴し、テスト文を読み上げてみてください。