Files

62 lines
6.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 需求:R-020 QMT Bridge MCP 能力内建(神之一手自注册 MCP,去三方插件依赖)
> 登记:2026-09-08 来源:老师指令(2026-09-08 新需求)| 需求状态:**已完成**
> 归档日期:2026-09-08 实现迭代:18-QMTBridgeMCP内建(验收通过 2026-09-08
> 讨论记录索引:R-020.md 正文(Q1-Q6 逐项拍板 + 老师澄清:移除对象=三方 dsh-skill-mcp-panel、官方 dsh-mcp-client 可依赖);实现细节见 docs/04-迭代记录/18-QMTBridgeMCP内建/(含 迭代复盘.md
> 归档路径:本文件已移入 05-需求池/已完成/
> 迭代状态标记:已定稿(2026-09-08)→ 已实现(迭代 18)→ **已归档(验收通过 2026-09-08**
## 需求描述(老师原始诉求)
> **老师原话(2026-09-08)**:当前我们给 DSH 配置了一个 MCP,用于连接 QMT bridge,这个配置是在另一个插件中配置的(三方插件 dsh-skill-mcp-panel 在 profile cordis.patch.yml 受管块里插入 QMT_Bridge_MCP 实例——管理 UI + 写宿主 patch;真正连接的是 DSH 官方 dsh-mcp-client)。我希望可以在神之一手插件的配置 tab 中,添加了 QMTBridge 的配置后,可以**自动检查 MCP 连接信息**,这样我们**不需要依赖三方插件来加入 MCP 的能力**。
>
> **2026-09-08 老师澄清(指令修正)**:不要的是**第三方 dsh-skill-mcp-panel**(设置菜单「技能 / MCP」+ 它写的宿主 patch 受管块);**依赖 DSH 官方 @deepseek-ai/dsh-mcp-client 是允许的**。实现 = 神之一手 apply 内动态挂载官方 dsh-mcp-client(参照 mcp_router 实证),**移除三方 dsh-skill-mcp-panel 及其受管块**。
## 定稿语义
- **MCP 能力内建**:神之一手在自己的 apply 内按 QMT 连接配置动态挂载 DSH 官方 @deepseek-ai/dsh-mcp-client(插件内管理:挂载/切换/卸载/状态都由神之一手控制),QMT Bridge 的 MCP 工具由神之一手自己接入;不再依赖三方 dsh-skill-mcp-panel 的面板与宿主 patch 受管块;
- **REST 直连不变**(技术约束-003):插件 UI/tab 数据仍走 RESTMCP 是插件自带的 Agent 侧能力;
- **MCP url 自动派生**:激活连接 baseUrl + /mcp,零新增配置字段。
## 讨论记录(2026-09-08,第一轮,Q1-Q6 老师逐项拍板 → 定稿)
| # | 问题 | 结论(老师拍板) |
|---|---|---|
| Q1 | MCP 客户端挂载粒度 | **只使用当前激活的那个连接**:仅激活连接挂 1 个 dsh-mcp-client 实例(serverName 固定 QMT_Bridge_MCP,切换激活即热切换 MCP url,工具名 mcp__QMT_Bridge_MCP__* 保持稳定);不逐连接各挂实例 |
| Q2 | 现有三方条目处置 | **现在的移除(2026-09-08 老师澄清:移除对象 = 第三方 dsh-skill-mcp-panel**:① 卸载/停用三方 dsh-skill-mcp-panel(其「技能 / MCP」设置菜单与宿主 patch 管理职责一并移除);② 删除 cordis.patch.yml 中其受管块(QMT_Bridge_MCP 不再由三方写入);**QMT 的 MCP 连接通过神之一手插件自己管理**——插件 apply 内动态挂载**官方 @deepseek-ai/dsh-mcp-client**(依赖官方库、管理在我们插件内),含连接 CRUD/激活切换的全生命周期联动 |
| Q3 | MCP url 与字段 | **自动来**:默认派生 baseUrl + /mcp,不需要每连接 mcpUrl 覆盖字段 |
| Q4 | 「自动检查 MCP 连接信息」口径 | **两处状态出口**:① 设置页「QMT 连接配置」连接卡片可检查(手动触发);② **对话窗口顶端状态指示灯区新增一个 MCP 状态**(与现有持仓/盘口同步指示灯并列) |
| Q5 | 失败与重连语义 | **采纳建议**:对齐 failOnStartupError:false + reconnect(初始连不上不拒绝插件激活;连接丢失自动指数退避重连;期间保留断开状态不崩插件) |
| Q6 | 范围确认 | **不做通用 MCP 管理**,只做 QMT 的 MCP 内建;通用任意 MCP 服务器管理面板不做(该域属 mcp-router / dsh-skill-mcp-panel,另议) |
## 定稿边界
**做**
1. 神之一手 apply 内动态挂载/卸载 dsh-mcp-client(唯一实例,serverName=QMT_Bridge_MCPurl=激活连接 baseUrl+/mcp);
2. 生命周期联动:启动(激活默认/上次连接)→ 挂载;添加/编辑/删除/激活连接 → MCP 挂/切/卸(对齐现有 qmt-connections API 热切换编排);激活连接被删自动切默认并重挂;
3. MCP 状态出口 ×2:设置页连接卡片 MCP 检查/状态;对话窗口顶端状态指示灯区新增 MCP 状态(三态风格对齐产品约束-012 指示灯体系);
4. 移除三方 dsh-skill-mcp-panel:卸载其插件 + 移除宿主 cordis.patch.yml 受管块(Q2;属宿主配置变更,按 editing-cordis-compositions 技能流程操作 + 老师确认);
5. 失败/重连语义按 Q5failOnStartupError:false + reconnect)。
**不做(本期)**:通用 MCP 服务器管理面板(Q6,含自建「任意 MCP 管理 UI」——Q6 明确不做);插件 UI/tab 数据源改走 MCP(技术约束-003 REST 直连不变);多 serverName 并存;自研 MCP 协议客户端(老师定:依赖官方 dsh-mcp-client 即可,不重造轮子)。
## 计划阶段待办(定稿后第一件事:技术可行性调研)
1. **依赖解析实证**one-divine-lot 运行时能否 import(@deepseek-ai/dsh-mcp-client)(宿主 CLI 依赖树 / profile node_modules 解析路径核实,对照 mcp_router 的 peerDependencies 声明与日志实证;确认后在 package.json 补 peer 依赖);
2. **动态挂载生命周期设计**add/update/remove/activate 连接 → MCP 实例 挂/切/卸 编排(对齐 qmt-connections API 现有热切换逻辑,MCP url 随激活 baseUrl);
3. **MCP 状态查询与展示**:服务端 MCP 状态端点(已连接/断开 + 工具数 + 错误/重连信息)+ 设置页卡片检查 + 会话头部指示灯新增 MCP 状态(对齐产品约束-012/UI约束的指示灯体系);
4. **宿主受管块迁移**cordis.patch.yml 移除 QMT_Bridge_MCP 块的精确操作步骤(保留块外内容逐字节不动);
5. 前端连接卡片表单是否需提示「MCP 将自动随激活连接启用」(Q4 落点 UI 文案)。
## 关联
- 终极目标:目标-001(DSH 插件形态·复用宿主 MCP 能力)、目标-008(真实交易系统接入)
- 既有需求:R-004(QMT 连接配置,本需求数据基础:settings.qmtConnections + 激活/默认语义 + 热切换编排);R-015(会话头部指示灯体系,MCP 状态灯并入同一区)
- 设计约束:技术约束-003(REST 直连不变)、技术约束-008(连接配置存储/热切换);定稿后需补新约束条目(技术约束:「插件内建 MCP 客户端注册规范」;产品约束:「MCP 状态出口(设置卡片 + 会话头部指示灯)」)
- 参考实现:mcp_routerds-plugins/mcp_router)——动态 ctx.plugin(dsh-mcp-client) 实证
## 验收
**(立项后写入迭代验收标准.md**