Skip to content

Commit 99bb24a

Browse files
committed
minimize context usage using minimal types for get issue comments
1 parent efe9d40 commit 99bb24a

File tree

3 files changed

+84
-12
lines changed

3 files changed

+84
-12
lines changed

pkg/github/issues.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -376,12 +376,9 @@ func GetIssue(ctx context.Context, client *github.Client, deps ToolDependencies,
376376
}
377377
}
378378

379-
r, err := json.Marshal(issue)
380-
if err != nil {
381-
return nil, fmt.Errorf("failed to marshal issue: %w", err)
382-
}
379+
minimalIssue := convertToMinimalIssue(issue)
383380

384-
return utils.NewToolResultText(string(r)), nil
381+
return MarshalledTextResult(minimalIssue), nil
385382
}
386383

387384
func GetIssueComments(ctx context.Context, client *github.Client, deps ToolDependencies, owner string, repo string, issueNumber int, pagination PaginationParams) (*mcp.CallToolResult, error) {

pkg/github/issues_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -345,15 +345,15 @@ func Test_GetIssue(t *testing.T) {
345345

346346
textContent := getTextResult(t, result)
347347

348-
var returnedIssue github.Issue
348+
var returnedIssue MinimalIssue
349349
err = json.Unmarshal([]byte(textContent.Text), &returnedIssue)
350350
require.NoError(t, err)
351-
assert.Equal(t, *tc.expectedIssue.Number, *returnedIssue.Number)
352-
assert.Equal(t, *tc.expectedIssue.Title, *returnedIssue.Title)
353-
assert.Equal(t, *tc.expectedIssue.Body, *returnedIssue.Body)
354-
assert.Equal(t, *tc.expectedIssue.State, *returnedIssue.State)
355-
assert.Equal(t, *tc.expectedIssue.HTMLURL, *returnedIssue.HTMLURL)
356-
assert.Equal(t, *tc.expectedIssue.User.Login, *returnedIssue.User.Login)
351+
assert.Equal(t, tc.expectedIssue.GetNumber(), returnedIssue.Number)
352+
assert.Equal(t, tc.expectedIssue.GetTitle(), returnedIssue.Title)
353+
assert.Equal(t, tc.expectedIssue.GetBody(), returnedIssue.Body)
354+
assert.Equal(t, tc.expectedIssue.GetState(), returnedIssue.State)
355+
assert.Equal(t, tc.expectedIssue.GetHTMLURL(), returnedIssue.HTMLURL)
356+
assert.Equal(t, tc.expectedIssue.GetUser().GetLogin(), returnedIssue.User.Login)
357357
})
358358
}
359359
}

pkg/github/minimal_types.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package github
22

33
import (
4+
"time"
5+
46
"github.com/google/go-github/v82/github"
57
)
68

@@ -134,8 +136,81 @@ type MinimalProject struct {
134136
OwnerType string `json:"owner_type,omitempty"`
135137
}
136138

139+
// MinimalIssue is the trimmed output type for issue objects to reduce verbosity.
140+
type MinimalIssue struct {
141+
Number int `json:"number"`
142+
Title string `json:"title"`
143+
Body string `json:"body,omitempty"`
144+
State string `json:"state"`
145+
StateReason string `json:"state_reason,omitempty"`
146+
Draft bool `json:"draft,omitempty"`
147+
Locked bool `json:"locked,omitempty"`
148+
HTMLURL string `json:"html_url"`
149+
User *MinimalUser `json:"user,omitempty"`
150+
Labels []string `json:"labels,omitempty"`
151+
Assignees []string `json:"assignees,omitempty"`
152+
Milestone string `json:"milestone,omitempty"`
153+
Comments int `json:"comments,omitempty"`
154+
CreatedAt string `json:"created_at,omitempty"`
155+
UpdatedAt string `json:"updated_at,omitempty"`
156+
ClosedAt string `json:"closed_at,omitempty"`
157+
ClosedBy string `json:"closed_by,omitempty"`
158+
IssueType string `json:"issue_type,omitempty"`
159+
}
160+
137161
// Helper functions
138162

163+
func convertToMinimalIssue(issue *github.Issue) MinimalIssue {
164+
m := MinimalIssue{
165+
Number: issue.GetNumber(),
166+
Title: issue.GetTitle(),
167+
Body: issue.GetBody(),
168+
State: issue.GetState(),
169+
StateReason: issue.GetStateReason(),
170+
Draft: issue.GetDraft(),
171+
Locked: issue.GetLocked(),
172+
HTMLURL: issue.GetHTMLURL(),
173+
User: convertToMinimalUser(issue.GetUser()),
174+
Comments: issue.GetComments(),
175+
}
176+
177+
if issue.CreatedAt != nil {
178+
m.CreatedAt = issue.CreatedAt.Format(time.RFC3339)
179+
}
180+
if issue.UpdatedAt != nil {
181+
m.UpdatedAt = issue.UpdatedAt.Format(time.RFC3339)
182+
}
183+
if issue.ClosedAt != nil {
184+
m.ClosedAt = issue.ClosedAt.Format(time.RFC3339)
185+
}
186+
187+
for _, label := range issue.Labels {
188+
if label != nil {
189+
m.Labels = append(m.Labels, label.GetName())
190+
}
191+
}
192+
193+
for _, assignee := range issue.Assignees {
194+
if assignee != nil {
195+
m.Assignees = append(m.Assignees, assignee.GetLogin())
196+
}
197+
}
198+
199+
if closedBy := issue.GetClosedBy(); closedBy != nil {
200+
m.ClosedBy = closedBy.GetLogin()
201+
}
202+
203+
if milestone := issue.GetMilestone(); milestone != nil {
204+
m.Milestone = milestone.GetTitle()
205+
}
206+
207+
if issueType := issue.GetType(); issueType != nil {
208+
m.IssueType = issueType.GetName()
209+
}
210+
211+
return m
212+
}
213+
139214
func convertToMinimalProject(fullProject *github.ProjectV2) *MinimalProject {
140215
if fullProject == nil {
141216
return nil

0 commit comments

Comments
 (0)