Add field_values to search_issues results · github/github-mcp-server@dca2621 · GitHub
Skip to content

Commit dca2621

Browse files
authored
Add field_values to search_issues results
1 parent cc2a957 commit dca2621

3 files changed

Lines changed: 260 additions & 21 deletions

File tree

pkg/github/issues.go

Lines changed: 137 additions & 1 deletion

pkg/github/issues_test.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -975,6 +975,100 @@ func unmarshalIFC(t *testing.T, ifcLabel any) map[string]any {
975975
return ifcMap
976976
}
977977

978+
func Test_SearchIssues_FieldValuesEnrichment(t *testing.T) {
979+
serverTool := SearchIssues(translations.NullTranslationHelper)
980+
981+
mockSearchResult := &github.IssuesSearchResult{
982+
Total: github.Ptr(2),
983+
IncompleteResults: github.Ptr(false),
984+
Issues: []*github.Issue{
985+
{
986+
Number: github.Ptr(42),
987+
Title: github.Ptr("Bug: Something is broken"),
988+
State: github.Ptr("open"),
989+
HTMLURL: github.Ptr("https://github.com/owner/repo/issues/42"),
990+
NodeID: github.Ptr("I_node_42"),
991+
User: &github.User{Login: github.Ptr("user1")},
992+
},
993+
{
994+
Number: github.Ptr(43),
995+
Title: github.Ptr("Feature request"),
996+
State: github.Ptr("open"),
997+
HTMLURL: github.Ptr("https://github.com/owner/repo/issues/43"),
998+
NodeID: github.Ptr("I_node_43"),
999+
User: &github.User{Login: github.Ptr("user2")},
1000+
},
1001+
},
1002+
}
1003+
1004+
restClient := MockHTTPClientWithHandlers(map[string]http.HandlerFunc{
1005+
GetSearchIssues: mockResponse(t, http.StatusOK, mockSearchResult),
1006+
})
1007+
1008+
gqlVars := map[string]any{
1009+
"ids": []any{"I_node_42", "I_node_43"},
1010+
}
1011+
gqlResponse := githubv4mock.DataResponse(map[string]any{
1012+
"nodes": []map[string]any{
1013+
{
1014+
"id": "I_node_42",
1015+
"issueFieldValues": map[string]any{
1016+
"nodes": []map[string]any{
1017+
{
1018+
"__typename": "IssueFieldSingleSelectValue",
1019+
"field": map[string]any{"name": "priority"},
1020+
"value": "P1",
1021+
},
1022+
{
1023+
"__typename": "IssueFieldNumberValue",
1024+
"field": map[string]any{"name": "estimate"},
1025+
"valueNumber": 2.5,
1026+
},
1027+
},
1028+
},
1029+
},
1030+
{
1031+
"id": "I_node_43",
1032+
"issueFieldValues": map[string]any{
1033+
"nodes": []map[string]any{},
1034+
},
1035+
},
1036+
},
1037+
})
1038+
1039+
const nodesQueryString = "query($ids:[ID!]!){nodes(ids: $ids){... on Issue{id,issueFieldValues(first: 25){nodes{__typename,... on IssueFieldDateValue{field{... on IssueFieldDate{name},... on IssueFieldNumber{name},... on IssueFieldSingleSelect{name},... on IssueFieldText{name}},value},... on IssueFieldNumberValue{field{... on IssueFieldDate{name},... on IssueFieldNumber{name},... on IssueFieldSingleSelect{name},... on IssueFieldText{name}},valueNumber: value},... on IssueFieldSingleSelectValue{field{... on IssueFieldDate{name},... on IssueFieldNumber{name},... on IssueFieldSingleSelect{name},... on IssueFieldText{name}},value},... on IssueFieldTextValue{field{... on IssueFieldDate{name},... on IssueFieldNumber{name},... on IssueFieldSingleSelect{name},... on IssueFieldText{name}},value}}}}}}"
1040+
matcher := githubv4mock.NewQueryMatcher(nodesQueryString, gqlVars, gqlResponse)
1041+
gqlClient := githubv4.NewClient(githubv4mock.NewMockedHTTPClient(matcher))
1042+
1043+
deps := BaseDeps{
1044+
Client: mustNewGHClient(t, restClient),
1045+
GQLClient: gqlClient,
1046+
}
1047+
handler := serverTool.Handler(deps)
1048+
1049+
request := createMCPRequest(map[string]any{
1050+
"query": "repo:owner/repo is:open",
1051+
})
1052+
1053+
result, err := handler(ContextWithDeps(context.Background(), deps), &request)
1054+
require.NoError(t, err)
1055+
require.False(t, result.IsError, "expected result to not be an error")
1056+
1057+
textContent := getTextResult(t, result)
1058+
1059+
var response SearchIssuesResponse
1060+
require.NoError(t, json.Unmarshal([]byte(textContent.Text), &response))
1061+
require.Equal(t, 2, *response.Total)
1062+
require.Len(t, response.Items, 2)
1063+
assert.Equal(t, 42, *response.Items[0].Number)
1064+
assert.Equal(t, []MinimalIssueFieldValue{
1065+
{Field: "priority", Value: "P1"},
1066+
{Field: "estimate", Value: "2.5"},
1067+
}, response.Items[0].FieldValues)
1068+
assert.Equal(t, 43, *response.Items[1].Number)
1069+
assert.Empty(t, response.Items[1].FieldValues)
1070+
}
1071+
9781072
func Test_CreateIssue(t *testing.T) {
9791073
// Verify tool definition once
9801074
serverTool := IssueWrite(translations.NullTranslationHelper)

pkg/github/search_utils.go

Lines changed: 29 additions & 20 deletions

0 commit comments

Comments
 (0)