前言¶
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 握手,而非端口检查:
POST initialize(Accept: application/json, text/event-stream),必要时跟随/mcp到/mcp/的 307。- 记录
Mcp-Session-Id并发送notifications/initialized(部分 FastMCP 服务缺少此步会在tools/list报错)。 POST tools/list,解析 JSON 或 SSEdata:块。- 对
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 步骤如下。
- 在 profile 目录用 link 方式安装本地包(路径改为你本机克隆或解压后的绝对路径):
cd ~\.dsh\profiles\desktop
pnpm add "link:<absolute path to this package>"
- 在
~/.dsh/profiles/desktop/package.json的 bundle 列表中加入插件名:
"dsh": {
"profile": {
"bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "@local/dsh-mcp-status"]
}
}
- 重启 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