dsh-mcpp:把 MCP 聚合网关搬进 DSH 宿主

前言

在 DSH 里接多个 MCP 上游时,常见做法是在本机单独跑一个聚合网关进程,再在客户端或宿主里填地址和 token。Python 版 mcpp 就是这样的网关:读同一份 config.yaml,把 Streamable HTTP 与 stdio 子进程收成若干 toolset,并按 Claude Code、Cursor、OpenCode 等客户端各自的 naming 暴露端点。进程多一层,配置和鉴权也要多维护一条链路。

dsh-mcpp 把这套网关按 Cordis 插件形态重写在 DSH 宿主侧:对外仍可 drop-in 替代旧服务监听;对 DSH 自己则提供 mcp__<toolset>__<tool> 原生工具、侧栏管理页,以及按 preset 过滤的作用域工具面。下面介绍它做什么、怎么装、日常怎么用。

这是什么

一句话:MCP++ 聚合网关的 DSH 插件版——同一端口与 config.yaml 的 HTTP 网关能力保留,同时在宿主内注册可选中的 mcp__* 工具、提供同源管理 UI,并支持 dsh-mcpp/scoped 为 agent preset 单独挂载工具子集。

旧 Python 服务退场后,监听 127.0.0.1:9020 上 /api/*、/admin 与 /{toolset}/{naming}/mcp 的可以是本插件;现有 Claude Code / Cursor / OpenCode / Codex 等配置(路径、auth.token)原则上无需改动。

对外 HTTP 网关(v0.1)

插件读取与旧服务相同的 YAML 字段:upstreams、expose、server_name、auth、clients。上游 MCP 被聚合成 toolset,每个 toolset 可按多种 naming mode 暴露,例如:

路径 工具公开名模式
/{toolset}/claude/mcp mcp__{toolset}__{tool}
/{toolset}/cursor/mcp mcp_{toolset}_{tool}
/{toolset}/opencode/mcp {toolset}_{tool}
/{toolset}/coder/mcp {toolset}__{tool}
/{toolset}/codex/mcp {toolset}::{tool}
/{toolset}/default/mcp {tool}

还支持工具面改写(as: 改名、hide: true、分组、params 的 map_from / enum / preset 等)、上游密钥池轮转与不健康标记,以及 /api/config、/api/tools、/admin 等管理接口与页面。网关支持 bearer 鉴权(header、?token=、mcpp_token cookie);clients: 可逐 naming 关停端点。

DSH 原生工具面(v0.2)

对 DSH 主 agent,被选中的工具以 mcp__<toolset>__<tool> 注册进 ctx.tools,调用直连上游,不再经第二层 MCP 转发。

  1. 默认全关。启用列表写在 <DSH_HOME>/storages/mcpp/selection.json,形态类似 { "version": 1, "enabled": ["search/searxng_search", …] }。
  2. 在 DSH 设置页 「MCP 工具」 按 toolset 或单工具勾选后保存,差量注册/注销,无需重启。
  3. 侧栏 「MCP 网关」 页签通过 iframe 加载管理页(dsh-better-sidebar 同源集成)。
  4. 其他插件可通过 ctx.mcpp 服务调用:catalog()、call(name, args, signal?)、upstreams()、toolsets();调用不要求该工具已被主 agent 选中。

同源路由走 DSH 宿主 webServer,受浏览器信任围栏保护,不向未授权浏览器暴露网关 token。主要路径包括:

  • GET /plugins/mcpp/admin — 管理页
  • /plugins/mcpp/api/* — 与 9020 同一套 admin handler
  • GET /plugins/mcpp/ui/catalog、POST /plugins/mcpp/ui/selection、POST /plugins/mcpp/ui/sync

同名工具若与其它插件(例如另配的 mcp-client)冲突,仅出现在设置页「注册失败」列表,不影响其它工具注册。

预设作用域工具面(v0.3)

通过包导出子路径 dsh-mcpp/scoped,可在 agent preset 配置里按 tools / toolsets / exclude 过滤,只把选中的 mcp__* 注册进该 preset 自己的 scope(主 agent 看不到)。调用仍复用宿主网关的上游连接,不再走第二道 MCP。

安装与启用

官方说明见仓库 INSTALL.md。README 概括的流程如下(非 dsh plugin add 一类命令,需按 profile 手工接入):

  1. 在插件目录执行构建,得到 lib/(含 client.js)与 static/。
  2. 将 lib/、static/ 以及 cordis.patch.yml 一并拷入目标 profile 的 node_modules/dsh-mcpp(package.json 的 files 必须包含这三类,否则 profile 组合校验会拒绝启动)。
  3. 在该 profile 的 package.json 增加对 dsh-mcpp 的依赖,并配置 dsh.profile.bundles。
  4. 在 cordis.patch.yml 增加按插件 id 的 config 行。
  5. 重启对应 DSH 端。

构建与测试(维护者文档中的示例,路径需按本机调整):

node --test --experimental-strip-types test/*.test.mjs
node ../../node_modules/tsdown/dist/run.mjs --config tsdown.config.mjs --config-loader native

脱离 DSH 仅验证网关时,可用候选端口避免占用 9020:

node --experimental-strip-types scripts/run-standalone.mjs <path-to-config.yaml> 9021

典型用法

外部 MCP 客户端(drop-in)

保持原有 config.yaml 与 auth.token,将客户端指向插件提供的 127.0.0.1:9020(或宿主实际监听地址)及既有 /{toolset}/{naming}/mcp 路径即可。

DSH 内勾选工具

在设置页「MCP 工具」勾选后保存;等价于更新 selection.json 并触发 POST /plugins/mcpp/ui/selection 一类同步。侧栏「MCP 网关」用于查看上游、暴露项与密钥等管理功能。

其它 Cordis 插件调用网关

在插件代码中通过宿主注入的 ctx.mcpp.call(name, args) 调用目录中的任意工具,无需先加入主 agent 的 enabled 列表。

Preset 限定工具集

在 profile 中为子 agent 依赖 dsh-mcpp/scoped,在 preset 配置里声明 tools / toolsets / exclude,仅该 preset 可见对应 mcp__* 工具。

适用场景与注意

适合

  • 已从 Python mcpp 迁出或计划退役独立网关进程,希望 DSH 同源承担聚合与管理。
  • 需要在 DSH 主对话里按需开启部分 MCP 工具,而不是把整站上云给默认 agent。
  • 需要为不同 preset(子 agent)挂载互不干扰的 MCP 工具子集。

注意

  • 插件以当前 DSH 进程的权限运行上游 stdio 子进程与 HTTP 出站;安装前请阅读源码与许可证,并核对 config.yaml 中的上游与密钥配置。
  • 与旧 Python 服务在少数错误路径上响应码有文档化差异(例如非法 JSON body:本插件 400 + JSON-RPC -32700,旧服务 500);其余行为以仓库 test/fixtures/golden/ 与集成测试为准。
  • 社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;DSH 生态原则是「一切皆插件」,本介绍事实以 GitHub README 与 INSTALL.md 为准。

结尾

dsh-mcpp 把 MCP 聚合网关收进 DSH:对外保持路径与配置兼容,对内提供可选 mcp__* 工具、侧栏管理与 preset 作用域。若你正在维护 mcpp 类部署或 DSH profile,可从目录页与仓库继续跟进安装细节与测试结果。

  • 目录页:https://www.skillhub.cn/plugins/Joe-zhouman/dsh-mcpp
  • GitHub:https://github.com/Joe-zhouman/dsh-mcpp
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜