dsh-mcp-manager:在 DSH 内管理多台 MCP 服务器与 OAuth 续期

前言

在 DeepSeek Harness(DSH)里接 MCP,常见做法是使用官方的 @deepseek-ai/dsh-mcp-client:每个实例只连一台服务器,清单要手写进 cordis.patch.yml,鉴权多半是静态 headers,不做 OAuth;token 过期后也不会自动续期,连接可能一直带着失效令牌,直到某次调用返回 401。

如果你需要在同一 profile 里维护多台 MCP、用 OAuth 2.1 授权受保护的 streamable-http 端点,并在到期前或 401 之后自动换证重连,社区插件 nekojackie/dsh-mcp-manager 把「清单编排、授权、续期、工具浏览」收进设置页和一组 agent 工具。它不重新实现 MCP 协议,而是编排真正的 mcp-client 子插件,被管理的服务器在 Harness 里仍是普通的 mcp__* 工具。项目标注由 DeepSeek V4.1 Flash 生成,上线前建议自行审阅源码与「安全说明」。

这是什么

dsh-mcp-manager(设置里显示为 MCP Server Manager,插件行 id mcp-manager)由维护者 nekojackie 发布,在 SkillHub 上归类为 admin-security。当前 GitHub 星标为 0;package.json 版本为 0.3.2,许可证 MIT,要求 Node >=20;开发与验证环境 README 写明为 DSH 0.2.1-rc.2、Node 24。

一句话:在 DSH 内完成 MCP 服务器全生命周期——添加 / 启用 / 停用 / 移除 / 重连,OAuth 2.1 授权,可编辑的定时续期与过期后续期,并在设置页浏览每台服务器暴露的工具及描述。

与官方 mcp-client 的差异

下面三点是 README 里对比官方客户端时强调的能力缺口,也是本插件的定位依据:

  1. 多服务器:一份配置管理多台,而不是每个实例只连一个。
  2. OAuth 2.1:受保护资源发现、元数据、动态客户端注册、授权码 + PKCE、刷新与退出等,token 只进 DSH 凭据库。
  3. 续期策略:默认定时检查(每 5 分钟)、到期前提前续期(默认 10 分钟),以及 401 触发的过期自愈;策略可在 UI 修改。

核心功能

服务器与传输

支持 stdio(command / args / env / cwd)与 streamable-http(url / headers)。卡片上可看到名称、传输方式、命令或 URL、状态(connected / no-tools / disabled / error / connecting)、工具数,以及启用、刷新、重连、编辑、移除等操作。

工具浏览

展开某台服务器可列出全部工具:对外公共名形如 mcp__<服务器>__<工具>,附带工具描述与入参名;页面与 agent 均可查询。

OAuth 2.1

面向在 /.well-known/oauth-protected-resource 声明授权服务器与 required_scopes 的 HTTP MCP。流程包括 RFC 9728 发现、RFC 8414/OIDC 元数据、RFC 7591 动态注册、授权码 + PKCE S256、一次性 state、RFC 8707 resource、刷新、粘贴令牌兜底、退出授权。回调地址为 http://127.0.0.1:<DSH 端口>/api/dsh-mcp-manager/oauth/callback。

自动续期与失败退避

  • 定时:按 refreshIntervalMs 检查,在 refreshLeadMs 窗口内续期并重连。
  • 已过期:仍有 refresh_token 时下一轮必续。
  • 401 自愈:mcp__* 调用被判未授权时立即续期重连(每台 30s 内最多一次,最多 3 次,30/60/120s 退避)。
  • 续期失败时按 30s → 60s → 120s 退避,上限为检查间隔,避免每轮都打授权服务器。

给 Agent 的六个工具

工具 作用
mcp_manager_list 列出受管服务器:传输、地址、状态、工具数、启动错误
mcp_manager_add 新增或同名覆盖一台服务器(含 oauth)
mcp_manager_remove 移除服务器及配置
mcp_manager_set_enabled 启用或停用(保留配置)
mcp_manager_tools 列出已注册 MCP 工具,可按服务器过滤
mcp_manager_oauth status / authorize / paste-token / refresh / refresh-all / signout

OAuth token 仅写入 DSH 凭据库 ~/.dsh/.credentials.yaml(键如 mcp-manager/<slug>),不进配置、不进日志、不进页面明文展示。

安装与启用

README 给出两种方式。方式 1 是一条命令序列(需本地已有仓库目录,例如先克隆到本机路径):

git clone https://github.com/nekojackie/dsh-mcp-manager.git
dsh plugin --profile <profile> add /path/to/dsh-mcp-manager
dsh <profile>

说明:

  • <profile> 对应 ~/.dsh/profiles/<名字>,桌面版一般为 desktop。
  • dsh plugin add 会在 profile 里装包,并把 bundle 写入 dsh.profile.bundles;mcp-manager 配置由 bundle 自带 patch 插入,不必手写 YAML。
  • 若 dsh 不在 PATH,可使用应用目录下 resources/runtime/cli/bin/dsh(Windows 为 dsh.cmd)。

装完后在 设置 → 插件 中应看到 MCP Server Manager(id mcp-manager,状态 active),并与「全部」页签并列出现 MCP 服务器 页签。

方式 2 是把 README 中的安装说明整段发给 DSH 助手,由助手克隆、执行 dsh plugin add、重启并核对页签;若 dsh 不可用,可改用 plugin_manager 的 install_bundle,target 指向插件目录。

典型用法

设置界面

路径:设置 → 插件 → MCP 服务器。

  1. 在卡片上添加或编辑服务器,选择 stdio 或 streamable-http 并填好命令或 URL。
  2. 需要 OAuth 时编辑服务器,勾选使用 OAuth 授权并保存;在卡片上点 授权(浏览器),在浏览器完成同意后回跳,插件换取 token 并重连,工具数会随之更新。
  3. 在 自动续期设置 中调整检查间隔、提前续期秒数、是否「过期后仍自动续期」,保存或恢复默认。

授权成功后卡片状态会自行推进:已授权 → 正在连接 → 工具数量,一般无需手点刷新。

直接改插件 config

清单与续期策略保存在插件行 mcp-manager 的 config 中,例如:

- id: mcp-manager
  name: dsh-mcp-manager
  config:
    refreshIntervalMs: 300000      # 检查周期,0 = 关闭,默认 5 分钟
    refreshLeadMs: 600000          # 提前多久续期,默认 10 分钟
    refreshOnExpiry: true          # 过期后仍自动续期(默认开)
    servers:
      - name: demo
        enabled: true
        transport: stdio
        command: npx
        args: ['-y', '@modelcontextprotocol/server-everything']
        env: {}
        cwd: ''
        toolCallTimeoutMs: 60000
        failOnStartupError: false
      - name: docs
        enabled: true
        transport: streamable-http
        url: http://127.0.0.1:3000/mcp
        headers: {}
        oauth:
          enabled: true
          scopes: []
          clientId: ''

服务器 name 须匹配 ^[A-Za-z0-9_-]{1,32}$,并作为工具前缀。OAuth 相关字段还包括 clientSecret、resourceMetadataUrl、authorizationServer 等,详见 README。

OAuth 授权步骤(HTTP + OAuth)

  1. 编辑服务器,勾选 使用 OAuth 授权,保存。
  2. 点 授权(浏览器);插件完成发现、动态注册与 PKCE,打开授权链接。
  3. 同意后回跳到本机 DSH 的 OAuth 回调路由。
  4. 插件将 token 写入凭据库并重连,工具列表可用。

已有 access token 时可用 粘贴令牌 兜底;也可 刷新令牌、全部续期 或 退出授权(删除本地授权并断开)。授权链接 10 分钟有效,state 一次性;重复打开需重新点授权。

用 Agent 工具巡检

安装并重启后,可让助手调用 mcp_manager_list 核对当前受管服务器清单,或用 mcp_manager_tools 按服务器查看 mcp__* 公共名与描述,避免在对话里手工拼清单。

适用场景与注意

适合谁:在同一 DSH profile 里维护多台 MCP(本地 stdio 与远程 HTTP)、依赖 OAuth 的 MCP 网关,或希望 token 过期前有策略、401 后能自愈重连的开发者与运维向用户。

权限与安全:插件以当前 DSH 进程权限运行;OAuth 与桥接逻辑在 Host 侧执行,页面通过仅回环的 POST /api/dsh-mcp-manager/* 与 Host 通信。clientSecret、headers、env 会留在 profile patch 中,共享机器宜优先用凭据中心环境变量。安装前请阅读仓库 安全说明 与源码;README 明确这是 AI 生成项目,生产使用前需自行审查。

已知限制(摘自 README):

  • OAuth 仅支持授权码 + PKCE;需授权服务器支持动态客户端注册,否则要在表单填 clientId。不支持 client_credentials、设备码等。
  • 401 自愈依赖错误信息能识别为鉴权问题;若服务端只返回自定义错误,可能只能等定时续期。
  • 修改清单或续期策略会重载插件,所有服务器会重连一次;单台重连用卡片上的「重连」。
  • 停用的服务器不续期;续期成功会重连该服务器,约有半秒重连窗口。

SkillHub 等社区目录与 DeepSeek / 幻方无官方从属关系,插件来自社区维护者,不属于 DSH 内置组件。

结尾

dsh-mcp-manager 把多台 MCP 的编排、OAuth 2.1、可编辑续期策略和工具浏览放进 DSH 设置与 mcp_manager_* 工具,在沿用官方 mcp-client 子插件的前提下补齐多实例与令牌生命周期管理。

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

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

小夜