远程代码执行系统

一个基于MCP的远程代码执行系统,通过Docker/gVisor容器安全运行用户代码,适用于自动化代码执行和开发测试场景。

  • by mosteligible
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 mosteligible/mcp-codemode

使用说明

mcp编码模式

此README涵盖了此存储库中围绕MCP构建的后端远程代码执行堆栈。

当前执行路径为:

client -> pyrunner -> coderunner -> agent ->Docker/gVisor容器

范围内的组件

  • client:可选的FastAPI聊天/编排服务,运行LLM代理并连接到MCP。
  • pyrunner:公开工具的Python MCP服务器,包括 execute_code.
  • coderunner:转到通过HTTP接受执行请求并通过gRPC将其转发给workers的控制平面。
  • agent:Go worker服务,管理沙盒容器并远程执行代码。
  • redis:代理流使用的令牌存储。

本文档有意关注远程执行后端路径,并没有描述存储库中的每个应用程序。

建筑

代码执行流程

  1. 用户消息到达 client 通过 /chat.
  2. LLM使用MCP工具 pyrunner.
  3. 当模型调用时 execute_code, pyrunner 发送 POST /run 到 coderunner.
  4. coderunner 选择遥控器 agent 连接来自 REMOTE_HOSTS.
  5. coderunner 使用以下命令通过gRPC转发请求 ExecuteCode.
  6. 这 agent 验证语言,应用超时,并在托管容器内运行指令。
  7. Stout、stderr和退出状态通过返回 coderunner 到 pyrunner,然后发送到MCP客户端。

运行时职责

  • pyrunner 是MCP和工具网关。它不会在当前设置中直接在本地执行代码。
  • coderunner 是薄的传输/控制平面层。它接收 /run 请求并将其发送给员工。
  • agent 是执行层。它启动并重用容器,然后使用Docker exec运行命令。

当前状态

  • MCP执行当前在Python路径中是无状态的。
  • Go执行API支持 sessionId但是 pyrunner 当前未发送。
  • agent 当前仅验证 python 和 bash 用于远程执行。
  • 工人选择 coderunner 是随机的,不感知负载。

服务和港口

  • pyrunner:MCP端点位于 :8000
  • client:FastAPI应用程序已打开 :8080 默认情况下
  • coderunner:上的HTTP API :8080 并打开MCP服务器 :8081
  • agent:gRPC工作程序打开 :30031 默认情况下
  • redis: :6379

注: client 和 coderunner 两者均默认为 :8080,因此它们不打算在不更改配置的情况下在同一主机上运行。

运行系统

完整的远程执行堆栈

要将MCP用于远程代码执行,请按以下顺序启动服务:

  1. 开始 redis
  2. 启动一个或多个 agent 工人
  3. 开始 coderunner
  4. 开始 pyrunner
  5. 可选择启动 client

1.开始 redis

docker pull redis
docker run -p 6379:6379 --name redis -d redis

2.开始 agent

在配置了Docker和gVisor的Linux机器上运行worker:

cd agent
go run .

重要环境变量:

  • WORKER_PORT 违约: :30031
  • DOCKER_IMAGE_NAME 违约: python:3.14-slim
  • MIN_ACTIVE 违约: 2

3.开始 coderunner

集 REMOTE_HOSTS 因此,它可以到达一个或多个工人。该值是一个以分号分隔的列表,例如:

REMOTE_HOSTS=127.0.0.1:30031

然后运行:

make run-coderunner

或者:

cd coderunner
go build -o ../build/coderunner .
../build/coderunner

4.启动 pyrunner

点 pyrunner 在 coderunner:

export CODE_EXECUTION_HOST=http://localhost:8080
cd pyrunner
uv run uvicorn main:app

这暴露了:

  • http://localhost:8000/mcp
  • http://localhost:8000/mcp-no-code-execute

5.开始 client (可选)

仅当您需要内置的FastAPI代理层时,才启动聊天/编排服务:

cd client
uv run main.py

在中配置MCP端点 client/config.py 或者如果需要,可以使用环境变量。

快速启动变体

仅限MCP

当另一个MCP客户端将直接调用服务器时,请使用此选项:

  1. 开始 agent
  2. 开始 coderunner
  3. 开始 pyrunner

聊天堆栈

当你想要内置 /chat 端点:

  1. 开始 redis
  2. 开始 agent
  3. 开始 coderunner
  4. 开始 pyrunner
  5. 开始 client

生成文件目标

从项目根:

make run-pyrunner
make run-client
make build-coderunner
make run-coderunner

备注

  • 开始 pyrunner 只有在之后 coderunner 是可达的。
  • 开始 coderunner 至少一个之后 agent 可通过以下方式联系 REMOTE_HOSTS.
  • 此根README有意限定在远程执行后端架构的范围内。
  • 组件特定的设置细节也存在 pyrunner/README.md, coderunner/README.md,以及 agent/README.md.