MCP-over-ACP: client-held credentials — confirming per-session serverId scoping, plus a Security note #2584
haowei2000
started this conversation in
Protocol Suggestions
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Related: MCP-over-ACP RFD · earlier thread #345 · Zulip topic
#rfds > MCP-over-ACPHi all — we build Cheers, a chat platform where an ACP client (our connector) runs third-party agents (Claude, Codex, Gemini, OpenCode) on a user's host and gives them platform tools over MCP. We've been working through how tool credentials should flow, and MCP-over-ACP looks like exactly the right shape. A few questions and an offer to help.
The pattern we care about
The agent decides what to call; the client decides whether, and with which credential. Today, the only portable option is to put a bearer token into
mcpServers[].headersonsession/neworsession/load.What we ran into in practice
redirect_uripoints at the host, which the user's browser (on another machine) can't reach.client_credentials) and puts it inmcpServers[].headers. To rotate it, we re-sendmcpServersviasession/loadbefore every prompt. Whether an agent actually swaps the header for a session that is already live is agent-specific, and we can't verify it uniformly. In practice that pushed us to a 24h TTL.serverIdis the clean, portable version of that.403 insufficient_scope. It surfaces as a generic tool failure, often without the reason reaching the model. We're moving refusals intoisErrortool results with an explicit next step. URL-mode elicitation isn't a fix here: MCP says servers must not use it to authorize access to themselves, and agent support is still sparse.With MCP-over-ACP the client can be the provider: it attaches its own credential when forwarding to the real (remote) MCP server, or executes locally, so the agent never holds one. Short-lived or sender-constrained (DPoP) tokens become practical, and so does per-call approval via MRTR.
1. Is per-session
serverIdthe intended way to scope authority?The RFD says "distinct offerings use distinct server IDs rather than hidden per-MCP-connection catalogs." We read this as: a provider that needs session-specific authority (for us, one chat channel per ACP session) declares a distinct
serverIdper session and binds the credential to that registration. If that's right, could the Security section say so explicitly? It's the piece that makes client-held credentials safe when one agent process serves several sessions.2. Proposed non-normative Security text
Happy to open a PR with this if it's welcome.
What we can contribute
mcpCapabilities.acp. We'd be glad to help land support in open adapters (e.g.claude-agent-acp,codex-acp) and test the polyfill path for agents without native support.session/load, which handle MRTR retries, and so on.Thanks for the careful design. The request-scoped rewrite made this much easier to reason about.
All reactions