电子表格训练环境

MCP沙盒环境是一个为AI代理设计的电子表格任务训练平台,支持程序化和GUI两种交互模式,提供自动化评分和隔离的Docker沙箱。

  • by krish1905
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 krish1905/mcp-sandbox

使用说明

MCP沙盒环境

一个RL培训环境,供AI代理练习现实世界的电子表格任务。通过模型上下文协议(MCP)支持程序化(工具使用)和基于GUI(计算机使用)的交互,具有自动分级和隔离的Docker沙盒。

建筑

┌─────────────────┐
│   AI Agent      │  (Claude, GPT, Local LLM, etc.)
│                 │
└────────┬────────┘
         │ Connects via MCP
         ▼
┌─────────────────┐
│   MCP Server    │  TypeScript, runs on host
│                 │
│ • Exposes tools │
│ • Manages tasks │
│ • Two modes:    │
│   - Tool Use    │
│   - Computer Use│
└────────┬────────┘
         │ Docker API
         ▼
┌─────────────────┐
│ Docker Sandbox  │  Isolated container
│                 │
│ • LibreOffice   │
│ • Python + libs │
│ • Xvfb (GUI)    │
│ • Fresh per task│
└─────────────────┘

特性

  • 两种交互模式:

    • 工具使用:通过Python进行编程访问(odfpy、pandas)
    • 计算机使用:GUI自动化(屏幕截图、鼠标、键盘)
  • 沙盒环境:

    • 隔离的Docker容器
    • 每项任务都有新的开始
    • 网络隔离
    • 可配置超时
  • 自动评分:

    • 电子表格与公差的比较
    • 公式验证
    • 部分信贷支持
    • 自定义分级器

快速开始

1.构建Docker镜像

cd sandbox-image
docker build -t mcp-sandbox:latest .

2.生成任务文件

cd tasks/banking-reserve
pip install odfpy
python generate_files.py

3.安装MCP服务器依赖项

cd mcp-server
npm install

4.构建和运行

npm run build
npm start

项目结构

mercor/
├── mcp-server/              # TypeScript MCP Server
│   ├── src/
│   │   ├── index.ts         # Entry point
│   │   ├── tools/           # MCP tool definitions
│   │   ├── sandbox/         # Docker container management
│   │   ├── tasks/           # Task loading
│   │   └── grading/         # Evaluation system
│   └── package.json
├── sandbox-image/           # Docker image
│   ├── Dockerfile
│   ├── scripts/             # Python scripts (run inside container)
│   └── entrypoint.sh
├── tasks/                   # Task definitions
│   └── banking-reserve/
│       ├── task.json        # Problem statement
│       ├── starting/        # Initial files
│       ├── oracle/          # Expected output
│       └── grader.py        # Custom grader
└── README.md

可用工具

任务管理

工具 说明
list_tasks 列出可用任务
start_task 使用任务初始化沙盒
get_task_info 获取问题陈述
submit_task 提交评分
reset_task 重置为初始状态

电子表格(工具使用)

工具 说明
list_sheets 列出工作表名称
read_cell 读取单元格值
write_cell 写入单元格
read_range 读取单元格范围
write_range 写入范围
get_formula 获取单元格公式
set_formula 设置单元格公式
get_sheet_data 获取完整的表格数据

计算机使用(GUI)

工具 说明
screenshot 捕获屏幕
mouse_move 移动光标
mouse_click 点击鼠标
keyboard_type 键入文本
keyboard_press 按键
keyboard_hotkey 按键组合
open_file_in_libreoffice 在GUI中打开文件

创建新任务

  1. 创建任务目录: tasks/my-task/

  2. 添加 task.json:

{
  "id": "my-task",
  "name": "My Task Name",
  "description": "Full problem description...",
  "timeoutSeconds": 300,
  "startingFiles": ["data.ods"],
  "expectedOutputs": ["data.ods"],
  "grading": {
    "type": "spreadsheet_comparison",
    "tolerance": 0.01,
    "checkFormulas": true
  }
}
  1. 将起始文件添加到 starting/

  2. 将预期产出添加到 oracle/

  3. 可选择添加 grader.py 用于自定义分级

发展

# Watch mode
npm run dev

# Run tests
npm test

# Lint
npm run lint

示例用法(代理视角)

Agent: start_task("banking-reserve")
→ Task started, sandbox created

Agent: get_task_info()
→ Returns problem statement

Agent: list_sheets("cash_flows.ods")
→ ["Sheet1"]

Agent: read_range("cash_flows.ods", "Sheet1", "B1", "B10")
→ Returns first 10 cash flow values

Agent: set_formula("cash_flows.ods", "Sheet1", "D2", "=SUMIF(B2:B101,\">0\")")
→ Formula set successfully

Agent: submit_task()
→ Returns grading result with score

许可证

麻省理工学院