dsh-mcp-manager:按工作区独立开关 MCP 与 Skills

前言

在 DeepSeek Harness(DSH)里,MCP 与 Skills 往往按 profile 全局生效:同一份 mcp: 配置会作用到所有工作区和会话。日常开发里这会带来几类具体摩擦——例如 codebase 在两个项目里各自对应不同的 .codebase/codebase.db,全局只能指向其一;注册了多个 MCP 时,当前工作区其实只需要其中一个,其余进程仍占用资源并把工具列表撑大,模型更容易选错工具;~/.claude/skills 下的技能也会在每个会话里出现,而多数工作区只需要其中少数几个。

下面介绍社区插件 dsh-mcp-manager(维护者 gyp8735abc,npm 包 @gyp8735abc/dsh-mcp-manager,MIT 许可证)。它把开关粒度下沉到工作区:每一行工作区左侧多一个插头图标,点开弹窗即可分别启用或关闭该工作区下的项目 MCP、全局 MCP、手动 MCP 以及各类 Skills,且互不牵连。

这是什么

dsh-mcp-manager 是面向 DSH Web 客户端的插件(分类:客户端)。一句话定位:Per-workspace MCP and skill switches for DeepSeek Harness — one popup per workspace row。

它不修改 DSH 核心安装目录,安装或卸载只影响 profile 与 $DSH_HOME(默认 ~/.dsh)。界面语言跟随 DSH(英文 / 简体中文)。

与全局配置的差异

DSH 自带的 MCP 配置是 profile 级别的;本插件把可切换对象按来源拆开,并在工作区路径上保存状态:

对象 来源 切换粒度
Global MCP ~/.claude.json 中的 mcpServers 按工作区
Project MCP 工作区内的 .mcp.json 按工作区
Manual MCP profile 里手写的 dsh-mcp-client 行 按工作区
Skills .dsh/skills、.claude/skills、.agents/skills 及用户目录下对应路径 按工作区

在 A 工作区关掉的 MCP,在 B 工作区仍可保持开启。

核心功能

一行工作区一个弹窗

弹窗内按组展示:Project MCP / Global MCP / Manual MCP / Project skills / Global skills。每一行一个开关,并 inline 显示 Enabled/Disabled 以及 MCP 的 Connected/Not connected。空组会隐藏;若该工作区没有任何可配置项,会显示空状态提示。

真正的按工作区隔离与联合挂载

状态键是绝对工作区路径。多个工作区若同时有活跃会话,各自 MCP 以 (工作区, 服务) 为单位独立进程挂载,带各自的配置与 cwd;切换或聚焦会话不会停掉其它工作区的服务;某工作区最后一个会话结束时,该工作区的服务才会卸载。

项目级 MCP 在运行时会带工作区前缀:例如工作区 A 里的 codebase 变为 a__codebase,模型侧工具名为 mcp__a__codebase__search_code 这类形式,同名服务在不同工作区可并存,不会互相覆盖。

会话级工具与技能过滤

当前会话只能看到本工作区的 mcp__<workspace>__* 工具,以及全局/手动 MCP 工具,其它仍在线工作区的工具不会泄漏进来。被关闭的 Skill 会从模型目录和 /name 注入中消失;若直接调用 skill 工具会被拒绝并给出明确原因。

其它已文档化的能力

  • 兼容 Claude Code 技能布局,会扫描项目 .claude/skills 与用户 ~/.claude/skills,包括无 YAML frontmatter 的 SKILL.md。
  • 每次打开弹窗会重新读取工作区列表与各工作区 .mcp.json,新工作区或改过的配置无需重启 DSH 即可反映。
  • 弹窗通过同源 HTTP API 拉取清单与切换状态(例如 GET /api/dsh-mcp-manager/inventory?active=<workspace path>);需要自动化时可查阅仓库 README 中的 API 表。

安装与启用

DSH 没有中心化应用商店;通过「插件市场」添加的是你信任的 index URL,索引内容未经 DSH 签名,安装前请在确认对话框中核对来源为 @gyp8735abc/dsh-mcp-manager。

方式一:插件市场(三步,只需做一次实验性开关)

  1. 打开 Plugins → Experimental plugins,启用 Custom plugin markets(Discover 标签在该 bundle 启用后才存在)。
  2. 在 Discover → Add index source 填入:
https://gyp8735abc.github.io/dsh-mcp-manager/index.json

也可额外添加社区目录 https://cdn.jsdelivr.net/npm/dsh-plugin-catalog/index.json(Awesome DSH Plugin catalog),再搜索 MCP manager、mcp、workspace 或 gyp8735abc 安装。

  1. 打开条目并点击 Install。

方式二:一条命令

适用于已配置 web profile 的环境:

dsh plugin --profile web add @gyp8735abc/dsh-mcp-manager

包内带 dsh.bundle.patch,profile 组合会自动插入插件行,无需手写 cordis.patch.yml。

方式三:从源码目录安装

在已 clone 的仓库根目录执行(资料中的官方写法):

dsh plugin --profile web add .

验证与生效

dsh --profile web --dump-config | grep -A 3 dsh-mcp-manager

输出中出现 id: dsh-mcp-manager 表示已进入组合树。随后重启 dsh web,并在浏览器硬刷新(Ctrl+Shift+R)——客户端 bundle 仅在启动时注入。之后每个工作区行左侧会出现插头图标。

运行环境要求(来自 package.json):dsh 为 >=0.2.0-rc.2 <0.3.0,Node >=22。

典型用法

  1. 在 Web UI 工作区列表中,点击目标行左侧插头图标,打开 MCP & skills 弹窗。
  2. 弹窗顶部会标注当前 Active 工作区路径:
    - 若正是当前聚焦的工作区,切换开关会立即连接或断开 MCP,并注册/卸载工具。
    - 若不是当前活跃工作区,开关只写入状态;该工作区下次有会话时再按状态挂载。
  3. 按需关闭本工作区不需要的全局 MCP 或 Skills,保留项目 .mcp.json 里真正要用的条目。

弹窗布局示意(来自 README):

┌ MCP & skills ───────────────────────────────┐
│ Workspace  D:\ai-workspace   Active          │
│                                              │
│ Project MCP (.mcp.json)                      │
│   ● codebase      stdio   Enabled  Connected │
│   ○ e2e-runner    stdio   Disabled —         │
│                                              │
│ Global MCP (~/.claude.json)                  │
│   ● everything-search  http  Enabled Connected│
│                                              │
│ Manual MCP (profile)                         │
│   ○ codegraph     stdio   Disabled —         │
│                                              │
│ Project skills (this workspace)              │
│   ● officecli  .dsh    Enabled               │
│   ○ probe      .claude Disabled              │
│                                              │
│ Global skills (all workspaces)               │
│   ● diagnose-windows-sandbox-acl  ~/.dsh     │
└──────────────────────────────────────────────┘

状态持久化

开关状态写在 $DSH_HOME/mcp-manager/state.json,例如:

{
  "projects": [
    {
      "path": "D:\\ai-workspace",
      "disabled": ["dsh-mcp-manager__codebase"],
      "disabledSkills": ["office"]
    }
  ]
}
字段 含义
path 工作区绝对路径(身份键)
disabled 在该工作区禁用的 MCP 运行时名;项目 MCP 为 <slug>__<name>,全局/手动 MCP 为 plain name
disabledSkills 在该工作区禁用的 skill 名

首次启动时会一次性从 $DSH_HOME/settings.yaml 里旧的 mcp: 段导入;disabled 同时认 qualified 名与 legacy 的 plain 名(如 codebase)。手改文件后,在重启 DSH 或下次打开弹窗时生效。

适用场景与注意

适合谁: 同一 DSH profile 下并行维护多个代码仓库或工作区,且各工作区需要的 MCP 进程、Skills 集合差异很大;希望减少无关工具进入当前会话、降低误调用概率的开发者。

权限与安全: 插件与当前 dsh 进程同权限运行,MCP 子进程也继承该环境。安装前请阅读 GitHub 仓库 源码与 MIT 许可证;从市场安装时只添加你信任的 index 源,并在安装确认里核对包名。

生态说明: DSH 主张「一切皆插件」;SkillHub 目录页与社区 catalog 是独立索引,与 DeepSeek / 幻方无官方从属关系。

结尾

经过上面的步骤,你可以在不拆 profile、不改 DSH 核心的前提下,把 MCP 与 Skills 的启用范围精确到每一个工作区行。更多细节与 API 说明见项目 README。

  • 目录页:https://www.skillhub.cn/plugins/gyp8735abc/dsh-mcp-manager
  • GitHub:https://github.com/gyp8735abc/dsh-mcp-manager
羽毛球分组比赛记分
小程序二维码

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

小夜