## 现状问题 `internal/httpapi` 的 MCP handler 里,「个人 MCP 只能由创建者本人操作」的校验手写了三遍,结构完全一样: - `mcp.go` `mcpServers` 的 DELETE 分支(报错「不能移除其他用户的个人 MCP」) - `mcp.go` `mcpServers` 的 PUT 分支(报错「不能修改其他用户的个人 MCP」) - `mcp_files.go` `editableMCP`(报错「不能修改其他用户的个人 MCP」) 每处都是 `if server.Scope == "personal" { current, authenticated := h.requestUser(c.Request, true); if !authenticated || current.ID != server.OwnerUserID { c.JSON(403, ...); return } }`。权限规则分散三处,以后改规则(例如加管理员放行)容易漏改一处;PUT 分支也因此嵌套到第 4 层。 ## 重构方案 在 `mcp.go` 新增 `func (h *mcpHandlers) requirePersonalMCPOwner(c *gin.Context, server domain.MCPServerDefinition, deniedMessage string) bool`:非 personal 直接放行;personal 时取当前用户,非本人则写 403 `{"error": deniedMessage}` 并返回 false。三处改为调用它,各自的报错文字逐字不变。 ## 影响范围 - 仅 `internal/httpapi/mcp.go`、`internal/httpapi/mcp_files.go` 两个文件,外加新增测试文件。 - 路由、状态码、报错文字、判断顺序(市场 MCP 检查仍在归属检查之前)均不变;对外接口和行为不变。 ## 验证方式 - 新增单测覆盖:项目级 MCP 无需登录即放行;个人 MCP 本人放行;非本人 / 未登录返回 403 且文字正确;DELETE、PUT、`editableMCP` 三个入口拒绝他人个人 MCP。 - `go vet ./internal/httpapi/`、`go test ./internal/httpapi/` 通过。
Activity
【架构优化】合并 MCP handler 中三处重复的个人 MCP 归属校验为 requirePersonalMCPOwner
Robert0622 commentedon Nov 14, 2026
已对照当前 main 代码核实:
internal/httpapi/mcp.go(38、58 行)与internal/httpapi/mcp_files.go(28 行)确实各自手写一遍「personal MCP 仅创建者本人可操作」的校验(均判断current.ID != server.OwnerUserID/existing.OwnerUserID),结构高度重复;核实时requirePersonalMCPOwner不存在(grep 无命中)。与原帖描述一致,证据充分,非重复。评估:改动范围小、行为不变(仅抽取 helper),适合纳入本 Loop backlog 开发。暂未建单:本 Loop backlog 当前已达上限(5/5),待下一轮释放容量后补建需求并跟进开发。