Skip to content

Commit ba785d2

Browse files
committed
add comprehensive minimal response where appropriate
1 parent 0418808 commit ba785d2

15 files changed

+607
-202
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,7 @@ The following sets of tools are available (all are on by default):
830830
- `repo`: Repository name (string, required)
831831

832832
- **get_commit** - Get commit details
833+
- `include_diff`: Whether to include file diffs and stats in the response. Default is true for single commit queries. (boolean, optional)
833834
- `owner`: Repository owner (string, required)
834835
- `page`: Page number for pagination (min 1) (number, optional)
835836
- `perPage`: Results per page for pagination (min 1, max 100) (number, optional)
@@ -865,6 +866,7 @@ The following sets of tools are available (all are on by default):
865866

866867
- **list_commits** - List commits
867868
- `author`: Author username or email address to filter commits by (string, optional)
869+
- `include_diffs`: Whether to include file diffs and stats in the response. Default is false for faster responses. (boolean, optional)
868870
- `owner`: Repository owner (string, required)
869871
- `page`: Page number for pagination (min 1) (number, optional)
870872
- `perPage`: Results per page for pagination (min 1, max 100) (number, optional)
@@ -898,6 +900,7 @@ The following sets of tools are available (all are on by default):
898900
- `sort`: Sort field ('indexed' only) (string, optional)
899901

900902
- **search_repositories** - Search repositories
903+
- `minimal_output`: Return minimal repository information (default: true). When false, returns full GitHub API repository objects. (boolean, optional)
901904
- `page`: Page number for pagination (min 1) (number, optional)
902905
- `perPage`: Results per page for pagination (min 1, max 100) (number, optional)
903906
- `query`: Repository search query. Examples: 'machine learning in:name stars:>1000 language:python', 'topic:react', 'user:facebook'. Supports advanced search syntax for precise filtering. (string, required)

pkg/github/__toolsnaps__/get_commit.snap

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
"description": "Get details for a commit from a GitHub repository",
77
"inputSchema": {
88
"properties": {
9+
"include_diff": {
10+
"description": "Whether to include file diffs and stats in the response. Default is true for single commit queries.",
11+
"type": "boolean"
12+
},
913
"owner": {
1014
"description": "Repository owner",
1115
"type": "string"

pkg/github/__toolsnaps__/list_commits.snap

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
"description": "Author username or email address to filter commits by",
1111
"type": "string"
1212
},
13+
"include_diffs": {
14+
"description": "Whether to include file diffs and stats in the response. Default is false for faster responses.",
15+
"type": "boolean"
16+
},
1317
"owner": {
1418
"description": "Repository owner",
1519
"type": "string"

pkg/github/__toolsnaps__/search_repositories.snap

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66
"description": "Find GitHub repositories by name, description, readme, topics, or other metadata. Perfect for discovering projects, finding examples, or locating specific repositories across GitHub.",
77
"inputSchema": {
88
"properties": {
9+
"minimal_output": {
10+
"default": true,
11+
"description": "Return minimal repository information (default: true). When false, returns full GitHub API repository objects.",
12+
"type": "boolean"
13+
},
914
"page": {
1015
"description": "Page number for pagination (min 1)",
1116
"minimum": 1,

pkg/github/gists.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,14 @@ func CreateGist(getClient GetClientFn, t translations.TranslationHelperFunc) (to
165165
return mcp.NewToolResultError(fmt.Sprintf("failed to create gist: %s", string(body))), nil
166166
}
167167

168-
r, err := json.Marshal(createdGist)
168+
minimalResponse := MinimalGistResponse{
169+
URL: createdGist.GetHTMLURL(),
170+
ID: createdGist.GetID(),
171+
Description: createdGist.GetDescription(),
172+
Public: createdGist.GetPublic(),
173+
}
174+
175+
r, err := json.Marshal(minimalResponse)
169176
if err != nil {
170177
return nil, fmt.Errorf("failed to marshal response: %w", err)
171178
}
@@ -249,7 +256,13 @@ func UpdateGist(getClient GetClientFn, t translations.TranslationHelperFunc) (to
249256
return mcp.NewToolResultError(fmt.Sprintf("failed to update gist: %s", string(body))), nil
250257
}
251258

252-
r, err := json.Marshal(updatedGist)
259+
minimalResponse := MinimalUpdateResponse{
260+
URL: updatedGist.GetHTMLURL(),
261+
Updated: true,
262+
Message: "Gist updated successfully",
263+
}
264+
265+
r, err := json.Marshal(minimalResponse)
253266
if err != nil {
254267
return nil, fmt.Errorf("failed to marshal response: %w", err)
255268
}

pkg/github/gists_test.go

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -321,23 +321,13 @@ func Test_CreateGist(t *testing.T) {
321321
// Parse the result and get the text content
322322
textContent := getTextResult(t, result)
323323

324-
// Unmarshal and verify the result
325-
var gist *github.Gist
324+
// Unmarshal and verify the minimal result
325+
var gist MinimalGistResponse
326326
err = json.Unmarshal([]byte(textContent.Text), &gist)
327327
require.NoError(t, err)
328328

329-
assert.Equal(t, *tc.expectedGist.ID, *gist.ID)
330-
assert.Equal(t, *tc.expectedGist.Description, *gist.Description)
331-
assert.Equal(t, *tc.expectedGist.HTMLURL, *gist.HTMLURL)
332-
assert.Equal(t, *tc.expectedGist.Public, *gist.Public)
333-
334-
// Verify file content
335-
for filename, expectedFile := range tc.expectedGist.Files {
336-
actualFile, exists := gist.Files[filename]
337-
assert.True(t, exists)
338-
assert.Equal(t, *expectedFile.Filename, *actualFile.Filename)
339-
assert.Equal(t, *expectedFile.Content, *actualFile.Content)
340-
}
329+
assert.Equal(t, tc.expectedGist.GetID(), gist.ID)
330+
assert.Equal(t, tc.expectedGist.GetHTMLURL(), gist.URL)
341331
})
342332
}
343333
}
@@ -486,22 +476,13 @@ func Test_UpdateGist(t *testing.T) {
486476
// Parse the result and get the text content
487477
textContent := getTextResult(t, result)
488478

489-
// Unmarshal and verify the result
490-
var gist *github.Gist
491-
err = json.Unmarshal([]byte(textContent.Text), &gist)
479+
// Unmarshal and verify the minimal result
480+
var updateResp MinimalUpdateResponse
481+
err = json.Unmarshal([]byte(textContent.Text), &updateResp)
492482
require.NoError(t, err)
493483

494-
assert.Equal(t, *tc.expectedGist.ID, *gist.ID)
495-
assert.Equal(t, *tc.expectedGist.Description, *gist.Description)
496-
assert.Equal(t, *tc.expectedGist.HTMLURL, *gist.HTMLURL)
497-
498-
// Verify file content
499-
for filename, expectedFile := range tc.expectedGist.Files {
500-
actualFile, exists := gist.Files[filename]
501-
assert.True(t, exists)
502-
assert.Equal(t, *expectedFile.Filename, *actualFile.Filename)
503-
assert.Equal(t, *expectedFile.Content, *actualFile.Content)
504-
}
484+
assert.Equal(t, tc.expectedGist.GetHTMLURL(), updateResp.URL)
485+
assert.Equal(t, true, updateResp.Updated)
505486
})
506487
}
507488
}

pkg/github/issues.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -872,7 +872,15 @@ func CreateIssue(getClient GetClientFn, t translations.TranslationHelperFunc) (t
872872
return mcp.NewToolResultError(fmt.Sprintf("failed to create issue: %s", string(body))), nil
873873
}
874874

875-
r, err := json.Marshal(issue)
875+
// Return minimal response with just essential information
876+
minimalResponse := MinimalIssueResponse{
877+
URL: issue.GetHTMLURL(),
878+
Number: issue.GetNumber(),
879+
State: issue.GetState(),
880+
Title: issue.GetTitle(),
881+
}
882+
883+
r, err := json.Marshal(minimalResponse)
876884
if err != nil {
877885
return nil, fmt.Errorf("failed to marshal response: %w", err)
878886
}
@@ -1242,7 +1250,14 @@ func UpdateIssue(getClient GetClientFn, t translations.TranslationHelperFunc) (t
12421250
return mcp.NewToolResultError(fmt.Sprintf("failed to update issue: %s", string(body))), nil
12431251
}
12441252

1245-
r, err := json.Marshal(updatedIssue)
1253+
// Return minimal response with just essential information
1254+
minimalResponse := MinimalUpdateResponse{
1255+
URL: updatedIssue.GetHTMLURL(),
1256+
Updated: true,
1257+
Message: "Issue updated successfully",
1258+
}
1259+
1260+
r, err := json.Marshal(minimalResponse)
12461261
if err != nil {
12471262
return nil, fmt.Errorf("failed to marshal response: %w", err)
12481263
}

pkg/github/issues_test.go

Lines changed: 11 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -712,39 +712,15 @@ func Test_CreateIssue(t *testing.T) {
712712
require.NoError(t, err)
713713
textContent := getTextResult(t, result)
714714

715-
// Unmarshal and verify the result
716-
var returnedIssue github.Issue
715+
// Unmarshal and verify the minimal result
716+
var returnedIssue MinimalIssueResponse
717717
err = json.Unmarshal([]byte(textContent.Text), &returnedIssue)
718718
require.NoError(t, err)
719719

720-
assert.Equal(t, *tc.expectedIssue.Number, *returnedIssue.Number)
721-
assert.Equal(t, *tc.expectedIssue.Title, *returnedIssue.Title)
722-
assert.Equal(t, *tc.expectedIssue.State, *returnedIssue.State)
723-
assert.Equal(t, *tc.expectedIssue.HTMLURL, *returnedIssue.HTMLURL)
724-
725-
if tc.expectedIssue.Body != nil {
726-
assert.Equal(t, *tc.expectedIssue.Body, *returnedIssue.Body)
727-
}
728-
729-
if tc.expectedIssue.Type != nil {
730-
assert.Equal(t, *tc.expectedIssue.Type.Name, *returnedIssue.Type.Name)
731-
}
732-
733-
// Check assignees if expected
734-
if len(tc.expectedIssue.Assignees) > 0 {
735-
assert.Equal(t, len(tc.expectedIssue.Assignees), len(returnedIssue.Assignees))
736-
for i, assignee := range returnedIssue.Assignees {
737-
assert.Equal(t, *tc.expectedIssue.Assignees[i].Login, *assignee.Login)
738-
}
739-
}
740-
741-
// Check labels if expected
742-
if len(tc.expectedIssue.Labels) > 0 {
743-
assert.Equal(t, len(tc.expectedIssue.Labels), len(returnedIssue.Labels))
744-
for i, label := range returnedIssue.Labels {
745-
assert.Equal(t, *tc.expectedIssue.Labels[i].Name, *label.Name)
746-
}
747-
}
720+
assert.Equal(t, tc.expectedIssue.GetNumber(), returnedIssue.Number)
721+
assert.Equal(t, tc.expectedIssue.GetTitle(), returnedIssue.Title)
722+
assert.Equal(t, tc.expectedIssue.GetState(), returnedIssue.State)
723+
assert.Equal(t, tc.expectedIssue.GetHTMLURL(), returnedIssue.URL)
748724
})
749725
}
750726
}
@@ -1233,45 +1209,13 @@ func Test_UpdateIssue(t *testing.T) {
12331209
// Parse the result and get the text content if no error
12341210
textContent := getTextResult(t, result)
12351211

1236-
// Unmarshal and verify the result
1237-
var returnedIssue github.Issue
1238-
err = json.Unmarshal([]byte(textContent.Text), &returnedIssue)
1212+
// Unmarshal and verify the minimal result
1213+
var updateResp MinimalUpdateResponse
1214+
err = json.Unmarshal([]byte(textContent.Text), &updateResp)
12391215
require.NoError(t, err)
12401216

1241-
assert.Equal(t, *tc.expectedIssue.Number, *returnedIssue.Number)
1242-
assert.Equal(t, *tc.expectedIssue.Title, *returnedIssue.Title)
1243-
assert.Equal(t, *tc.expectedIssue.State, *returnedIssue.State)
1244-
assert.Equal(t, *tc.expectedIssue.HTMLURL, *returnedIssue.HTMLURL)
1245-
1246-
if tc.expectedIssue.Body != nil {
1247-
assert.Equal(t, *tc.expectedIssue.Body, *returnedIssue.Body)
1248-
}
1249-
1250-
if tc.expectedIssue.Type != nil {
1251-
assert.Equal(t, *tc.expectedIssue.Type.Name, *returnedIssue.Type.Name)
1252-
}
1253-
1254-
// Check assignees if expected
1255-
if len(tc.expectedIssue.Assignees) > 0 {
1256-
assert.Len(t, returnedIssue.Assignees, len(tc.expectedIssue.Assignees))
1257-
for i, assignee := range returnedIssue.Assignees {
1258-
assert.Equal(t, *tc.expectedIssue.Assignees[i].Login, *assignee.Login)
1259-
}
1260-
}
1261-
1262-
// Check labels if expected
1263-
if len(tc.expectedIssue.Labels) > 0 {
1264-
assert.Len(t, returnedIssue.Labels, len(tc.expectedIssue.Labels))
1265-
for i, label := range returnedIssue.Labels {
1266-
assert.Equal(t, *tc.expectedIssue.Labels[i].Name, *label.Name)
1267-
}
1268-
}
1269-
1270-
// Check milestone if expected
1271-
if tc.expectedIssue.Milestone != nil {
1272-
assert.NotNil(t, returnedIssue.Milestone)
1273-
assert.Equal(t, *tc.expectedIssue.Milestone.Number, *returnedIssue.Milestone.Number)
1274-
}
1217+
assert.Equal(t, tc.expectedIssue.GetHTMLURL(), updateResp.URL)
1218+
assert.Equal(t, true, updateResp.Updated)
12751219
})
12761220
}
12771221
}

0 commit comments

Comments
 (0)