plane_v2_api.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. package data
  2. import (
  3. "github.com/mark3labs/mcp-go/mcp"
  4. "github.com/mark3labs/mcp-go/server"
  5. "fwh-toolbox-server/config"
  6. plane_v2 "fwh-toolbox-server/repositories/api/plane_v2"
  7. )
  8. // planeV2 通用 PlaneService 实例(MCP 专用,不绑定 Feedback 标签)
  9. var planeV2 *plane_v2.PlaneService
  10. // planeV2Workspace / planeV2Project 从配置读取的默认 workspace/project
  11. var planeV2Workspace string
  12. var planeV2Project string
  13. func registerPlaneV2ApiTools(s *server.MCPServer) {
  14. // 初始化通用 PlaneService(PlaneClient 已在 main.go 中初始化)
  15. planeV2 = plane_v2.NewPlaneService()
  16. // 从配置读取默认 workspace/project
  17. cfg, _ := config.LoadConfig()
  18. if cfg != nil {
  19. planeV2Workspace = cfg.PlaneWebApi.WorkspaceSlug
  20. planeV2Project = cfg.PlaneWebApi.ProjectId
  21. }
  22. // ============ Workspace (读) ============
  23. s.AddTool(
  24. mcp.NewTool("data_plane_v2_list_workspaces",
  25. mcp.WithDescription("列出所有工作空间(V2 Web API)"),
  26. ),
  27. handlePlaneV2ListWorkspaces,
  28. )
  29. s.AddTool(
  30. mcp.NewTool("data_plane_v2_get_workspace",
  31. mcp.WithDescription("获取当前工作空间详情(V2 Web API)"),
  32. ),
  33. handlePlaneV2GetWorkspace,
  34. )
  35. // ============ Project (读) ============
  36. s.AddTool(
  37. mcp.NewTool("data_plane_v2_list_projects",
  38. mcp.WithDescription("列出工作空间下的所有项目(V2 Web API)"),
  39. ),
  40. handlePlaneV2ListProjects,
  41. )
  42. s.AddTool(
  43. mcp.NewTool("data_plane_v2_get_project",
  44. mcp.WithDescription("获取项目详情(V2 Web API)"),
  45. mcp.WithString("project_id", mcp.Required(), mcp.Description("项目 UUID")),
  46. ),
  47. handlePlaneV2GetProject,
  48. )
  49. // ============ Issue (读) ============
  50. s.AddTool(
  51. mcp.NewTool("data_plane_v2_list_issues",
  52. mcp.WithDescription("列出项目工作项列表(V2 Web API)"),
  53. ),
  54. handlePlaneV2ListIssues,
  55. )
  56. s.AddTool(
  57. mcp.NewTool("data_plane_v2_get_issue",
  58. mcp.WithDescription("获取工作项详情(V2 Web API)"),
  59. mcp.WithString("issue_id", mcp.Required(), mcp.Description("工作项 UUID")),
  60. ),
  61. handlePlaneV2GetIssue,
  62. )
  63. s.AddTool(
  64. mcp.NewTool("data_plane_v2_get_sub_issues",
  65. mcp.WithDescription("获取子工作项列表(V2 Web API)"),
  66. mcp.WithString("issue_id", mcp.Required(), mcp.Description("父工作项 UUID")),
  67. ),
  68. handlePlaneV2GetSubIssues,
  69. )
  70. s.AddTool(
  71. mcp.NewTool("data_plane_v2_get_issue_activity",
  72. mcp.WithDescription("获取工作项活动历史(V2 Web API)"),
  73. mcp.WithString("issue_id", mcp.Required(), mcp.Description("工作项 UUID")),
  74. ),
  75. handlePlaneV2GetIssueActivity,
  76. )
  77. // ============ Cycle (读) ============
  78. s.AddTool(
  79. mcp.NewTool("data_plane_v2_list_cycles",
  80. mcp.WithDescription("列出项目周期列表(V2 Web API)"),
  81. ),
  82. handlePlaneV2ListCycles,
  83. )
  84. s.AddTool(
  85. mcp.NewTool("data_plane_v2_get_cycle",
  86. mcp.WithDescription("获取周期详情(V2 Web API)"),
  87. mcp.WithString("cycle_id", mcp.Required(), mcp.Description("周期 UUID")),
  88. ),
  89. handlePlaneV2GetCycle,
  90. )
  91. s.AddTool(
  92. mcp.NewTool("data_plane_v2_list_cycle_issues",
  93. mcp.WithDescription("列出周期中的工作项(V2 Web API)"),
  94. mcp.WithString("cycle_id", mcp.Required(), mcp.Description("周期 UUID")),
  95. ),
  96. handlePlaneV2ListCycleIssues,
  97. )
  98. // ============ Module (读) ============
  99. s.AddTool(
  100. mcp.NewTool("data_plane_v2_list_modules",
  101. mcp.WithDescription("列出项目模块列表(V2 Web API)"),
  102. ),
  103. handlePlaneV2ListModules,
  104. )
  105. s.AddTool(
  106. mcp.NewTool("data_plane_v2_get_module",
  107. mcp.WithDescription("获取模块详情(V2 Web API)"),
  108. mcp.WithString("module_id", mcp.Required(), mcp.Description("模块 UUID")),
  109. ),
  110. handlePlaneV2GetModule,
  111. )
  112. s.AddTool(
  113. mcp.NewTool("data_plane_v2_list_module_issues",
  114. mcp.WithDescription("列出模块中的工作项(V2 Web API)"),
  115. mcp.WithString("module_id", mcp.Required(), mcp.Description("模块 UUID")),
  116. ),
  117. handlePlaneV2ListModuleIssues,
  118. )
  119. // ============ Label (读) ============
  120. s.AddTool(
  121. mcp.NewTool("data_plane_v2_list_labels",
  122. mcp.WithDescription("列出项目标签列表(V2 Web API)"),
  123. ),
  124. handlePlaneV2ListLabels,
  125. )
  126. s.AddTool(
  127. mcp.NewTool("data_plane_v2_get_label",
  128. mcp.WithDescription("获取标签详情(V2 Web API)"),
  129. mcp.WithString("label_id", mcp.Required(), mcp.Description("标签 UUID")),
  130. ),
  131. handlePlaneV2GetLabel,
  132. )
  133. // ============ State (读) ============
  134. s.AddTool(
  135. mcp.NewTool("data_plane_v2_list_states",
  136. mcp.WithDescription("列出项目状态列表(V2 Web API)"),
  137. ),
  138. handlePlaneV2ListStates,
  139. )
  140. s.AddTool(
  141. mcp.NewTool("data_plane_v2_get_state",
  142. mcp.WithDescription("获取状态详情(V2 Web API)"),
  143. mcp.WithString("state_id", mcp.Required(), mcp.Description("状态 UUID")),
  144. ),
  145. handlePlaneV2GetState,
  146. )
  147. // ============ Comment (读) ============
  148. s.AddTool(
  149. mcp.NewTool("data_plane_v2_list_comments",
  150. mcp.WithDescription("列出工作项评论(V2 Web API)"),
  151. mcp.WithString("issue_id", mcp.Required(), mcp.Description("工作项 UUID")),
  152. ),
  153. handlePlaneV2ListComments,
  154. )
  155. s.AddTool(
  156. mcp.NewTool("data_plane_v2_get_comment",
  157. mcp.WithDescription("获取评论详情(V2 Web API)"),
  158. mcp.WithString("issue_id", mcp.Required(), mcp.Description("工作项 UUID")),
  159. mcp.WithString("comment_id", mcp.Required(), mcp.Description("评论 UUID")),
  160. ),
  161. handlePlaneV2GetComment,
  162. )
  163. // ============ Link (读) ============
  164. s.AddTool(
  165. mcp.NewTool("data_plane_v2_list_issue_links",
  166. mcp.WithDescription("列出工作项链接(V2 Web API)"),
  167. mcp.WithString("issue_id", mcp.Required(), mcp.Description("工作项 UUID")),
  168. ),
  169. handlePlaneV2ListIssueLinks,
  170. )
  171. // ============ Relation (读) ============
  172. s.AddTool(
  173. mcp.NewTool("data_plane_v2_list_issue_relations",
  174. mcp.WithDescription("列出工作项关联关系(V2 Web API)"),
  175. mcp.WithString("issue_id", mcp.Required(), mcp.Description("工作项 UUID")),
  176. ),
  177. handlePlaneV2ListIssueRelations,
  178. )
  179. // ============ Sticky (读) ============
  180. s.AddTool(
  181. mcp.NewTool("data_plane_v2_list_stickies",
  182. mcp.WithDescription("列出工作空间便签(V2 Web API)"),
  183. ),
  184. handlePlaneV2ListStickies,
  185. )
  186. s.AddTool(
  187. mcp.NewTool("data_plane_v2_get_sticky",
  188. mcp.WithDescription("获取便签详情(V2 Web API)"),
  189. mcp.WithString("sticky_id", mcp.Required(), mcp.Description("便签 UUID")),
  190. ),
  191. handlePlaneV2GetSticky,
  192. )
  193. // ============ Intake (读) ============
  194. s.AddTool(
  195. mcp.NewTool("data_plane_v2_list_intake_issues",
  196. mcp.WithDescription("列出收件箱工作项(V2 Web API)"),
  197. mcp.WithString("status", mcp.Description("状态过滤")),
  198. ),
  199. handlePlaneV2ListIntakeIssues,
  200. )
  201. s.AddTool(
  202. mcp.NewTool("data_plane_v2_get_intake_issue",
  203. mcp.WithDescription("获取收件箱工作项详情(V2 Web API)"),
  204. mcp.WithString("issue_id", mcp.Required(), mcp.Description("工作项 UUID")),
  205. ),
  206. handlePlaneV2GetIntakeIssue,
  207. )
  208. // ============ Asset (读) ============
  209. s.AddTool(
  210. mcp.NewTool("data_plane_v2_get_project_asset_url",
  211. mcp.WithDescription("获取项目资源的预签名访问 URL(V2 Web API)"),
  212. mcp.WithString("asset_id", mcp.Required(), mcp.Description("资源 UUID")),
  213. ),
  214. handlePlaneV2GetProjectAssetURL,
  215. )
  216. // ============ Page (读) ============
  217. s.AddTool(
  218. mcp.NewTool("data_plane_v2_list_pages",
  219. mcp.WithDescription("列出项目页面列表(V2 Web API)"),
  220. ),
  221. handlePlaneV2ListPages,
  222. )
  223. s.AddTool(
  224. mcp.NewTool("data_plane_v2_get_page",
  225. mcp.WithDescription("获取页面详情(V2 Web API)"),
  226. mcp.WithString("page_id", mcp.Required(), mcp.Description("页面 UUID")),
  227. ),
  228. handlePlaneV2GetPage,
  229. )
  230. s.AddTool(
  231. mcp.NewTool("data_plane_v2_get_page_description",
  232. mcp.WithDescription("获取页面描述内容(V2 Web API)"),
  233. mcp.WithString("page_id", mcp.Required(), mcp.Description("页面 UUID")),
  234. ),
  235. handlePlaneV2GetPageDescription,
  236. )
  237. // ============ Member (读) ============
  238. s.AddTool(
  239. mcp.NewTool("data_plane_v2_list_workspace_members",
  240. mcp.WithDescription("列出工作空间成员(V2 Web API)"),
  241. ),
  242. handlePlaneV2ListWorkspaceMembers,
  243. )
  244. s.AddTool(
  245. mcp.NewTool("data_plane_v2_get_workspace_member",
  246. mcp.WithDescription("获取工作空间成员详情(V2 Web API)"),
  247. mcp.WithString("member_id", mcp.Required(), mcp.Description("成员 UUID")),
  248. ),
  249. handlePlaneV2GetWorkspaceMember,
  250. )
  251. s.AddTool(
  252. mcp.NewTool("data_plane_v2_list_project_members",
  253. mcp.WithDescription("列出项目成员(V2 Web API)"),
  254. ),
  255. handlePlaneV2ListProjectMembers,
  256. )
  257. s.AddTool(
  258. mcp.NewTool("data_plane_v2_get_project_member",
  259. mcp.WithDescription("获取项目成员详情(V2 Web API)"),
  260. mcp.WithString("member_id", mcp.Required(), mcp.Description("成员 UUID")),
  261. ),
  262. handlePlaneV2GetProjectMember,
  263. )
  264. }