dsh-mcp-bar
Verifieddsh-mcp-bar · v0.1.0 · MIT · Web UI
DeepSeek Harness MCP 管理插件:侧边栏完整的服务器管理面板。表单 / JSON 添加,启停、编辑、删除、连接测试与工具查看,配置持久化并接管 profile 中的原生 mcp-client 条目。
Install
dsh plugin add dsh-mcp-bar Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
MCP Bar
DeepSeek Harness 的 MCP 管理插件。它在侧边栏提供一个完整的管理面板:新建、启停、改配置、删条目、测连接、看工具,都不需要再改 cordis.patch.yml 或翻日志。对话页不注入任何常驻 UI。
MCP Bar 是独立插件,不依赖 dsh-mcp-connector。两者同时管理同名 Server 会重复注册工具,装了这个就可以卸掉那个。
能力
- 服务器列表:合并展示 MCP Bar 自己管理的 Server 和 profile 中已有的原生
mcp-client条目,带状态圆点、传输方式、地址 / 命令、工具数。支持搜索、启停、编辑、删除。 - 新建:表单和 JSON 两种方式。表单覆盖名称、类型(stdio / Streamable HTTP)、超时、协议、命令与参数、URL 与请求头、环境变量、工作目录。JSON 兼容
{"mcpServers": {...}}、裸 map、单条对象和数组,以及 Claude / Cursor 风格的command + args、url、disabled、toolCallTimeoutMs字段。 - 连接测试:走
initialize→notifications/initialized→tools/list,支持 stdio(换行帧 / Content-Length 帧)与 Streamable HTTP(含 SSE 响应、分页、会话清理)。失败时区分协议、鉴权、HTTP、超时、网络与进程启动错误。 - 工具查看:列出一个 Server 暴露的工具、描述和输入 schema。
- 持久化:记录保存在 DSH 的 storage domain
mcp_bar。启动时根据记录重建动态mcp-client条目,重启后自动恢复。具体文件见配置落在哪些文件。 - 原生条目接管:profile 里已有的
mcp-client条目可以直接接管,之后能在面板里编辑和启停;删除接管记录会恢复原条目。配置中含非字面量表达式时拒绝接管,避免把宿主代码写进存储。
安装
要求 DeepSeek Harness 0.2.x 与 Node.js 20+。
# 方式一:从 npm 安装(发布后)
dsh plugin --profile <profile> add dsh-mcp-bar
# 方式二:从本地目录安装(clone 后无需执行 npm install:
# 运行期用到的 zod 会回退到宿主 @deepseek-ai/dsh-storage-domain 自带的版本)
dsh plugin --profile <profile> add /path/to/dsh-mcp-bar
# 或者直接编辑 profile 的 package.json,把 dsh-mcp-bar 加进 bundles
插件声明了 dsh.bundle.patch,安装后插件自带的 cordis.patch.yml 会作为 bundle patch 参与 profile 组合。装完重启 DSH,侧边栏会多一个「MCP 服务器」入口。
使用
从侧边栏「MCP 服务器」打开面板:
- 新建 → 选「表单」或「JSON」。stdio 填命令与参数,HTTP 填 URL 与请求头;保存前可以先点「测试连接」确认能拿到工具。
- 列表里可以「停用 / 启用」。「停用」会把对应的动态条目标记为 disabled,工具从当前会话消失,但配置保留。
- 编辑保存后会自动重建条目并重新连接;如果目标暂时连不上,配置仍然保存,状态显示为异常,稍后可以重试。
- profile 中的原生 Server 会以「profile 配置」分组出现,可以一键接管到 MCP Bar 管理。接管前它们只提供「接管 / 测试 / 详情」,因为插件不改写
cordis.patch.yml;接管成为 MCP Bar 记录后,启停、编辑、删除才可用。
配置落在哪些文件
Server 配置本身只落一个文件;运行状态和动态 loader 条目不写盘。
| 内容 | 位置 |
|---|---|
| MCP Server 记录 | ~/.dsh/storages/mcp_bar.json(设置了 DSH_HOME 时为 $DSH_HOME/storages/mcp_bar.json) |
动态 mcp-bar-<key> 条目 |
不落盘。插件启动时按存储记录重建 |
profile 中的原生 mcp-client 条目 |
profile 的 cordis.patch.yml,插件不修改;接管与停用只影响运行时 |
| 插件安装状态 | profile 的 package.json、pnpm-lock.yaml 与 node_modules/ |
mcp_bar.json 是 DSH storage-json 的 single 单元文件,结构如下:
{
"unit": { "name": "mcp_bar", "version": 1 },
"global": null,
"tables": {
"servers": {
"s60d4b11350b5": {
"key": "s60d4b11350b5",
"serverName": "e2e_echo",
"transport": "stdio",
"command": "node",
"args": ["server.mjs"],
"env": {},
"headers": {},
"timeoutMs": 60000,
"enabled": true,
"nativeEntryId": null,
"createdAt": 1792939997451,
"updatedAt": 1792939997451
}
}
}
}
几点约定:
- 文件在第一次保存 Server 时创建;每次新增、编辑、启停或删除都会原子重写整份单元文件。
env与headers会以明文保存。运行期错误和连接状态只存在内存里,不进入这个文件。- 动态条目只存在于运行时。插件启动时会先停用被接管的原生条目,再从记录重建;因此不要把这些条目手写进
cordis.patch.yml。 - 接管原生条目时,
nativeEntryId记录来源;原来的 YAML 不会被改写,插件只在每次启动时于运行时停用它。删除接管记录会恢复原条目。 - 安装插件会修改
~/.dsh/profiles/<profile>/package.json(增加依赖并加入dsh.profile.bundles),并更新该 profile 的pnpm-lock.yaml与node_modules/。插件自己的cordis.patch.yml作为 bundle patch 参与组合;要改entryPrefix或probeTimeoutMs,在 profile 的cordis.patch.yml中覆盖。
数据与安全
- 配置只包含用户填写的内容(含 env / headers 凭据),不包含运行状态;运行期错误只存在内存里。
- 浏览器半区与宿主半区通过同源
POST /mcp-bar/api通信。方法名走白名单,请求需要同时满足:回环 Host(localhost/127.0.0.1/::1等)、非Sec-Fetch-Site: cross-site、Origin与Host同源。请求体上限 1 MiB。 - stdio 探测会以当前用户权限启动配置中的命令。只添加你信任的 Server。
开发
npm install
npm run check # 语法检查 + 单元测试
npm run dev:ui # 静态 UI harness(React + mock API),不需要启动 DSH
目录结构:
lib/index.js 宿主半区:插件入口、状态聚合、API 实现
lib/record.js 表单 / JSON / 原生配置 → 存储记录的规范化
lib/args.js 命令参数解析与格式化
lib/json-import.js JSON 导入
lib/provision.js 动态 mcp-client 条目的增删改与原生条目接管
lib/probe.js stdio / Streamable HTTP 连接探测
lib/store.js storage domain(mcp_bar / servers)
lib/web.js 同源 HTTP API 与信任 fence
lib/client.js 浏览器半区:面板、表单
scripts/ UI harness 与验收脚本
test/ node:test 单元测试
浏览器半区没有构建步骤:lib/client.js 是包在 window.__ModuleLoader__.load(...) 里的 CommonJS 工厂,直接用 require("react") 和 React.createElement。改完刷新页面即可。
发布
维护者发布到 npm(包名 dsh-mcp-bar):
- 按 semver 更新
package.json的version并提交。 npm login登录维护者账号;账号开了 2FA 时准备一次性验证码。npm publish。prepublishOnly会先自动跑npm run check;files白名单保证只发布lib/、cordis.patch.yml、README 与 LICENSE。npm view dsh-mcp-bar version确认已生效。
发错的版本 72 小时内可 npm unpublish dsh-mcp-bar@<version> 撤回,之后只能 npm deprecate。
已知限制
- 只支持
stdio与 Streamable HTTP。旧版的sse配置在导入时会提示并按 Streamable HTTP 保存。 - 原生条目接管只处理字面量配置;含 Cordis 表达式的条目会提示手动新建。
- 动态 loader 条目不会写进 profile,而是插件启动时按存储记录重建。因此不要把 MCP Bar 创建的条目再手写进
cordis.patch.yml,否则会造成重复。 - 协议版本展示的是探测结果;实际工具调用协议由
dsh-mcp-client决定。
License
MIT