第一章 先把 MCP 接进 dsh
本章导读
技能(skill)给 agent 方法论,MCP 给 agent 能力。前者是指令包,后者是真能调用的工具。
DeepSeek Harness 通过 @deepseek-ai/dsh-mcp-client 接入 MCP:它解析 Cordis overlay、启动 stdio 子进程或连接 Streamable HTTP URL、发现工具,并以 mcp__<serverName>__<tool> 的形式把工具暴露给模型。
本章不推荐具体服务器,先把接入机制讲透。这套机制值得认真学,因为官方明确划了一条职责边界——很多“接入失败”其实是边界外的期待落空。
DSH 负责什么,不负责什么
这是官方原文划定的边界,请务必记住:
| DSH 负责 | DSH 不负责 |
|---|---|
| 解析选中的 Cordis overlay | 下载服务器 |
| 启动已配置的 stdio 命令 | 初始化其数据库 |
| 连接已配置的 Streamable HTTP URL | 选择模型或 embedding 提供方 |
| 发现 MCP 工具 | 创建云端账户 |
以 mcp__<serverName>__<tool> 公开工具 |
迁移提供方数据 |
| stdio 下随插件生命周期启停子进程 | 监管独立的 HTTP 服务 |
两条高频踩坑正出自这张表:
其一,“装好了但工具不出现” —— 因为你没有先安装上游服务器。DSH 只负责启动命令,不负责 npm install。
其二,“远程服务器连不上” —— 因为上游 HTTP 服务必须已经运行。DSH 不会替你把服务拉起来。
配置长什么样
所有 MCP 配置都是同一形状:一份 Cordis overlay YAML,里面一个 insert patch。官方示例的骨架:
- insert:
- id: memory-my-server
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: my-memory
transport: stdio
command: my-memory-mcp
args: []
env: {}
cwd: !!js process.cwd()
四个必填项:id(本配置内唯一)、serverName(决定工具名前缀)、transport(stdio 或 streamable-http)、以及对应传输的命令或 URL。
一个安全设计值得单独讲
stdio 桥接器在启动子进程前,会主动移除环境中名称通常表示凭据的变量和所有 DSH_* 变量;其余环境变量仍继承。
这意味着两件事:
- 你的
AWS_SECRET_ACCESS_KEY之类的变量不会漏给第三方服务器,这是保护。 - 如果某个服务器确实需要某个密钥,必须显式写进配置项的
config.env,不能指望环境继承。
官方还特别叮嘱:不要把密钥直接写进 YAML。实务做法是用 !!js 表达式从环境读取,像官方示例那样:
env:
MEMORY_FILE_PATH: !!js >-
process.env.MEMORY_FILE_PATH?.trim() || process.getBuiltinModule('node:path').join(process.getBuiltinModule('node:os').homedir(), '.dsh-mcp-reference-memory.jsonl')
本章小节
- 1.1 MCP 与 dsh-mcp-client:工具怎么进来
- 1.2 第一份配置:stdio 传输
- 1.3 远程服务器:streamable-http
- 1.4 持久化、密钥与验证排错
