From ec920abd5f24640ea055e4187a348db1443d5ca1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 17 Jan 2026 05:13:03 +0000 Subject: [PATCH 1/3] Initial plan From 104a48de4fc47fcc87a5e2ae6dabf38dc5a303bb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 17 Jan 2026 05:31:52 +0000 Subject: [PATCH 2/3] Fix MCP Gateway schema validation for stdio servers - Updated property order for stdio servers to support MCP Gateway schema format - Added rendering support for container, entrypoint, entrypointArgs, and mounts fields - Removed container transformation that was converting container to docker commands - Container+version fields are now combined into single container image string - Updated tests to reflect new MCP Gateway format behavior - ast-grep now compiles without schema validation errors Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../workflows/go-pattern-detector.lock.yml | 8 +- pkg/workflow/mcp-config.go | 138 ++++++++-------- pkg/workflow/mcp_container_args_test.go | 148 ++++++------------ 3 files changed, 126 insertions(+), 168 deletions(-) diff --git a/.github/workflows/go-pattern-detector.lock.yml b/.github/workflows/go-pattern-detector.lock.yml index 614bbd6d30a..cc990547e27 100644 --- a/.github/workflows/go-pattern-detector.lock.yml +++ b/.github/workflows/go-pattern-detector.lock.yml @@ -383,13 +383,7 @@ jobs: "mcpServers": { "ast-grep": { "type": "stdio", - "command": "docker", - "args": [ - "run", - "--rm", - "-i", - "mcp/ast-grep:latest" - ] + "container": "mcp/ast-grep:latest" }, "github": { "container": "ghcr.io/github/github-mcp-server:v0.28.1", diff --git a/pkg/workflow/mcp-config.go b/pkg/workflow/mcp-config.go index 32b6122f95c..bfe2fd372f0 100644 --- a/pkg/workflow/mcp-config.go +++ b/pkg/workflow/mcp-config.go @@ -633,8 +633,10 @@ func renderSharedMCPConfig(yaml *strings.Builder, toolName string, toolConfig ma if renderer.Format == "toml" { propertyOrder = []string{"command", "args", "env", "proxy-args", "registry"} } else { - // JSON format - include copilot fields if required - propertyOrder = []string{"type", "command", "tools", "args", "env", "proxy-args", "registry"} + // JSON format - use MCP Gateway schema format (container-based) OR legacy command-based + // Per MCP Gateway Specification v1.0.0 section 3.2.1, stdio servers SHOULD be containerized + // But we also support legacy command-based tools for backwards compatibility + propertyOrder = []string{"type", "container", "entrypoint", "entrypointArgs", "mounts", "command", "args", "tools", "env", "proxy-args", "registry"} } case "http": if renderer.Format == "toml" { @@ -670,6 +672,22 @@ func renderSharedMCPConfig(yaml *strings.Builder, toolName string, toolConfig ma if renderer.RequiresCopilotFields { existingProperties = append(existingProperties, prop) } + case "container": + if mcpConfig.Container != "" { + existingProperties = append(existingProperties, prop) + } + case "entrypoint": + if mcpConfig.Entrypoint != "" { + existingProperties = append(existingProperties, prop) + } + case "entrypointArgs": + if len(mcpConfig.EntrypointArgs) > 0 { + existingProperties = append(existingProperties, prop) + } + case "mounts": + if len(mcpConfig.Mounts) > 0 { + existingProperties = append(existingProperties, prop) + } case "command": if mcpConfig.Command != "" { existingProperties = append(existingProperties, prop) @@ -748,6 +766,54 @@ func renderSharedMCPConfig(yaml *strings.Builder, toolName string, toolConfig ma fmt.Fprintf(yaml, "%s \"*\"\n", renderer.IndentLevel) fmt.Fprintf(yaml, "%s]%s\n", renderer.IndentLevel, comma) } + case "container": + comma := "," + if isLast { + comma = "" + } + // Container field - per MCP Gateway Specification v1.0.0 section 4.1.2 + // Required for stdio servers (containerized servers) + fmt.Fprintf(yaml, "%s\"container\": \"%s\"%s\n", renderer.IndentLevel, mcpConfig.Container, comma) + case "entrypoint": + comma := "," + if isLast { + comma = "" + } + // Entrypoint field - per MCP Gateway Specification v1.0.0 + // Optional entrypoint override for container + fmt.Fprintf(yaml, "%s\"entrypoint\": \"%s\"%s\n", renderer.IndentLevel, mcpConfig.Entrypoint, comma) + case "entrypointArgs": + comma := "," + if isLast { + comma = "" + } + // EntrypointArgs field - per MCP Gateway Specification v1.0.0 + // Arguments passed to the container entrypoint + fmt.Fprintf(yaml, "%s\"entrypointArgs\": [\n", renderer.IndentLevel) + for argIndex, arg := range mcpConfig.EntrypointArgs { + argComma := "," + if argIndex == len(mcpConfig.EntrypointArgs)-1 { + argComma = "" + } + fmt.Fprintf(yaml, "%s \"%s\"%s\n", renderer.IndentLevel, arg, argComma) + } + fmt.Fprintf(yaml, "%s]%s\n", renderer.IndentLevel, comma) + case "mounts": + comma := "," + if isLast { + comma = "" + } + // Mounts field - per MCP Gateway Specification v1.0.0 + // Volume mounts for the container + fmt.Fprintf(yaml, "%s\"mounts\": [\n", renderer.IndentLevel) + for mountIndex, mount := range mcpConfig.Mounts { + mountComma := "," + if mountIndex == len(mcpConfig.Mounts)-1 { + mountComma = "" + } + fmt.Fprintf(yaml, "%s \"%s\"%s\n", renderer.IndentLevel, mount, mountComma) + } + fmt.Fprintf(yaml, "%s]%s\n", renderer.IndentLevel, comma) case "command": if renderer.Format == "toml" { fmt.Fprintf(yaml, "%scommand = \"%s\"\n", renderer.IndentLevel, mcpConfig.Command) @@ -1198,68 +1264,12 @@ func getMCPConfig(toolConfig map[string]any, toolName string) (*parser.MCPServer } } - // Handle container transformation for stdio type - if result.Type == "stdio" && result.Container != "" { - // Save user-provided args before transforming - userProvidedArgs := result.Args - entrypoint := result.Entrypoint - entrypointArgs := result.EntrypointArgs - mounts := result.Mounts - - // Transform container field to docker command and args - result.Command = "docker" - result.Args = []string{"run", "--rm", "-i"} - - // Add environment variables as -e flags (sorted for deterministic output) - envKeys := make([]string, 0, len(result.Env)) - for envKey := range result.Env { - envKeys = append(envKeys, envKey) - } - sort.Strings(envKeys) - for _, envKey := range envKeys { - result.Args = append(result.Args, "-e", envKey) - } - - // Add volume mounts if configured (sorted for deterministic output) - if len(mounts) > 0 { - sortedMounts := make([]string, len(mounts)) - copy(sortedMounts, mounts) - sort.Strings(sortedMounts) - for _, mount := range sortedMounts { - result.Args = append(result.Args, "-v", mount) - } - } - - // Insert user-provided args (e.g., additional docker flags) before the container image - if len(userProvidedArgs) > 0 { - result.Args = append(result.Args, userProvidedArgs...) - } - - // Add entrypoint override if specified - if entrypoint != "" { - result.Args = append(result.Args, "--entrypoint", entrypoint) - } - - // Build container image with version if provided - containerImage := result.Container - if result.Version != "" { - containerImage = containerImage + ":" + result.Version - } - - // Add the container image - result.Args = append(result.Args, containerImage) - - // Add entrypoint args after the container image - if len(entrypointArgs) > 0 { - result.Args = append(result.Args, entrypointArgs...) - } - - // Clear the container, version, entrypoint, entrypointArgs, and mounts fields since they're now part of the command - result.Container = "" - result.Version = "" - result.Entrypoint = "" - result.EntrypointArgs = nil - result.Mounts = nil + // Combine container and version fields into a single container image string + // Per MCP Gateway Specification, the container field should include the full image reference + // including the tag (e.g., "mcp/ast-grep:latest" instead of separate container + version fields) + if result.Type == "stdio" && result.Container != "" && result.Version != "" { + result.Container = result.Container + ":" + result.Version + result.Version = "" // Clear version since it's now part of container } return result, nil diff --git a/pkg/workflow/mcp_container_args_test.go b/pkg/workflow/mcp_container_args_test.go index 2572567a7c3..6837dac4cc0 100644 --- a/pkg/workflow/mcp_container_args_test.go +++ b/pkg/workflow/mcp_container_args_test.go @@ -21,13 +21,14 @@ func TestContainerWithCustomArgs(t *testing.T) { t.Fatalf("getMCPConfig failed: %v", err) } - // Check that command is docker - if result.Command != "docker" { - t.Errorf("Expected command 'docker', got '%s'", result.Command) + // Check that container is set (MCP Gateway format) + expectedContainer := "test:latest" // version should be appended + if result.Container != expectedContainer { + t.Errorf("Expected container '%s', got '%s'", expectedContainer, result.Container) } - // Check that args contain the expected elements (with version appended to container) - expectedArgs := []string{"run", "--rm", "-i", "-e", "TEST_VAR", "-v", "/tmp:/tmp:ro", "-w", "/tmp", "test:latest"} + // Check that custom Docker runtime args are preserved + expectedArgs := []string{"-v", "/tmp:/tmp:ro", "-w", "/tmp"} if len(result.Args) != len(expectedArgs) { t.Errorf("Expected %d args, got %d: %v", len(expectedArgs), len(result.Args), result.Args) } @@ -50,11 +51,6 @@ func TestContainerWithCustomArgs(t *testing.T) { if !hasWorkdir { t.Error("Expected working directory '-w /tmp' in args") } - - // Check that container with version is the last arg - if result.Args[len(result.Args)-1] != "test:latest" { - t.Errorf("Expected container 'test:latest' as last arg, got '%s'", result.Args[len(result.Args)-1]) - } } func TestContainerWithoutCustomArgs(t *testing.T) { @@ -72,20 +68,14 @@ func TestContainerWithoutCustomArgs(t *testing.T) { t.Fatalf("getMCPConfig failed: %v", err) } - // Check that command is docker - if result.Command != "docker" { - t.Errorf("Expected command 'docker', got '%s'", result.Command) - } - - // Check that args contain the expected elements (no custom args) - expectedArgs := []string{"run", "--rm", "-i", "-e", "TEST_VAR", "test:latest"} - if len(result.Args) != len(expectedArgs) { - t.Errorf("Expected %d args, got %d: %v", len(expectedArgs), len(result.Args), result.Args) + // Check that container is set (MCP Gateway format) + if result.Container != "test:latest" { + t.Errorf("Expected container 'test:latest', got '%s'", result.Container) } - // Check that container is the last arg (backward compatibility - container with :tag in it) - if result.Args[len(result.Args)-1] != "test:latest" { - t.Errorf("Expected container 'test:latest' as last arg, got '%s'", result.Args[len(result.Args)-1]) + // Check that args are empty (no custom args) + if len(result.Args) != 0 { + t.Errorf("Expected 0 args, got %d: %v", len(result.Args), result.Args) } } @@ -105,20 +95,15 @@ func TestContainerWithVersionField(t *testing.T) { t.Fatalf("getMCPConfig failed: %v", err) } - // Check that command is docker - if result.Command != "docker" { - t.Errorf("Expected command 'docker', got '%s'", result.Command) - } - - // Check that container with version is the last arg + // Check that container includes the version expectedContainer := "ghcr.io/test/image:v1.2.3" - if result.Args[len(result.Args)-1] != expectedContainer { - t.Errorf("Expected container '%s' as last arg, got '%s'", expectedContainer, result.Args[len(result.Args)-1]) + if result.Container != expectedContainer { + t.Errorf("Expected container '%s', got '%s'", expectedContainer, result.Container) } } func TestContainerWithEntrypointArgs(t *testing.T) { - // Test that entrypointArgs are added after the container image + // Test that entrypointArgs are preserved in MCP Gateway format config := map[string]any{ "container": "test-image", "version": "latest", @@ -134,47 +119,26 @@ func TestContainerWithEntrypointArgs(t *testing.T) { t.Fatalf("getMCPConfig failed: %v", err) } - // Check that command is docker - if result.Command != "docker" { - t.Errorf("Expected command 'docker', got '%s'", result.Command) + // Check that container is set with version + expectedContainer := "test-image:latest" + if result.Container != expectedContainer { + t.Errorf("Expected container '%s', got '%s'", expectedContainer, result.Container) } - // Expected args structure: ["run", "--rm", "-i", "-e", "TEST_VAR", "test-image:latest", "--config", "/app/config.json", "--verbose"] - expectedArgs := []string{"run", "--rm", "-i", "-e", "TEST_VAR", "test-image:latest", "--config", "/app/config.json", "--verbose"} - if len(result.Args) != len(expectedArgs) { - t.Errorf("Expected %d args, got %d: %v", len(expectedArgs), len(result.Args), result.Args) + // Check that entrypointArgs are set + expectedEntrypointArgs := []string{"--config", "/app/config.json", "--verbose"} + if len(result.EntrypointArgs) != len(expectedEntrypointArgs) { + t.Errorf("Expected %d entrypointArgs, got %d: %v", len(expectedEntrypointArgs), len(result.EntrypointArgs), result.EntrypointArgs) } - // Check that entrypoint args come after container image - containerImageIndex := -1 - for i, arg := range result.Args { - if arg == "test-image:latest" { - containerImageIndex = i - break + // Verify each entrypoint arg + for i, expectedArg := range expectedEntrypointArgs { + if i >= len(result.EntrypointArgs) { + t.Errorf("Missing entrypoint arg at index %d: expected '%s'", i, expectedArg) + continue } - } - - if containerImageIndex == -1 { - t.Fatal("Container image not found in args") - } - - // Verify entrypoint args are after container image - if containerImageIndex+1 >= len(result.Args) { - t.Error("No args found after container image") - } else { - // Check each entrypoint arg - entrypointArgsStart := containerImageIndex + 1 - expectedEntrypointArgs := []string{"--config", "/app/config.json", "--verbose"} - - for i, expectedArg := range expectedEntrypointArgs { - actualIndex := entrypointArgsStart + i - if actualIndex >= len(result.Args) { - t.Errorf("Missing entrypoint arg at index %d: expected '%s'", i, expectedArg) - continue - } - if result.Args[actualIndex] != expectedArg { - t.Errorf("Entrypoint arg %d: expected '%s', got '%s'", i, expectedArg, result.Args[actualIndex]) - } + if result.EntrypointArgs[i] != expectedArg { + t.Errorf("Entrypoint arg %d: expected '%s', got '%s'", i, expectedArg, result.EntrypointArgs[i]) } } } @@ -197,54 +161,44 @@ func TestContainerWithArgsAndEntrypointArgs(t *testing.T) { t.Fatalf("getMCPConfig failed: %v", err) } - // Check that command is docker - if result.Command != "docker" { - t.Errorf("Expected command 'docker', got '%s'", result.Command) + // Check that container is set with version + expectedContainer := "test-image:v1.0" + if result.Container != expectedContainer { + t.Errorf("Expected container '%s', got '%s'", expectedContainer, result.Container) } - // Expected structure: ["run", "--rm", "-i", "-e", "ENV_VAR", "-v", "/host:/container", "test-image:v1.0", "serve", "--port", "8080"] - expectedArgs := []string{"run", "--rm", "-i", "-e", "ENV_VAR", "-v", "/host:/container", "test-image:v1.0", "serve", "--port", "8080"} + // Check that Docker runtime args (before container) are preserved + expectedArgs := []string{"-v", "/host:/container"} if len(result.Args) != len(expectedArgs) { t.Errorf("Expected %d args, got %d: %v", len(expectedArgs), len(result.Args), result.Args) } - // Find container image position - containerImageIndex := -1 + // Verify volume mount is in args + hasVolume := false for i, arg := range result.Args { - if arg == "test-image:v1.0" { - containerImageIndex = i - break - } - } - - if containerImageIndex == -1 { - t.Fatal("Container image not found in args") - } - - // Verify args come before container image (specifically the volume mount) - hasVolumeBefore := false - for i := 0; i < containerImageIndex; i++ { - if result.Args[i] == "-v" && i+1 < containerImageIndex && result.Args[i+1] == "/host:/container" { - hasVolumeBefore = true + if arg == "-v" && i+1 < len(result.Args) && result.Args[i+1] == "/host:/container" { + hasVolume = true break } } - if !hasVolumeBefore { - t.Error("Expected volume mount args before container image") + if !hasVolume { + t.Error("Expected volume mount args in Docker runtime args") } - // Verify entrypoint args come after container image + // Check that entrypointArgs are preserved expectedEntrypointArgs := []string{"serve", "--port", "8080"} - entrypointArgsStart := containerImageIndex + 1 + if len(result.EntrypointArgs) != len(expectedEntrypointArgs) { + t.Errorf("Expected %d entrypointArgs, got %d: %v", len(expectedEntrypointArgs), len(result.EntrypointArgs), result.EntrypointArgs) + } + // Verify entrypoint args for i, expectedArg := range expectedEntrypointArgs { - actualIndex := entrypointArgsStart + i - if actualIndex >= len(result.Args) { + if i >= len(result.EntrypointArgs) { t.Errorf("Missing entrypoint arg at index %d: expected '%s'", i, expectedArg) continue } - if result.Args[actualIndex] != expectedArg { - t.Errorf("Entrypoint arg %d: expected '%s', got '%s'", i, expectedArg, result.Args[actualIndex]) + if result.EntrypointArgs[i] != expectedArg { + t.Errorf("Entrypoint arg %d: expected '%s', got '%s'", i, expectedArg, result.EntrypointArgs[i]) } } } From 116ef01dfcb45685538c69a4e3c8f5cfae648e19 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 17 Jan 2026 05:39:23 +0000 Subject: [PATCH 3/3] Final update - fix complete and verified Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/brave.lock.yml | 10 +- .github/workflows/mcp-inspector.lock.yml | 108 ++++-------------- .../workflows/notion-issue-summary.lock.yml | 10 +- .github/workflows/scout.lock.yml | 18 +-- 4 files changed, 27 insertions(+), 119 deletions(-) diff --git a/.github/workflows/brave.lock.yml b/.github/workflows/brave.lock.yml index 517d64c704b..bbb1c2e4d9c 100644 --- a/.github/workflows/brave.lock.yml +++ b/.github/workflows/brave.lock.yml @@ -380,18 +380,10 @@ jobs: "mcpServers": { "brave-search": { "type": "stdio", - "command": "docker", + "container": "docker.io/mcp/brave-search", "tools": [ "*" ], - "args": [ - "run", - "--rm", - "-i", - "-e", - "BRAVE_API_KEY", - "docker.io/mcp/brave-search" - ], "env": { "BRAVE_API_KEY": "${{ secrets.BRAVE_API_KEY }}" } diff --git a/.github/workflows/mcp-inspector.lock.yml b/.github/workflows/mcp-inspector.lock.yml index a37cdf6ba37..d9104faaae4 100644 --- a/.github/workflows/mcp-inspector.lock.yml +++ b/.github/workflows/mcp-inspector.lock.yml @@ -224,7 +224,7 @@ jobs: const determineAutomaticLockdown = require('/opt/gh-aw/actions/determine_automatic_lockdown.cjs'); await determineAutomaticLockdown(github, context, core); - name: Download container images - run: bash /opt/gh-aw/actions/download_docker_images.sh @sentry/mcp-server@0.26.0 docker.io/mcp/brave-search ghcr.io/github/github-mcp-server:v0.28.1 ghcr.io/githubnext/gh-aw-mcpg:v0.0.62 mcp/arxiv-mcp-server mcp/ast-grep:latest mcp/context7 mcp/memory mcp/notion microsoft-fabric-rti-mcp node:lts-alpine + run: bash /opt/gh-aw/actions/download_docker_images.sh docker.io/mcp/brave-search ghcr.io/github/github-mcp-server:v0.28.1 ghcr.io/githubnext/gh-aw-mcpg:v0.0.62 mcp/arxiv-mcp-server mcp/ast-grep:latest mcp/context7 mcp/memory mcp/notion node:lts-alpine python:alpine - name: Write Safe Outputs Config run: | mkdir -p /opt/gh-aw/safeoutputs @@ -457,65 +457,37 @@ jobs: "mcpServers": { "arxiv": { "type": "stdio", - "command": "docker", + "container": "mcp/arxiv-mcp-server", "tools": [ "search_arxiv", "get_paper_details", "get_paper_pdf" - ], - "args": [ - "run", - "--rm", - "-i", - "mcp/arxiv-mcp-server" ] }, "ast-grep": { "type": "stdio", - "command": "docker", + "container": "mcp/ast-grep:latest", "tools": [ "*" - ], - "args": [ - "run", - "--rm", - "-i", - "mcp/ast-grep:latest" ] }, "brave-search": { "type": "stdio", - "command": "docker", + "container": "docker.io/mcp/brave-search", "tools": [ "*" ], - "args": [ - "run", - "--rm", - "-i", - "-e", - "BRAVE_API_KEY", - "docker.io/mcp/brave-search" - ], "env": { "BRAVE_API_KEY": "${{ secrets.BRAVE_API_KEY }}" } }, "context7": { "type": "stdio", - "command": "docker", + "container": "mcp/context7", "tools": [ "get-library-docs", "resolve-library-id" ], - "args": [ - "run", - "--rm", - "-i", - "-e", - "CONTEXT7_API_KEY", - "mcp/context7" - ], "env": { "CONTEXT7_API_KEY": "${{ secrets.CONTEXT7_API_KEY }}" } @@ -551,7 +523,12 @@ jobs: }, "fabric-rti": { "type": "stdio", - "command": "docker", + "container": "python:alpine", + "entrypoint": "uvx", + "entrypointArgs": [ + "uvx", + "microsoft-fabric-rti-mcp" + ], "tools": [ "kusto_known_services", "kusto_query", @@ -567,22 +544,6 @@ jobs: "get_eventstream", "get_eventstream_definition" ], - "args": [ - "run", - "--rm", - "-i", - "-e", - "AZURE_CLIENT_ID", - "-e", - "AZURE_CLIENT_SECRET", - "-e", - "AZURE_TENANT_ID", - "--entrypoint", - "uvx", - "python:alpine", - "uvx", - "microsoft-fabric-rti-mcp" - ], "env": { "AZURE_CLIENT_ID": "${{ secrets.AZURE_CLIENT_ID }}", "AZURE_CLIENT_SECRET": "${{ secrets.AZURE_CLIENT_SECRET }}", @@ -615,20 +576,16 @@ jobs: }, "memory": { "type": "stdio", - "command": "docker", + "container": "mcp/memory", + "args": [ + "-v", + "/tmp/gh-aw/cache-memory:/app/dist" + ], "tools": [ "store_memory", "retrieve_memory", "list_memories", "delete_memory" - ], - "args": [ - "run", - "--rm", - "-i", - "-v", - "/tmp/gh-aw/cache-memory:/app/dist", - "mcp/memory" ] }, "microsoftdocs": { @@ -640,21 +597,13 @@ jobs: }, "notion": { "type": "stdio", - "command": "docker", + "container": "mcp/notion", "tools": [ "search_pages", "get_page", "get_database", "query_database" ], - "args": [ - "run", - "--rm", - "-i", - "-e", - "NOTION_API_TOKEN", - "mcp/notion" - ], "env": { "NOTION_API_TOKEN": "${{ secrets.NOTION_API_TOKEN }}" } @@ -682,7 +631,12 @@ jobs: }, "sentry": { "type": "stdio", - "command": "docker", + "container": "node:lts-alpine", + "entrypoint": "npx", + "entrypointArgs": [ + "npx", + "@sentry/mcp-server@0.26.0" + ], "tools": [ "whoami", "find_organizations", @@ -699,22 +653,6 @@ jobs: "search_docs requires SENTRY_OPENAI_API_KEY", "get_doc" ], - "args": [ - "run", - "--rm", - "-i", - "-e", - "OPENAI_API_KEY", - "-e", - "SENTRY_ACCESS_TOKEN", - "-e", - "SENTRY_HOST", - "--entrypoint", - "npx", - "node:lts-alpine", - "npx", - "@sentry/mcp-server@0.26.0" - ], "env": { "OPENAI_API_KEY": "${{ secrets.SENTRY_OPENAI_API_KEY }}", "SENTRY_ACCESS_TOKEN": "${{ secrets.SENTRY_ACCESS_TOKEN }}", diff --git a/.github/workflows/notion-issue-summary.lock.yml b/.github/workflows/notion-issue-summary.lock.yml index 3a038f7f388..5d9b5d651a2 100644 --- a/.github/workflows/notion-issue-summary.lock.yml +++ b/.github/workflows/notion-issue-summary.lock.yml @@ -317,21 +317,13 @@ jobs: }, "notion": { "type": "stdio", - "command": "docker", + "container": "mcp/notion", "tools": [ "search_pages", "get_page", "get_database", "query_database" ], - "args": [ - "run", - "--rm", - "-i", - "-e", - "NOTION_API_TOKEN", - "mcp/notion" - ], "env": { "NOTION_API_TOKEN": "${{ secrets.NOTION_API_TOKEN }}" } diff --git a/.github/workflows/scout.lock.yml b/.github/workflows/scout.lock.yml index ac94a17ba22..5a953554cc0 100644 --- a/.github/workflows/scout.lock.yml +++ b/.github/workflows/scout.lock.yml @@ -437,25 +437,11 @@ jobs: "mcpServers": { "arxiv": { "type": "stdio", - "command": "docker", - "args": [ - "run", - "--rm", - "-i", - "mcp/arxiv-mcp-server" - ] + "container": "mcp/arxiv-mcp-server" }, "context7": { "type": "stdio", - "command": "docker", - "args": [ - "run", - "--rm", - "-i", - "-e", - "CONTEXT7_API_KEY", - "mcp/context7" - ], + "container": "mcp/context7", "env": { "CONTEXT7_API_KEY": "${{ secrets.CONTEXT7_API_KEY }}" }