dsh-mcp-relay:用 MCP 把运行中的 DSH 实例交给外部智能体驱动

前言

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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye