Skip to content

feat: mount MCP servers as local CLIs after gateway starts#25928

Open
Copilot wants to merge 23 commits intomainfrom
copilot/reconstruct-feature-24503
Open

feat: mount MCP servers as local CLIs after gateway starts#25928
Copilot wants to merge 23 commits intomainfrom
copilot/reconstruct-feature-24503

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 12, 2026

Reconstructs the feature from #24503. Adds opt-in mounting of MCP servers as standalone CLI tools on PATH via tools.mount-as-clis: true (default false). When enabled, user-facing MCP servers are exposed as shell commands and excluded from the agent's final MCP config, forcing the agent to use CLI wrappers exclusively. The github MCP server is excluded from CLI mounting as it is handled differently and remains available as a normal MCP tool.

The safeoutputs and mcpscripts servers are always CLI-mounted when enabled — regardless of the mount-as-clis setting — and remain available as MCP tools too (dual access). The injected prompt instructs the agent to prefer the CLI wrappers over the MCP tools for these servers.

How it works

The gateway starts containers for all configured servers (so they're reachable), then filtering happens in two stages:

  1. Gateway config: includes all servers — needed to populate ${RUNNER_TEMP}/gh-aw/mcp-cli/manifest.json
  2. Agent config: CLI-mounted servers excluded via GH_AW_MCP_CLI_SERVERS env var in each convert_gateway_config_*.cjs script — except safeoutputs and mcpscripts, which stay in the agent MCP config for dual access

After the gateway starts, mount_mcp_as_cli.cjs reads the manifest, queries each server's tools/list via the full MCP session protocol (initializenotifications/initializedtools/list), and generates locked-down CLI wrappers under ${RUNNER_TEMP}/gh-aw/mcp-cli/bin/.

tools:
  playwright:
  mount-as-clis: true
# Agent uses these instead of MCP protocol:
playwright browser_navigate --url https://example.com
safeoutputs add_comment --body "Analysis complete"
mcpscripts mcpscripts-gh --args "pr list --repo owner/repo --limit 5"

Note: The github MCP server is not CLI-mounted — it is handled differently and remains available as a normal MCP tool even when mount-as-clis: true is set.

Changes

New files

  • pkg/workflow/mcp_cli_mount.gogetMCPCLIServerNames(), getMCPCLIExcludeFromAgentConfig(), generateMCPCLIMountStep(), buildMCPCLIPromptSection()
  • actions/setup/js/mount_mcp_as_cli.cjs — manifest reader, MCP handshake, CLI wrapper generator; scripts placed at ${RUNNER_TEMP}/gh-aw/mcp-cli/bin/ (inside AWF sandbox mount), directory locked chmod 555, API key baked in at generation time (not available in sandbox env)
  • actions/setup/md/mcp_cli_tools_prompt.md<mcp-clis> prompt section template
  • actions/setup/js/convert_gateway_config_copilot.cjs — JavaScript gateway config converter for Copilot (filters CLI servers, adds tools:["*"], rewrites URLs)
  • actions/setup/js/convert_gateway_config_claude.cjs — JavaScript gateway config converter for Claude (filters CLI servers, sets type:"http", rewrites URLs)
  • actions/setup/js/convert_gateway_config_codex.cjs — JavaScript gateway config converter for Codex (filters CLI servers, resolves host.docker.internal to 172.30.0.1, generates TOML)
  • actions/setup/js/convert_gateway_config_gemini.cjs — JavaScript gateway config converter for Gemini (filters CLI servers, removes type field for transport auto-detection, rewrites URLs, adds context.includeDirectories)
  • actions/setup/js/start_mcp_gateway.cjs — JavaScript gateway startup script (reads MCP config from stdin, launches Docker container, health check polling, engine-specific converter dispatch, CLI manifest creation, GitHub Actions outputs)

Go pipeline integration

  • ToolsConfig.MountAsCLIs field + parser + schema + validation
  • compiler_yaml_main_job.go calls generateMCPCLIMountStep() after gateway setup
  • mcp_setup_generator.go exports GH_AW_MCP_CLI_SERVERS JSON array to $GITHUB_ENV using getMCPCLIExcludeFromAgentConfig() (excludes safeoutputs/mcpscripts so they remain as MCP tools)
  • unified_prompt_step.go injects CLI tools prompt section (8a, after safe outputs)
  • mcp_rendering.go documents why CLI servers stay in gateway config
  • mcp_renderer.go invokes node start_mcp_gateway.cjs (converted from bash start_mcp_gateway.sh)
  • getMCPCLIServerNames() always includes safeoutputs and mcpscripts when they are enabled (HasSafeOutputsEnabled/IsMCPScriptsEnabled), regardless of mount-as-clis setting
  • getMCPCLIExcludeFromAgentConfig() returns only servers that should be removed from agent MCP config (does not include safeoutputs/mcpscripts — they get dual access)

Dual access for safeoutputs and mcpscripts

  • safeoutputs and mcpscripts are always CLI-mounted when enabled, even without mount-as-clis: true
  • They remain in the agent's MCP config (not filtered by converter scripts) — dual access via both CLI and MCP
  • The alwaysCLIMountedServers map in Go controls which servers get this treatment
  • The prompt template instructs the agent to prefer CLI wrappers over MCP tools for these servers

Gateway scripts (bash → JavaScript)

  • start_mcp_gateway.cjs — full JavaScript port of the gateway startup script using child_process.spawn for Docker container management, Node.js http module for health checks, and child_process.execSync for converter/checker dispatch. Maintains all security controls (umask, symlink attack prevention, 0o600 file permissions)
  • convert_gateway_config_{copilot,claude,codex,gemini}.cjs — all four engine converters are JavaScript for CLI server filtering, URL rewriting, and engine-specific config generation
  • validate_prompt_placeholders.sh — strips backtick code spans before checking for unreplaced __GH_AW_*__ placeholders

Config storage hardening (/tmpRUNNER_TEMP)

  • MCP config (mcp-config/) and CLI manifest (mcp-cli/) moved from /tmp/gh-aw/ to ${RUNNER_TEMP}/gh-aw/ to prevent tampering — /tmp is world-writable, RUNNER_TEMP is per-runner and not world-accessible
  • Updated across all JavaScript scripts (start_mcp_gateway.cjs, converter scripts, mount_mcp_as_cli.cjs, redact_secrets.cjs) and Go engine code (claude_engine.go, codex_engine.go, codex_mcp.go, claude_mcp.go, gemini_mcp.go, mcp_setup_generator.go, threat_detection.go, step_order_validation.go)
  • MCP logs remain under /tmp/gh-aw/mcp-logs/ since the Docker gateway container writes there via -v /tmp:/tmp:rw

Security hardening (shell injection, input validation)

  • shellEscapeDoubleQuoted() in mount_mcp_as_cli.cjs — escapes $ `` \ " ! and strips \r\n for all values embedded in generated CLI wrapper bash scripts (server name, URL, tools file path, API key), preventing shell injection and line injection attacks
  • isValidServerName() in mount_mcp_as_cli.cjs — validates server names against [a-zA-Z0-9_-] with 64-char max length, preventing path traversal and shell metacharacter injection via malicious server names; servers failing validation are skipped with a warning
  • URL validation — manifest server entries validated with new URL() before processing
  • Port validationgatewayPort verified to be strictly numeric before interpolation into execSync shell commands in start_mcp_gateway.cjs
  • API key passingcheck_mcp_servers.sh call uses $MCP_GATEWAY_API_KEY env var reference instead of direct JS string interpolation to avoid shell metacharacter risks
  • Server name validation in manifeststart_mcp_gateway.cjs filters invalid server names when generating the CLI manifest

Observability improvements

  • All 5 new JavaScript scripts use core.* logging via shim.cjs (core.info, core.error, core.warning) instead of console.*, ensuring consistent GitHub Actions annotation output
  • All 4 converter scripts log CLI-mounted server filter list and include/filter counts
  • start_mcp_gateway.cjs logs startup banner (engine, port, domain, runner temp), server names in CLI manifest; top-level error handler preserves stack traces via core.error(err.stack) before core.setFailed()
  • mount_mcp_as_cli.cjs logs manifest server count after internal filtering, skipped servers with validation error reasons

Server exclusions

  • The github MCP server is excluded from CLI mounting in both Go (internalMCPServerNames) and JavaScript (INTERNAL_SERVERS) — it is handled differently and remains a normal MCP tool
  • safeoutputs and mcpscripts are always CLI-mounted when enabled (dual access with MCP), with usage examples and preference guidance in the prompt template

Smoke test

  • smoke-copilot.md enables mount-as-clis: true and updates test instructions to use CLI syntax for playwright/serena/safeoutputs/mcpscripts while keeping github as a normal MCP tool


✨ PR Review Safe Output Test - Run 24374939921

💥 [THE END] — Illustrated by Smoke Claude · ● 229.4K ·



✨ PR Review Safe Output Test - Run 24375143641

💥 [THE END] — Illustrated by Smoke Claude · ● 143.9K ·

Copilot AI and others added 2 commits April 12, 2026 18:06
Agent-Logs-Url: https://github.com/github/gh-aw/sessions/f6e50b8d-7b6d-4cef-a64b-c7b0f9f8878d

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Adds automatic mounting of MCP servers as local CLI tools in agentic
workflows. This behavior is opt-in via a new `tools.mount-as-clis: true`
flag (default `false`). When enabled, all user-facing MCP servers are
exposed as standalone shell commands and excluded from the agent's final
MCP config so the agent uses the CLI wrappers exclusively.

Reconstructs the feature from PR #24503.

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/f6e50b8d-7b6d-4cef-a64b-c7b0f9f8878d

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot ignore the github MCP server, it is handled differently.

The github MCP server is handled differently and should not be
mounted as a CLI tool. Added it to the exclusion lists in both
Go and JavaScript code, updated prompt template examples, and
restored smoke test instructions to use github as a normal MCP tool.

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/35a490ef-753b-4f4e-8ab3-0d10a2d44b21

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 12, 2026

@copilot ignore the github MCP server, it is handled differently.

Excluded the github MCP server from CLI mounting in commit 4951367. Added it to the exclusion lists in both Go (internalMCPServerNames) and JavaScript (INTERNAL_SERVERS), updated the prompt template to remove github examples, and restored the smoke test to use github as a normal MCP tool.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw -pack /home/REDACTED/work/gh-aw/gh-aw/cmd/gh-aw/main.go (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw muPkofL/NgJlZta4-C (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v9
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha .js&#39; --ignore-path .prettierigno-errorsas (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha .js&#39; --ignore-path .prettierigno-errorsas erena-mcp-server:latest x_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha k/gh-aw/gh-aw config 1/x64/bin/node remote.origin.urgit (http block)
  • https://api.github.com/repos/actions/setup-go/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq .object.sha .js&#39; --ignore-path .prettierigno-errorsas (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq .object.sha .js&#39; --ignore-path .prettierigno-errorsas show x_amd64/vet (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha to pkg/workflow/data/action_pins.json...&#34; (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha ithub/workflows commit.gpgsign /home/REDACTED/.local/bin/bash (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha (http block)
  • https://api.github.com/repos/docker/build-push-action/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/docker/build-push-action/git/ref/tags/v7 --jq .object.sha (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha (http block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI requested a review from pelikhan April 12, 2026 18:58
@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot enable flag for smoke-copilot

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot always enabled for safeoutputs, mcpscripts. Update the built prompt generator to reflect this change too.

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 12, 2026

@copilot enable flag for smoke-copilot

The mount-as-clis: true flag is already enabled in smoke-copilot.md (line 47 in the tools section) since commit afeaeed. The compiled lock file includes the "Mount MCP servers as CLIs" step, GH_AW_MCP_CLI_SERVERS env var, and CLI prompt section for agenticworkflows, playwright, and serena (with github excluded per the previous feedback).

Removed safeoutputs, mcp-scripts, and mcpscripts from the
internalMCPServerNames exclusion list in both Go and JavaScript.
Added explicit logic to always include safeoutputs and mcpscripts
in getMCPCLIServerNames() when they are enabled.
Updated the prompt template with safeoutputs/mcpscripts examples
and updated smoke-copilot test instructions accordingly.

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/20bf245a-f76f-48bb-9b17-8597b84ee941

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 12, 2026

@copilot always enabled for safeoutputs, mcpscripts. Update the built prompt generator to reflect this change too.

Done in fb83906. Removed safeoutputs and mcpscripts from the exclusion lists in both Go (internalMCPServerNames) and JavaScript (INTERNAL_SERVERS). Added explicit logic in getMCPCLIServerNames() to always include them when enabled. Updated the prompt template with safeoutputs/mcpscripts usage examples and the smoke-copilot test instructions to list them as CLI-mounted servers.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw **/*.cjs 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/actions/ai-inference/git/ref/tags/v1
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq .object.sha -json GO111MODULE /usr/local/bin/bash GOINSECURE GOMOD -d bash --no�� --noprofile GOPROXY (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v3
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq .object.sha &#34; GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v5
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE node /opt�� prettier --check 64/bin/go --ignore-path .prettierignore 64/bin/go go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha -test.timeout=10m0s -test.count=1 /usr/bin/git GOSUMDB GOWORK 64/bin/go git rev-�� --show-toplevel go /usr/bin/git MFpD/H8VUAZrsjt5git GO111MODULE 64/bin/go git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha --show-toplevel node /usr/bin/git run lint:cjs 64/bin/go git rev-�� --show-toplevel sh /usr/bin/git &#34;prettier&#34; --chegit node 64/bin/go git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v9
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/actions/setup-go/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/pkg/tool/linux_amd64/cgo GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/cgo (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha d -n 10 (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha d -n 10 --global rgo/bin/git http.https://gitgh (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha (http block)
  • https://api.github.com/repos/docker/build-push-action/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/docker/build-push-action/git/ref/tags/v7 --jq .object.sha --get-regexp --global t (http block)
    • Triggering command: /usr/bin/gh gh api /repos/docker/build-push-action/git/ref/tags/v7 --jq .object.sha ver\|cli_server _config_copilot.sh r: $owner, name: $name) { hasDiscussionsEnabled } } (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v0.1.2
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq .object.sha 476627/b001/workflow.test GO111MODULE 476627/b001/importcfg.link GOINSECURE GOMOD GOMODCACHE iTe2m1FqJ9AqD/E7yW-V-7DMzId52nbD6_/zJRkgRAW4PV_t4DqOxSf/EhrgUD1iTe2m1FqJ9AqD env ry=1 GO111MODULE che/go-build/14/14900198eb5740c9d1377a056c579ed3b8c3e7641e6841d95fa187196c139bf3-d GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v0.47.4
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq .object.sha --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel npx /usr/bin/git --check **/*.cjs 64/bin/go git (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq .object.sha 1089883/b423/_pkGOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env hkp_/BdvgLBe8Jb1GOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE 1089883/b423/impGOPROXY (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha (http block)
  • https://api.github.com/repos/nonexistent/action/git/ref/tags/v999.999.999
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq .object.sha 1089883/b428/_pkGOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env BdUk/qiAXtumHukIGOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE 1089883/b428/impGOPROXY (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 12, 2026

✅ All tools validated successfully! Agent Container Smoke Test confirms agent container is ready.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 12, 2026

⚠️ Smoke Gemini failed. Gemini encountered unexpected challenges...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 12, 2026

✨ The prophecy is fulfilled... Smoke Codex has completed its mystical journey. The stars align. 🌟

@github-actions
Copy link
Copy Markdown
Contributor

📰 BREAKING: Smoke Copilot is now investigating this pull request. Sources say the story is developing...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 12, 2026

🎬 THE ENDSmoke Claude MISSION: ACCOMPLISHED! The hero saves the day! ✨

@github-actions github-actions bot removed the smoke label Apr 12, 2026
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot merge main, fix conflicts, recompile

…lock files

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 14, 2026

@copilot merge main, fix conflicts, recompile

Merged main, resolved 1 conflict (daily-fact lock file), and recompiled all 191 lock files in 5ef0488.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw nnY3ZTMsdTJO (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha (http block)
  • https://api.github.com/repos/docker/build-push-action/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/docker/build-push-action/git/ref/tags/v7 --jq .object.sha (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@pelikhan pelikhan added smoke and removed smoke labels Apr 14, 2026
@github-actions
Copy link
Copy Markdown
Contributor

📰 BREAKING: Smoke Copilot is now investigating this pull request. Sources say the story is developing...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 14, 2026

⚠️ Smoke Gemini failed. Gemini encountered unexpected challenges...

@github-actions github-actions bot removed the smoke label Apr 14, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 14, 2026

🎬 THE ENDSmoke Claude MISSION: ACCOMPLISHED! The hero saves the day! ✨

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 14, 2026

✅ All tools validated successfully! Agent Container Smoke Test confirms agent container is ready.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 14, 2026

🌑 The shadows whisper... Smoke Codex failed. The oracle requires further meditation...

@github-actions
Copy link
Copy Markdown
Contributor

Agent Container Tool Check

Tool Status Version
bash 5.2.21
sh available
git 2.53.0
jq 1.7
yq v4.52.5
curl 8.5.0
gh 2.89.0
node v20.20.2
python3 3.12.3
go 1.24.13
java 21.0.10
dotnet 10.0.201

Result: 12/12 tools available ✅

Overall Status: PASS

🔧 Tool validation by Agent Container Smoke Test · ● 208.2K ·

@github-actions
Copy link
Copy Markdown
Contributor

Smoke Test Results — §24374939926

Author: @Copilot | Assignees: @pelikhan, @Copilot

Test Status
GitHub MCP
MCP Scripts GH CLI
Serena CLI ❌ jq quoting bug
Playwright CLI ❌ jq quoting bug
Web Fetch
File Write + Bash verify
Discussion Query
Build gh-aw
Upload artifact
Discussion Creation
Workflow Dispatch
PR Review

Overall: ⚠️ PARTIAL PASS — Serena/Playwright fail due to jq/awk quoting bugs in CLI wrappers (the very bug this PR introduces and documents).

📰 BREAKING: Report filed by Smoke Copilot · ● 893.8K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Smoke test run §24374939926 confirmed the jq/awk quoting bugs in mount_mcp_as_cli.cjs are active — both Serena and Playwright CLI wrappers fail with session not found due to premature bash variable expansion. Comments added at lines 321 and 346.

📰 BREAKING: Report filed by Smoke Copilot · ● 893.8K

>/dev/null 2>/dev/null || true

local session_id
session_id=\$(grep -i "^mcp-session-id:" "\$headers_file" 2>/dev/null | awk "{print \$2}" | tr -d "\\r" || echo "")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug confirmed active (smoke test): Same issue — awk "{print $2}" with double quotes causes bash to expand positional variable before awk, resulting in empty session ID capture and session not found errors in all CLI tool invocations.

local key="\${1#--}"
if [[ \$# -ge 2 && "\$2" != --* ]]; then
local val="\$2"
args=\$(echo "\$args" | jq --arg k "\$key" --arg v "\$val" ". + {(\$k): \$v}")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug confirmed active (smoke test): The jq filter uses double-quoted bash strings which expand shell variables before jq sees them, producing . + {(): } errors. Fix: use single quotes for jq filter strings to prevent premature shell expansion. This is causing Serena and Playwright CLI wrappers to fail with session not found.

@github-actions
Copy link
Copy Markdown
Contributor

📰 VERDICT: Smoke Copilot has concluded. All systems operational. This is a developing story. 🎤

@github-actions
Copy link
Copy Markdown
Contributor

Smoke Test Run 24374939921 — PARTIAL ✅

Test Result
1 GitHub MCP
2 mcpscripts-gh
3 Serena
4 Make Build
5 Playwright
6 Tavily
7 File Write
8 Bash
9 Discussion
10 AW Status
11 Slack
12 Code Scan
13 Update PR
14 Review Comments
15 Submit Review
16 Resolve Thread ⚠️ skipped
17 Add Reviewer
18 Push Branch
19 Close PR ⚠️ skipped

💥 [THE END] — Illustrated by Smoke Claude · ● 229.4K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💥 Automated smoke test review - all systems nominal! Run 24374939921 verified PR #25928 changes. The MCP CLI mounting feature looks well-structured with good security hardening.

💥 [THE END] — Illustrated by Smoke Claude · ● 229.4K

@@ -0,0 +1,5 @@
---
"gh-aw": patch
---
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Smoke Test Review Comment #1 — The changeset entry accurately describes the tools.mount-as-clis feature. Consider adding a note about the dual-access behavior for safeoutputs and mcpscripts servers in the changeset description for better documentation.

@@ -390,7 +390,7 @@ jobs:
GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
run: |
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Smoke Test Review Comment #2 — Good security improvement moving MCP config from /tmp/gh-aw/mcp-config to \$\{RUNNER_TEMP}/gh-aw/mcp-config. The RUNNER_TEMP directory is per-runner and not world-accessible, preventing tampering. Run 24374939921.

Copy link
Copy Markdown
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💥 Automated smoke test review — Run 24375143641. All systems nominal! Review comments test the safe-outputs pipeline end-to-end.

💥 [THE END] — Illustrated by Smoke Claude · ● 143.9K

@@ -0,0 +1,5 @@
---
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Smoke Test Review Comment #1 — Changeset header looks good. The patch bump is appropriate for an opt-in feature addition.

"gh-aw": patch
---

Added opt-in MCP CLI mounting via `tools.mount-as-clis: true`, which exposes eligible MCP servers as local CLI wrappers on `PATH` and updates prompt/config wiring so agents use those wrappers. The `github` MCP server remains a normal MCP tool, while `safeoutputs` and `mcpscripts` are included in CLI mounting when enabled.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Smoke Test Review Comment #2 — Good changeset description. Consider mentioning safeoutputs/mcpscripts dual-access behavior in the summary for operators reading release notes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants