Skip to main content
Glama
milhous

foundry-sandbox-mcp

by milhous
README.md
# Foundry Sandbox MCP Server

一个基于 Docker 的 Foundry 测试沙盒 MCP Server,允许 AI 在隔离的 Docker 容器中安全地运行 Foundry 测试命令。

## 功能特性

- ✅ **自动容器管理**: 每次测试时自动创建新容器,测试完成后自动清理
- ✅ **全新测试环境**: 每次测试都在全新的容器中运行,确保环境干净
- ✅ **多包管理器支持**: 支持 forge、npm、yarn 三种包管理器
- ✅ **灵活的依赖格式**: 支持数组格式(不带版本号)和对象格式(带版本号)
- ✅ **自动依赖安装**: 根据依赖清单文件自动安装依赖
- ✅ **Docker 缓存清理**: 测试完成后自动清理 Docker system 缓存
- ✅ **环境一致性**: 无论运行在 Mac、Windows 还是 Linux,行为完全一致
- ✅ **安全性**: 所有操作在 Docker 容器中运行,与宿主机隔离
- ✅ **零污染**: 所有依赖和缓存保留在容器内,测试完成后自动清理

## 前置要求

- Docker 和 Docker Compose
- Node.js 18+ 和 Yarn
- Foundry 项目

## 快速开始

### 安装

1. 克隆或下载项目

2. 安装依赖:

```bash
yarn install
```

3. 构建项目:

```bash
yarn build
```

### 配置 MCP 客户端

#### Claude Desktop 配置

编辑配置文件:

**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`

**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "foundry-sandbox": {
      "command": "node",
      "args": ["/absolute/path/to/foundry-mcp/dist/index.js"]
    }
  }
}
```

#### Cursor 配置

```json
{
  "mcpServers": {
    "foundry-sandbox": {
      "command": "node",
      "args": ["/absolute/path/to/foundry-mcp/dist/index.js"]
    }
  }
}
```

**配置说明**:
- `/absolute/path/to/foundry-mcp`: MCP Server 的安装路径(绝对路径)
- Docker 镜像会在首次使用时自动构建

### 开发模式

```json
{
  "mcpServers": {
    "foundry-sandbox": {
      "command": "yarn",
      "args": ["dev"],
      "cwd": "/absolute/path/to/foundry-mcp"
    }
  }
}
```

## 可用工具

### `forge_test`

在 Docker 容器中运行 `forge test` 命令。每次测试时创建新容器,测试完成后自动清理,确保全新环境。

**参数**:

- `projectRoot` (必需): 项目根路径(绝对路径),用于 Docker 挂载。例如 `/path/to/project`
- `testFolderPath` (必需): 测试合约文件夹路径(相对项目根路径)。例如 `test` 或 `test/unit`。如果路径以 `.sol` 结尾,则直接使用该路径;否则会自动匹配该文件夹下的所有 `.t.sol` 文件
- `dependenciesManifestPath` (必需): 依赖项清单文件路径(相对项目根路径)。文件格式为 JSON 对象,例如 `dependencies.json`
- `extraArgs` (可选): 额外的 `forge test` 参数数组
- `enablePrune` (可选): 是否在测试完成后执行 `docker system prune -f`(默认为 `false`,安全起见默认跳过)

**工作流程**:

1. 创建新容器(使用唯一名称),挂载项目目录
2. 根据依赖清单文件自动安装依赖(forge、npm、yarn)
3. 在容器中运行 `forge test` 命令
4. 返回测试结果
5. 自动删除容器并清理 Docker system 缓存

## 依赖管理

### 依赖清单文件格式

依赖清单文件支持三种包管理器(forge、npm、yarn),每种包管理器支持两种格式:

#### 格式说明

1. **数组格式(不带版本号)**: `["package-name"]` - 使用最新版本
2. **对象格式(带版本号)**: `{"package-name": "version"}` - 指定版本

#### 示例

```json
{
  "forge": ["foundry-rs/forge-std"],
  "npm": {
    "@openzeppelin/contracts": "^5.0.2",
    "@openzeppelin/contracts-upgradeable": "^5.0.2"
  },
  "yarn": ["@chainlink/contracts"]
}
```

#### 详细说明

- **forge**: 使用 `forge install --no-git` 安装 Git 依赖
  - 数组格式:`["foundry-rs/forge-std"]`(使用最新版本)
  - 对象格式:`{"foundry-rs/forge-std": "v1.0.0"}`(指定版本或 tag)
  
- **npm**: 使用 `npm install` 安装 npm 包
  - 数组格式:`["@openzeppelin/contracts"]`(使用最新版本)
  - 对象格式:`{"@openzeppelin/contracts": "^5.0.2"}`(指定版本)
  
- **yarn**: 使用 `yarn add` 安装 yarn 包
  - 数组格式:`["@chainlink/contracts"]`(使用最新版本)
  - 对象格式:`{"@chainlink/contracts": "^1.0.0"}`(指定版本)

#### 注意事项

- 所有字段(forge、npm、yarn)都是可选的,但至少需要提供一个字段
- 每个字段可以独立选择使用数组或对象格式
- 支持混合格式(部分字段使用数组,部分字段使用对象)
- 版本号格式遵循各包管理器的标准格式

## Docker 环境管理

### 自动容器管理

**MCP Server 会自动管理 Docker 容器生命周期**:

- ✅ **每次测试时创建新容器**:使用唯一名称(基于时间戳),确保全新环境
- ✅ **自动挂载项目目录**:将传入的项目路径挂载到容器的 `/workspace` 目录
- ✅ **测试完成后自动清理**:删除容器并清理 Docker system 缓存
- ✅ **无需手动操作**:完全自动化,无需手动创建或删除容器

### Docker 镜像管理

**重要**:Docker 镜像 `foundry-sandbox:latest` 会在首次使用时自动构建。

如果镜像不存在,MCP 工具会自动:
1. 检测 MCP 服务器路径(通过环境变量 `FOUNDRY_MCP_PROJECT_PATH` 或自动查找)
2. 读取 `src/docker/Dockerfile.foundry` 和 `src/docker/docker-compose.yml` 配置
3. 使用 `docker-compose build` 自动构建 Docker 镜像

**手动构建**(可选):
```bash
# 使用 docker-compose(推荐)
cd /path/to/foundry-mcp
docker-compose -f src/docker/docker-compose.yml build foundry-sandbox

# 或使用 docker build
docker build -t foundry-sandbox:latest -f src/docker/Dockerfile.foundry .
```

**设置 MCP 服务器路径**(可选,用于自动构建):
```bash
export FOUNDRY_MCP_PROJECT_PATH=/path/to/foundry-mcp
```

**注意**:MCP 服务器目录必须同时包含 `src/docker/Dockerfile.foundry` 和 `src/docker/docker-compose.yml` 文件。

### Docker 镜像内容

Docker 镜像基于 `ghcr.io/foundry-rs/foundry:latest`,并包含:

- Foundry 工具集(forge, cast, anvil, chisel)
- Node.js 20.x
- npm
- yarn

## 使用示例

### 运行所有测试

```json
{
  "name": "forge_test",
  "arguments": {
    "projectRoot": "/absolute/path/to/project",
    "testFolderPath": "test",
    "dependenciesManifestPath": "dependencies.json"
  }
}
```

### 运行特定测试文件

```json
{
  "name": "forge_test",
  "arguments": {
    "projectRoot": "/absolute/path/to/project",
    "testFolderPath": "test/Counter.t.sol",
    "dependenciesManifestPath": "dependencies.json"
  }
}
```

### 使用额外参数

```json
{
  "name": "forge_test",
  "arguments": {
    "projectRoot": "/absolute/path/to/project",
    "testFolderPath": "test",
    "dependenciesManifestPath": "dependencies.json",
    "extraArgs": ["-vvv", "--gas-report"]
  }
}
```

## 工作原理

1. **MCP Server** 接收来自 AI 的工具调用请求
2. **Docker Manager** 创建新的 Docker 容器并挂载项目目录
3. **依赖安装** 根据依赖清单文件自动安装依赖(forge、npm、yarn)
4. **Forge Tool** 在容器中执行 `forge test` 命令
5. **结果返回** 命令输出(stdout/stderr)和退出码被捕获并返回给 AI
6. **清理** 自动删除容器并清理 Docker system 缓存

## 项目结构

```
foundry-mcp/
├── src/
│   ├── index.ts              # MCP Server 主文件
│   ├── docker-manager.ts     # Docker 容器管理
│   ├── docker/
│   │   ├── Dockerfile.foundry        # Foundry Docker 镜像
│   │   └── docker-compose.yml       # Docker Compose 配置
│   └── tools/
│       └── forge-tool.ts     # Forge 工具实现
├── dist/                     # 编译后的文件
├── dependencies.json         # 依赖清单示例文件
├── package.json
├── tsconfig.json
└── README.md
```

## 开发

### 开发模式

```bash
yarn dev
```

### 构建

```bash
yarn build
```

### 运行

```bash
yarn start
```

## 故障排除

### Docker 容器未找到

**MCP Server 现在会自动创建容器**。如果仍然失败:

1. 检查 Docker 是否正在运行:
```bash
docker ps
```

2. 检查 Docker 镜像是否存在:
```bash
docker images | grep foundry-sandbox
```

3. 如果镜像不存在,MCP Server 会自动构建,或手动构建:
```bash
docker-compose -f src/docker/docker-compose.yml build foundry-sandbox
```

### Docker 未运行

确保 Docker Desktop 正在运行:

```bash
docker ps
```

### 依赖安装失败

1. 检查依赖清单文件格式是否正确
2. 检查网络连接(依赖需要从网络下载)
3. 查看 MCP Server 日志获取详细错误信息

### 权限问题

如果遇到权限问题,确保 Docker 有权限访问项目目录。

## 安全注意事项

- 所有操作在 Docker 容器中运行,与宿主机隔离
- 容器与宿主机通过卷挂载共享文件
- 测试完成后自动清理容器和缓存
- 建议在生产环境中使用只读卷挂载(如果需要)

## 许可证

MIT

TDQS

A3.9/5.0

Scored across 1 tool

Disambiguation5/5

With only a single tool, there is no possibility of confusion or overlap; the purpose is entirely distinct.

Naming Consistency5/5

The single tool name 'forge_test' follows a consistent verb_noun pattern, which is as consistent as possible with one tool.

Tool Count3/5

The server has only 1 tool, which is borderline for a typical MCP server; more tools would be expected for a sandbox environment.

Completeness2/5

The server only provides a test runner, missing essential operations like compilation or deployment, leaving significant gaps for a Foundry sandbox.

Maintenance

ActivityInactive
ResponsivenessNo issues