🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

MCP 服务管理 yangfch3/dsh-mcp-mgr

DeepSeek Harness
yangfch34 天前有提交已提供中文文档扫描:含敏感能力

✅ 最新的 0.3.x 版本已在 dsh@0.2.1 版本通过兼容性测试

40/100
综合分
6
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yangfch3/dsh-mcp-mgr
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · market
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 4 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-mcp-mgr-workspace(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.19.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 02:20:54

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 56 处,展示前 56 条)
  • 删除本地文件递归
    e2e/apply-remove-settle.mjs:29
    rmSync(workspace, { recursive: true, force: true })
  • 写入本地文件
    e2e/apply-remove-settle.mjs:30
    mkdirSync(join(workspace, '.dsh', 'dshmm'), { recursive: true })
  • 删除本地文件递归
    e2e/apply-remove-settle.mjs:75
    rmSync(workspace, { recursive: true, force: true })
  • 写入本地文件
    e2e/e2e.mjs:26
    mkdirSync(dirname(mcpJson), { recursive: true })
  • 写入本地文件
    e2e/e2e.mjs:28
    writeFileSync(mcpJson, JSON.stringify({
  • 写入本地文件
    e2e/e2e.mjs:58
    writeFileSync(mcpJson, JSON.stringify({
  • 删除本地文件递归
    e2e/e2e.mjs:71
    rmSync(workspace, { recursive: true, force: true })
  • 删除本地文件递归
    e2e/repro-dup.mjs:22
    rmSync(workspace, { recursive: true, force: true })
  • 写入本地文件
    e2e/repro-dup.mjs:23
    mkdirSync(join(workspace, '.dsh', 'dshmm'), { recursive: true })
  • 写入本地文件
    e2e/repro-dup.mjs:38
    writeFileSync(mcpJson, JSON.stringify({ mcpServers: { unity: { type: 'stdio', command: process.execPath, args: [serverScript] } } }))
  • 删除本地文件递归
    e2e/repro-dup.mjs:67
    rmSync(workspace, { recursive: true, force: true })
  • 删除本地文件递归
    e2e/repro-realtools.mjs:19
    rmSync(workspace, { recursive: true, force: true })
  • 写入本地文件
    e2e/repro-realtools.mjs:20
    mkdirSync(join(workspace, '.dsh', 'dshmm'), { recursive: true })
  • 写入本地文件
    e2e/repro-realtools.mjs:24
    writeFileSync(mcpJson, JSON.stringify({
  • 删除本地文件递归
    e2e/repro-realtools.mjs:42
    rmSync(workspace, { recursive: true, force: true })
  • 删除本地文件递归
    e2e/repro-scope.mjs:21
    rmSync(workspace, { recursive: true, force: true })
  • 写入本地文件
    e2e/repro-scope.mjs:22
    mkdirSync(join(workspace, '.dsh', 'dshmm'), { recursive: true })
  • 写入本地文件
    e2e/repro-scope.mjs:26
    writeFileSync(mcpJson, JSON.stringify({
  • 删除本地文件递归
    e2e/repro-scope.mjs:49
    rmSync(workspace, { recursive: true, force: true })
  • 删除本地文件递归
    e2e/repro-scope2.mjs:21
    rmSync(workspace, { recursive: true, force: true })
  • 写入本地文件
    e2e/repro-scope2.mjs:22
    mkdirSync(join(workspace, '.dsh', 'dshmm'), { recursive: true })
  • 写入本地文件
    e2e/repro-scope2.mjs:26
    writeFileSync(mcpJson, JSON.stringify({
  • 删除本地文件递归
    e2e/repro-scope2.mjs:50
    rmSync(workspace, { recursive: true, force: true })
  • 删除本地文件递归
    e2e/repro-unity.mjs:19
    rmSync(workspace, { recursive: true, force: true })
  • 写入本地文件
    e2e/repro-unity.mjs:20
    mkdirSync(join(workspace, '.dsh', 'dshmm'), { recursive: true })
  • 写入本地文件
    e2e/repro-unity.mjs:23
    writeFileSync(mcpJson, JSON.stringify({
  • 删除本地文件递归
    e2e/repro-unity.mjs:46
    rmSync(workspace, { recursive: true, force: true })
  • 写入本地文件
    gen.mjs:14
    mkdirSync(output, { recursive: true })
  • 写入本地文件
    gen.mjs:15
    writeFileSync(join(output, `typert.${artifact.face}.js`), artifact.js)
  • 写入本地文件
    gen.mjs:16
    writeFileSync(join(output, `typert.${artifact.face}.d.ts`), artifact.dts)
  • 写入本地文件
    gen.mjs:18
    writeFileSync(join(output, 'typert.remote-client.js'), artifact.remote.js)
  • 写入本地文件
    gen.mjs:19
    writeFileSync(join(output, 'typert.remote-client.d.ts'), artifact.remote.dts)
  • 写入本地文件
    gen.mjs:20
    writeFileSync(join(output, 'typert.remote-client.d.ts.map'), artifact.remote.dtsMap)
  • 读取本地文件
    packages/dsh-mcp-mgr/src/discovery.ts:51
    return existsSync(mcpJsonPath(workspacePath))
  • 读取本地文件
    packages/dsh-mcp-mgr/src/index.ts:209
    document = JSON.parse(readFileSync(path, 'utf8')) as { mcpServers?: Record<string, unknown> }
  • 读取本地文件
    packages/dsh-mcp-mgr/src/index.ts:265
    const document = JSON.parse(readFileSync(path, 'utf8')) as { mcpServers?: Record<string, unknown> }
  • 读取本地文件
    packages/dsh-mcp-mgr/src/index.ts:306
    const document = JSON.parse(readFileSync(path, 'utf8')) as { mcpServers?: Record<string, unknown> }
  • 读取本地文件
    packages/dsh-mcp-mgr/src/index.ts:445
    const parsed = parseMcpJson(readFileSync(path, 'utf8'), workspacePath)
  • 写入本地文件
    packages/dsh-mcp-mgr/src/index.ts:463
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    packages/dsh-mcp-mgr/src/index.ts:466
    writeFileSync(tmp, `${JSON.stringify(document, null, 2)}\n`, { encoding: 'utf8', mode: 0o600, flag: 'wx' })
  • 写入本地文件
    packages/dsh-mcp-mgr/src/index.ts:467
    chmodSync(tmp, 0o600)
  • 写入本地文件
    packages/dsh-mcp-mgr/src/index.ts:468
    renameSync(tmp, path)
  • 删除本地文件
    packages/dsh-mcp-mgr/src/index.ts:470
    rmSync(tmp, { force: true })
  • 读取本地文件
    packages/dsh-mcp-mgr/src/profile.ts:115
    profileNames = readdirSync(profilesDir, { withFileTypes: true })
  • 读取本地文件
    packages/dsh-mcp-mgr/src/profile.ts:123
    if (!existsSync(patchFile)) continue
  • 读取本地文件
    packages/dsh-mcp-mgr/src/profile.ts:125
    if (idPattern.test(readFileSync(patchFile, 'utf8'))) return patchFile
  • 读取本地文件
    packages/dsh-mcp-mgr/src/version.ts:54
    const pkg = JSON.parse(readFileSync(new URL(relative, import.meta.url), 'utf8')) as { version?: unknown }
  • 发起网络请求
    packages/dsh-mcp-mgr/src/version.ts:71
    const response = await fetch(
  • 读取本地文件
    packages/tsdown.client.ts:226
    const source = await readFile(fileId)
  • 读取本地文件
    packages/tsdown.client.ts:267
    if (existsSync(emitted)) return emitted
  • 读取密钥环境变量
    verify.mjs:36
    process.env.MCP_TEST_TOKEN = 'tok-123'
  • 读取密钥环境变量
    verify.mjs:50
    delete process.env.MCP_TEST_TOKEN
  • 删除本地文件递归
    verify.mjs:147
    rmSync(tmpProfiles, { recursive: true, force: true })
  • 写入本地文件
    verify.mjs:148
    mkdirSync(join(tmpProfiles, 'web'), { recursive: true })
  • 写入本地文件
    verify.mjs:149
    writeFileSync(join(tmpProfiles, 'web', 'cordis.patch.yml'), '- insert:\n - id: mcp-deepwiki\n name: "@deepseek-ai/dsh-mcp-client"\n confi
  • 删除本地文件递归
    verify.mjs:179
    rmSync(tmpProfiles, { recursive: true, force: true })
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-api-workspace-controller@deepseek-ai/dsh-attachment@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-store@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-settings-plugins
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

1 张 · 点击查看大图

功能亮点

  • 按工作区读取配置
  • 热同步MCP服务
  • 网页设置界面

为 DeepSeek Harness 管理 MCP 服务:发现工作区 mcp.json、热同步,还有网页设置界面。

README

由 DeepSeek 最新模型翻译生成
dsh-mcp-mgr ✅ 最新的 0.3.x 版本已在 dsh@0.2.1 版本通过兼容性测试 npx @deepseek-ai/dsh@0.2.1-rc.5 plugin --profile web add dsh-mcp-mgr@latest dsh 的工作区级 MCP 管理器:从每个工作区的 .dsh/dshmm/mcp.json 读取 MCP server,动态注册工具,并在 Web 设置页提供管理界面。 MCP 服务列表 选择使用方式 | 使用者 | 入口 | 是否需要源码仓库 | | 普通用户 | npm 包 + npx @deepseek-ai/dsh | 不需要 deepseek-harness 或本插件源码 | | 源码开发者 | deepseek-harness source + 本仓库 source | 见源码开发者指南 | 普通用户:使用 npm 包 安装并启动 npx @deepseek-ai/dsh plugin --profile web add dsh-mcp-mgr@latest npx @deepseek-ai/dsh web 更新时重复执行安装命令即可: npx @deepseek-ai/dsh plugin --profile web add dsh-mcp-mgr@latest 卸载:
展开完整文档(README 剩余 1 节)
dsh-mcp-mgr

✅ 最新的 0.3.x 版本已在 dsh@0.2.1 版本通过兼容性测试

npx @deepseek-ai/dsh@0.2.1-rc.5 plugin --profile web add dsh-mcp-mgr@latest

dsh 的工作区级 MCP 管理器:从每个工作区的 .dsh/dshmm/mcp.json 读取 MCP server,动态注册工具,并在 Web 设置页提供管理界面。

MCP 服务列表

选择使用方式

| 使用者 | 入口 | 是否需要源码仓库 |
| 普通用户 | npm 包 + npx @deepseek-ai/dsh | 不需要 deepseek-harness 或本插件源码 |
| 源码开发者 | deepseek-harness source + 本仓库 source | 见源码开发者指南 |

普通用户:使用 npm 包

安装并启动

npx @deepseek-ai/dsh plugin --profile web add dsh-mcp-mgr@latest
npx @deepseek-ai/dsh web

更新时重复执行安装命令即可:

npx @deepseek-ai/dsh plugin --profile web add dsh-mcp-mgr@latest

卸载:

npx @deepseek-ai/dsh plugin --profile web remove dsh-mcp-mgr

工作区配置

在工作区根目录创建 .dsh/dshmm/mcp.json:

{
"mcpServers": {
"my-http-server": {
"type": "http",
"url": "http://127.0.0.1:8090/mcp"
},
"my-stdio-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "<mcp-server-package>"]
}
}
}

规则:

- 缺省 type 按 Streamable HTTP 处理;支持 ${VAR} 环境变量展开。
- stdio server 未指定 cwd 时使用工作区根目录。
- serverName 全局唯一,重复名称会显示冲突。
- 设置 "enabled": false 可禁用条目但不删除;缺省为启用。

行为与限制

- 工作区工具使用 mcp__<serverName>__<tool> 命名。
- 设置页的严格模式用于只挂载当前选中工作区的 server。

源码开发者

需要同时修改 deepseek-harness 和本插件源码时,参阅源码开发者指南。两个仓库可以位于任意目录,不要求同级或固定路径。

设计说明见 Doc/requirements.md。
预览分享卡片长什么样 ↓yangfch3/dsh-mcp-mgr
分享 · DeepSeek Harness Hub
yangfch3/dsh-mcp-mgr

✅ 最新的 0.3.x 版本已在 dsh@0.2.1 版本通过兼容性测试

这是你的仓库?认领条目

回到顶部