ソースを参照

fix:替换mcp使用的plane接口

Jerry Liang 2 ヶ月 前
親
コミット
490f627a60

+ 19 - 0
service/cmd/mcp/tools/data/plane_v2_api.go

@@ -3,9 +3,28 @@ package data
 import (
 	"github.com/mark3labs/mcp-go/mcp"
 	"github.com/mark3labs/mcp-go/server"
+
+	"fwh-toolbox-server/config"
+	plane_v2 "fwh-toolbox-server/repositories/api/plane_v2"
 )
 
+// planeV2 通用 PlaneService 实例(MCP 专用,不绑定 Feedback 标签)
+var planeV2 *plane_v2.PlaneService
+
+// planeV2Workspace / planeV2Project 从配置读取的默认 workspace/project
+var planeV2Workspace string
+var planeV2Project string
+
 func registerPlaneV2ApiTools(s *server.MCPServer) {
+	// 初始化通用 PlaneService(PlaneClient 已在 main.go 中初始化)
+	planeV2 = plane_v2.NewPlaneService()
+
+	// 从配置读取默认 workspace/project
+	cfg, _ := config.LoadConfig()
+	if cfg != nil {
+		planeV2Workspace = cfg.PlaneWebApi.WorkspaceSlug
+		planeV2Project = cfg.PlaneWebApi.ProjectId
+	}
 	// ============ Workspace (读) ============
 	s.AddTool(
 		mcp.NewTool("data_plane_v2_list_workspaces",

+ 34 - 35
service/cmd/mcp/tools/data/plane_v2_api_handlers.go

@@ -6,25 +6,24 @@ import (
 	"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()
+	data, err := planeV2.ListWorkspaces()
 	return planeRawResult(data, err, "列出工作空间")
 }
 
 func handlePlaneV2GetWorkspace(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
-	data, err := repositories.Plane.GetWorkspace()
+	data, err := planeV2.GetWorkspace(planeV2Workspace)
 	return planeRawResult(data, err, "获取工作空间详情")
 }
 
 // === Project Handlers ===
 
 func handlePlaneV2ListProjects(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
-	data, err := repositories.Plane.ListProjects()
+	data, err := planeV2.ListProjects(planeV2Workspace)
 	return planeRawResult(data, err, "列出项目")
 }
 
@@ -33,14 +32,14 @@ func handlePlaneV2GetProject(ctx context.Context, req mcp.CallToolRequest) (*mcp
 	if err != nil {
 		return helper.ParamError("project_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetProject(id)
+	data, apiErr := planeV2.GetProject(planeV2Workspace, id)
 	return planeRawResult(data, apiErr, "获取项目详情")
 }
 
 // === Issue Handlers ===
 
 func handlePlaneV2ListIssues(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
-	data, err := repositories.Plane.ListIssues()
+	data, err := planeV2.ListIssues(planeV2Workspace, planeV2Project)
 	return planeRawResult(data, err, "列出工作项")
 }
 
@@ -49,7 +48,7 @@ func handlePlaneV2GetIssue(ctx context.Context, req mcp.CallToolRequest) (*mcp.C
 	if err != nil {
 		return helper.ParamError("issue_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetIssue(id)
+	data, apiErr := planeV2.GetIssue(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "获取工作项详情")
 }
 
@@ -58,7 +57,7 @@ func handlePlaneV2GetSubIssues(ctx context.Context, req mcp.CallToolRequest) (*m
 	if err != nil {
 		return helper.ParamError("issue_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetSubIssues(id)
+	data, apiErr := planeV2.GetSubIssues(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "获取子工作项")
 }
 
@@ -67,14 +66,14 @@ func handlePlaneV2GetIssueActivity(ctx context.Context, req mcp.CallToolRequest)
 	if err != nil {
 		return helper.ParamError("issue_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetIssueActivity(id)
+	data, apiErr := planeV2.GetIssueActivity(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "获取工作项活动历史")
 }
 
 // === Cycle Handlers ===
 
 func handlePlaneV2ListCycles(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
-	data, err := repositories.Plane.ListCycles()
+	data, err := planeV2.ListCycles(planeV2Workspace, planeV2Project)
 	return planeRawResult(data, err, "列出周期")
 }
 
@@ -83,7 +82,7 @@ func handlePlaneV2GetCycle(ctx context.Context, req mcp.CallToolRequest) (*mcp.C
 	if err != nil {
 		return helper.ParamError("cycle_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetCycle(id)
+	data, apiErr := planeV2.GetCycle(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "获取周期详情")
 }
 
@@ -92,14 +91,14 @@ func handlePlaneV2ListCycleIssues(ctx context.Context, req mcp.CallToolRequest)
 	if err != nil {
 		return helper.ParamError("cycle_id"), nil
 	}
-	data, apiErr := repositories.Plane.ListCycleIssues(id)
+	data, apiErr := planeV2.ListCycleIssues(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "列出周期工作项")
 }
 
 // === Module Handlers ===
 
 func handlePlaneV2ListModules(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
-	data, err := repositories.Plane.ListModules()
+	data, err := planeV2.ListModules(planeV2Workspace, planeV2Project)
 	return planeRawResult(data, err, "列出模块")
 }
 
@@ -108,7 +107,7 @@ func handlePlaneV2GetModule(ctx context.Context, req mcp.CallToolRequest) (*mcp.
 	if err != nil {
 		return helper.ParamError("module_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetModule(id)
+	data, apiErr := planeV2.GetModule(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "获取模块详情")
 }
 
@@ -117,14 +116,14 @@ func handlePlaneV2ListModuleIssues(ctx context.Context, req mcp.CallToolRequest)
 	if err != nil {
 		return helper.ParamError("module_id"), nil
 	}
-	data, apiErr := repositories.Plane.ListModuleIssues(id)
+	data, apiErr := planeV2.ListModuleIssues(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "列出模块工作项")
 }
 
 // === Label Handlers ===
 
 func handlePlaneV2ListLabels(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
-	data, err := repositories.Plane.ListLabels()
+	data, err := planeV2.ListLabels(planeV2Workspace, planeV2Project)
 	return planeRawResult(data, err, "列出标签")
 }
 
@@ -133,14 +132,14 @@ func handlePlaneV2GetLabel(ctx context.Context, req mcp.CallToolRequest) (*mcp.C
 	if err != nil {
 		return helper.ParamError("label_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetLabel(id)
+	data, apiErr := planeV2.GetLabel(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "获取标签详情")
 }
 
 // === State Handlers ===
 
 func handlePlaneV2ListStates(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
-	data, err := repositories.Plane.ListStates()
+	data, err := planeV2.ListStates(planeV2Workspace, planeV2Project)
 	return planeRawResult(data, err, "列出状态")
 }
 
@@ -149,7 +148,7 @@ func handlePlaneV2GetState(ctx context.Context, req mcp.CallToolRequest) (*mcp.C
 	if err != nil {
 		return helper.ParamError("state_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetState(id)
+	data, apiErr := planeV2.GetState(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "获取状态详情")
 }
 
@@ -160,7 +159,7 @@ func handlePlaneV2ListComments(ctx context.Context, req mcp.CallToolRequest) (*m
 	if err != nil {
 		return helper.ParamError("issue_id"), nil
 	}
-	data, apiErr := repositories.Plane.ListComments(id)
+	data, apiErr := planeV2.ListComments(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "列出评论")
 }
 
@@ -173,7 +172,7 @@ func handlePlaneV2GetComment(ctx context.Context, req mcp.CallToolRequest) (*mcp
 	if err != nil {
 		return helper.ParamError("comment_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetComment(issueID, commentID)
+	data, apiErr := planeV2.GetComment(planeV2Workspace, planeV2Project, issueID, commentID)
 	return planeRawResult(data, apiErr, "获取评论详情")
 }
 
@@ -184,7 +183,7 @@ func handlePlaneV2ListIssueLinks(ctx context.Context, req mcp.CallToolRequest) (
 	if err != nil {
 		return helper.ParamError("issue_id"), nil
 	}
-	data, apiErr := repositories.Plane.ListIssueLinks(id)
+	data, apiErr := planeV2.ListIssueLinks(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "列出工作项链接")
 }
 
@@ -195,14 +194,14 @@ func handlePlaneV2ListIssueRelations(ctx context.Context, req mcp.CallToolReques
 	if err != nil {
 		return helper.ParamError("issue_id"), nil
 	}
-	data, apiErr := repositories.Plane.ListIssueRelations(id)
+	data, apiErr := planeV2.ListIssueRelations(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "列出工作项关联")
 }
 
 // === Sticky Handlers ===
 
 func handlePlaneV2ListStickies(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
-	data, err := repositories.Plane.ListStickies()
+	data, err := planeV2.ListStickies(planeV2Workspace)
 	return planeRawResult(data, err, "列出便签")
 }
 
@@ -211,7 +210,7 @@ func handlePlaneV2GetSticky(ctx context.Context, req mcp.CallToolRequest) (*mcp.
 	if err != nil {
 		return helper.ParamError("sticky_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetSticky(id)
+	data, apiErr := planeV2.GetSticky(planeV2Workspace, id)
 	return planeRawResult(data, apiErr, "获取便签详情")
 }
 
@@ -219,7 +218,7 @@ func handlePlaneV2GetSticky(ctx context.Context, req mcp.CallToolRequest) (*mcp.
 
 func handlePlaneV2ListIntakeIssues(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
 	status := req.GetString("status", "")
-	data, err := repositories.Plane.ListIntakeIssues(status)
+	data, err := planeV2.ListIntakeIssues(planeV2Workspace, planeV2Project, status)
 	return planeRawResult(data, err, "列出收件箱工作项")
 }
 
@@ -228,7 +227,7 @@ func handlePlaneV2GetIntakeIssue(ctx context.Context, req mcp.CallToolRequest) (
 	if err != nil {
 		return helper.ParamError("issue_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetIntakeIssue(id)
+	data, apiErr := planeV2.GetIntakeIssue(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "获取收件箱工作项详情")
 }
 
@@ -239,7 +238,7 @@ func handlePlaneV2GetProjectAssetURL(ctx context.Context, req mcp.CallToolReques
 	if err != nil {
 		return helper.ParamError("asset_id"), nil
 	}
-	url, apiErr := repositories.Plane.GetProjectAssetURL(id)
+	url, apiErr := planeV2.GetProjectAssetURL(planeV2Workspace, planeV2Project, id)
 	if apiErr != nil {
 		return helper.ServiceError("获取资源URL", apiErr), nil
 	}
@@ -249,7 +248,7 @@ func handlePlaneV2GetProjectAssetURL(ctx context.Context, req mcp.CallToolReques
 // === Page Handlers ===
 
 func handlePlaneV2ListPages(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
-	data, err := repositories.Plane.ListPages()
+	data, err := planeV2.ListPages(planeV2Workspace, planeV2Project)
 	return planeRawResult(data, err, "列出页面")
 }
 
@@ -258,7 +257,7 @@ func handlePlaneV2GetPage(ctx context.Context, req mcp.CallToolRequest) (*mcp.Ca
 	if err != nil {
 		return helper.ParamError("page_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetPage(id)
+	data, apiErr := planeV2.GetPage(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "获取页面详情")
 }
 
@@ -267,14 +266,14 @@ func handlePlaneV2GetPageDescription(ctx context.Context, req mcp.CallToolReques
 	if err != nil {
 		return helper.ParamError("page_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetPageDescription(id)
+	data, apiErr := planeV2.GetPageDescription(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "获取页面描述")
 }
 
 // === Member Handlers ===
 
 func handlePlaneV2ListWorkspaceMembers(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
-	data, err := repositories.Plane.ListWorkspaceMembers()
+	data, err := planeV2.ListWorkspaceMembers(planeV2Workspace)
 	return planeRawResult(data, err, "列出工作空间成员")
 }
 
@@ -283,12 +282,12 @@ func handlePlaneV2GetWorkspaceMember(ctx context.Context, req mcp.CallToolReques
 	if err != nil {
 		return helper.ParamError("member_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetWorkspaceMember(id)
+	data, apiErr := planeV2.GetWorkspaceMember(planeV2Workspace, id)
 	return planeRawResult(data, apiErr, "获取工作空间成员详情")
 }
 
 func handlePlaneV2ListProjectMembers(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
-	data, err := repositories.Plane.ListProjectMembers()
+	data, err := planeV2.ListProjectMembers(planeV2Workspace, planeV2Project)
 	return planeRawResult(data, err, "列出项目成员")
 }
 
@@ -297,6 +296,6 @@ func handlePlaneV2GetProjectMember(ctx context.Context, req mcp.CallToolRequest)
 	if err != nil {
 		return helper.ParamError("member_id"), nil
 	}
-	data, apiErr := repositories.Plane.GetProjectMember(id)
+	data, apiErr := planeV2.GetProjectMember(planeV2Workspace, planeV2Project, id)
 	return planeRawResult(data, apiErr, "获取项目成员详情")
 }