dsh-mcp-autoload:按项目自动挂载 MCP 服务器

前言

在 DSH 里用 MCP 扩展智能体能力时,常见做法是在 Profile 里写死一批服务器。多仓库、多项目并行时,Profile 里的全局配置容易和当前工作目录对不上:要么工具过多、要么缺项目专用的 MCP。维护者 micln 的 dsh-mcp-autoload 把 MCP 声明收进项目根目录下的清单文件,每个 Agent 会话按当前项目自动挂载,会话结束即断开,其它项目的声明不会泄漏进当前会话。

这是什么

dsh-mcp-autoload 是 DeepSeek Harness(DSH)的 Web 侧插件(npm 包名 dsh-mcp-autoload,当前资料版本 0.4.0,MIT 许可证)。它会在项目根(向上查找最近带有 .git 标记的祖先目录)读取 .agents/mcp.json,在创建 Agent 时并行挂载其中启用的 MCP 服务器,并在 Web UI 中展示本会话可用的 MCP 清单;Profile 里已配置的用户级 MCP 仅展示,不能通过本插件的弹层改写。

核心功能

  • 项目级发现:默认配置文件路径为 .agents/mcp.json,可通过插件 patch 中的 configPath、projectRootMarkers 调整(默认根标记为 .git)。
  • 会话级作用域:服务器挂在 Agent 的 Cordis 作用域内,工具名形如 mcp__<serverName>__<rawToolName>;连接在 Agent 销毁时关闭。不同项目、不同会话可独立使用同名 server。
  • 启动时挂载:在 Agent 创建阶段等待首次连接,首回合即可用工具;多服务器并行连接,单个失败只记日志并跳过,不阻塞其余(failOnStartupError 为 false)。
  • 传输方式:有 url 时用 Streamable HTTP;否则用 command 启动 stdio 子进程,工作目录为会话 cwd。支持 type: stdio | http;sse 会被拒绝并打日志。disabled: true 或 enabled: false 的条目静默跳过。
  • 会话内开关:Web 弹层可在浏览器确认后启用/禁用项目清单中的条目;清单会加锁、备份(保留最新五份)并原子替换;禁用后立即卸载工具;重新启用若挂载失败会回滚清单。清单每个会话开始时读一次(含 resume),手动改文件需新开会话才生效。
  • 安全提示:清单中的 command 会在会话启动时执行,与信任 npm postinstall 同级;只应在可信项目中添加并审查该文件。

安装与启用

环境要求:DSH >=0.2.1-0 <0.3.0,Node.js ^22.19.0 || >=24.0.0。dsh plugin 会把参数转发到 profile 目录内的 pnpm。

安装到 web profile:

dsh plugin --profile web add dsh-mcp-autoload

包声明了 dsh.bundle.patch,CLI 会把 bundle 注册进 profile 的 dsh.profile.bundles。安装后需重启 dsh web(宿主端在启动时加载),再在浏览器中硬刷新(Cmd/Ctrl+Shift+R)。

本地开发时用绝对路径以 link: 形式添加:

dsh plugin --profile web add /absolute/path/to/dsh-mcp-autoload

更新与卸载:

dsh plugin --profile web add dsh-mcp-autoload@latest
dsh plugin --profile web remove dsh-mcp-autoload

典型用法

在项目根(含 .git 的目录)创建 .agents/mcp.json。最小示例:

{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["@playwright/mcp@latest"]
    }
  }
}

stdio 与 HTTP、环境变量、开关字段的完整示例(资料原文):

{
  "mcpServers": {
    "playwright": {
      "type": "stdio",
      "command": "npx",
      "args": ["@playwright/mcp@latest"],
      "env": { "PLAYWRIGHT_BROWSERS_PATH": "~/.cache/ms-playwright" }
    },
    "postgres_local": {
      "type": "http",
      "url": "http://localhost:3000/mcp",
      "headers": { "Authorization": "Bearer local-dev-token" }
    },
    "experimental_server": {
      "enabled": false,
      "command": "uvx",
      "args": ["some-experimental-mcp@latest"]
    },
    "legacy_server": {
      "disabled": true,
      "url": "http://old-mcp.internal/mcp"
    }
  }
}

字段要点:command/args/env 用于 stdio;url/headers 用于 HTTP;args 不经 shell 展开。server 名称需匹配 [A-Za-z0-9_-]{1,32},否则会被规范化为确定性 slug(与 DSH ACP bridge 相同算法)。

插件默认配置(写在 patch 中,一般无需改):

- id: mcp-autoload
  name: dsh-mcp-autoload
  config:
    configPath: .agents/mcp.json
    projectRootMarkers: ['.git']

适用场景与注意

适合需要在仓库内版本化管理 MCP、且希望 DSH Web 会话随 cwd 自动带上对应工具的团队或个人。不适合把不可信第三方仓库里的 .agents/mcp.json 直接交给 DSH 执行——安装插件前请阅读 GitHub 仓库 源码与 MIT 许可证;插件与所启动的 MCP 子进程以当前 DSH 进程权限运行。

Peer 包(@deepseek-ai/cordis、@deepseek-ai/schemastery、@deepseek-ai/dsh-mcp-client 等)由 DSH 安装提供,bundle 仅作版本校验。

结尾

dsh-mcp-autoload 把 MCP 从「全局 Profile 配置」拉回「项目清单 + 会话挂载」,减少跨项目工具泄漏,并在 UI 里做有限的启停管理。目录页:micln/dsh-mcp-autoload;源码与 README:github.com/micln/dsh-mcp-autoload。

羽毛球分组比赛记分
小程序二维码

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

小夜