第一章 先把 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_* 变量;其余环境变量仍继承。

这意味着两件事:

  1. 你的 AWS_SECRET_ACCESS_KEY 之类的变量不会漏给第三方服务器,这是保护。
  2. 如果某个服务器确实需要某个密钥,必须显式写进配置项的 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 持久化、密钥与验证排错

延伸阅读