Ableton MCPのソースコードを眺める MCP Server 編
推薦基盤ブロックの荒木です。
本記事は ZOZO Advent Calendar 2025 シリーズ 8 の 2 日目です。
概要
本記事はAbleton MCPのソースコードを眺める 全体編の続編です。
本記事はAbleton MCPのソースコードを読んでいきます。
前回はリポジトリの全体を眺めました。
重要な二つのファイルがあり、MCPサーバーの本体であるMCP_Server/server.pyと、Abletonを操作しているAbletonMCP_Remote_Script/init.pyです。
本記事では、MCP Serverの本体であるMCP_Server/server.pyのソースコードを読んでいきます。
MCP_Server/server.py
主要コンポーネント
このファイルにあるモジュールは大きく4つのコンポーネントに分けることができます。
AbletonConnection class(15~162行目)
Ableton Liveを操作するコンポーネントとのソケット通信を管理するクラスです。
ライフサイクル管理(164~184行目)
サーバーの起動時にAbletonへの接続を試行します。
シャットダウン時に適切に切断します。
接続管理(196~256行目)
グローバルな接続を管理します。
接続のリトライや接続検証などをおこないます。
localhost:9877に接続します。
MCPツール群(261~653行目)
MCPツールの関数について書かれています。
ここで定義されている関数をAIが呼び出すことができます。
この関数群が一番重要な箇所になっているので少し詳細に解説していきます。
MCPツール群
@mcp.tool()
def get_session_info(ctx: Context) -> str:
"""Get detailed information about the current Ableton session"""
try:
ableton = get_ableton_connection()
result = ableton.send_command("get_session_info")
return json.dumps(result, indent=2)
except Exception as e:
logger.error(f"Error getting session info from Ableton: {str(e)}")
return f"Error getting session info: {str(e)}"
get_session_infoを紹介していきます。
セッションの状態(ざっくりいえば現在の音楽の状態)を取得する関数です。
@mcp.tool()
このリポジトリで使われているFastMCPの機能です。
このデコレーターによって関数は以下の機能を持ちます。
- この関数をMCPツールとして登録
- 関数のdocstringを説明文として使用
"""Get detailed information about the current Ableton session""" - → AIはこの説明を見て、いつこのツールを使うべきか判断します
- パラメータの型情報を自動抽出
def get_track_info(ctx: Context, track_index: int) -> str:
- track_index: int → 整数パラメータとして登録
- AIは「track_indexには整数を渡す必要がある」と理解します(本当はtrack_indexはないけど)
要するにこのデコレータをつけることで、MCPに接続しているAIがこの関数をtoolとして使えるようになります。
ableton = get_ableton_connection()
get_ableton_connection()は上記で紹介した接続管理を行う関数です。
グローバルな接続を管理します。
result = ableton.send_command("get_session_info")
get_session_infoというコマンドをabletonに送ります。
おそらくAbletonMCP_Remote_Script/init.pyにget_session_infoコマンドをたたかれたときにコマンドに応じたロジックを実行するというコードがあるんでしょう。
他の関数も同様に hogehoge コマンドをablentonに送信するという関数がほとんどでした。
実際のAblentonを操作するロジックはAbletonMCP_Remote_Script/init.py側で実装されているのでしょう。
return json.dumps(result, indent=2)
返ってきた内容をdumpして返却します。
まとめ
本記事ではMCP Server側の実装を眺めていきました。
新しい機能を実装するには、ableton側にhogehogeというcommandを送り、ableton側でhogehogeを受け取ったときのコードを書けばよいということがわかりました。
次回はAbletonを操作するコードを眺めていきます。
@mcp.tool()
def new_tool(ctx: Context) -> str:
"""new tool explain"""
try:
ableton = get_ableton_connection()
result = ableton.send_command("hogehoge")
...
Discussion