/ operation / user / user.go
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  }