Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,152 changes: 562 additions & 590 deletions pkg/github/actions.go

Large diffs are not rendered by default.

24 changes: 12 additions & 12 deletions pkg/github/actions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ func Test_ListWorkflows(t *testing.T) {
request := createMCPRequest(tc.requestArgs)

// Call handler
result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)

require.NoError(t, err)
require.Equal(t, tc.expectError, result.IsError)
Expand Down Expand Up @@ -203,7 +203,7 @@ func Test_RunWorkflow(t *testing.T) {
request := createMCPRequest(tc.requestArgs)

// Call handler
result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)

require.NoError(t, err)
require.Equal(t, tc.expectError, result.IsError)
Expand Down Expand Up @@ -299,7 +299,7 @@ func Test_RunWorkflow_WithFilename(t *testing.T) {
request := createMCPRequest(tc.requestArgs)

// Call handler
result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)

require.NoError(t, err)
require.Equal(t, tc.expectError, result.IsError)
Expand Down Expand Up @@ -407,7 +407,7 @@ func Test_CancelWorkflowRun(t *testing.T) {
request := createMCPRequest(tc.requestArgs)

// Call handler
result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)

require.NoError(t, err)
require.Equal(t, tc.expectError, result.IsError)
Expand Down Expand Up @@ -537,7 +537,7 @@ func Test_ListWorkflowRunArtifacts(t *testing.T) {
request := createMCPRequest(tc.requestArgs)

// Call handler
result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)

require.NoError(t, err)
require.Equal(t, tc.expectError, result.IsError)
Expand Down Expand Up @@ -627,7 +627,7 @@ func Test_DownloadWorkflowRunArtifact(t *testing.T) {
request := createMCPRequest(tc.requestArgs)

// Call handler
result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)

require.NoError(t, err)
require.Equal(t, tc.expectError, result.IsError)
Expand Down Expand Up @@ -713,7 +713,7 @@ func Test_DeleteWorkflowRunLogs(t *testing.T) {
request := createMCPRequest(tc.requestArgs)

// Call handler
result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)

require.NoError(t, err)
require.Equal(t, tc.expectError, result.IsError)
Expand Down Expand Up @@ -817,7 +817,7 @@ func Test_GetWorkflowRunUsage(t *testing.T) {
request := createMCPRequest(tc.requestArgs)

// Call handler
result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)

require.NoError(t, err)
require.Equal(t, tc.expectError, result.IsError)
Expand Down Expand Up @@ -1082,7 +1082,7 @@ func Test_GetJobLogs(t *testing.T) {
request := createMCPRequest(tc.requestArgs)

// Call handler
result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)

require.NoError(t, err)
require.Equal(t, tc.expectError, result.IsError)
Expand Down Expand Up @@ -1149,7 +1149,7 @@ func Test_GetJobLogs_WithContentReturn(t *testing.T) {
"return_content": true,
})

result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)
require.NoError(t, err)
require.False(t, result.IsError)

Expand Down Expand Up @@ -1202,7 +1202,7 @@ func Test_GetJobLogs_WithContentReturnAndTailLines(t *testing.T) {
"tail_lines": float64(1), // Requesting last 1 line
})

result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)
require.NoError(t, err)
require.False(t, result.IsError)

Expand Down Expand Up @@ -1254,7 +1254,7 @@ func Test_GetJobLogs_WithContentReturnAndLargeTailLines(t *testing.T) {
"tail_lines": float64(100),
})

result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)
require.NoError(t, err)
require.False(t, result.IsError)

Expand Down
172 changes: 84 additions & 88 deletions pkg/github/code_scanning.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,51 +44,49 @@ func GetCodeScanningAlert(t translations.TranslationHelperFunc) inventory.Server
Required: []string{"owner", "repo", "alertNumber"},
},
},
func(deps ToolDependencies) mcp.ToolHandlerFor[map[string]any, any] {
return func(ctx context.Context, _ *mcp.CallToolRequest, args map[string]any) (*mcp.CallToolResult, any, error) {
owner, err := RequiredParam[string](args, "owner")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
repo, err := RequiredParam[string](args, "repo")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
alertNumber, err := RequiredInt(args, "alertNumber")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}

client, err := deps.GetClient(ctx)
if err != nil {
return utils.NewToolResultErrorFromErr("failed to get GitHub client", err), nil, nil
}
func(ctx context.Context, deps ToolDependencies, _ *mcp.CallToolRequest, args map[string]any) (*mcp.CallToolResult, any, error) {
owner, err := RequiredParam[string](args, "owner")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
repo, err := RequiredParam[string](args, "repo")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
alertNumber, err := RequiredInt(args, "alertNumber")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}

alert, resp, err := client.CodeScanning.GetAlert(ctx, owner, repo, int64(alertNumber))
if err != nil {
return ghErrors.NewGitHubAPIErrorResponse(ctx,
"failed to get alert",
resp,
err,
), nil, nil
}
defer func() { _ = resp.Body.Close() }()
client, err := deps.GetClient(ctx)
if err != nil {
return utils.NewToolResultErrorFromErr("failed to get GitHub client", err), nil, nil
}

if resp.StatusCode != http.StatusOK {
body, err := io.ReadAll(resp.Body)
if err != nil {
return utils.NewToolResultErrorFromErr("failed to read response body", err), nil, nil
}
return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to get alert", resp, body), nil, nil
}
alert, resp, err := client.CodeScanning.GetAlert(ctx, owner, repo, int64(alertNumber))
if err != nil {
return ghErrors.NewGitHubAPIErrorResponse(ctx,
"failed to get alert",
resp,
err,
), nil, nil
}
defer func() { _ = resp.Body.Close() }()

r, err := json.Marshal(alert)
if resp.StatusCode != http.StatusOK {
body, err := io.ReadAll(resp.Body)
if err != nil {
return utils.NewToolResultErrorFromErr("failed to marshal alert", err), nil, nil
return utils.NewToolResultErrorFromErr("failed to read response body", err), nil, nil
}
return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to get alert", resp, body), nil, nil
}

return utils.NewToolResultText(string(r)), nil, nil
r, err := json.Marshal(alert)
if err != nil {
return utils.NewToolResultErrorFromErr("failed to marshal alert", err), nil, nil
}

return utils.NewToolResultText(string(r)), nil, nil
},
)
}
Expand Down Expand Up @@ -137,62 +135,60 @@ func ListCodeScanningAlerts(t translations.TranslationHelperFunc) inventory.Serv
Required: []string{"owner", "repo"},
},
},
func(deps ToolDependencies) mcp.ToolHandlerFor[map[string]any, any] {
return func(ctx context.Context, _ *mcp.CallToolRequest, args map[string]any) (*mcp.CallToolResult, any, error) {
owner, err := RequiredParam[string](args, "owner")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
repo, err := RequiredParam[string](args, "repo")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
ref, err := OptionalParam[string](args, "ref")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
state, err := OptionalParam[string](args, "state")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
severity, err := OptionalParam[string](args, "severity")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
toolName, err := OptionalParam[string](args, "tool_name")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}

client, err := deps.GetClient(ctx)
if err != nil {
return utils.NewToolResultErrorFromErr("failed to get GitHub client", err), nil, nil
}
alerts, resp, err := client.CodeScanning.ListAlertsForRepo(ctx, owner, repo, &github.AlertListOptions{Ref: ref, State: state, Severity: severity, ToolName: toolName})
if err != nil {
return ghErrors.NewGitHubAPIErrorResponse(ctx,
"failed to list alerts",
resp,
err,
), nil, nil
}
defer func() { _ = resp.Body.Close() }()
func(ctx context.Context, deps ToolDependencies, _ *mcp.CallToolRequest, args map[string]any) (*mcp.CallToolResult, any, error) {
owner, err := RequiredParam[string](args, "owner")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
repo, err := RequiredParam[string](args, "repo")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
ref, err := OptionalParam[string](args, "ref")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
state, err := OptionalParam[string](args, "state")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
severity, err := OptionalParam[string](args, "severity")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}
toolName, err := OptionalParam[string](args, "tool_name")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}

if resp.StatusCode != http.StatusOK {
body, err := io.ReadAll(resp.Body)
if err != nil {
return utils.NewToolResultErrorFromErr("failed to read response body", err), nil, nil
}
return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to list alerts", resp, body), nil, nil
}
client, err := deps.GetClient(ctx)
if err != nil {
return utils.NewToolResultErrorFromErr("failed to get GitHub client", err), nil, nil
}
alerts, resp, err := client.CodeScanning.ListAlertsForRepo(ctx, owner, repo, &github.AlertListOptions{Ref: ref, State: state, Severity: severity, ToolName: toolName})
if err != nil {
return ghErrors.NewGitHubAPIErrorResponse(ctx,
"failed to list alerts",
resp,
err,
), nil, nil
}
defer func() { _ = resp.Body.Close() }()

r, err := json.Marshal(alerts)
if resp.StatusCode != http.StatusOK {
body, err := io.ReadAll(resp.Body)
if err != nil {
return utils.NewToolResultErrorFromErr("failed to marshal alerts", err), nil, nil
return utils.NewToolResultErrorFromErr("failed to read response body", err), nil, nil
}
return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to list alerts", resp, body), nil, nil
}

return utils.NewToolResultText(string(r)), nil, nil
r, err := json.Marshal(alerts)
if err != nil {
return utils.NewToolResultErrorFromErr("failed to marshal alerts", err), nil, nil
}

return utils.NewToolResultText(string(r)), nil, nil
},
)
}
4 changes: 2 additions & 2 deletions pkg/github/code_scanning_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ func Test_GetCodeScanningAlert(t *testing.T) {
request := createMCPRequest(tc.requestArgs)

// Call handler with new signature
result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)

// Verify results
if tc.expectError {
Expand Down Expand Up @@ -216,7 +216,7 @@ func Test_ListCodeScanningAlerts(t *testing.T) {
request := createMCPRequest(tc.requestArgs)

// Call handler with new signature
result, err := handler(context.Background(), &request)
result, err := handler(ContextWithDeps(context.Background(), deps), &request)

// Verify results
if tc.expectError {
Expand Down
Loading