🚀 Moonbridge
Moonbridge 让你的 MCP 客户端拥有了一个团队。你可以从 Claude Code、Cursor 或任何 MCP 客户端中生成 AI 编码代理,以较低的成本并行运行 10 种方案。
uvx moonbridge
🚀 快速开始
- 至少安装一个受支持的 CLI:
| 适配器 |
安装命令 |
认证方式 |
| Kimi(默认) |
uv tool install --python 3.13 kimi-cli |
kimi login |
| Codex |
npm install -g @openai/codex |
设置 OPENAI_API_KEY |
| OpenCode |
curl -fsSL https://opencode.ai/install | bash |
opencode auth login |
| Gemini CLI |
npm install -g @google/gemini-cli |
运行 gemini 登录流程或设置 GEMINI_API_KEY |
- 添加到 MCP 配置文件(
~/.mcp.json):
{
"mcpServers": {
"moonbridge": {
"type": "stdio",
"command": "uvx",
"args": ["moonbridge"]
}
}
}
- 开始使用。你的 MCP 客户端现在拥有
spawn_agent 和 spawn_agents_parallel 工具。
⚠️ 安全警告(请先阅读)
Moonbridge 会执行代理式 CLI(Kimi/Codex/OpenCode/Gemini)。恶意或粗心的提示可能会导致代理运行 shell 命令、读取可访问的文件或通过网络调用泄露数据。
Moonbridge 添加了防护措施(MOONBRIDGE_ALLOWED_DIRS、环境白名单、可选的 MOONBRIDGE_SANDBOX=1),但这些并不等同于操作系统级别的隔离。
对于不可信的提示或共享环境,请在具有最小权限的文件系统和网络访问权限的容器或虚拟机中运行 Moonbridge。
🔄 更新
Moonbridge 在启动时会检查更新(缓存 24 小时)。若要手动更新:
uvx moonbridge --refresh
uv tool upgrade moonbridge
若要在 CI/自动化中禁用更新检查:
export MOONBRIDGE_SKIP_UPDATE_CHECK=1
💡 何时使用 Moonbridge
| 任务 |
使用 Moonbridge 的原因 |
| 并行探索 |
同时运行 10 种方案,选择最佳方案 |
| 前端/UI 工作 |
Kimi 在可视化编码和组件设计方面表现出色 |
| 测试和文档编写 |
对于大量任务具有成本效益 |
| 代码重构 |
在一次请求中尝试多种策略 |
最适合:受益于并行执行或大量任务的场景。
🔍 工作原理
连接流程
- MCP 客户端(Claude Code、Cursor 等)通过标准输入输出连接到 Moonbridge。
- 客户端通过
list_tools 发现可用工具。
- 客户端调用
spawn_agent 或 spawn_agents_parallel。
生成过程
- Moonbridge 验证提示和工作目录。
- 确定要使用的适配器(Kimi、Codex、OpenCode、Gemini)。
- 适配器使用适当的标志构建 CLI 命令。
- 在单独的进程组中生成子进程。
- 捕获标准输出/标准错误,强制执行超时。
- 返回结构化的 JSON 结果。
并行执行
spawn_agents_parallel 通过 asyncio.gather 并发运行最多 10 个代理。
- 每个代理是独立的(单独的进程、单独的输出)。
- 当最后一个代理完成(或超时)时,所有结果一起返回。
MCP 客户端 → 标准输入输出 → Moonbridge → 适配器 → CLI 子进程
→ CLI 子进程(并行)
→ CLI 子进程(并行)
💻 工具
| 工具 |
使用场景 |
spawn_agent |
单个任务:“为 auth.ts 编写测试” |
spawn_agents_parallel |
广泛探索:10 个代理,10 种方案,选择最佳方案 |
check_status |
验证适配器 CLI 是否安装并认证 |
list_adapters |
显示可用的适配器及其状态 |
list_models |
显示适配器已知/动态的模型选项 |
示例:并行探索
{
"agents": [
{"prompt": "重构为 React hooks"},
{"prompt": "重构为 Zustand"},
{"prompt": "重构为 Redux Toolkit"}
]
}
三种方案,一次请求,你选择最佳方案。
工具参数
spawn_agent
| 参数 |
类型 |
是否必需 |
描述 |
prompt |
字符串 |
是 |
代理的任务描述 |
adapter |
字符串 |
否 |
使用的后端:kimi、codex、opencode、gemini(默认来自 MOONBRIDGE_ADAPTER,回退为 kimi) |
model |
字符串 |
否 |
模型覆盖(例如,gpt-5.2-codex、openrouter/minimax/minimax-m2.5、gemini-2.5-pro)。对于 opencode,模型使用 provider/model。 |
thinking |
布尔值 |
否 |
启用推理模式(仅适用于 Kimi) |
reasoning_effort |
字符串 |
否 |
推理预算:low、medium、high、xhigh(仅适用于 Codex,默认 xhigh) |
timeout_seconds |
整数 |
否 |
覆盖默认超时时间(30 - 3600) |
spawn_agents_parallel
| 参数 |
类型 |
是否必需 |
描述 |
agents |
数组 |
是 |
代理配置列表(最多 10 个) |
agents[].prompt |
字符串 |
是 |
此代理的任务 |
agents[].adapter |
字符串 |
否 |
此代理的后端 |
agents[].model |
字符串 |
否 |
此代理的模型覆盖(codex 默认:gpt-5.3-codex;opencode 使用 provider/model;gemini 默认:gemini-2.5-pro) |
agents[].thinking |
布尔值 |
否 |
启用推理(仅适用于 Kimi) |
agents[].reasoning_effort |
字符串 |
否 |
推理预算(仅适用于 Codex,默认 xhigh) |
agents[].timeout_seconds |
整数 |
否 |
此代理的超时时间 |
check_status
| 参数 |
类型 |
是否必需 |
描述 |
adapter |
字符串 |
否 |
要明确检查的适配器。未提供时默认为 MOONBRIDGE_ADAPTER。 |
list_models
| 参数 |
类型 |
是否必需 |
描述 |
adapter |
字符串 |
否 |
要检查的适配器。未提供时默认为 MOONBRIDGE_ADAPTER。 |
provider |
字符串 |
否 |
OpenCode 模型目录的提供者过滤器(例如,openrouter)。 |
refresh |
布尔值 |
否 |
刷新支持动态发现的适配器的模型目录。 |
📄 响应格式
所有工具返回的 JSON 包含以下字段:
| 字段 |
类型 |
描述 |
status |
字符串 |
success、error、timeout、auth_error 或 cancelled |
output |
字符串 |
代理的标准输出 |
stderr |
字符串 | null |
标准错误(如果有) |
returncode |
整数 |
进程退出代码(超时/错误时为 -1) |
duration_ms |
整数 |
执行时间(毫秒) |
agent_index |
整数 |
代理索引(单个代理为 0,并行代理为 0 - N) |
message |
字符串(可选) |
人类可读的错误上下文(适用时) |
raw |
对象(可选) |
可选的结构化元数据(例如,沙箱差异) |
当输出太大时,Moonbridge 会截断输出并添加 raw.output_limit 元数据,包含原始大小。
⚙️ 配置
环境变量
| 变量 |
描述 |
MOONBRIDGE_ADAPTER |
默认适配器(默认:kimi) |
MOONBRIDGE_TIMEOUT |
默认超时时间(秒)(30 - 3600) |
MOONBRIDGE_KIMI_TIMEOUT |
Kimi 特定的默认超时时间 |
MOONBRIDGE_CODEX_TIMEOUT |
Codex 特定的默认超时时间 |
MOONBRIDGE_OPENCODE_TIMEOUT |
OpenCode 特定的默认超时时间 |
MOONBRIDGE_GEMINI_TIMEOUT |
Gemini 特定的默认超时时间 |
MOONBRIDGE_MODEL |
全局默认模型覆盖 |
MOONBRIDGE_KIMI_MODEL |
Kimi 特定的模型覆盖 |
MOONBRIDGE_CODEX_MODEL |
Codex 特定的模型覆盖 |
MOONBRIDGE_OPENCODE_MODEL |
OpenCode 特定的模型覆盖 |
MOONBRIDGE_GEMINI_MODEL |
Gemini 特定的模型覆盖 |
MOONBRIDGE_MAX_AGENTS |
最大并行代理数 |
MOONBRIDGE_MAX_OUTPUT_CHARS |
每个代理在标准输出 + 标准错误中返回的最大字符数(默认 120000;超时尾部按流计算) |
MOONBRIDGE_ALLOWED_DIRS |
以冒号分隔的工作目录白名单 |
MOONBRIDGE_STRICT |
设置为 1 以要求 ALLOWED_DIRS(未设置时退出) |
MOONBRIDGE_SANDBOX |
设置为 1 以在当前工作目录的临时副本中运行代理 |
MOONBRIDGE_SANDBOX_KEEP |
设置为 1 以保留沙箱目录以供检查 |
MOONBRIDGE_SANDBOX_MAX_DIFF |
最大差异大小(字节)(默认 500000) |
MOONBRIDGE_SANDBOX_MAX_COPY |
最大沙箱副本大小(字节)(默认 500MB) |
MOONBRIDGE_LOG_LEVEL |
设置为 DEBUG 以进行详细日志记录 |
🔒 安全
Moonbridge 继承了所选适配器 CLI 的安全模型。Kimi、Codex、OpenCode 和 Gemini 是代理式 CLI;提示可以触发命令执行、文件访问和网络活动,这些活动受进程权限的限制。
1. 威胁模型(包括提示注入)
如果攻击者能够影响通过 MCP 发送的提示输入,他们可以尝试让代理:
- 读取敏感文件(例如
~/.ssh 或 .env)。
- 运行破坏性的 shell 命令。
- 通过网络泄露数据。
Moonbridge 不会检查提示意图。请将提示输入视为潜在的不可信输入。
2. 目录限制(MOONBRIDGE_ALLOWED_DIRS)
默认情况下,代理可以在任何目录中操作。设置 MOONBRIDGE_ALLOWED_DIRS 以进行限制:以冒号分隔的允许路径。在检查之前,符号链接会通过 os.path.realpath 解析。严格模式(MOONBRIDGE_STRICT=1)在启动时如果没有配置有效的允许目录则会退出。
export MOONBRIDGE_ALLOWED_DIRS="/home/user/projects:/home/user/work"
export MOONBRIDGE_STRICT=1
3. 环境清理
只有白名单中的环境变量会传递给生成的代理。每个适配器定义自己的白名单(PATH、HOME,以及适配器特定的变量,如 Codex 的 OPENAI_API_KEY)。默认情况下,你的 shell 环境(秘密、令牌、SSH 密钥)不会被继承。
4. 输入验证
模型参数会进行验证,以防止标志注入(以 - 开头的值会被拒绝)。提示限制为 100,000 个字符,且不能为空。
5. 进程隔离和沙箱模式
代理在单独的进程组中运行(start_new_session=True)。退出时会清理孤儿进程。可用沙箱模式(MOONBRIDGE_SANDBOX=1)进行运行时复制隔离。
注意:这不是操作系统级别的沙箱。代理仍然可以读取或写入它们可以访问的任意主机文件。
6. 强化部署清单
- 将
MOONBRIDGE_ALLOWED_DIRS 设置为尽可能小的集合。
- 启用
MOONBRIDGE_STRICT=1,以便在缺少限制时安全关闭。
- 启用
MOONBRIDGE_SANDBOX=1 以避免直接修改工作区。
- 在容器/虚拟机中运行 Moonbridge 以实现强隔离。
- 在没有额外身份验证控制的情况下,不要将 Moonbridge 暴露给不可信的客户端。
🛠️ 故障排除
"CLI 未找到"
安装你所选适配器的 CLI:
uv tool install --python 3.13 kimi-cli
which kimi
npm install -g @openai/codex
which codex
curl -fsSL https://opencode.ai/install | bash
which opencode
npm install -g @google/gemini-cli
which gemini
"auth_error" 响应
使用你所选的 CLI 进行认证:
kimi login
export OPENAI_API_KEY=sk-...
opencode auth login
gemini
超时错误
适配器有合理的默认值:Codex = 1800 秒,Kimi = 600 秒,OpenCode = 1200 秒,Gemini = 1200 秒。
对于特别长的任务,显式覆盖超时时间:
{"prompt": "...", "timeout_seconds": 3600}
或者通过环境变量设置每个适配器的默认值:
export MOONBRIDGE_CODEX_TIMEOUT=2400
export MOONBRIDGE_KIMI_TIMEOUT=900
export MOONBRIDGE_OPENCODE_TIMEOUT=1200
export MOONBRIDGE_GEMINI_TIMEOUT=1200
⏱️ 超时最佳实践
| 任务类型 |
建议超时时间 |
| 快速查询、状态检查 |
60 - 180 秒 |
| 简单编辑 |
300 - 600 秒 |
| 功能实现 |
1200 - 1800 秒 |
| 大型重构 |
1800 - 3600 秒 |
优先级解析:显式参数 > 适配器环境变量 > 适配器默认值 > 全局环境变量 > 600 秒回退值
"MOONBRIDGE_ALLOWED_DIRS 未设置" 警告
默认情况下,如果没有配置目录限制,Moonbridge 会在启动时发出警告。这在本地开发中是正常的。对于共享/生产环境,请设置允许的目录:
export MOONBRIDGE_ALLOWED_DIRS="/path/to/project:/another/path"
📦 沙箱模式(运行时复制)
启用沙箱模式以在工作目录的临时副本中运行代理:
export MOONBRIDGE_SANDBOX=1
启用后:
- 代理在当前工作目录的临时副本中运行。
- 默认情况下,主机文件保持不变。
raw.sandbox 中包含统一的差异和摘要。
可选设置:
export MOONBRIDGE_SANDBOX_KEEP=1
export MOONBRIDGE_SANDBOX_MAX_DIFF=200000
export MOONBRIDGE_SANDBOX_MAX_COPY=300000000
限制:这不是操作系统级别的隔离。如果代理选择,它们仍然可以读取/写入任意主机路径。使用容器/虚拟机实现强隔离。
若要强制执行限制(退出而不是警告):
export MOONBRIDGE_STRICT=1
工作目录权限被拒绝
验证目录是否在你的白名单中:
export MOONBRIDGE_ALLOWED_DIRS="/path/to/project:/another/path"
调试日志
启用详细日志记录:
export MOONBRIDGE_LOG_LEVEL=DEBUG
🖥️ 平台支持
仅支持 macOS 和 Linux,不支持 Windows。
📄 许可证
本项目采用 MIT 许可证,请参阅 LICENSE 文件。