From 8fc11ae848534912705dc47e16f3b173a61c1ced Mon Sep 17 00:00:00 2001 From: Adam Holt Date: Wed, 10 Dec 2025 16:41:06 +0000 Subject: [PATCH 1/2] Add raw client error annotation and annotate GetFileContents --- pkg/errors/error.go | 31 +++++++++++++++++++++++++++++++ pkg/github/repositories.go | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/pkg/errors/error.go b/pkg/errors/error.go index be2cf58f9..b416cfaba 100644 --- a/pkg/errors/error.go +++ b/pkg/errors/error.go @@ -3,6 +3,7 @@ package errors import ( "context" "fmt" + "net/http" "github.com/github/github-mcp-server/pkg/utils" "github.com/google/go-github/v79/github" @@ -44,10 +45,23 @@ func (e *GitHubGraphQLError) Error() string { return fmt.Errorf("%s: %w", e.Message, e.Err).Error() } +type GitHubRawAPIError struct { + Message string `json:"message"` + Err error `json:"-"` +} + +func newGitHubRawAPIError(message string, err error) *GitHubRawAPIError { + return &GitHubRawAPIError{ + Message: message, + Err: err, + } +} + type GitHubErrorKey struct{} type GitHubCtxErrors struct { api []*GitHubAPIError graphQL []*GitHubGraphQLError + raw []*GitHubRawAPIError } // ContextWithGitHubErrors updates or creates a context with a pointer to GitHub error information (to be used by middleware). @@ -107,6 +121,15 @@ func addGitHubGraphQLErrorToContext(ctx context.Context, err *GitHubGraphQLError return nil, fmt.Errorf("context does not contain GitHubCtxErrors") } +func addRawAPIErrorToContext(ctx context.Context, err *GitHubRawAPIError) (context.Context, error) { + if val, ok := ctx.Value(GitHubErrorKey{}).(*GitHubCtxErrors); ok { + val.raw = append(val.raw, err) + return ctx, nil + } + + return nil, fmt.Errorf("context does not contain GitHubCtxErrors") +} + // NewGitHubAPIErrorResponse returns an mcp.NewToolResultError and retains the error in the context for access via middleware func NewGitHubAPIErrorResponse(ctx context.Context, message string, resp *github.Response, err error) *mcp.CallToolResult { apiErr := newGitHubAPIError(message, resp, err) @@ -124,3 +147,11 @@ func NewGitHubGraphQLErrorResponse(ctx context.Context, message string, err erro } return utils.NewToolResultErrorFromErr(message, err) } + +func NewGitHubRawAPIErrorResponse(ctx context.Context, message string, resp *http.Response, err error) *mcp.CallToolResult { + rawAPIErr := newGitHubRawAPIError(message, err) + if ctx != nil { + _, _ = addRawAPIErrorToContext(ctx, rawAPIErr) // Explicitly ignore error for graceful handling + } + return utils.NewToolResultErrorFromErr(message, err) +} diff --git a/pkg/github/repositories.go b/pkg/github/repositories.go index dbf24e8e3..86f164ce0 100644 --- a/pkg/github/repositories.go +++ b/pkg/github/repositories.go @@ -636,7 +636,7 @@ func GetFileContents(getClient GetClientFn, getRawClient raw.GetRawClientFn, t t } resp, err := rawClient.GetRawContent(ctx, owner, repo, path, rawOpts) if err != nil { - return utils.NewToolResultError("failed to get raw repository content"), nil, nil + return ghErrors.NewGitHubRawAPIErrorResponse(ctx, "failed to get raw repository content", resp, err), nil, nil } defer func() { _ = resp.Body.Close() From 234565bc8f51d449ab1b769568ef3612fd70f047 Mon Sep 17 00:00:00 2001 From: Adam Holt Date: Wed, 10 Dec 2025 17:03:28 +0000 Subject: [PATCH 2/2] Track response. --- pkg/errors/error.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pkg/errors/error.go b/pkg/errors/error.go index b416cfaba..eb633e687 100644 --- a/pkg/errors/error.go +++ b/pkg/errors/error.go @@ -46,14 +46,16 @@ func (e *GitHubGraphQLError) Error() string { } type GitHubRawAPIError struct { - Message string `json:"message"` - Err error `json:"-"` + Message string `json:"message"` + Response *http.Response `json:"-"` + Err error `json:"-"` } -func newGitHubRawAPIError(message string, err error) *GitHubRawAPIError { +func newGitHubRawAPIError(message string, resp *http.Response, err error) *GitHubRawAPIError { return &GitHubRawAPIError{ - Message: message, - Err: err, + Message: message, + Response: resp, + Err: err, } } @@ -149,7 +151,7 @@ func NewGitHubGraphQLErrorResponse(ctx context.Context, message string, err erro } func NewGitHubRawAPIErrorResponse(ctx context.Context, message string, resp *http.Response, err error) *mcp.CallToolResult { - rawAPIErr := newGitHubRawAPIError(message, err) + rawAPIErr := newGitHubRawAPIError(message, resp, err) if ctx != nil { _, _ = addRawAPIErrorToContext(ctx, rawAPIErr) // Explicitly ignore error for graceful handling }