diff --git a/README.md b/README.md index 6613214..5cd977f 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,7 @@ The Gitea MCP Server supports the following tools: | Tool | Scope | Description | | :--------------------------: | :----------: | :---------------------------------------------------: | | get_my_user_info | User | Get the information of the authenticated user | +| get_user_orgs | User | Get organizations associated with the authenticated user | | create_repo | Repository | Create a new repository | | fork_repo | Repository | Fork a repository | | list_my_repos | Repository | List all repositories owned by the authenticated user | diff --git a/operation/user/user.go b/operation/user/user.go index 149c497..8aa4923 100644 --- a/operation/user/user.go +++ b/operation/user/user.go @@ -8,12 +8,14 @@ import ( "gitea.com/gitea/gitea-mcp/pkg/log" "gitea.com/gitea/gitea-mcp/pkg/to" + gitea_sdk "code.gitea.io/sdk/gitea" "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" ) const ( GetMyUserInfoToolName = "get_my_user_info" + GetUserOrgsToolName = "get_user_orgs" ) var ( @@ -21,10 +23,18 @@ var ( GetMyUserInfoToolName, mcp.WithDescription("Get my user info"), ) + + GetUserOrgsTool = mcp.NewTool( + GetUserOrgsToolName, + mcp.WithDescription("Get organizations associated with the authenticated user"), + mcp.WithNumber("page", mcp.Description("page number"), mcp.DefaultNumber(1)), + mcp.WithNumber("pageSize", mcp.Description("page size"), mcp.DefaultNumber(100)), + ) ) func RegisterTool(s *server.MCPServer) { s.AddTool(GetMyUserInfoTool, GetUserInfoFn) + s.AddTool(GetUserOrgsTool, GetUserOrgsFn) } func GetUserInfoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { @@ -36,3 +46,27 @@ func GetUserInfoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolR return to.TextResult(user) } + +func GetUserOrgsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { + log.Debugf("Called GetUserOrgsFn") + page, ok := req.Params.Arguments["page"].(float64) + if !ok || page < 1 { + page = 1 + } + pageSize, ok := req.Params.Arguments["pageSize"].(float64) + if !ok || pageSize < 1 { + pageSize = 100 + } + opt := gitea_sdk.ListOrgsOptions{ + ListOptions: gitea_sdk.ListOptions{ + Page: int(page), + PageSize: int(pageSize), + }, + } + orgs, _, err := gitea.Client().ListMyOrgs(opt) + if err != nil { + return to.ErrorResult(fmt.Errorf("get user orgs err: %v", err)) + } + + return to.TextResult(orgs) +}