Skip to content

Commit f53c32d

Browse files
cleanup search_users response
1 parent 8854b2a commit f53c32d

File tree

2 files changed

+54
-21
lines changed

2 files changed

+54
-21
lines changed

pkg/github/search.go

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,20 @@ func SearchCode(getClient GetClientFn, t translations.TranslationHelperFunc) (to
146146
}
147147
}
148148

149+
type MinimalUser struct {
150+
Login string `json:"login"`
151+
ID int64 `json:"id,omitempty"`
152+
ProfileURL string `json:"profile_url,omitempty"`
153+
AvatarURL string `json:"avatar_url,omitempty"`
154+
}
155+
156+
// Build a response struct similar to the real GitHub search users response
157+
type MinimalSearchUsersResult struct {
158+
TotalCount int `json:"total_count"`
159+
IncompleteResults bool `json:"incomplete_results"`
160+
Items []MinimalUser `json:"items"`
161+
}
162+
149163
// SearchUsers creates a tool to search for GitHub users.
150164
func SearchUsers(getClient GetClientFn, t translations.TranslationHelperFunc) (tool mcp.Tool, handler server.ToolHandlerFunc) {
151165
return mcp.NewTool("search_users",
@@ -200,7 +214,7 @@ func SearchUsers(getClient GetClientFn, t translations.TranslationHelperFunc) (t
200214
return nil, fmt.Errorf("failed to get GitHub client: %w", err)
201215
}
202216

203-
result, resp, err := client.Search.Users(ctx, query, opts)
217+
result, resp, err := client.Search.Users(ctx, "type:user "+query, opts)
204218
if err != nil {
205219
return nil, fmt.Errorf("failed to search users: %w", err)
206220
}
@@ -214,11 +228,37 @@ func SearchUsers(getClient GetClientFn, t translations.TranslationHelperFunc) (t
214228
return mcp.NewToolResultError(fmt.Sprintf("failed to search users: %s", string(body))), nil
215229
}
216230

217-
r, err := json.Marshal(result)
231+
minimalUsers := make([]MinimalUser, 0, len(result.Users))
232+
for _, user := range result.Users {
233+
if user.Login != nil {
234+
mu := MinimalUser{Login: *user.Login}
235+
if user.ID != nil {
236+
mu.ID = *user.ID
237+
}
238+
if user.HTMLURL != nil {
239+
mu.ProfileURL = *user.HTMLURL
240+
}
241+
if user.AvatarURL != nil {
242+
mu.AvatarURL = *user.AvatarURL
243+
}
244+
minimalUsers = append(minimalUsers, mu)
245+
}
246+
}
247+
minimalResp := MinimalSearchUsersResult{
248+
TotalCount: result.GetTotal(),
249+
IncompleteResults: result.GetIncompleteResults(),
250+
Items: minimalUsers,
251+
}
252+
if result.Total != nil {
253+
minimalResp.TotalCount = *result.Total
254+
}
255+
if result.IncompleteResults != nil {
256+
minimalResp.IncompleteResults = *result.IncompleteResults
257+
}
258+
r, err := json.Marshal(minimalResp)
218259
if err != nil {
219260
return nil, fmt.Errorf("failed to marshal response: %w", err)
220261
}
221-
222262
return mcp.NewToolResultText(string(r)), nil
223263
}
224264
}

pkg/github/search_test.go

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -335,18 +335,13 @@ func Test_SearchUsers(t *testing.T) {
335335
ID: github.Ptr(int64(1001)),
336336
HTMLURL: github.Ptr("https://github.com/user1"),
337337
AvatarURL: github.Ptr("https://avatars.githubusercontent.com/u/1001"),
338-
Type: github.Ptr("User"),
339-
Followers: github.Ptr(100),
340-
Following: github.Ptr(50),
341338
},
342339
{
343340
Login: github.Ptr("user2"),
344341
ID: github.Ptr(int64(1002)),
345342
HTMLURL: github.Ptr("https://github.com/user2"),
346343
AvatarURL: github.Ptr("https://avatars.githubusercontent.com/u/1002"),
347344
Type: github.Ptr("User"),
348-
Followers: github.Ptr(200),
349-
Following: github.Ptr(75),
350345
},
351346
},
352347
}
@@ -365,7 +360,7 @@ func Test_SearchUsers(t *testing.T) {
365360
mock.WithRequestMatchHandler(
366361
mock.GetSearchUsers,
367362
expectQueryParams(t, map[string]string{
368-
"q": "location:finland language:go",
363+
"q": "type:user location:finland language:go",
369364
"sort": "followers",
370365
"order": "desc",
371366
"page": "1",
@@ -391,7 +386,7 @@ func Test_SearchUsers(t *testing.T) {
391386
mock.WithRequestMatchHandler(
392387
mock.GetSearchUsers,
393388
expectQueryParams(t, map[string]string{
394-
"q": "location:finland language:go",
389+
"q": "type:user location:finland language:go",
395390
"page": "1",
396391
"per_page": "30",
397392
}).andThen(
@@ -451,19 +446,17 @@ func Test_SearchUsers(t *testing.T) {
451446
textContent := getTextResult(t, result)
452447

453448
// Unmarshal and verify the result
454-
var returnedResult github.UsersSearchResult
449+
var returnedResult MinimalSearchUsersResult
455450
err = json.Unmarshal([]byte(textContent.Text), &returnedResult)
456451
require.NoError(t, err)
457-
assert.Equal(t, *tc.expectedResult.Total, *returnedResult.Total)
458-
assert.Equal(t, *tc.expectedResult.IncompleteResults, *returnedResult.IncompleteResults)
459-
assert.Len(t, returnedResult.Users, len(tc.expectedResult.Users))
460-
for i, user := range returnedResult.Users {
461-
assert.Equal(t, *tc.expectedResult.Users[i].Login, *user.Login)
462-
assert.Equal(t, *tc.expectedResult.Users[i].ID, *user.ID)
463-
assert.Equal(t, *tc.expectedResult.Users[i].HTMLURL, *user.HTMLURL)
464-
assert.Equal(t, *tc.expectedResult.Users[i].AvatarURL, *user.AvatarURL)
465-
assert.Equal(t, *tc.expectedResult.Users[i].Type, *user.Type)
466-
assert.Equal(t, *tc.expectedResult.Users[i].Followers, *user.Followers)
452+
assert.Equal(t, *tc.expectedResult.Total, returnedResult.TotalCount)
453+
assert.Equal(t, *tc.expectedResult.IncompleteResults, returnedResult.IncompleteResults)
454+
assert.Len(t, returnedResult.Items, len(tc.expectedResult.Users))
455+
for i, user := range returnedResult.Items {
456+
assert.Equal(t, *tc.expectedResult.Users[i].Login, user.Login)
457+
assert.Equal(t, *tc.expectedResult.Users[i].ID, user.ID)
458+
assert.Equal(t, *tc.expectedResult.Users[i].HTMLURL, user.ProfileURL)
459+
assert.Equal(t, *tc.expectedResult.Users[i].AvatarURL, user.AvatarURL)
467460
}
468461
})
469462
}

0 commit comments

Comments
 (0)