user.go
1 package user 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "codeberg.org/goern/forgejo-mcp/v2/pkg/forgejo" 9 "codeberg.org/goern/forgejo-mcp/v2/pkg/log" 10 "codeberg.org/goern/forgejo-mcp/v2/pkg/to" 11 12 "github.com/mark3labs/mcp-go/mcp" 13 "github.com/mark3labs/mcp-go/server" 14 ) 15 16 const ( 17 GetMyUserInfoToolName = "get_my_user_info" 18 ) 19 20 var ( 21 GetMyUserInfoTool = mcp.NewTool( 22 GetMyUserInfoToolName, 23 mcp.WithDescription("Get user info"), 24 ) 25 ) 26 27 func RegisterTool(s *server.MCPServer) { 28 s.AddTool(GetMyUserInfoTool, GetUserInfoFn) 29 s.AddTool(CheckNotificationsTool, CheckNotificationsFn) 30 s.AddTool(GetNotificationThreadTool, GetNotificationThreadFn) 31 s.AddTool(MarkNotificationReadTool, MarkNotificationReadFn) 32 s.AddTool(MarkAllNotificationsReadTool, MarkAllNotificationsReadFn) 33 s.AddTool(ListRepoNotificationsTool, ListRepoNotificationsFn) 34 s.AddTool(MarkRepoNotificationsReadTool, MarkRepoNotificationsReadFn) 35 } 36 37 func GetUserInfoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { 38 ctx, _ = log.WithMCPContext(ctx, GetMyUserInfoToolName) 39 start := time.Now() 40 41 log.LogMCPToolStart(ctx, GetMyUserInfoToolName, map[string]interface{}{}) 42 43 user, resp, err := forgejo.Client().GetMyUserInfo() 44 duration := time.Since(start) 45 46 // Log API call details — guard resp against nil (e.g. network error) 47 statusCode := 0 48 if resp != nil { 49 statusCode = resp.StatusCode 50 } 51 forgejo.LogAPICall(ctx, "GET", "/user", duration, statusCode, err) 52 53 if err != nil { 54 log.LogMCPToolError(ctx, GetMyUserInfoToolName, duration, err) 55 return to.ErrorResult(fmt.Errorf("get user info err: %v", err)) 56 } 57 58 log.LogMCPToolComplete(ctx, GetMyUserInfoToolName, duration, fmt.Sprintf("Retrieved info for user: %s", user.UserName)) 59 60 return to.TextResult(user) 61 }