mcpField
H
Heroku MCP Code Execution - Python

Heroku MCP Code Execution - Python

本地服务
github.com/heroku开发工具813 周前更新

关于 Heroku MCP Code Execution - Python

Heroku MCP Code Execution - Python 是可在本地或 Heroku 上执行 Python 代码的 MCP 服务,为开发者提供 STDIO、HTTP/SSE 测试与部署方式。

主要功能

  1. 01通过 MCP 工具执行 Python 代码
  2. 02使用 STDIO、Streamable HTTP 或 SSE 测试
  3. 03在 Heroku 部署服务
  4. 04传入代码和软件包列表

适用场景

  1. 01通过 MCP 客户端运行 Python 代码片段
  2. 02测试本地 STDIO 或 HTTP/SSE 连接
  3. 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 工具。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。