package data import ( "context" "github.com/mark3labs/mcp-go/mcp" "fwh-toolbox-server/cmd/mcp/tools/helper" "fwh-toolbox-server/repositories" ) // === Workspace Handlers === func handlePlaneV2ListWorkspaces(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { data, err := repositories.Plane.ListWorkspaces() return planeRawResult(data, err, "列出工作空间") } func handlePlaneV2GetWorkspace(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { data, err := repositories.Plane.GetWorkspace() return planeRawResult(data, err, "获取工作空间详情") } // === Project Handlers === func handlePlaneV2ListProjects(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { data, err := repositories.Plane.ListProjects() return planeRawResult(data, err, "列出项目") } func handlePlaneV2GetProject(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("project_id") if err != nil { return helper.ParamError("project_id"), nil } data, apiErr := repositories.Plane.GetProject(id) return planeRawResult(data, apiErr, "获取项目详情") } // === Issue Handlers === func handlePlaneV2ListIssues(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { data, err := repositories.Plane.ListIssues() return planeRawResult(data, err, "列出工作项") } func handlePlaneV2GetIssue(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("issue_id") if err != nil { return helper.ParamError("issue_id"), nil } data, apiErr := repositories.Plane.GetIssue(id) return planeRawResult(data, apiErr, "获取工作项详情") } func handlePlaneV2GetSubIssues(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("issue_id") if err != nil { return helper.ParamError("issue_id"), nil } data, apiErr := repositories.Plane.GetSubIssues(id) return planeRawResult(data, apiErr, "获取子工作项") } func handlePlaneV2GetIssueActivity(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("issue_id") if err != nil { return helper.ParamError("issue_id"), nil } data, apiErr := repositories.Plane.GetIssueActivity(id) return planeRawResult(data, apiErr, "获取工作项活动历史") } // === Cycle Handlers === func handlePlaneV2ListCycles(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { data, err := repositories.Plane.ListCycles() return planeRawResult(data, err, "列出周期") } func handlePlaneV2GetCycle(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("cycle_id") if err != nil { return helper.ParamError("cycle_id"), nil } data, apiErr := repositories.Plane.GetCycle(id) return planeRawResult(data, apiErr, "获取周期详情") } func handlePlaneV2ListCycleIssues(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("cycle_id") if err != nil { return helper.ParamError("cycle_id"), nil } data, apiErr := repositories.Plane.ListCycleIssues(id) return planeRawResult(data, apiErr, "列出周期工作项") } // === Module Handlers === func handlePlaneV2ListModules(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { data, err := repositories.Plane.ListModules() return planeRawResult(data, err, "列出模块") } func handlePlaneV2GetModule(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("module_id") if err != nil { return helper.ParamError("module_id"), nil } data, apiErr := repositories.Plane.GetModule(id) return planeRawResult(data, apiErr, "获取模块详情") } func handlePlaneV2ListModuleIssues(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("module_id") if err != nil { return helper.ParamError("module_id"), nil } data, apiErr := repositories.Plane.ListModuleIssues(id) return planeRawResult(data, apiErr, "列出模块工作项") } // === Label Handlers === func handlePlaneV2ListLabels(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { data, err := repositories.Plane.ListLabels() return planeRawResult(data, err, "列出标签") } func handlePlaneV2GetLabel(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("label_id") if err != nil { return helper.ParamError("label_id"), nil } data, apiErr := repositories.Plane.GetLabel(id) return planeRawResult(data, apiErr, "获取标签详情") } // === State Handlers === func handlePlaneV2ListStates(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { data, err := repositories.Plane.ListStates() return planeRawResult(data, err, "列出状态") } func handlePlaneV2GetState(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("state_id") if err != nil { return helper.ParamError("state_id"), nil } data, apiErr := repositories.Plane.GetState(id) return planeRawResult(data, apiErr, "获取状态详情") } // === Comment Handlers === func handlePlaneV2ListComments(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("issue_id") if err != nil { return helper.ParamError("issue_id"), nil } data, apiErr := repositories.Plane.ListComments(id) return planeRawResult(data, apiErr, "列出评论") } func handlePlaneV2GetComment(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { issueID, err := req.RequireString("issue_id") if err != nil { return helper.ParamError("issue_id"), nil } commentID, err := req.RequireString("comment_id") if err != nil { return helper.ParamError("comment_id"), nil } data, apiErr := repositories.Plane.GetComment(issueID, commentID) return planeRawResult(data, apiErr, "获取评论详情") } // === Link Handlers === func handlePlaneV2ListIssueLinks(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("issue_id") if err != nil { return helper.ParamError("issue_id"), nil } data, apiErr := repositories.Plane.ListIssueLinks(id) return planeRawResult(data, apiErr, "列出工作项链接") } // === Relation Handlers === func handlePlaneV2ListIssueRelations(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("issue_id") if err != nil { return helper.ParamError("issue_id"), nil } data, apiErr := repositories.Plane.ListIssueRelations(id) return planeRawResult(data, apiErr, "列出工作项关联") } // === Sticky Handlers === func handlePlaneV2ListStickies(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { data, err := repositories.Plane.ListStickies() return planeRawResult(data, err, "列出便签") } func handlePlaneV2GetSticky(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("sticky_id") if err != nil { return helper.ParamError("sticky_id"), nil } data, apiErr := repositories.Plane.GetSticky(id) return planeRawResult(data, apiErr, "获取便签详情") } // === Intake Handlers === func handlePlaneV2ListIntakeIssues(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { status := req.GetString("status", "") data, err := repositories.Plane.ListIntakeIssues(status) return planeRawResult(data, err, "列出收件箱工作项") } func handlePlaneV2GetIntakeIssue(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("issue_id") if err != nil { return helper.ParamError("issue_id"), nil } data, apiErr := repositories.Plane.GetIntakeIssue(id) return planeRawResult(data, apiErr, "获取收件箱工作项详情") } // === Asset Handlers === func handlePlaneV2GetProjectAssetURL(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("asset_id") if err != nil { return helper.ParamError("asset_id"), nil } url, apiErr := repositories.Plane.GetProjectAssetURL(id) if apiErr != nil { return helper.ServiceError("获取资源URL", apiErr), nil } return helper.TextResult(url), nil } // === Page Handlers === func handlePlaneV2ListPages(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { data, err := repositories.Plane.ListPages() return planeRawResult(data, err, "列出页面") } func handlePlaneV2GetPage(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("page_id") if err != nil { return helper.ParamError("page_id"), nil } data, apiErr := repositories.Plane.GetPage(id) return planeRawResult(data, apiErr, "获取页面详情") } func handlePlaneV2GetPageDescription(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("page_id") if err != nil { return helper.ParamError("page_id"), nil } data, apiErr := repositories.Plane.GetPageDescription(id) return planeRawResult(data, apiErr, "获取页面描述") } // === Member Handlers === func handlePlaneV2ListWorkspaceMembers(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { data, err := repositories.Plane.ListWorkspaceMembers() return planeRawResult(data, err, "列出工作空间成员") } func handlePlaneV2GetWorkspaceMember(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("member_id") if err != nil { return helper.ParamError("member_id"), nil } data, apiErr := repositories.Plane.GetWorkspaceMember(id) return planeRawResult(data, apiErr, "获取工作空间成员详情") } func handlePlaneV2ListProjectMembers(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { data, err := repositories.Plane.ListProjectMembers() return planeRawResult(data, err, "列出项目成员") } func handlePlaneV2GetProjectMember(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { id, err := req.RequireString("member_id") if err != nil { return helper.ParamError("member_id"), nil } data, apiErr := repositories.Plane.GetProjectMember(id) return planeRawResult(data, apiErr, "获取项目成员详情") }