Heroku MCP Code Execution - Python について
Heroku MCP Code Execution - Python は、ローカルまたは Heroku で Python コードを実行する MCP サーバーです。開発者向けに STDIO、HTTP/SSE のテストとデプロイ手段を備えています。
主な機能
- 01MCP ツールで Python コードを実行
- 02STDIO、Streamable HTTP、SSE でテスト
- 03Heroku にサーバーをデプロイ
- 04コードとパッケージ一覧を指定
活用シーン
- 01MCP クライアントから Python のコード片を実行
- 02ローカルの STDIO または HTTP/SSE 接続をテスト
- 03Heroku で Python コード実行環境をデプロイ
MCP 対応
MCP クライアントに `code_exec_python` ツールを提供します。STDIO、Streamable HTTP、SSE 接続に対応し、ローカルテストと Heroku へのデプロイに利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Heroku MCP Code Execution - Python
自動デプロイ
手動デプロイ
Heroku CLI から必須の環境変数を設定する
各変数を手動で設定する代わりに、Heroku CLI を使って適切な値を取得します。
export APP_NAME=<your-heroku-app-name>
heroku create $APP_NAME
heroku buildpacks:set heroku/python -a $APP_NAME
# set a private API key that you create, for example:
heroku config:set API_KEY=$(openssl rand -hex 32) -a $APP_NAME
heroku config:set STDIO_MODE_ONLY=<true/false> -a $APP_NAME
# set the remote server type (module) that your web process will use (only relevant for web deployments)
heroku config:set REMOTE_SERVER_TRANSPORT_MODULE=<streamable_http_server/sse_server>
注:開発環境以外でのセキュリティとコード実行の分離を確保するため、STDIO_MODE_ONLY を true に設定することをおすすめします。
ローカルとデプロイ環境で STDIO の機能のみ(SSE server なし)を使う場合は、次を実行します。
heroku ps:scale web=0 -a $APP_NAME
デプロイ済みの SSE サーバーを使う場合は、次を実行します。
heroku ps:scale web=1 -a $APP_NAME
heroku config:set WEB_CONCURRENCY=1 -a $APP_NAME
任意で、ローカル開発用にこれらの設定変数をローカルの .env ファイルに記述できます。
heroku config -a $APP_NAME --shell | tee .env > /dev/null
次に、アプリを Git リポジトリに接続します。
heroku git:remote -a $APP_NAME
そしてデプロイします!
git push heroku main
次のコマンドでログを確認します。
heroku logs --tail -a $APP_NAME
ローカルでのテスト
パッケージを一度だけインストールします。
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt
ローカルの Streamable HTTP、SSE
(ステートレスな)Streamable HTTP または SSE をテストする場合は、ターミナルのペインで次のコマンドを実行してサーバーを起動します。
source venv/bin/activate
export API_KEY=$(heroku config:get API_KEY -a $APP_NAME)
# Either run src.streamable_http_server or src.sse_server, here:
uvicorn src.streamable_http_server:app --reload
--reload を付けて実行するかどうかは任意ですが、ローカル開発では便利です。
次に、新しいペインを開き、サーバーに対していくつかのクエリを実行してみます。
ローカルの Streamable HTTP、SSE - リクエスト例
まず、次を実行します。
export API_KEY=$(heroku config:get API_KEY -a $APP_NAME)
以下のコマンドでは、上記の Streamable HTTP サーバーを実行した場合は example_clients/streamable_http_client.py を、SSE サーバーを実行している場合は example_clients/sse_client.py を使用します。
ツールの一覧を表示します。
python example_clients/streamable_http_client.py mcp list_tools | jq
ツール呼び出しリクエストの例:
注:STDIO_MODE_ONLY を true に設定している場合、これは意図的に動作しません。
python example_clients/streamable_http_client.py mcp call_tool --args '{
"name": "code_exec_python",
"arguments": {
"code": "import numpy as np; print(np.random.rand(50).tolist())",
"packages": ["numpy"]
}
}' | jq
ローカルの STDIO
MCP サーバーを STDIO モードで簡単にテストする方法は 2 つあります。
1. ローカルの STDIO - Python STDIO クライアントの例
ツールの一覧を表示します。
python example_clients/stdio_client.py mcp list_tools | jq
ツール呼び出しリクエストの例:
python example_clients/stdio_client.py mcp call_tool --args '{
"name": "code_exec_python",
"arguments": {
"code": "import numpy as np; print(np.random.rand(50).tolist())",
"packages": ["numpy"]
}
}' | jq
2. ローカルの STDIO - 直接呼び出し
ツール呼び出しリクエストの例:
cat <<EOF | python -m src.stdio_server
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"0.1.0","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}
{"jsonrpc":"2.0","method":"notifications/initialized","params":{}}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"code_exec_python","arguments":{"code":"import numpy as np; print(np.random.rand(50).tolist())","packages":["numpy"]}}}
EOF
(サーバーはクライアントからのシャットダウンリクエストを想定しています。そのため、CTRL-C で接続を停止できます。)
リモートでのテスト
リモート Streamable HTTP、SSE
リモートの Streamble HTTP または SSE サーバーをテストするには、ウェブプロセスが実際に起動していることを確認する必要があります。コストを抑えるため、このリポジトリではデフォルトで作成時にウェブ dyno を起動しません。多くの方は STDIO モード(ローカルおよびワンオフ dyno)でのリクエストのみを利用するためです。
heroku ps:scale web=1 -a $APP_NAME
コストを抑えるためにウェブ dyno を 0 に戻さない限り(heroku ps:scale web=0 -a $APP_NAME)、この操作は一度だけ行えば十分です。現在実行中の dyno を確認するには、heroku ps -a $APP_NAME を使用します。
デフォルトでは、このアプリは Streamable HTTP MCP サーバーをデプロイします。SSE サーバーをデプロイする場合は、次を実行します。
heroku config:set REMOTE_SERVER_TRANSPORT_MODULE=sse_server
これにより、Procfile で実行されるサーバーが変わります。
次に、次を実行します。
export API_KEY=$(heroku config:get API_KEY -a $APP_NAME)
export MCP_SERVER_URL=$(heroku info -s -a $APP_NAME | grep web_url | cut -d= -f2)
次に、テストセクションのローカル SSE - リクエスト例に示されているものと同じクエリを実行できます。MCP_SERVER_URL を設定しているため、クライアントはデプロイしたサーバーを呼び出します。
リモート STDIO
リモート MCP サーバーを STDIO モードでテストする方法は 2 つあります。
1. リモート STDIO - サーバー上で実行する Python STDIO クライアントの例
デプロイしたコードを実行するには、デプロイ先のサーバー上で、ワンオフ dyno 内からクライアントのサンプルコードを実行できます。
heroku run --app $APP_NAME -- bash -c 'python -m example_clients.stdio_client mcp list_tools | jq'
または:
heroku run --app $APP_NAME -- bash -c '
python -m example_clients.stdio_client mcp call_tool --args '\''{
"name": "code_exec_python",
"arguments": {
"code": "import numpy as np; print(np.random.rand(50).tolist())",
"packages": ["numpy"]
}
}'\'' | jq
'
2. リモート STDIO - ワンオフ dyno への直接呼び出し
また、クライアントをローカルで実行またはシミュレートし、クライアント側のリクエストをワンオフ dyno に送信することもできます。
heroku run --app "$APP_NAME" -- bash -c "python -m src.stdio_server 2> logs.txt" <<EOF
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"0.1.0","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}
{"jsonrpc":"2.0","method":"notifications/initialized","params":{}}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"code_exec_python","arguments":{"code":"import numpy as np; print(np.random.rand(50).tolist())","packages":["numpy"]}}}
EOF
繰り返しになりますが、リクエストを単一のコマンドで実行するため、クライアントのシャットダウンリクエストをシミュレートできない点に注意してください。
3. 近日公開 - Heroku MCP Gateway!
近日中に、MCP リポジトリを Heroku の MCP Gateway に接続できるようになります。これにより、ワンオフ MCP dyno とのストリーミングリクエストとレスポンスが簡単になります!
Heroku MCP Gateway はランデブープロトコルを実装しているため、シームレスな双方向通信で、MCP サーバーのワンオフ dyno(コード実行の分離!)と簡単に通信できます。
Heroku に MCP アプリをデプロイして登録すると、Heroku の v1/mcp/servers にリクエストを送信して登録済みの MCP ツールを確認できます。また、v1/agents/heroku にリクエストを送信すると、ワンオフ dyno を介して MCP ツールを自動的に実行できます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。