🚀 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 文件。