MCP 客户端(dsh-mcp-client)

MCP client bridge

别名:@deepseek-ai/dsh-mcp-client、MCP、MCP 接入、mcp-client

DSH 自带的 MCP 客户端桥接(@deepseek-ai/dsh-mcp-client,0.1.0-rc.6):一个插件实例接一台 MCP 服务器,把对方的工具注册进 ctx.tools,模型看到的名字是 mcp__<serverName>__<rawName>——与 Claude Code、Codex 同一套「服务器限定名」。

一句话

MCP 客户端桥接是 DSH 里唯一「把外部世界的工具接成模型能力」的官方通道:一台服务器 = 一个插件实例, 接上之后模型看到的是 mcp__github__create_issue 这样的原生工具,不再需要你去粘贴什么适配代码。

它解决什么问题

模型自己只能调用 harness 内建的那些工具。想让它在你的 GitHub、数据库、浏览器里干活,过去只有两条路: 写一个插件(要懂 DSH 的插件契约),或者把结果手工贴进对话。MCP 是第三条——外面已经有一大批 按协议暴露工具的服务器,桥接层把它们统一注册进来,你只写一段配置。

两种传输

一个实例接一台服务器,传输只有两种:

传输要填典型用途
stdiocommand(+ args / env / cwd)本机进程。例:npx -y @modelcontextprotocol/server-github
streamable-httpurl(+ headers)已经在跑的 HTTP 服务,本机或远端

env 是合并进一个已经清理过的环境,不是替换;cwd 决定子进程的工作目录—— 涉及相对路径的服务器要留意这一项。

工具命名:这一段最容易踩坑

每个 MCP 工具在协议上有两个名字:

  • 原始名(rawName):在 tools/call 里上网线的那个;
  • 公开名:注册到 ctx.tools 的 mcp__<serverName>__<rawName>,模型看到的是它。

公开名会被规范到 DeepSeek 的函数名约定(64 字符、[A-Za-z0-9_-]);一旦发生替换或截断, 就会追加 (serverName, rawName) 的确定性 12 位十六进制 hash。这条设计的价值在于: 名字是 (serverName, rawName) 的纯函数——连接顺序、重新同步、别的服务器都不会让一个工具改名。 所以你的提示词里写死 mcp__github__create_issue 是安全的。

几条边界,都是实测口径:

  • 两台服务器各有一个 search:各自带命名空间,共存,不冲突。
  • serverName 重复:后加载的那个插件实例会失败(不是静默合并)。
  • 服务器在工具列表里把同一个名字列两次:整个列表按无效拒绝。
  • 有外部注册抢占这个服务器的命名空间:整代回滚(绝不留下一个残缺的工具集),并明确报错。

断线、超时与启动失败

项默认说明
自动重连开首次失败等 500ms,之后翻倍,上限 30s
重连尝试上限10 次连续失败到上限就彻底放弃(等下一次配置变更)
单次工具调用超时60stoolCallTimeoutMs
初始连接失败是否阻止激活否failOnStartupError: false——配置写错时插件仍然挂上,只是没有工具

最后一项是个取舍:默认 false 让「服务器没起来」不至于连累整个 profile,代价是错误不显眼。 如果你希望配置写错时立刻炸出来,把它设成 true。

改配置不需要重启:HMR 会断开旧连接、按新配置重连;serverName 没变时工具名完全一致, 所以正在进行的对话不会因为改名而找不到工具。

凭据:这一页最大的风险点

stdio 用 env、HTTP 用 headers 传 token。给服务器什么凭据,模型就能用那些工具做到什么程度—— 一个全权限的 GitHub token 意味着它可以改你所有仓库。建议:

  • 按最小必要给:只读的先用只读 token;
  • 把 token 放在环境变量里,用配置的表达式语法引用,别写死在文件里;
  • 记住这台服务器的工具对模型是始终可见可调用的,除非你在权限档位上另行限制。

怎么自己核实

本机就能核,不需要联网:

~/.dsh/profiles/node_modules/@deepseek-ai/dsh-mcp-client/README.zh.md

字段名、默认值、命名规则都在这份 README 里(快照 2026-10-02,0.1.0-rc.6)。 想确认某一台服务器到底暴露了哪些工具,就把它接上、看模型侧的可用工具列表—— 公开名一定是 mcp__<你填的 serverName>__<原始名>。

与别的东西的关系

  • 它是插件(宿主侧),所以安装、版本、兼容这些事和别的插件一样走 profile 与 patch 层。
  • 它接进来的工具属于那台服务器,不属于 DSH:服务器换了版本,工具名或行为可能变—— 这也是「名字是纯函数」这件事值得单独讲的原因。
  • 想找服务器,别在本站翻:去 官方合集(快照 2026-10-02,约 9.09 万 star)。 本站只收「桥接机制 + 值得单独讲的接法」。

信息表

auth
stdio 走 env(如 GITHUB_TOKEN),HTTP 走 headers.Authorization。给服务器什么 token,模型就能用它做什么——按最小必要给。
category
capability.mcp
docs
https://modelcontextprotocol.io/
install
在 profile 的 cordis.yml 里加一个 @deepseek-ai/dsh-mcp-client 实例:stdio 填 command/args/env/cwd,HTTP 填 url/headers。改完 HMR 自动断开重连,不必重启进程。
provides
把一台 MCP 服务器的全部工具注册成模型的原生工具,命名空间是 mcp__<serverName>__、两种传输:stdio(spawn 本机进程)与 streamable-http(连 HTTP 服务)、断线自动重连(默认开启,退避上限 30s),单次工具调用超时可控
repo
deepseek-ai/deepseek-harness
risk
network、credentials
titleEn
MCP client bridge
transport
both
updatedAt
2026-10-02

标签:工具接入、桥接、外部工具、MCP