Skip to content

fix: approve every launcher-injected MCP server under protected Full access - #6

Merged
zfy0701 merged 1 commit into
agentconnect/rebase-v1.12.0from
codex/full-access-injected-mcp
Sep 20, 2026
Merged

zfy0701 merged 1 commit into
agentconnect/rebase-v1.12.0from
codex/full-access-injected-mcp

Conversation

@zfy0701

@zfy0701 zfy0701 commented Sep 20, 2026

Copy link
Copy Markdown

Problem

Protected Full access answers MCP tool approvals itself: every granular approval
category is disabled, so no client is ever asked. It approved only ACP-injected
servers whose config carries a url, so a launcher that injects its own bridge
over stdio had every call to that bridge cancelled with
user cancelled MCP tool call, and no approval ever reached the launcher.

The same call succeeds in agent and read-only, which forward the approval to
the ACP client; it failed only in the mode meant to be the most permissive.

Change

Drop the transport condition. Every server the launcher injected through
session/new, session/load or session/fork is approved on any transport,
under the guards #4 already had:

  • a name that any Codex config layer or the adapter's own config also declares
    is never approved, so session config cannot borrow a launcher-injected name;
  • changing mode revokes pending approvals;
  • already-loaded resumes are excluded.

Only the launcher can put a server on the injected list, so the list is already
the provenance proof. Transport added nothing to it.

fullAccessHttpMcpServers is renamed to fullAccessApprovedMcpServers, since it
no longer holds only HTTP servers. readme-dev.md is updated, including the
sentence that said stdio servers receive no automatic approval.

One behaviour change to be aware of: any other stdio server the launcher injects
(an operator's own MCP servers, for example) is approved under Full access as
well. Other modes still forward those approvals to the client.

Verification

  • npm run typecheck clean.
  • vitest run src/__tests__/PermissionLifecycleContext.test.ts src/__tests__/CodexACPAgent/CodexAcpClient.test.ts: 118 passed. The full suite was not run locally.
  • New client-level case: a stdio bridge and an HTTP server are both approved; a
    name a config layer declares is not.
  • Negative control: with the url condition restored, the new case fails with
    expected [ 'assigned' ] to deeply equal [ 'bridge', 'assigned' ], which is
    the reported bug.

Fixes agentconnect-md/agentconnect#2151. Supersedes #5: same outcome without a
per-launch secret, because the config-layer name guard already refuses a
borrowed name.

🤖 Generated with Claude Code

…access

Protected Full access answered MCP tool approvals itself but approved
only ACP-injected servers with a `url`, so a launcher's own stdio bridge
had every call cancelled with `user cancelled MCP tool call`. Only the
launcher can inject a server, and a name any config layer also declares
is never approved, so the injected list is already the provenance proof.
Drop the transport condition and rename the field to say what it holds.

Fixes agentconnect-md/agentconnect#2151.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant