Files
gitea-mcp-server/mcp/operation/activity/activity.go
T

192 lines
5.5 KiB
Go

package activity
import (
"context"
"fmt"
"gitea.com/gitea/gitea-mcp/pkg/gitea"
"gitea.com/gitea/gitea-mcp/pkg/log"
"gitea.com/gitea/gitea-mcp/pkg/params"
"gitea.com/gitea/gitea-mcp/pkg/to"
"gitea.com/gitea/gitea-mcp/pkg/tool"
gitea_sdk "code.gitea.io/sdk/gitea"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
const (
ListUserActivityToolName = "list_user_activity"
ListOrgActivityToolName = "list_org_activity"
ListTeamActivityToolName = "list_team_activity"
)
var Tool = tool.New()
var (
ListUserActivityTool = mcp.NewTool(
ListUserActivityToolName,
mcp.WithDescription("List activity/feeds for a user"),
mcp.WithString("username", mcp.Required(), mcp.Description("Username")),
mcp.WithString("date", mcp.Description("Filter by date (YYYY-MM-DD)")),
mcp.WithNumber("page", mcp.Description("page number"), mcp.DefaultNumber(1)),
mcp.WithNumber("perPage", mcp.Description("results per page"), mcp.DefaultNumber(20)),
)
ListOrgActivityTool = mcp.NewTool(
ListOrgActivityToolName,
mcp.WithDescription("List activity/feeds for an organization"),
mcp.WithString("org", mcp.Required(), mcp.Description("Organization name")),
mcp.WithString("date", mcp.Description("Filter by date (YYYY-MM-DD)")),
mcp.WithNumber("page", mcp.Description("page number"), mcp.DefaultNumber(1)),
mcp.WithNumber("perPage", mcp.Description("results per page"), mcp.DefaultNumber(20)),
)
ListTeamActivityTool = mcp.NewTool(
ListTeamActivityToolName,
mcp.WithDescription("List activity/feeds for a team"),
mcp.WithNumber("team_id", mcp.Required(), mcp.Description("Team ID")),
mcp.WithString("date", mcp.Description("Filter by date (YYYY-MM-DD)")),
mcp.WithNumber("page", mcp.Description("page number"), mcp.DefaultNumber(1)),
mcp.WithNumber("perPage", mcp.Description("results per page"), mcp.DefaultNumber(20)),
)
)
func init() {
Tool.RegisterRead(server.ServerTool{
Tool: ListUserActivityTool,
Handler: listUserActivityFn,
})
Tool.RegisterRead(server.ServerTool{
Tool: ListOrgActivityTool,
Handler: listOrgActivityFn,
})
Tool.RegisterRead(server.ServerTool{
Tool: ListTeamActivityTool,
Handler: listTeamActivityFn,
})
}
func listUserActivityFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
log.Debugf("[Activity] Called listUserActivityFn")
args := req.GetArguments()
username, err := params.GetString(args, "username")
if err != nil {
return to.ErrorResult(err)
}
date := params.GetOptionalString(args, "date", "")
page, pageSize := params.GetPagination(args, 20)
client, err := gitea.ClientFromContext(ctx)
if err != nil {
return to.ErrorResult(fmt.Errorf("get gitea client err: %v", err))
}
opt := gitea_sdk.ListUserActivityFeedsOptions{
ListOptions: gitea_sdk.ListOptions{
Page: page,
PageSize: pageSize,
},
Date: date,
}
activities, _, err := client.ListUserActivityFeeds(username, opt)
if err != nil {
return to.ErrorResult(fmt.Errorf("list user activity err: %v", err))
}
return to.TextResult(slimActivities(activities))
}
func listOrgActivityFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
log.Debugf("[Activity] Called listOrgActivityFn")
args := req.GetArguments()
org, err := params.GetString(args, "org")
if err != nil {
return to.ErrorResult(err)
}
date := params.GetOptionalString(args, "date", "")
page, pageSize := params.GetPagination(args, 20)
client, err := gitea.ClientFromContext(ctx)
if err != nil {
return to.ErrorResult(fmt.Errorf("get gitea client err: %v", err))
}
opt := gitea_sdk.ListOrgActivityFeedsOptions{
ListOptions: gitea_sdk.ListOptions{
Page: page,
PageSize: pageSize,
},
Date: date,
}
activities, _, err := client.ListOrgActivityFeeds(org, opt)
if err != nil {
return to.ErrorResult(fmt.Errorf("list org activity err: %v", err))
}
return to.TextResult(slimActivities(activities))
}
func listTeamActivityFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
log.Debugf("[Activity] Called listTeamActivityFn")
args := req.GetArguments()
teamID, err := params.GetIndex(args, "team_id")
if err != nil {
return to.ErrorResult(err)
}
date := params.GetOptionalString(args, "date", "")
page, pageSize := params.GetPagination(args, 20)
client, err := gitea.ClientFromContext(ctx)
if err != nil {
return to.ErrorResult(fmt.Errorf("get gitea client err: %v", err))
}
opt := gitea_sdk.ListTeamActivityFeedsOptions{
ListOptions: gitea_sdk.ListOptions{
Page: page,
PageSize: pageSize,
},
Date: date,
}
activities, _, err := client.ListTeamActivityFeeds(teamID, opt)
if err != nil {
return to.ErrorResult(fmt.Errorf("list team activity err: %v", err))
}
return to.TextResult(slimActivities(activities))
}
func slimActivities(activities []*gitea_sdk.Activity) []map[string]interface{} {
result := make([]map[string]interface{}, len(activities))
for i, a := range activities {
result[i] = slimActivity(a)
}
return result
}
func slimActivity(a *gitea_sdk.Activity) map[string]interface{} {
result := map[string]interface{}{
"id": a.ID,
"op_type": a.OpType,
"content": a.Content,
"repo_id": a.RepoID,
"comment_id": a.CommentID,
"ref_name": a.RefName,
"is_private": a.IsPrivate,
"user_id": a.UserID,
"created": a.Created,
}
if a.Repo != nil {
result["repo_name"] = a.Repo.FullName
}
if a.ActUser != nil {
result["act_user_id"] = a.ActUserID
result["act_user_name"] = a.ActUser.UserName
}
return result
}