把本机 Codex 包成可多轮续聊的 MCP 子代理
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/14 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Miraclemarvel/dsh-codex-bridge该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · dev
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 19 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 12 处,展示前 12 条)
- 读取本地文件server.mjs:36
const isFile = (p) => { try { return statSync(p).isFile(); } catch { return false; } }; - 执行外部命令固定命令server.mjs:165
spawn('taskkill', ['/pid', String(pid), '/t', '/f'], { stdio: 'ignore', windowsHide: true }); - 写入本地文件server.mjs:185
writeFileSync(promptFile, prompt, 'utf8'); - 写入本地文件server.mjs:186
writeFileSync(outFile, '', 'utf8'); - 写入本地文件server.mjs:187
writeFileSync(errFile, '', 'utf8'); - 读取本地文件server.mjs:202
try { stdout = stripBom(readFileSync(outFile, 'utf8')); } catch { } - 读取本地文件server.mjs:203
try { stderr = stripBom(readFileSync(errFile, 'utf8')); } catch { } - 删除本地文件递归server.mjs:205
try { rmSync(dir, { recursive: true, force: true }); } catch { } - 执行外部命令来自配置/变量server.mjs:214
child = spawn(spec.command, spec.args, { - 删除本地文件递归server.mjs:222
try { rmSync(dir, { recursive: true, force: true }); } catch { } - 读取本地文件server.mjs:345
if (!existsSync(cwd) || !statSync(cwd).isDirectory()) throw new Error('cwd is not an existing directory: ' + cwd); - 读取本地文件server.mjs:345
if (!existsSync(cwd) || !statSync(cwd).isDirectory()) throw new Error('cwd is not an existing directory: ' + cwd);
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
一个 MCP 服务器,封装本地 Codex 命令行,让任何 MCP 客户端都能用上多轮 Codex 子代理。
README
由 DeepSeek 最新模型翻译生成dsh-codex-bridge
把本机 Codex CLI 包成一个 MCP server。 任何 MCP 客户端 —— DeepSeek Harness、Claude Code、Cursor…… —— 装上它就能得到一个能多轮续聊的 Codex 子代理:派活、追问、拿第二意见。
零依赖、单文件、不需要额外的 API key(用的就是你 Codex CLI 已经登录的账号)。
English quickstart ↓
它做什么
两个工具:
| 工具 | 作用 |
| ask | 新开一个 Codex 会话,返回最终答复 + thread id |
| followup | 带 thread id 回去续同一会话,Codex 记得之前所有轮次 |
Codex 在自己的进程里跑,是个完整 agent —— 有自己的工具、自己的工作目录。让它审代码、查一个 bug、独立调研一件事,或者跟你的方案唱反调,都可以。
和官方 Codex subagent 的差别
OpenAI 和 DSH 都提供「把 Codex 当子代理」的通道,但它们都是 one-shot:每次调用是一个全新的、一次性的会话,只回最终答案。
展开完整文档(README 剩余 1 节)
dsh-codex-bridge
把本机 Codex CLI 包成一个 MCP server。 任何 MCP 客户端 —— DeepSeek Harness、Claude Code、Cursor…… —— 装上它就能得到一个能多轮续聊的 Codex 子代理:派活、追问、拿第二意见。
零依赖、单文件、不需要额外的 API key(用的就是你 Codex CLI 已经登录的账号)。
English quickstart ↓
它做什么
两个工具:
| 工具 | 作用 |
| ask | 新开一个 Codex 会话,返回最终答复 + thread id |
| followup | 带 thread id 回去续同一会话,Codex 记得之前所有轮次 |
Codex 在自己的进程里跑,是个完整 agent —— 有自己的工具、自己的工作目录。让它审代码、查一个 bug、独立调研一件事,或者跟你的方案唱反调,都可以。
和官方 Codex subagent 的差别
OpenAI 和 DSH 都提供「把 Codex 当子代理」的通道,但它们都是 one-shot:每次调用是一个全新的、一次性的会话,只回最终答案。
| | 本桥 | 常见官方 one-shot 通道 |
| 多轮续聊 | ✅ followup 带 thread id 回到同一会话 | ❌ 每次全新会话 |
| 中间过程 | 正文 + token 用量 + thread id | 一般只有最终答案 |
| 沙箱策略 | 可逐次指定 read-only / workspace-write / danger-full-access | 由 Codex 原生配置决定 |
| 依赖 | 只要 codex CLI | 需要对应平台的 SDK / bundle |
一句话:只需要一问一答,用官方通道就行;需要跟 Codex 来回迭代,用它。
安装
前置
1. Node.js ≥ 18
2. Codex CLI 已安装并已登录(codex login)
3. 确认能找到 codex:
codex --version
找不到就设 CODEX_BIN 指向它(见「环境变量」)。
拿到代码
git clone https://github.com/Miraclemarvel/dsh-codex-bridge.git
cd dsh-codex-bridge
node test/smoke.mjs # 不需要 Codex、不需要联网,先确认协议层正常
看到 SMOKE PASSED 就说明 server 本身没问题。
注意:在受限沙箱里跑这条会 EPERM(子进程管道被拦),普通 shell 里没问题。
配置
通用 MCP 客户端
大多数客户端(Claude Code、Cursor、Windsurf…)读同一套 JSON,见 examples/mcp.json:
{
"mcpServers": {
"codex": {
"command": "node",
"args": ["/absolute/path/to/dsh-codex-bridge/server.mjs"],
"env": {
"CODEX_BRIDGE_CWD": "/absolute/path/to/your/project",
"CODEX_BRIDGE_SANDBOX": "read-only"
}
}
}
}
Claude Code 也可以直接命令行加:
claude mcp add codex -- node /absolute/path/to/dsh-codex-bridge/server.mjs
DeepSeek Harness
用 DSH 自带的 dsh-mcp-client 挂载。往 <DSH_HOME>/profiles/<profile>/cordis.patch.yml 末尾追加(完整示例见 examples/dsh-profile.yml):
- insert:
- id: mcp-codex-bridge
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: codex
transport: stdio
command: node
args:
- /absolute/path/to/dsh-codex-bridge/server.mjs
cwd: /absolute/path/to/your/project
toolCallTimeoutMs: 1800000
env:
CODEX_BRIDGE_CWD: /absolute/path/to/your/project
CODEX_BRIDGE_SANDBOX: read-only
工具会以 mcp__codex__ask / mcp__codex__followup 出现在模型侧。
两个必须知道的坑(都是实测踩出来的)
① 新增条目一定要包在 - insert: 里。 cordis.patch.yml 是「id-targeted config overrides, disables, and insert lists」。裸的 - id: X 是按 id 覆盖已有条目;id 在 profile 里不存在就静默丢弃 —— 不报错、不警告,文件看起来完全正常。
② 改已有条目能热重载,新增条目必须重启 Host。 宿主会立刻重写合成后的 cordis.yml,但不会 spawn 新插件的子进程。别误判成配置写错了。
另外 dsh-mcp-client 的 toolCallTimeoutMs 默认只有 60 秒,长任务会被它先掐断,务必调大。
工具参考
ask(prompt, cwd?, sandbox?, model?, timeoutMs?)
新开一个 Codex 会话。
- prompt(必填)—— 指令。Codex 看不到你这边客户端的对话,需要什么上下文都得写进来。
- cwd —— Codex 的工作目录,默认是 server 进程的 cwd。
- sandbox —— read-only(默认)| workspace-write | danger-full-access。
- model —— 覆盖模型,比如 gpt-6.1-sol。省略则用 Codex 默认。
- timeoutMs —— 硬超时,到点杀掉整棵进程树并返回部分输出。
返回正文 + thread id + token 用量。
followup(threadId, prompt, cwd?, model?, timeoutMs?)
续同一会话。threadId 来自上一次 ask 或 followup 的返回。
注意:followup 不能改 sandbox。 codex exec resume 子命令没有 -s,沙箱策略沿用原会话。
环境变量
| 变量 | 默认 | 说明 |
| CODEX_BIN | 自动探测 | codex 可执行文件路径。不设则依次找 PATH → ~/.codex/bin/codex.exe、~/.codex/.sandbox-bin/codex.exe(Windows)/ ~/.local/bin/codex、/usr/local/bin/codex、/opt/homebrew/bin/codex(POSIX) |
| CODEX_BRIDGE_CWD | 进程 cwd | 默认工作目录 |
| CODEX_BRIDGE_SANDBOX | read-only | 默认沙箱策略 |
| CODEX_BRIDGE_TIMEOUT_MS | 900000 | 默认超时(15 分钟) |
| CODEX_BRIDGE_MAX_TIMEOUT_MS | 3600000 | 调用方可传的超时上限(1 小时) |
设计要点
改代码前值得先知道这几条 —— 每一条都是踩坑之后定下来的。
零依赖,手写 JSON-RPC。 不引入 @modelcontextprotocol/sdk:clone 下来直接 node server.mjs 就能跑,没有 npm install、没有版本冲突。
全程不碰管道。 stdin 用临时文件 fd,stdout/stderr 直接重定向到临时文件 fd,spawn(bin, args, { stdio: [inFd, outFd, errFd] }),父进程立刻放掉句柄,等 close 事件再读文件。原因:受限沙箱(比如 DSH 自己的文件沙箱)下 piped stdio 会 EPERM,而文件重定向两边都能跑。顺带好处是完全绕开 argv 长度上限,prompt 想多长都行。
initialize 原样回显客户端请求的 protocolVersion。 客户端只会请求自己支持的版本,回显就一定落在它的支持集内 —— 省掉一份会过期的协议版本白名单。
生命周期不能图省事。 写成 process.stdin.on('end', () => process.exit(0)) 会把还在飞的 Codex 调用直接掐死(症状:只回了 initialize,tools/call 毫无输出)。正确做法是 pending 计数 + stdinEnded 标志,两者都满足才退出。
followup 的 threadId 必须显式校验。 spawn 会把 undefined 参数悄悄字符串化成 "undefined":Codex 找不到那个会话,就静默新建一个 —— 不报错、退出码 0,只是「完全没有上文」。所以 buildArgs 里宁可 throw。
Windows 的 .cmd 要转手。 npm 全局安装只留 codex.cmd,而 spawn 不能直接执行 .cmd/.bat,必须交给 cmd.exe /c。我们的 argv 里没有用户自由文本(prompt 走 stdin),只有 cwd / model 可能含空格,逐个加引号即可。
噪音降级。 Code Mode 缺失、WebSocket 回落 HTTPS、Reconnecting... N/5 这些每次调用都出现,但不是真错误,归到 notes 而不是 error。
故障排查
| 现象 | 原因 / 处理 |
| 客户端里看不到工具 | server 起不来。终端直接跑 node server.mjs,看 stderr 的 [codex-bridge] ready — codex=... 那行 |
| Could not locate the codex executable | 设 CODEX_BIN 指向完整的可执行文件路径 |
| 工具调用老是超时 | 客户端侧超时可能比 Codex 实际耗时短。DSH 的 dsh-mcp-client 默认只有 60 秒,必须调大 toolCallTimeoutMs |
| 改了配置没反应(DSH) | 新增条目必须重启 Host,且必须包在 - insert: 里(见上文) |
| followup 说不知道上文 | 你传的 threadId 不是这个会话的。ask 的返回里会明确写出该用哪个 id |
已知限制
- Codex 看不到调用方的对话。 它是独立进程,不是旁听者。上下文得由调用方写进 prompt。
- followup 不能改 sandbox。 见上文。
- 首次调用可能很慢。 如果 Codex 先试 WebSocket 传输再超时回落 HTTPS,每次会白等一段时间(会看到 Reconnecting... N/5、Falling back from WebSockets to HTTPS transport)。这些已归为 notes,不影响结果,但确实拖时间。
- 只暴露 tools。 MCP 的 Resources 和 Prompts 返回空列表。
- 无进度流。 一次调用要么等到最终答案,要么等到超时。
English quickstart
dsh-codex-bridge 把本地 Codex CLI 包装成 MCP 服务器,让任何 MCP 客户端都能拿到一个 Codex 子代理,而且能真正反复迭代——不是只能调用一次。
git clone https://github.com/Miraclemarvel/dsh-codex-bridge.git
cd dsh-codex-bridge
node test/smoke.mjs # protocol-level check; needs no Codex, no network
把它加进你的客户端(见 examples/mcp.json):
{
"mcpServers": {
"codex": {
"command": "node",
"args": ["/absolute/path/to/dsh-codex-bridge/server.mjs"]
}
}
}
你会得到两个工具:
- ask(prompt, cwd?, sandbox?, model?, timeoutMs?) —— 新建一个 Codex 会话。默认 read-only,所以 Codex 只能查看,不能修改。返回答案和一个 thread id。Codex 看不到你的对话,所以需要的上下文都写进 prompt。
- followup(threadId, prompt, ...) —— 继续同一个会话。Codex 记得之前每一轮。沙箱策略会继承(codex exec resume 没有 -s)。
需要 Node ≥ 18,以及已登录的 Codex CLI。如果 codex 不在你的 PATH 里,就设置 CODEX_BIN。
MIT 协议。
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Miraclemarvel/dsh-codex-bridge
把本机 Codex 包成可多轮续聊的 MCP 子代理
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,125已汉化MCP
71.7
AI 架构文档生成器sopaco/deepwiki-rs
🚀 Litho 已进化为 Terrain —— 给你的 AI 智能体一张会呼吸的代码库地图。
★ 3,157已汉化DSH
70.8
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
AI 编程纪律方法包GanyuanRan/Aegis
让 AI 编程 agent 变得可信:少返工、更安全、说“完成”前先给证据。
★ 1,384已汉化DSH
69.6
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9