跳到主内容

dsh-mcp-panel

29Star4Fork0Issue0Watching

给 DSH 官方 MCP 客户端加一个只读管理面板:/mcp 命令看服务器状态与健康诊断,Settings 里通过追加式配置文件片段增删改 MCP 服务器,并能试跑 mcp__* 工具。

机审证据5/5方法论数据来源安装命令持续维护DSH 版本风险扫描
机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科
语言
TypeScript
License
Apache-2.0
分支
main
cordisdeepseekdeepseek-harnessdshdsh-pluginmanagementmcpmcp-client

安装

命令web profile
$ dsh plugin --profile web add dsh-mcp-panel

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

对话式安装

帮我安装 DeepSeek Harness 插件 PerryLink/dsh-mcp-panel:先查看仓库 https://github.com/PerryLink/dsh-mcp-panel 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

给 DSH 官方 MCP 客户端叠加一层管理面板:在 /mcp 命令和 Settings → Plugins → MCP 标签里查看每个 MCP 服务器的连接状态、工具清单、错误诊断,支持以追加方式生成服务器增删改片段、并能试跑任意 mcp__* 工具,全程只读或审批通过后落盘。

核心能力

  • /mcp 命令:列出每个 MCP 服务器一行——传输方式、目标、工具数、连接状态、最近一次错误、重连次数;输出是模型可读 + 会话日志可回放,支持英 / 中 / 西 / 葡 / 印地五种语言。
  • /mcp <server> tools | health | call | disable | enable | probe 子命令:列出模型可见工具名、按错误模式给出修复建议、通过官方工具流水线试跑一次、生成启停片段、发起后台探针。
  • Settings → Plugins → MCP 标签:服务器增删改表单(stdio / streamable-http 两种形态),工具试跑控制台,连接状态卡片 + 健康诊断 + 探针结果,全部走 mcpPanel 远程通道拉数据。
  • 追加式配置写入:表单提交后渲染成 insert / set / set disabled: true 片段并加入 cordis.patch.yml 末尾;写入前自动备份当前文件,按 backupCount 保留最新若干份,可一键复制到剪贴板或经审批落盘。
  • Streamable HTTP 与 stdio 探针:在控制台或 /mcp <server> probe 触发后台任务,stdio 行通过 node:child_process.spawn 启动配置的 command/args 完成一次 MCP initialize 握手,结果只回控制台、不会进模型上下文。
  • 诚实状态呈现:观测不到的字段一律显示 unknown / -1 / — 并标记 statusSource: 'derived';从不伪造连接状态,不注入 prompt 片段,配置里的 header 值永远不出现在快照里。
  • 展示前脱敏:URL query 凭据、userinfo 密码、header 值、Bearer token、JWT 在显示前一律替换成 ***;stdio 探针用与官方桥相同的 scrubbedParentEnv 基础环境,DSH_* 与凭据形状的环境变量不会隐式注入子进程。

技术实现

  • 语言: TypeScript(ESM,type: module),浏览器端使用 React + 内置 Typert Remote
  • 关键依赖: @deepseek-ai/cordis(宿主框架)、@deepseek-ai/dsh-typert-protocol(host ↔ client 双向远程通道)、@deepseek-ai/dsh-subprocess(stdio 探针的凭据过滤环境)、zod v4(wire codec 校验)+ @deepseek-ai/schemastery(loader 配置 schema)
  • 架构模式: 双面 Cordis 函数插件,host 端 src/index.ts 通过 apply(ctx, config) 挂 McpPanelService(Typert Remote 服务,命名空间 mcpPanel)+ /mcp 命令 + 可选 mcp_probe 工具 + 后台任务控制器;client 端 src/client/index.ts 通过 ctx.remote.$mount(MCP_PANEL_REMOTE) 注册远程调用客户端,再向 settings.plugins.tab 槽位注入 MCP 标签
  • 入口文件: host 端 src/index.ts(插件导出 + 挂载),client 端 src/client/index.ts(浏览器挂载);wire 词表与 invocation descriptor 由 src/wire.ts 单源提供,host manifest src/typert.host.ts 与 client src/client/remote.ts 共享

适用场景

你已经在用官方 MCP 客户端连了不少外部服务,每次排查"为什么这个工具今天不响应"都要去翻日志;装上之后直接看 Settings 标签或跑 /mcp <server> health,状态、重连次数、错误模式一目了然;想临时增删服务器也可以走表单而不是手改 YAML,改错了自动有备份可回滚。

前置依赖与兼容性

依赖最低版本说明
DeepSeek Harness0.1.0-rc.8四个 dsh-* peerDependencies 范围 >=0.1.0-rc.8 <0.2.0,dshWorkshop.compatibility.dshVersions 仅列出 0.1.0-rc.8
Node.js^22.19.0 || >=24.0.0package.json#engines.node 声明
Cordis^4.0.1peerDependencies
Cordis Loader^1.0.2peerDependencies
Schemastery^3.18.0peerDependencies
平台跨平台host 端纯 JS;stdio 探针仅用 node:child_process.spawn;浏览器标签仅在 web profile 注册
原生模块无无 os/cpu 限制,无 node-gyp/node-pty 等原生依赖

安装方式

dsh plugin --profile web add github:PerryLink/dsh-mcp-panel

配置项

配置类型说明默认值
probeEnabledboolean是否注册 mcp_probe 后台任务工具;关闭后只剩面板内部探针按钮可用true
probeTimeoutMsnumber每次探针的超时时间(毫秒)10000
maxProbesnumber面板保留展示的最近探针记录条数10
refreshIntervalMsnumber面板建议刷新间隔(毫秒),0 表示按需刷新0
outputLanguageen | zh | es | pt | hi/mcp 命令的输出语言(不影响浏览器面板)en
passiveProbeEnabledboolean是否对 streamable-http 服务器做周期性被动探针false
passiveProbeIntervalMsnumber被动探针周期(毫秒)60000
trialEnabledboolean工具试跑控制台总开关(关闭后 Settings 标签和 /mcp call 都不能试跑)true
trialTimeoutMsnumber单次试跑面板侧超时(毫秒)120000
trialMaxResultCharsnumber试跑结果 JSON 投影的最大字符数,超出会截断并标记60000
writeEnabledboolean配置写入总开关;关闭后所有写请求都被拒绝,但片段仍可复制到剪贴板true
backupCountnumber每次写之前保留的 cordis.patch.yml 时间戳备份数量5

常见问题

Q: 这个插件和我手写的 cordis.yml 有什么关系?

A: 不冲突。官方 MCP 客户端是"桥"(每台服务器在 cordis.yml / cordis.patch.yml 里写一行),这个插件是"控制台",只读取桥的状态、要写也只是追加新片段并自动备份,不会动你已写好的行。

Q: 它会改动我现有的 MCP 服务器配置吗?

A: 不会。任何写入都是追加到 cordis.patch.yml 的尾部、并且先复制原文件到带时间戳的备份;卸载或回滚时只需删掉追加的那块,配置保持原状。

Q: 我能让它完全只读吗?

A: 可以。把配置项 writeEnabled 设为 false,所有写入请求都会被拒绝(但仍然可以在控制台生成片段并复制到剪贴板,手动粘贴)。

Q: /mcp 显示的连接状态为什么有时是 unknown?

A: 因为官方 MCP 客户端目前没有把连接状态外发为可观察事件,控制台无法猜测——这是诚实默认值,只有上游真的发来状态事件后才会变成 connecting / connected / waiting / exhausted / disposed 之一。

Q: 在 Settings 里试跑工具会绕过审批吗?

A: 不会。试跑走的就是官方 ctx.tools.execute() 流水线,权限策略、审批请求、护栏全部照常生效;如果当前会话有打开的回合,审批会路由到 Web 的审批通道。

Q: 探针(probe)会不会暴露我的 API Key?

A: 不会。stdio 探针在子进程里只完成一次 MCP initialize 握手,不会发送你的密钥;任何 URL、错误文本、JWT、Bearer token 在显示前都会被 sanitize.ts 模块统一替换成 ***;你配置的 header 值根本不会出现在快照里。

Q: /mcp 输出为什么有五种语言?Web 面板怎么只有两种?

A: /mcp 命令有独立的 outputLanguage 配置(en/zh/es/pt/hi),方便命令行和会话日志消费;浏览器面板的语言跟随应用 UI 语言(en/zh),两者是两套词库。

Q: 怎么彻底卸载?

A: 从 cordis.patch.yml 删掉 mcp-panel 行(Web 配置热加载,无需重启),从 node_modules 移除 dsh-mcp-panel 包,再用 dsh --dump-config 确认没有 mcp-panel 行残留。

上手难度

入门 — 仅一行安装命令,控制台开箱即用、命令不需要额外学习;如果想关掉写入或调探针阈值,配置项也都是 Schemastery schema,所有边界都在加载时校验失败直接报错。

已知问题与限制

  • Resources 和 Prompts 当前不可用:官方 MCP 客户端目前只桥接 Tools;控制台会显示这两项"pending upstream support",直到上游暴露 mcpCatalog 服务(提案见 docs/upstream-proposal.md)。
  • 进程退出码和 stderr 尾部缺失:stdio 探针目前只能给出握手是否成功 / 服务端名称版本;子进程的 exitCode 和 stderrTail 是向上游提议的字段,等上游真的发来后控制台才会填入。
  • 未观测字段保持 unknown:连接状态、重连次数、最近错误时间戳在没收到上游事件之前一律显示 unknown / -1 / — 并标记 statusSource: 'derived'——控制台从不据工具注册表反推连接状态,避免误报"还活着"。
  • writeEnabled: false 会拦截所有写:包括任何审批流程也无法落盘,但仍然能渲染片段用于手动复制粘贴。

查看使用指南 →

该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/PerryLink/dsh-mcp-panel)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录