feat(mcp): 单一全局 lian-jing 服务器——组级挂载收敛(mcp-single-server T1-T3/T5/T6) #3

Merged
lanrtop merged 2 commits from feat/mcp-single-server into master 2026-07-06 18:52:56 +08:00
Owner

动机

MCP 客户端配置成本随产品组数线性增长(12 组 × 28 工具 ≈ 300+ 工具注册/会话),与飞轮"项目越多越强"方向相反;实测组级挂载无隔离价值(任意组服务器可操作任意项目,归属校验只覆盖部分工具)。收敛为单一 lian-jing 服务器后:授权/注册一次永久生效,liangjing.json 只需 project_id,group_id 缺失/过期/移组同步一整类问题从根上消失。

设计文档见 .blueprint/modules/mcp-single-server.md

变更清单

  • T1 服务器层:路由收敛为 POST/GET /mcp + POST /mcp/messagesprocess_rpc 单参数化
  • T2 工具层resolve_project_root(project_id) 直查 project_workspaces;3 处组归属校验替换为 ensure_project_existslist_group_projects 改 required group_id 参数
  • T3 注入层:settings.json 收敛为单 "lian-jing" key(URL /mcp),注入时清理旧 lian-jing:group-*liangjing.json 主动删除 group_id;新增 migrate_to_single_server 启动时一次性迁移(重注入全量 + 清理旧全局注册两种命名格式,mcp_single_migrated 标记位防重,claude CLI 缺失不落标记等重试);退组/删组加"仍属其他组则保留"判断
  • T5 同步:git-workflow 文档/模板、retro-catchup 技能 Python 兜底、设置页 URL 展示、mcp-config-inject 取代注记
  • T6 收口:删除旧 /mcp/group/:gid 路由(原计划后置一版,评估后提前:迁移自动重写全部客户端配置,旧路由消费者只剩升级前会话,重启后本就断开)

Agent 自验报告

  • cargo test 93 passed / 0 failed(含新驻军测试 process_rpc_handshake:initialize 返回 serverInfo.name=炼境,tools/list ≥20 个工具)
  • pnpm typecheck 通过(lefthook pre-commit 强制)
  • grep -rE 'lian-jing-\{group_id\}|lian-jing:group-|mcp/group' docs/ src/ src-tauri/resources/ .claude/skills/ 零残留
  • grep 'mcp/group' src-tauri/src/ 零命中
  • T4 端到端验证(需合并后构建新二进制 + 重启炼境触发自动迁移):claude mcp list 仅剩 lian-jing、抽查 3 个项目配置文件、新会话实调 get_diagnostics

风险与迁移

新版启动 10 秒后后台自动执行一次性迁移:批量重注入全部托管项目 + claude mcp remove 清理旧全局注册(完整 UUID / 短 8 位两种历史命名)。迁移幂等,部分失败记日志不阻塞。升级前启动的 Claude 会话需重开(服务重启后 SSE 本就断开)。webhook 路由 /webhook/gitea/:project_id 不受影响。

## 动机 MCP 客户端配置成本随产品组数线性增长(12 组 × 28 工具 ≈ 300+ 工具注册/会话),与飞轮"项目越多越强"方向相反;实测组级挂载无隔离价值(任意组服务器可操作任意项目,归属校验只覆盖部分工具)。收敛为单一 `lian-jing` 服务器后:授权/注册一次永久生效,`liangjing.json` 只需 `project_id`,group_id 缺失/过期/移组同步一整类问题从根上消失。 设计文档见 `.blueprint/modules/mcp-single-server.md`。 ## 变更清单 - **T1 服务器层**:路由收敛为 `POST/GET /mcp` + `POST /mcp/messages`;`process_rpc` 单参数化 - **T2 工具层**:`resolve_project_root(project_id)` 直查 `project_workspaces`;3 处组归属校验替换为 `ensure_project_exists`;`list_group_projects` 改 required `group_id` 参数 - **T3 注入层**:settings.json 收敛为单 `"lian-jing"` key(URL `/mcp`),注入时清理旧 `lian-jing:group-*`;`liangjing.json` 主动删除 `group_id`;新增 `migrate_to_single_server` 启动时一次性迁移(重注入全量 + 清理旧全局注册两种命名格式,`mcp_single_migrated` 标记位防重,claude CLI 缺失不落标记等重试);退组/删组加"仍属其他组则保留"判断 - **T5 同步**:git-workflow 文档/模板、retro-catchup 技能 Python 兜底、设置页 URL 展示、mcp-config-inject 取代注记 - **T6 收口**:删除旧 `/mcp/group/:gid` 路由(原计划后置一版,评估后提前:迁移自动重写全部客户端配置,旧路由消费者只剩升级前会话,重启后本就断开) ## Agent 自验报告 - [x] `cargo test` 93 passed / 0 failed(含新驻军测试 `process_rpc_handshake`:initialize 返回 serverInfo.name=炼境,tools/list ≥20 个工具) - [x] `pnpm typecheck` 通过(lefthook pre-commit 强制) - [x] `grep -rE 'lian-jing-\{group_id\}|lian-jing:group-|mcp/group' docs/ src/ src-tauri/resources/ .claude/skills/` 零残留 - [x] `grep 'mcp/group' src-tauri/src/` 零命中 - [ ] T4 端到端验证(需合并后构建新二进制 + 重启炼境触发自动迁移):`claude mcp list` 仅剩 `lian-jing`、抽查 3 个项目配置文件、新会话实调 `get_diagnostics` ## 风险与迁移 新版启动 10 秒后后台自动执行一次性迁移:批量重注入全部托管项目 + `claude mcp remove` 清理旧全局注册(完整 UUID / 短 8 位两种历史命名)。迁移幂等,部分失败记日志不阻塞。升级前启动的 Claude 会话需重开(服务重启后 SSE 本就断开)。webhook 路由 `/webhook/gitea/:project_id` 不受影响。
lanrtop added 2 commits 2026-07-06 18:35:31 +08:00
feat(mcp): 单一全局 lian-jing 服务器——组级挂载收敛(T1-T3+T5)
All checks were successful
Push & PR Check / check (push) Successful in 1m4s
a41161f7d1
T1 服务器层:新增全局 /mcp + /mcp/messages 路由,process_rpc 组上下文
Option 化;旧 /mcp/group/:gid 路由保留过渡,T6 移除。驻军测试 2 条。
T2 工具层:resolve_project_root 按 project_id 直查 project_workspaces,
删除 3 处组归属校验(实测无隔离价值);list_group_projects 改显式传参。
T3 注入层:settings.json 收敛为单 "lian-jing" key(URL /mcp),注入时
清理旧 lian-jing:group-* key;liangjing.json 主动删除 group_id;
启动时一次性迁移(重注入全量 + 清理旧全局注册两种命名格式,标记位防重)。
T5 同步:git-workflow 文档/模板、retro-catchup 技能 Python 兜底、
设置页 URL 展示、mcp-config-inject 模块取代注记。

收益:MCP 客户端配置成本 O(N组)→O(1),授权一次永久生效;
group_id 缺失/过期/移组同步一整类问题从根上消失。
feat(mcp): T6 删除旧 /mcp/group 路由与兼容层——提前并入本次发版
All checks were successful
Push & PR Check / check (push) Successful in 1m6s
Push & PR Check / check (pull_request) Successful in 49s
df7d52a084
原计划后置一个版本,经评估提前:迁移在新版启动时自动重写全部
客户端配置(settings.json/liangjing.json/全局注册),旧路由的实际
消费者只剩升级前的存量会话,而服务重启后它们本就断开重连。
单人环境下双路由过渡的保留价值趋近于零,一次收口减少一轮发版。

- tools_call 签名去 Option 组上下文,process_rpc 单参数化
- list_group_projects 的 group_id 改为 required 参数
- grep 'mcp/group' src-tauri/src/ 零命中,cargo test 93 全绿
lanrtop merged commit 01eb941ab9 into master 2026-07-06 18:52:56 +08:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: lanrtop/dev-manager-tauri#3
No description provided.