Initial commit: Gitea MCP Server
This commit is contained in:
@@ -0,0 +1,191 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user