deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
HuanLinOTO/dsh-plugin-mcp-manager
MCP 服务器管理面板:GUI 增删改 MCP 服务器配置(写入 cordis.patch.yml + HMR 实时挂载)+ 工具浏览 + agent 面 mcp_* 管理工具 | MCP server management panel: GUI add/edit/delete MCP server configs (writes cordis.patch.yml + HMR hot-mount) + tool browsing + agent-side mcp_* management tools
PROJECT TOPICS
PROJECT README
DSH MCP 服务器管理插件 — GUI 增删改 MCP 服务器配置 + 工具浏览 + agent 面
mcp_*管理工具。
服务器连接管理 + 工具浏览。连接生命周期完全委托官方 @deepseek-ai/dsh-mcp-client——
本插件是注册表的「写配置层」+「状态/工具浏览层」,不自己拉连接。
GUI(Plugins 页「dsh-mcp-manager」行配置卡片) ──HTTP──> /api/mcp-manager ──读写──> profile cordis.patch.yml
Agent 面 mcp_* 工具 ─────────────────────────────┘ (mcp-client insert 行)
│ 配置 HMR 实时挂载
▼
官方 mcp-client 实例(连接+注册工具)
GUI 状态/工具浏览 <──ctx.tools.schemas() 过滤 mcp__──┘
每台 MCP 服务器 = profile cordis.patch.yml 中一条 name: '@deepseek-ai/dsh-mcp-client' 的
insert 行。配置 HMR 实时挂载/卸载/热替换,无需重启 web。
禁用 ≠ 删除:禁用写入 entry-level disabled: true(与 id/name/config 同级),
loader 跳过挂载该 mcp-client 实例 → 工具不注册(模型不可见),config 原样保留在 patch
文件中。重新启用只需移除该字段,loader HMR 重新挂载。适合「暂时不让模型用某台服务器」
而不丢失配置。
pnpm install
@deepseek-ai/* peer deps 从公共 npm registry 解析(已发布)。yaml(eemeli)是唯一运行时依赖。
pnpm typecheck # tsc --noEmit(src/ + tests/ 全量;client 包类型经 paths 直指 dsh checkout 的 lib/types)
pnpm test # vitest run(registry + locales + row-key 单元测试)
pnpm build # tsdown 双 bundle:lib/index.mjs(Node half)+ lib/index.js(client half)
| 文件 | 职责 |
|---|---|
src/registry.ts |
服务器注册表:eemeli yaml Document API 读写 insert 行 + loadOverlayPatches 校验 + serverName 唯一 + entry-level disabled 字段 |
src/tools.ts |
agent 面 mcp_* ×5 工具(defineTool,规范 JSON 输出) |
src/index.ts |
Node half:/api/mcp-manager 路由 + ctx.tools.schemas() 过滤 + mcp 工具注册 |
src/client/index.ts |
client half:plugins.row.config 注册 Plugins 页「dsh-mcp-manager」行配置卡片(key @huanlin/dsh-plugin-mcp-manager#dsh-mcp-manager,由 row-key.ts 常量派生) |
src/client/row-key.ts |
行配置 key 常量:包名 # 行 id 三方一致性(cordis.patch.yml 行 id / package.json 包名 / ROW_KEY),tests/row-key.spec.ts 守卫 |
src/client/Panel.tsx |
卡片 UI:summary 一行简介 + page 完整面板(服务器列表 + 增删改表单(内联卡片下方)+ 禁用/启用 + 工具浏览) |
存储 = profile cordis.patch.yml 的 mcp-client insert 行(单一事实来源):
- insert:
- id: mcp-github # 行 id(mcp-<serverName>)
name: '@deepseek-ai/dsh-mcp-client'
disabled: true # 可选 entry-level 字段:loader 跳过挂载,工具不注册,config 保留
config:
serverName: github # 工具命名空间 mcp__github__*
transport: stdio # stdio | streamable-http
command: npx
args: ['-y', '@modelcontextprotocol/server-github']
env: { GITHUB_TOKEN: '' } # 明文(见下「Secret 处理」)
toolCallTimeoutMs: 60000
failOnStartupError: false
stdio(command/args/env/cwd)与 streamable-http(url/headers)。disabled: true(与 id/name/config 同级,不在 config 内)。
loader 跳过挂载 → 工具不注册 → 模型不可见;启用 = 移除该字段。loadOverlayPatches(app-boot)校验;写后失败自动回滚。!!js 表达式与注释(eemeli Document API 往返保留)。# 本地开发(link: 热更新——改源码后 pnpm build 即可见)
dsh plugin --profile web add "link:<本仓库路径>"
# 远端(预构建 lib/ 入库,无 prepare,开箱即用)
dsh plugin --profile web add "github:dsh-external/dsh-mcp-manager"
安装后重启 dsh web(bundle 层在 boot 时加载),浏览器硬刷新(Ctrl+Shift+R)。
@huanlin/dsh-plugin-mcp-manager → dsh-mcp-manager 行 →
「配置」打开完整面板(行详情页的描述回退显示 summary 一行简介)。mcp__* 工具列表(禁用状态下不可展开)。mcp_server_list / mcp_server_add / mcp_server_update /
mcp_server_remove / mcp_server_set_enabled。| 路由 | 方法 | 说明 |
|---|---|---|
/api/mcp-manager/servers |
GET | 列出服务器 + 工具数 + 状态 + disabled |
/api/mcp-manager/servers |
POST | 新增(body: {config})→ HMR 挂载 |
/api/mcp-manager/servers/<id> |
PUT | 编辑(整块替换 config) |
/api/mcp-manager/servers/<id> |
PATCH | 禁用/启用(body: {disabled: boolean};config 保留) |
/api/mcp-manager/servers/<id> |
DELETE | 删除 |
/api/mcp-manager/tools |
GET | 工具浏览(mcp__ 前缀按 serverName 分组) |
/api/mcp-manager/status |
GET | 运行态状态(含 disabled) |
⚠ P0:env / headers 以明文存入 profile cordis.patch.yml(与官方示例同形态)。
README 明确警示:勿放长期密钥;部署隔离。P1 可接 @deepseek-ai/dsh-credentials(待设计)。
package.json 声明 dsh.bundle.patchcordis.patch.yml(insert 行 id/name 齐全)name 用包名 @huanlin/dsh-plugin-mcp-managerfiles 含 lib/ + cordis.patch.ymlpeerDependencies 含 @deepseek-ai/cordis + @deepseek-ai/*(dsh-tools / dsh-llm / dsh-app-boot / dsh-client-ui-primitives / dsh-client-ui-slots / dsh-client-ui-plugin-manager(type-only,plugins.row.config 契约)/ dsh-client-ui-renderer / dsh-client-locale,对齐 v0.1.7-rc.1)validateServerConfig(fail loud,携带字段名)含 @deepseek-ai/* private peer deps → 采用预构建 lib/ 入库策略:
lib/ 不进 .gitignore,无 prepare 脚本。github: 安装开箱即用(pnpm 在 git install 的
prepare 阶段拉不到 private 包,故不能用 prepare 策略)。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。