plane.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package tools
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/mark3labs/mcp-go/mcp"
  7. "github.com/mark3labs/mcp-go/server"
  8. "fwh-toolbox-server/dto"
  9. "fwh-toolbox-server/services"
  10. )
  11. func RegisterPlaneTools(s *server.MCPServer) {
  12. // Tool: 创建反馈
  13. s.AddTool(
  14. mcp.NewTool("create_feedback",
  15. mcp.WithDescription("在 Plane 创建 Intake Issue(问题反馈或需求提交)"),
  16. mcp.WithString("title", mcp.Required(), mcp.Description("标题")),
  17. mcp.WithString("type", mcp.Required(), mcp.Description("类型:bug 或 feature")),
  18. mcp.WithString("priority", mcp.Description("优先级:urgent, high, medium, low, none(默认 medium)")),
  19. mcp.WithString("description", mcp.Description("详细描述")),
  20. mcp.WithString("category", mcp.Description("分类:bug类(bug,ui,performance,other) / feature类(new,improvement,experience)")),
  21. ),
  22. handleCreateFeedback,
  23. )
  24. // Tool: 查询反馈历史
  25. s.AddTool(
  26. mcp.NewTool("query_feedback_history",
  27. mcp.WithDescription("查询 Plane Intake Issue 提交历史(带 Feedback 标签的记录)"),
  28. ),
  29. handleQueryFeedbackHistory,
  30. )
  31. }
  32. func handleCreateFeedback(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  33. title, err := req.RequireString("title")
  34. if err != nil {
  35. return mcp.NewToolResultError("参数 title 必填"), nil
  36. }
  37. feedbackType, err := req.RequireString("type")
  38. if err != nil {
  39. return mcp.NewToolResultError("参数 type 必填"), nil
  40. }
  41. if feedbackType != "bug" && feedbackType != "feature" {
  42. return mcp.NewToolResultError("type 必须是 bug 或 feature"), nil
  43. }
  44. priority := req.GetString("priority", "medium")
  45. description := req.GetString("description", "")
  46. category := req.GetString("category", "")
  47. body := dto.FeedbackSubmitDTO{
  48. Title: title,
  49. Type: feedbackType,
  50. Priority: priority,
  51. Description: description,
  52. Category: category,
  53. }
  54. result, err := services.SubmitFeedback(body, "MCP-Agent")
  55. if err != nil {
  56. return mcp.NewToolResultError(fmt.Sprintf("创建失败: %v", err)), nil
  57. }
  58. jsonBytes, _ := json.MarshalIndent(result, "", " ")
  59. return mcp.NewToolResultText(string(jsonBytes)), nil
  60. }
  61. func handleQueryFeedbackHistory(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  62. data, err := services.GetFeedbackHistory("")
  63. if err != nil {
  64. return mcp.NewToolResultError(fmt.Sprintf("查询失败: %v", err)), nil
  65. }
  66. jsonBytes, _ := json.MarshalIndent(data, "", " ")
  67. return mcp.NewToolResultText(string(jsonBytes)), nil
  68. }