前言¶
DeepSeek Harness(DSH)支持在 Web 配置下本地跑智能体会话。若你希望 Codex 或其它 MCP 客户端去「遥控」这台已经在跑的 DSH,常见做法是走 Web GUI:每一步往往要截图或解析 DOM,成本高、也不稳定。
dsh-mcp-relay 由社区维护者 Nigheart 发布,归类为模型推理相关插件。它把正在运行的 DSH 实例通过 Model Context Protocol(MCP)暴露出来,外部智能体可以列出会话、把任务委派给 DSH 自己的 session,并在 DSH 向人提问时代为作答,避免委派任务卡在「等不到人」的状态。
这是什么¶
一句话:在 DSH 进程内挂载 HTTP 中继插件,再在同一台机器上启动独立 MCP 服务(stdio),让 MCP 客户端用结构化工具调用驱动该实例已有的会话。
对外部调用方来说,一个 DSH session 类似子智能体:在指定 workspace 里保持上下文,多轮调用仍记得此前工作,最终返回本轮结果。
架构怎么拆¶
插件分成两半,职责边界明确:
MCP client (stdio)
└── bin/dsh-mcp-relay.mjs MCP server;轮询中继、为调用方挂起待答问题
└── HTTP 127.0.0.1:<port>/dsh-relay
└── lib/index.js 运行在 DSH 进程内的 Cordis 宿主插件
└── ctx.sessionController → DSH agent
lib/index.js是 DSH 宿主插件,与 Web GUI 同进程,能读写该实例已有 session,注册 HTTP 路由并完成 DSH 侧工作。bin/dsh-mcp-relay.mjs是独立 MCP 服务,对智能体走 stdio、对插件走 HTTP。DSH 进程本身占用 stdout,插件无法在进程内直接提供 stdio MCP。
等待与轮询放在 MCP 服务端;dsh_delegate 默认阻塞,一次工具调用对应一轮委派结束,调用方收到完整结果。
核心功能¶
README 中列出的 MCP 工具如下:
| 工具 | 作用 |
|---|---|
dsh_list_sessions |
列出运行中实例的 session,可按 workspace 过滤 |
dsh_models |
列出实例可路由的 provider/model,及各模型的 reasoning effort |
dsh_delegate |
在 workspace 新建或按 sessionId 继续 session,发送指令并等待本轮结束 |
dsh_answer |
回答 DSH 智能体提出的问题,使其继续执行 |
dsh_approval |
设置 session 对未来审批请求的处理方式:gui、auto-approve、deny |
dsh_cancel |
取消当前 turn(例如无人可处理的审批) |
dsh_poll |
读取 session 状态与最新输出;在 wait 返回 waiting 或 timeout 后使用 |
委派示例(来自 README):
dsh_delegate({ workspace: "/home/me/project", instruction: "Add the missing tests for parser.js" })
默认会阻塞到 turn 结束。仅当调用方确有并行其它工作时才传 wait: false,再用 dsh_poll 配合较长的 timeoutMs 收取结果,而不是秒级短轮询。不传 sessionId 会新建 DSH 智能体;传回返回的 sessionId 可继续同一智能体上下文。
常见 status 包括 completed(本轮结束,output 为最终回答)与 waiting(需通过 dsh_answer 等继续)。
环境与依赖¶
- 已启用 Web profile 的 DSH(
dsh web或桌面应用)。 - 与 DSH 同机安装 Node.js 18 及以上。
- 能拉起 stdio MCP 服务器的 MCP 客户端。
安装与启用¶
包未发布到 npm,需从 GitHub 仓库安装。官方命令为:
dsh plugin --profile web add github:Nigheart/dsh-mcp-relay
安装后重启 DSH。启动日志中应出现类似:
[dsh-mcp-relay] mounted /dsh-relay (tokenRequired=false)
可用 curl 独立验证(默认 Web 端口 3080;若实例使用其它端口,请替换):
curl -s http://127.0.0.1:3080/dsh-relay/ping
# {"ok":true,"data":{"relay":"dsh-mcp-relay","version":"0.6.4","tokenRequired":false}}
非默认端口时,除 curl 改端口外,还需为 MCP 服务设置 DSH_RELAY_URL(见下文)。
手动安装时,可在 profile 的 package.json 中声明依赖并把包列入 bundles;包自带 cordis.patch.yml,其中 loader 需保留 inject: [webServer, sessionController],否则可能在服务就绪前激活导致路由未挂载。细节见仓库 README。
配置 MCP 客户端¶
以 Codex 的 ~/.codex/config.toml 为例:
[mcp_servers.dsh]
command = "node"
args = ["/absolute/path/to/dsh-mcp-relay/bin/dsh-mcp-relay.mjs"]
startup_timeout_sec = 60
# DSH 非默认端口或启用了 token 时再配置
[mcp_servers.dsh.env]
DSH_RELAY_URL = "http://127.0.0.1:8080/dsh-relay"
MCP 握手里的 initialize.instructions 会附带用法说明,客户端无需额外手写工作流提示。
环境变量(摘自 README):
| 变量 | 默认值 | 用途 |
|---|---|---|
DSH_RELAY_URL |
http://127.0.0.1:3080/dsh-relay |
插件 HTTP 地址 |
DSH_RELAY_TOKEN |
未设置 | 作为 x-dsh-relay-token 发送,需与插件侧一致 |
DSH_RELAY_TIMEOUT_MS |
600000 |
单次委派默认等待时间 |
DSH_RELAY_POLL_MS |
2000 |
进度轮询间隔 |
DSH_RELAY_CALL_TIMEOUT_MS |
30000 |
单次中继 HTTP 调用上限 |
DSH_RELAY_SURFACE |
lean |
工具面规模;full 为旧版 0.6.0 表面,用于对比测量 |
若 MCP 客户端对单次工具调用有超时上限(Codex 为 tool_timeout_sec),且短于中继等待时间,会把一次阻塞委派拆成多次往返。README 建议至少给到 DSH_RELAY_TIMEOUT_MS 量级,例如:
[mcp_servers.dsh]
tool_timeout_sec = 600
适用场景与注意¶
适合:已在本机跑 DSH Web 实例,希望用 Codex 或其它 MCP 客户端把具体 coding 任务委派给 DSH session,并能在无人值守时回答 DSH 的追问或处理审批策略。
注意:
- 插件在 DSH 进程内运行,权限与当前 DSH 进程一致;安装前请阅读源码与许可证(MIT,见仓库
package.json)。 - DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。
- 自 0.6.1 起工具面做了精简以降低 MCP 每次请求重复携带的 schema 体积;可用仓库内
bin/dsh-bench.mjs做表面与用量对比(见 README)。
链接¶
- 社区目录页:https://www.skillhub.cn/plugins/Nigheart/dsh-mcp-relay
- 源码与文档:https://github.com/Nigheart/dsh-mcp-relay