关于 Heroku MCP Code Execution - Python
Heroku MCP Code Execution - Python 是可在本地或 Heroku 上执行 Python 代码的 MCP 服务,为开发者提供 STDIO、HTTP/SSE 测试与部署方式。
主要功能
- 01通过 MCP 工具执行 Python 代码
- 02使用 STDIO、Streamable HTTP 或 SSE 测试
- 03在 Heroku 部署服务
- 04传入代码和软件包列表
适用场景
- 01通过 MCP 客户端运行 Python 代码片段
- 02测试本地 STDIO 或 HTTP/SSE 连接
- 03在 Heroku 部署 Python 代码执行服务
MCP 相关
向 MCP 客户端提供 `code_exec_python` 工具,支持 STDIO、Streamable HTTP 或 SSE 连接,可用于本地测试和 Heroku 部署。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Heroku MCP 代码执行 - 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
有两种简单的方法可以通过 STDIO 模式测试 MCP 服务:
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 服务,需要确保 Web 进程已启动。为节省成本,此仓库默认不会在创建时启动 Web dyno,因为很多人只想使用 STDIO 模式(本地和一次性 dyno)请求:
heroku ps:scale web=1 -a $APP_NAME
除非为了节省成本将 Web 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
有两种方法可以测试 STDIO 模式下的远程 MCP 服务:
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 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。