From 59693ffc5d996b69dd6c4097d593f3ec0ec0e42f Mon Sep 17 00:00:00 2001 From: hiifong Date: Sun, 16 Mar 2025 16:33:15 +0800 Subject: [PATCH] feat: add get issue by index --- operation/issue/issue.go | 52 ++++++++++++++++++++++++++++++++++++++++ operation/operation.go | 4 ++++ operation/repo/repo.go | 30 +++++++++++++++++++---- operation/user/user.go | 4 ++-- 4 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 operation/issue/issue.go diff --git a/operation/issue/issue.go b/operation/issue/issue.go new file mode 100644 index 0000000..f255c07 --- /dev/null +++ b/operation/issue/issue.go @@ -0,0 +1,52 @@ +package issue + +import ( + "context" + "encoding/json" + "fmt" + + "gitea.com/gitea/gitea-mcp/pkg/gitea" + "github.com/mark3labs/mcp-go/mcp" +) + +const ( + GetIssueByIndexToolName = "get_issue_by_index" +) + +var ( + GetIssueByIndexTool = mcp.NewTool( + GetIssueByIndexToolName, + mcp.WithDescription("get issue by index"), + mcp.WithString( + "owner", + mcp.Required(), + mcp.Description("repository owner"), + ), + mcp.WithString( + "repo", + mcp.Required(), + mcp.Description("repository name"), + ), + mcp.WithNumber( + "index", + mcp.Required(), + mcp.Description("repository issue index"), + ), + ) +) + +func GetIssueByIndexFn(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + owner := request.Params.Arguments["owner"].(string) + repo := request.Params.Arguments["repo"].(string) + index := request.Params.Arguments["index"].(float64) + issue, _, err := gitea.Client().GetIssue(owner, repo, int64(index)) + if err != nil { + return mcp.NewToolResultError(fmt.Sprintf("get %v/%v/issue/%v err", owner, repo, int64(index))), err + } + + result, err := json.Marshal(issue) + if err != nil { + return mcp.NewToolResultError("marshal issue err"), err + } + return mcp.NewToolResultText(string(result)), nil +} diff --git a/operation/operation.go b/operation/operation.go index 23deb29..d4885f0 100644 --- a/operation/operation.go +++ b/operation/operation.go @@ -3,6 +3,7 @@ package operation import ( "fmt" + "gitea.com/gitea/gitea-mcp/operation/issue" "gitea.com/gitea/gitea-mcp/operation/repo" "gitea.com/gitea/gitea-mcp/operation/user" "gitea.com/gitea/gitea-mcp/operation/version" @@ -22,6 +23,9 @@ func RegisterTool(s *server.MCPServer) { // Repo Tool s.AddTool(repo.ListMyReposTool, repo.ListMyReposFn) + // Issue Tool + s.AddTool(issue.GetIssueByIndexTool, issue.GetIssueByIndexFn) + // Version Tool s.AddTool(version.GetGiteaMCPServerVersionTool, version.GetGiteaMCPServerVersionFn) } diff --git a/operation/repo/repo.go b/operation/repo/repo.go index c26d8fb..3d106cf 100644 --- a/operation/repo/repo.go +++ b/operation/repo/repo.go @@ -16,25 +16,45 @@ const ( var ( ListMyReposTool = mcp.NewTool( ListMyReposToolName, - mcp.WithDescription("List My Repositories"), + mcp.WithDescription("List my repositories"), + mcp.WithNumber( + "page", + mcp.Description("Page number"), + mcp.DefaultNumber(1), + mcp.Min(1), + ), + mcp.WithNumber( + "pageSize", + mcp.Description("Page size number"), + mcp.DefaultNumber(10), + mcp.Min(1), + ), ) ) func ListMyReposFn(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + page, ok := request.Params.Arguments["page"].(float64) + if !ok { + return mcp.NewToolResultError("get page number error"), nil + } + size, ok := request.Params.Arguments["pageSize"].(float64) + if !ok { + return mcp.NewToolResultError("get page size number error"), nil + } opts := gitea.ListReposOptions{ ListOptions: gitea.ListOptions{ - Page: 1, - PageSize: 100, + Page: int(page), + PageSize: int(size), }, } repos, _, err := giteaPkg.Client().ListMyRepos(opts) if err != nil { - return mcp.NewToolResultError("Get My User Info Error"), err + return mcp.NewToolResultError("List my repositories error"), err } result, err := json.Marshal(repos) if err != nil { - return mcp.NewToolResultError("Get My User Info Error"), err + return mcp.NewToolResultError("marshal repository list error"), err } return mcp.NewToolResultText(string(result)), nil } diff --git a/operation/user/user.go b/operation/user/user.go index f40acfb..1ec87dd 100644 --- a/operation/user/user.go +++ b/operation/user/user.go @@ -16,7 +16,7 @@ const ( var ( GetMyUserInfoTool = mcp.NewTool( GetMyUserInfoToolName, - mcp.WithDescription("Get My User Info"), + mcp.WithDescription("Get my user info"), ) ) @@ -28,7 +28,7 @@ func GetUserInfoFn(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallT result, err := json.Marshal(user) if err != nil { - return mcp.NewToolResultError("Get My User Info Error"), err + return mcp.NewToolResultError("marshal my user info error"), err } return mcp.NewToolResultText(string(result)), nil }