代码沙盒执行服务

Onyx是一个MCP(模型上下文协议)服务器,可在Docker沙盒中安全执行多种编程语言的代码,适用于AI工作流构建和Claude Desktop高级用户。

  • by avd1729
  • Go
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 avd1729/Onyx

使用说明

缟玛瑙

Onyx是一种 MCP(模型上下文协议)服务器 在内部安全地执行代码 Docker沙盒。它支持多种编程语言,并与 克劳德桌面 或其他MCP客户端。Onyx使在 沙盒MCP环境非常适合 克劳德桌面 高级用户或任何使用可执行代码构建AI工作流的人。

特性

  • 🔹 多语言支持:

    • pythonpython:3.11)
    • Javaopenjdk:17)
    • Cgcc:12)
    • Cgcc:12)
    • JavaScript/Node.js(node:20)
    • 生锈(rust:1.72)
  • 🔹 Docker沙盒:

    • 网络已禁用(--network none)
    • 带有tmpfs挂载的只读FS用于安全写入
    • CPU、内存和进程数有限
    • 非根执行(--user 1000:1000)
  • 🔹 MCP协议:暴露a run_code 用于执行任意代码的工具。

  • 🔹 日志记录:所有执行日志都转到 stderr (对MCP客户端安全)。

  • 🔹 CI就绪:通过GitHub Actions对执行者进行自动测试。


项目结构

sandbox/
├── .github/
│   └── workflows/ci.yml       # GitHub Actions CI
├── cmd/
│   └── server/
│       └── main.go            # MCP server entrypoint
├── internal/
│   ├── model/                 # Code params, executor interface, result types
│   ├── executor/              # Language-specific executors
│   └── utils/                 # Docker availability checks
├── tests/
├── go.mod, go.sum

安装说明

1.先决条件

验证两者:

go version
docker --version

2.拉取所需的Docker镜像

为了避免第一次执行时的延迟,请预拉所有语言运行时:

docker pull python:3.11
docker pull openjdk:17
docker pull gcc:12
docker pull node:20
docker pull rust:1.72

3.构建并运行服务器

从repo的根开始:

# Run directly
go run ./cmd/server/main.go

# Or build a binary (recommended for Claude Desktop)
go build -o sandbox_server ./cmd/server/main.go

你现在应该已经 sandbox_server (或 sandbox_server.exe 在Windows上)。


与Claude Desktop连接

  1. 找到Claude Desktop的配置文件:

    code $env:AppData\Claude\claude_desktop_config.json
    
  2. 为添加MCP服务器条目 缟玛瑙:

    {
      "mcpServers": {
        "onyx": {
          "command": "<absolute path>/sandbox_server.exe",
          "args": []
        }
      }
    }
    
  3. 重新启动克劳德桌面。

  4. 现在你应该看到 run_code 工具可用。


用法

For a good example of how it can be used, check out this chat: https://claude.ai/share/512e1f5a-77fc-40ca-8c49-b372b2c680f9

扩展到新语言

添加对另一种语言的支持需要:

  1. 选择Docker镜像 使用语言的编译器/运行时。 例子: golang:1.22 对于Go来说, php:8.2-cli 对于PHP。

  2. 实现执行器 在……里面 internal/executor/<lang>.go:

    • 定义一个结构(例如。, GoExecutor).

    • 实施 Execute 方法:

      • 将源代码导入容器。
      • 在内部编译/解释它 /workspace.
      • 运行输出二进制文件/脚本。
  3. 在中注册 main.go:

    if args.Language == "go" {
        runtime = executor.GoExecutor{}
    }
    
  4. 编写测试 在……里面 internal/executor/go_test.go.

  5. 拉取Docker镜像 提前(docker pull golang:1.22).