dsh-mcp-status:在聊天顶栏查看 MCP 服务器是否「此刻可用」

前言

DeepSeek Harness(DSH)在启动时连接配置里的 MCP 服务器。某个服务挂掉时,症状往往不直观:模型工具列表里少了某个工具,或调用时出现传输错误。配置文件只能说明「应当连上谁」,不能说明「现在谁真的在应答」。

用端口探测判断「在线」也不够:TCP 端口开着但从未完成 MCP 握手,对 Harness 来说仍等于不可用。下面介绍社区插件 dsh-mcp-status(维护者 lobichshev-ops,MIT 许可,Node ≥ 20),它在会话顶栏增加 MCP 状态按钮,用与 Harness 相同的握手逻辑回答:当前能否完成 initialize + tools/list,各服务器暴露多少工具。

这是什么

dsh-mcp-status 是 DSH 客户端侧插件:在聊天头部 conversation.session.header.utilities 区域(与语言、Markdown 等控件同一行)放置 MCP 按钮。点开弹层可查看各 MCP 服务器的名称、端点、状态、响应时间和工具数量;并可选展示从各 1C:EDT 项目 .mcp.json 发现的 EDT 服务块。结果有缓存,打开面板即可读上次探测数据;完整探测约需 15 秒量级。

仓库:lobichshev-ops/dsh-mcp-status
目录页:SkillHub 插件页

核心功能

元素 位置 作用
状态圆点 聊天顶栏 全部应答为绿点;有不可用项为红点
服务器列表 弹层内 名称、endpoint、state、响应时间、工具数
EDT 块 弹层内 当前通过项目 .mcp.json 发现的在服 EDT MCP
刷新 弹层标题栏 强制重新探测;时间戳在新结果落地后更新

主机侧在启动时及默认每 5 分钟调用 Python 脚本 scripts/mcp_status.py(仅标准库)做探测,结果写入缓存文件并由 GET /plugin/mcp-status 提供;浏览器侧约每 20 秒拉取该路由,探测进行中(refreshing: true)时改为约 1.5 秒轮询。

探测对每个已配置服务器做真实 MCP 握手,而非端口检查:

  1. POST initialize(Accept: application/json, text/event-stream),必要时跟随 /mcp 到 /mcp/ 的 307。
  2. 记录 Mcp-Session-Id 并发送 notifications/initialized(部分 FastMCP 服务缺少此步会在 tools/list 报错)。
  3. POST tools/list,解析 JSON 或 SSE data: 块。
  4. 对 stdio 传输:按配置 spawn 子进程,经 stdin/stdout 交换换行分隔的 JSON-RPC,各阶段有独立超时。

状态含义(资料原文):

state 含义
ok 握手成功,tools 为服务器返回数量
warn initialize 成功但 tools/list 失败
dead 拒绝连接、超时、HTTP 错误或非 MCP 响应
off 配置行 disabled: true
skipped 未探测(例如 EDT 项目无 URL)

可选配置写在 loader 行的 config 中(均可省略):

键 默认 含义
pythonPath DSH 运行时 Python 探测脚本解释器
scriptPath 包内 scripts/mcp_status.py 自定义探测脚本路径
intervalMs 300000(5 分钟) 后台刷新周期,最小 15 秒

示例:

- insert:
    - id: mcp-status
      name: '@local/dsh-mcp-status'
      config:
        intervalMs: 60000

手动刷新:GET /plugin/mcp-status?refresh=1 会在后台启动探测并立即返回旧缓存且 refreshing: true,直至新结果写入。

安装与启用

包自带 dsh.bundle.patch,会向 profile 插入 loader 行。官方 README 步骤如下。

  1. 在 profile 目录用 link 方式安装本地包(路径改为你本机克隆或解压后的绝对路径):
cd ~\.dsh\profiles\desktop
pnpm add "link:<absolute path to this package>"
  1. 在 ~/.dsh/profiles/desktop/package.json 的 bundle 列表中加入插件名:
"dsh": {
  "profile": {
    "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "@local/dsh-mcp-status"]
  }
}
  1. 重启 DSH。主机侧随 profile 加载并注册路由;客户端通过 window.__ModuleLoader__ 注入顶栏按钮。

当前 package 版本为 0.1.0,包名 @local/dsh-mcp-status。

典型用法

日常使用:打开任意会话,看顶栏 MCP 按钮旁圆点颜色;点击打开列表,确认各服务器 state 与 tools 是否符合预期。某工具突然从模型侧消失时,先在此面板区分是 dead / warn 还是配置里被注释(响应 JSON 中 commentedOut 字段会列出被注释的服务器 id)。

需要即时结果时,在弹层点刷新;UI 会在 refreshing 期间加快轮询,新 fetchedAt 出现即表示缓存已更新。

开发与排错时可直接请求 API(需 DSH Web 已运行且插件已加载):

GET /plugin/mcp-status
GET /plugin/mcp-status?refresh=1

返回体包含 ok、fetchedAt、durationMs、refreshing、error 及 data.servers 等字段,格式见仓库 README「Wire format」一节。

README 另提到可单独运行 scripts/mcp_status.py 做 standalone probe(细节见仓库「Standalone probe」),适合在不启动完整 UI 时验证握手逻辑。

适用场景与注意

适合:本地或团队维护多路 MCP(HTTP 与 stdio 混合)、依赖 EDT 项目内 MCP、需要区分「配置写了」与「此刻能 list tools」的 DSH 用户。

限制(资料原文要点):完整探测耗时可达约 15 秒;stdio 路由类服务在 tools/list 阶段可能更久;探测以 当前 DSH 进程权限与环境 运行,与你在终端手动测 MCP 的路径、网络、沙箱可能不一致。

安装前请自行阅读 GitHub 源码 与 MIT 许可证。插件来自社区目录 SkillHub,与 DeepSeek / 幻方无官方从属关系;DSH 生态主张「一切皆插件」,是否启用由你自行评估。

结尾

dsh-mcp-status 把 MCP 连通性从「间接猜」变成顶栏一键可见:握手级探测、工具数量、缓存与手动刷新,与 Harness 实际加载工具的条件对齐。

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

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

小夜