Skip to content

【架构优化】合并 MCP handler 中三处重复的个人 MCP 归属校验为 requirePersonalMCPOwner #757

Open

Description

@fx-kurumi

现状问题

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

  1. added a commit that references this issue on Nov 14, 2026
    9a1d114
  2. Robert0622 commented on Nov 14, 2026

    @Robert0622
    Collaborator

    已对照当前 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),待下一轮释放容量后补建需求并跟进开发。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions