NewGitHubAPIErrorResponse returns an mcp.NewToolResultError and retains the error in the context for access via middleware
(ctx context.Context, message string, resp *github.Response, err error)
| 157 | |
| 158 | // NewGitHubAPIErrorResponse returns an mcp.NewToolResultError and retains the error in the context for access via middleware |
| 159 | func NewGitHubAPIErrorResponse(ctx context.Context, message string, resp *github.Response, err error) *mcp.CallToolResult { |
| 160 | apiErr := newGitHubAPIError(message, resp, err) |
| 161 | if ctx != nil { |
| 162 | _, _ = addGitHubAPIErrorToContext(ctx, apiErr) // Explicitly ignore error for graceful handling |
| 163 | } |
| 164 | |
| 165 | var rateLimitErr *github.RateLimitError |
| 166 | if stderrors.As(err, &rateLimitErr) { |
| 167 | resetTime := rateLimitErr.Rate.Reset.Time |
| 168 | if !resetTime.IsZero() { |
| 169 | retryIn := time.Until(resetTime).Round(time.Second) |
| 170 | if retryIn > 0 { |
| 171 | return utils.NewToolResultError(fmt.Sprintf( |
| 172 | "%s: GitHub API rate limit exceeded. Retry after %v.", message, retryIn)) |
| 173 | } |
| 174 | } |
| 175 | return utils.NewToolResultError(fmt.Sprintf( |
| 176 | "%s: GitHub API rate limit exceeded. Wait before retrying.", message)) |
| 177 | } |
| 178 | |
| 179 | var abuseErr *github.AbuseRateLimitError |
| 180 | if stderrors.As(err, &abuseErr) { |
| 181 | if abuseErr.RetryAfter != nil { |
| 182 | retryAfter := abuseErr.RetryAfter.Round(time.Second) |
| 183 | if retryAfter > 0 { |
| 184 | return utils.NewToolResultError(fmt.Sprintf( |
| 185 | "%s: GitHub secondary rate limit exceeded. Retry after %v.", |
| 186 | message, retryAfter)) |
| 187 | } |
| 188 | } |
| 189 | return utils.NewToolResultError(fmt.Sprintf( |
| 190 | "%s: GitHub secondary rate limit exceeded. Wait before retrying.", message)) |
| 191 | } |
| 192 | |
| 193 | return utils.NewToolResultErrorFromErr(message, err) |
| 194 | } |
| 195 | |
| 196 | // NewGitHubGraphQLErrorResponse returns an mcp.NewToolResultError and retains the error in the context for access via middleware |
| 197 | func NewGitHubGraphQLErrorResponse(ctx context.Context, message string, err error) *mcp.CallToolResult { |