package user import ( "context" "errors" "fmt" "git.lethalbits.com/lethalbits/gitea-mcp-extended/pkg/gitea" "git.lethalbits.com/lethalbits/gitea-mcp-extended/pkg/log" "git.lethalbits.com/lethalbits/gitea-mcp-extended/pkg/to" gitea_sdk "code.gitea.io/sdk/gitea" "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" ) const ( GetUserInfoToolName = "get_user_info" GetUserSettingsToolName = "get_user_settings" UpdateUserSettingsToolName = "update_user_settings" ) var ( GetUserInfoTool = mcp.NewTool( GetUserInfoToolName, mcp.WithDescription("Get a user's public information by username"), mcp.WithString("username", mcp.Required(), mcp.Description("username")), ) GetUserSettingsTool = mcp.NewTool( GetUserSettingsToolName, mcp.WithDescription("Get the authenticated user's settings"), ) UpdateUserSettingsTool = mcp.NewTool( UpdateUserSettingsToolName, mcp.WithDescription("Update the authenticated user's settings"), mcp.WithString("full_name", mcp.Description("full name")), mcp.WithString("description", mcp.Description("user bio/description")), mcp.WithString("website", mcp.Description("website URL")), mcp.WithString("location", mcp.Description("location")), mcp.WithString("language", mcp.Description("language preference")), mcp.WithString("theme", mcp.Description("UI theme")), mcp.WithBoolean("hide_email", mcp.Description("hide email from profile")), mcp.WithBoolean("hide_activity", mcp.Description("hide activity from profile")), ) ) func init() { Tool.RegisterRead(server.ServerTool{Tool: GetUserInfoTool, Handler: GetUserByNameFn}) Tool.RegisterRead(server.ServerTool{Tool: GetUserSettingsTool, Handler: GetUserSettingsFn}) Tool.RegisterWrite(server.ServerTool{Tool: UpdateUserSettingsTool, Handler: UpdateUserSettingsFn}) } func GetUserByNameFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called GetUserByNameFn") username, ok := req.GetArguments()["username"].(string) if !ok { return to.ErrorResult(errors.New("username is required")) } client, err := gitea.ClientFromContext(ctx) if err != nil { return to.ErrorResult(fmt.Errorf("get gitea client err: %v", err)) } user, _, err := client.GetUserInfo(username) if err != nil { return to.ErrorResult(fmt.Errorf("get user %s err: %v", username, err)) } return to.TextResult(user) } func GetUserSettingsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called GetUserSettingsFn") client, err := gitea.ClientFromContext(ctx) if err != nil { return to.ErrorResult(fmt.Errorf("get gitea client err: %v", err)) } settings, _, err := client.GetUserSettings() if err != nil { return to.ErrorResult(fmt.Errorf("get user settings err: %v", err)) } return to.TextResult(settings) } func UpdateUserSettingsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called UpdateUserSettingsFn") opt := gitea_sdk.UserSettingsOptions{} if v, ok := req.GetArguments()["full_name"].(string); ok { opt.FullName = &v } if v, ok := req.GetArguments()["description"].(string); ok { opt.Description = &v } if v, ok := req.GetArguments()["website"].(string); ok { opt.Website = &v } if v, ok := req.GetArguments()["location"].(string); ok { opt.Location = &v } if v, ok := req.GetArguments()["language"].(string); ok { opt.Language = &v } if v, ok := req.GetArguments()["theme"].(string); ok { opt.Theme = &v } if v, ok := req.GetArguments()["hide_email"].(bool); ok { opt.HideEmail = &v } if v, ok := req.GetArguments()["hide_activity"].(bool); ok { opt.HideActivity = &v } client, err := gitea.ClientFromContext(ctx) if err != nil { return to.ErrorResult(fmt.Errorf("get gitea client err: %v", err)) } settings, _, err := client.UpdateUserSettings(opt) if err != nil { return to.ErrorResult(fmt.Errorf("update user settings err: %v", err)) } return to.TextResult(settings) }