Skip to content

dsh-mcp-manager

Verified

@jiuling/dsh-mcp-manager · v1.0.3 · MIT · Web UI

MCP 服务器管理器:在 DSH Web GUI 的设置界面中可视化新增 / 编辑 / 删除 / 启停 @deepseek-ai/dsh-mcp-client 配置行,直接读写当前 profile 的 cordis.patch.yml。1.0.3 起适配 DSH 0.2.1(官方删除 webRuntime 服务,信任校验改用 connection.requestRejection)。

Install

dsh plugin add @jiuling/dsh-mcp-manager

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Tags

Readme

dsh-mcp-manager

在 DSH Web GUI 的设置界面里可视化地管理 MCP 服务器——新增、编辑、删除、启用/停用—— 不需要手动编辑 cordis.patch.yml。

写入目标是当前 profile 的 cordis.patch.yml,并且以「最小改动」为原则: 只重写被改动的那一行 loader entry,文件里的注释与 !!js 表达式原样保留。

功能

能力 说明
服务器列表 读取当前 profile 中所有 @deepseek-ai/dsh-mcp-client 配置行
新增 支持 stdio 与 streamable-http 两种传输方式
编辑 修改名称、命令/参数/环境变量,或 url/请求头
删除 连带删除该行自己的注释说明块(会二次确认)
启用 / 停用 写入 disabled: true,保留全部配置,便于随时恢复
自动备份 每次写入前生成 cordis.patch.yml.bak-mcp-manager-<时间戳>
原子写入 先写临时文件再 rename,读方不会看到半截文件

保存后由 DSH 自己的热加载机制生效(dsh.profile.patchReload: "live" 会监听这个文件)。 页面上另有「重启 DSH」按钮作为兜底。

界面位置

设置 → 左侧「MCP 服务器」。

侧栏图标由本插件自己绘制:shell 的 navIcon(id) 是一张只认官方 id 的硬编码映射表, 且 slot 注册参数没有 icon 字段,未注册的 id 一律回退成通用齿轮。本插件给导航项打上 data-mcp-nav 标记,用 currentColor mask 画自己的 mark(跟随主题明暗)。

安装

方式一:手动部署(推荐,可离线)

  1. 构建:

    cd dsh-mcp-manager
    npm install
    npm run build        # 生成 lib/index.js 与 lib/client.js
    npm test             # 39 个测试(21 个纯函数 + 18 个宿主 API 集成)
    
  2. 复制到当前 profile 的 node_modules:

    $dst = "$env:USERPROFILE\.dsh\profiles\web\node_modules\dsh-mcp-manager"
    New-Item -ItemType Directory -Force $dst | Out-Null
    Copy-Item package.json, cordis.patch.yml, README.md $dst
    Copy-Item -Recurse lib $dst
    
  3. 在 ~/.dsh/profiles/web/cordis.patch.yml 末尾追加:

    - insert:
        - id: dsh-mcp-manager
          name: 'dsh-mcp-manager'
    
  4. 重启一次 DSH(首次挂载需要重启;之后的配置变更都是热加载):

    dsh web
    

方式二:dsh plugin 命令

dsh plugin --profile web add ./dsh-mcp-manager

依赖说明

插件自身只依赖 yaml。安装到 profile 后,Node 会沿着 profiles/web/node_modules/dsh-mcp-manager/lib/ 逐级向上查找, 最终命中 DSH 全局安装里的 node_modules/yaml,因此无需额外安装。

react 不打包进产物:浏览器侧通过 window.__ModuleLoader__.load 的模块表复用宿主页面里的 React。

配置字段

字段 必填 说明
serverName 是 [A-Za-z0-9_-]{1,32},全局唯一。工具会注册为 mcp__<serverName>__<工具名>
transport 是 stdio 或 streamable-http
command stdio 可执行文件,如 python、node、npx
args stdio 参数数组,不经过 shell 解析
env stdio(可选) 环境变量键值对
url http MCP 端点地址,须以 http:// 或 https:// 开头
headers http(可选) 请求头键值对,常用于 Authorization
enabled 否 默认 true;关闭时写入 disabled: true
failOnStartupError 否 为真时,连接失败会阻止插件激活

设置命名空间

插件注册的设置命名空间是 dsh-mcp-manager,符合 ^[a-z][a-z0-9-]*$,不使用 mcp.servers 这类带点号的格式。

命名空间内提供一个可选字段:

字段 说明
profile 手动指定 profile 名称;留空则自动识别

关于 profile 自动识别

DSH 没有暴露「当前 profile 目录」的服务,所以插件按以下顺序探测, 并对每个候选都做一次真实的 YAML 解析校验:

  1. 设置命名空间里的 profile 覆盖值;
  2. 从插件自身安装路径向上查找最近的 cordis.patch.yml(插件被装进 profile 时,这就是那个 profile);
  3. 启动参数中的 --profile <name>(dsh web 等价于 --profile web);
  4. 扫描 $DSH_HOME/profiles/*,找挂载了本插件的层。

全部失败时页面会给出中文提示,并可通过设置里的 profile 字段手动指定。

已知边界

  • 只管理 @deepseek-ai/dsh-mcp-client 的行;其他插件行不会被读取或改写。
  • 不使用整份文档重新序列化的方式写入(那会吃掉注释),因此不要手工把同一行拆成 YAML 多行 flow 写法——行内的 - id: 与 config: 结构需保持常规块状缩进。
  • 若同一 profile 下有两处同名 serverName,写入前的校验会拒绝保存并提示。
  • 变更生效依赖热加载;若 DSH 未开启 patchReload,需点「重启 DSH」或手动重启。

开发

npm run build      # tsc(宿主)+ tsc 类型检查(客户端)+ esbuild 打包浏览器产物
npm test           # node --test
npm run typecheck  # 只做类型检查

源码布局:

src/index.ts              宿主侧:profile 探测、文件读写、/dsh-mcp-manager/api/* 路由
src/patch-editor.ts       纯函数:按字节区间编辑 cordis.patch.yml
src/client/index.ts       浏览器侧入口:注册 settings.section 页面
src/client/navGlyph.ts    侧栏图标:打标记 + 注入 currentColor mask 样式
src/client/SettingsPage.tsx  页面组件
tools/build-client.mjs    把客户端 TS 打包成 window.__ModuleLoader__.load 形态
                          (PLUGIN_ID / OUT 环境变量可构建其它包名变体)
tests/patch-editor.test.mjs  21 个纯函数测试(含真实 profile 文件的字节级往返)
tests/api.test.mjs           18 个宿主 API 集成测试(真实 HTTP + 临时 profile)

lib/client.js 是生成物,不要手改:改 src/client/* 后重新构建。

构建产物里的 loader id 必须等于实际安装的包名。本包发布名是 @jiuling/dsh-mcp-manager; 若某个 profile 挂的是无 scope 的 dsh-mcp-manager,用环境变量构建该变体:

$env:PLUGIN_ID="dsh-mcp-manager"; $env:OUT="<profile>\node_modules\dsh-mcp-manager\lib\client.js"
node tools/build-client.mjs

许可

MIT