主人 2026-10-24:「能否将每个 MCP 服务器所承载的插件和工具按上游(来源)服务器分类 并与其他插件相对隔离?」 归属信息此前后端根本没有(GET /admin/plugins 每条只有 name/kind/description/两个 布尔),而 `mcp:` 是每台 server 一条的 KindMCP 条目的注册键,**不是**工具的命名空间 (工具名由 server 原样给出,连前缀都没有)⇒ 只能靠注册时的元数据,不能解析名字。 后端(唯一汇点盖章): - 新增 pkg/plugins/sdk/origin.go:Origin{Kind,Server,Transport} + 可选接口 OriginAware(没实现 = 宿主内置,老工具零改动)+ OriginOf(零值视为无来源)。 - registry.Capability 加 Origin 字段;RegisterTool 盖章(覆盖热装与 .env MCP_SERVERS_JSON 两条接入路径的合流处),ReplaceTool **同样重新盖章**(它逐字段 重建条目,漏了就是「热替换把来源抹掉」)。 - mcp.mcpTool 实现 Origin()(server 名与传输都在 cfg 上),transport 用新的 transportNameOf 报**实际会用的**形态(stdio/sse/http),与 newTransport 同一推断。 - 网关 PluginSummary 加可选 origin(omitempty):零值 ⇒ 键缺席,不是空对象。 - 卸载守卫:对单把 MCP 工具或 `mcp:<server>` 登记条目直接 400 (plugin_uninstall_scope)并指向「MCP 服务器」页 —— 原来会绕过插件管理器裸删, server 的 names 账本不同步、重连后工具复活。判据是来源章,不是名字前缀。 前端(呈现分组): - admin/modules/pluginOrigin.ts:纯函数按 origin.server 分节(按 server 名排序), transport 未报告时标题省略括号,缺 server 名不冒充内置。 - Plugins.tsx:工具段两级(`来自 fs(stdio)· N 把工具` + 宿主内置),MCP 工具行去掉 「卸载」改为指向 MCP 页;`kind:"mcp"` 登记条目与未知 kind(iot)各有段如实显示, 不再静默丢弃(design/09 §5.2.1 红线③)。 零影响(有断言):tool_policies 表/策略写路径未改;ToolSchemas 不发来源(测试断言 模型面既无 origin 键也无 server 名);停用 server ⇒ 条目连来源一起消失,无孤儿。 测试:registry 盖章/保章(两条均已实测变异变红)/内置零值/改策略不清章;mcp 注册 路径盖章 + transport 推断表;网关读面缺席与存在、热装整链、卸载守卫;前端 esbuild+cjs 逻辑测试 12 项。验收:go build/vet/test 全绿,frontend `npm run build` 通过。
- 新增依赖:github.com/modelcontextprotocol/go-sdk v1.8.0(direct)+ github.com/google/jsonschema-go v0.4.3 (SDK 自带依赖,直接用于 schema 校验/默认值,避免再造一份);go.sum 纯新增 - 删除自研协议层:rpc.go / stdio.go / http.go / sse.go 及其测试 - 用 SDK 的成熟逻辑:命令传输(stdio 子进程)/ SSE / Streamable HTTP、协议版本协商与 -32022 回退、keepalive(含失败阈值)、tools/list_changed 订阅、能力协商(InitializeResult.Capabilities) - 保留自研的四件事(其余零自研):配置→传输、发现→registry 注册、能力族推断、schema 缓存(Prepare 命中不重复解析) - 能力闸诚实化:服务器声明 capabilities 但不含 tools 时 ListTools/DiscoverTools 返回 ErrCapabilityNotDeclared(不静默空集);完全不声明 capabilities 的老式服务器仍按 legacy 处理 - 复核:build 绿 + capability 全包测试绿(mcp 42 用例,含真子进程 stdio / httptest Streamable HTTP / 内存传输三类假 server,不依赖外网)+ `-race` 干净;变异 2 条(featuresFrom 恒 true / 删 applySchema 调用)已还原 - 无 REST/WS/env/数据目录变更;包内 API 有增删(见回报),仓外调用方签名未变(未改 cmd/cyrene 与 plugin/manager)