image
image

我已经把 DSH 里 MCP 相关的实现和本机配置都查清楚了(dsh-mcp-client 插件、profile 结构、凭据机制、当前 settings.yaml)。下面是完整答案。

一、DSH 与 MCP 的关系

DSH(DeepSeek Harness)本身是 MCP 客户端:内置桥接插件 @deepseek-ai/dsh-mcp-client(已随 @deepseek-ai/dsh 安装在 /root/.dsh/profiles/node_modules/,不需要额外安装)。你只需要:

  1. 准备一个 MCP 服务器(现成的,或自己用官方 SDK 写一个);
  2. 在 web profile 的配置里声明它,DSH 就会连上去、把服务器上的工具注册给模型,工具名形如 mcp__<serverName>__<工具名>(和 Claude Code / Codex 的命名一致)。

二、接入现成 MCP 服务器(两步)

第 1 步:编辑 /root/.dsh/profiles/web/cordis.patch.yml(这是用户覆盖层,不要动自动生成的 cordis.yml),追加一个 insert 列表。两种传输方式任选:

- insert:
    # 方式一:stdio —— spawn 一个子进程(如官方 GitHub 服务器)
    - id: mcp-github
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: github          # 命名空间,[A-Za-z0-9_-]{1,32},须唯一
        transport: stdio
        command: npx
        args: ['-y', '@modelcontextprotocol/server-github']
        env:
          GITHUB_TOKEN: !!js process.env.GITHUB_TOKEN

    # 方式二:streamable-http —— 连接一个 HTTP MCP 端点
    - id: mcp-myserver
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: myserver
        transport: streamable-http
        url: http://127.0.0.1:3001/mcp
        headers:
          Authorization: !!js '`Bearer ${process.env.MCP_TOKEN}`'

第 2 步:保存即可生效。web 应用开着 HMR,配置改动会触发断开→重连→重新发现工具,无需重启进程。模型立刻就能调用 mcp__github__create_issue 这类工具。

常用配置项:

字段传输说明
transport两者stdio 或 streamable-http
serverName两者工具命名空间,存活实例中唯一
command / args / env / cwdstdio子进程启动方式(env 覆盖在净化后的环境之上)
url / headershttp端点与认证头
toolCallTimeoutMs两者单次工具调用超时,默认 60000
failOnStartupError两者初始连接失败是否拒绝激活,默认 false(仅记日志)
reconnect.*两者自动重连策略(默认开启,指数退避)

三、自己写一个 MCP 服务器再接入

用官方 SDK 写个最简 stdio 服务器(TypeScript):

// my-server.ts
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';

const server = new McpServer({ name: 'demo', version: '1.0.0' });
server.tool('echo', { text: z.string() }, async ({ text }) => ({
  content: [{ type: 'text', text }],
}));
await server.connect(new StdioServerTransport());

然后同样在 cordis.patch.yml 里注册:

    - id: mcp-demo
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: demo
        transport: stdio
        command: node
        args: ['/root/plex/my-server.js']

HTTP 版则把 StdioServerTransport 换成 StreamableHTTPServerTransport 挂到任意 Web 框架上,DSH 用 transport: streamable-http + url 接入。注意 DSH 只桥接 MCP 的 tools 能力(resources/prompts 暂未消费)。

四、b.ai 的 API key 能用吗?

能用,而且本部署默认就是走 b.ai。 当前 /root/.dsh/settings.yaml 里已经是:

llm-deepseek:
  baseURL: https://api.b.ai/v1
agent-default-model:
  provider: deepseek-official
  model: deepseek-v4-flash

即 deepseek-official 这个路由(dsh-llm-deepseek 适配器)请求的就是 api.b.ai/v1(OpenAI 兼容路径,我实测 /v1/models 返回 401 待鉴权,端点真实可达)。存 key 有三种方式,优先级从高到低:

  1. Web 界面:设置 → 模型(Models)→ DeepSeek 那一行 → 填 API 密钥。密钥经 credentials.set 只写存入 ~/.dsh/.credentials.yaml(0600 权限,永不回显),立即生效,不用重启;
  2. 环境变量:启动时 DEEPSEEK_API_KEY=sk-… dsh(启动环境层始终优先且只读,适合 CI/容器);
  3. 手写凭据文件:~/.dsh/.credentials.yaml,格式就是一个 mapping,如 DEEPSEEK_API_KEY: sk-…。

两点提醒:

  • 默认凭据引用是 DEEPSEEK_API_KEY;如果你在 Models 页输入,页面会自动派生并保存这个引用;
  • MCP 与 LLM key 是两回事:b.ai 的 key 只供 deepseek-official 这条 LLM 路由使用。你写的 MCP 服务器如果要自己调 b.ai(或其他)API,需要在它自己的 env 里单独配置(如 env: { BAI_API_KEY: '…' }),互不干扰。

如果你告诉我具体想接哪个 MCP 服务器(比如 GitHub、Playwright、某个自建服务),或想让我直接帮你写一个示例 MCP 服务器并把配置写进 cordis.patch.yml,我可以直接动手改好。


沙盒能完成的任务类型

1. 代码开发与调试

  • 写、改、重构代码(支持多语言,通过文件编辑 + shell 执行)
  • 跑测试、构建项目、修 bug、代码审查
  • 示例:给你写一个 Python/Node 脚本,直接在沙盒里运行验证结果

2. 数据处理与分析

  • 写脚本处理 CSV / JSON / 日志文件、批量转换格式、批量重命名
  • 数据清洗、统计计算、生成图表(matplotlib 等可安装)

3. 网络与信息获取

  • 实时联网搜索(web_search 工具,带来源链接)
  • 用 curl 抓取网页、调用 API、下载文件
  • 示例:抓取某个网站的数据存成结构化文件

4. 多代理并行协作(特色能力)

  • 子代理:把独立任务(比如"分析 A 文件""写 B 模块的测试")并行委派给多个子代理同时干,效率翻倍
  • 工作流:大规模编排,几十个子代理分阶段并行处理(比如批量审计一堆文件、多角度调研)
  • 长周期目标:一个目标可以跨多轮自动持续推进,中途断点续做

5. 环境运维类

  • 安装依赖(npm install、python3 -m pip——注意没有 pip3 命令,但可用模块方式)
  • git 克隆/提交、后台长任务运行(如长时间运行的服务器、爬虫)

6. 与 Web GUI 集成

  • 当前 DSH 管理界面跑在 http://127.0.0.1:3080,可以开发/修改前端界面和插件

限制说明

  • 文件沙盒:默认只能写 /root/plex;需要写工作区外(如 /etc、/usr)时,命令会被拒绝,我可申请临时提升权限(workspace-write 或 danger-full-access),需你批准
  • 资源有限:2 核 / 1.9GB 内存,不适合跑重型训练、大型构建(比如编译 Chromium)
  • 无持久 shell 状态:每条命令都是全新 shell,环境变量和 cwd 不保留,需显式传入
  • 无浏览器自动化:不能帮你操作真实浏览器页面(没有 playwright/selenium 类工具)
  • 系统级操作:默认无 root 系统管理权限,装系统包(apt)需要提权审批

简单说:凡是"写代码、跑脚本、处理数据、上网查信息、并行委派子代理"这类工作,沙盒都能做;


附注(Ray): 过程比较详细,应该可以避免不少幻觉/胡说吧
image