elegant-branch-54423
10/15/2026, 2:57 PMlimited-student-10747
10/15/2026, 3:00 PMfresh-machine-37269
10/15/2026, 3:00 PMfresh-machine-37269
10/15/2026, 3:03 PMsse.
β’ Anything not advertised gets dropped with a warning rather than an error β which is exactly the "ACP can't connect to my MCP servers" symptom.
For Codex specifically, codex-acp advertises http but ignores sse, so SSE-configured servers silently don't make it through. Two other gotchas in the same area: stdio servers need `npx`/`uvx` present in the runtime image, and MCP binds at session creation β changing the config restarts the session, there's no runtime add.
Tracked issues:
β’ agent-canvas #2395 β Enable MCP servers for ACP agents (original work, closed) github.com/OpenHands/agent-canvas/issues/2395
β’ software-agent-sdk #3705 β Foundation: codify ACP MCP forwarding (closed; documents the capability gating and drop-with-warning behaviour) github.com/OpenHands/software-agent-sdk/issues/3705
β’ agent-canvas #2383 / software-agent-sdk #3668 β ACP MCP auth header forwarding fix (closed)
β’ agent-canvas #2022 β Preserve MCP credentials for ACP conversations (closed)
β’ software-agent-sdk #5743 β sub-agents didn't inherit the parent's MCP servers (closed 2026-10-14, SDK 1.54.0) β worth checking if the tools vanish specifically in delegated sub-agents
If you're hitting a concrete failure β an error, or an empty server list for one particular agent β it'd help to know which ACP agent and whether the server is stdio/http/sse. That combination may not be covered yet and would be worth a fresh issue.
This reply was generated by an AI agent (OpenHands) on behalf of the user.limited-student-10747
10/15/2026, 3:07 PMlimited-student-10747
10/15/2026, 3:07 PMelegant-branch-54423
10/15/2026, 3:24 PMOpenHands agent, but when I use Codex via ACP, Codex tries to connect to them and fails.
> [codex-acp forwarded startup error] MCP server Linear failed to start: The Linear MCP server is not logged in. Run codex mcp login Linear.
Feels like we might be missing a step in priming the MCP servers for use via ACP. This should be pretty easy to repro; happy to create an issue for this exact scenario. If we can solve for this scenario, then I think it matches the basic user expectation of "I configure an MCP server and can use it with Openhands and ACP agents"limited-student-10747
10/15/2026, 3:32 PMfresh-machine-37269
10/15/2026, 3:43 PM"kind": "shttp" in the catalog, which normalises to http β and codex-acp does advertise http. So those servers are being forwarded. They're just arriving with no credentials.
The actual bug: _remote_mcp_headers() in acp_agent.py (~line 675) only converts header-compatible auth. MCPOAuthAuthCredential.to_http_headers() deliberately returns None (mcp/config.py, ~line 480). So for an OAuth2 connection the code hits its "uses unsupported remote MCP auth type β¦ only header-compatible auth can be forwarded" branch and forwards the bare URL with static headers only β no Authorization. The OAuth access token lives in auth.state and is only ever materialised by the native FastMCP path (token store + mcp_oauth_factory); initial_oauth_state has no caller anywhere on the ACP path. Codex therefore gets an unauthenticated URL and reports exactly what you saw: not logged in, run codex mcp login.
Two things that make this conclusive:
β’ Granola's catalog entry has only an oauth connection option β no API-key fallback β so it can never work via ACP today.
β’ A Linear API-key connection (strategy: bearer) does forward, because that path returns an Authorization header. So OAuth-vs-key is the discriminator, not the provider.
Why the symptoms look inconsistent: Canvas's Test connection and the OpenHands agent both route through create_mcp_tools() with an OAuth token store (mcp_router.py::_probe_mcp_server) β the native path, which handles OAuth fine. Green checkmarks + works on OpenHands + fails on ACP is the exact signature of this.
So your read is right, and it's both:
β’ Technical bug β OAuth MCP credentials are never forwarded to the ACP subprocess.
β’ UX bug β the drop is a server-side logger.warning, never surfaced in Canvas. A warning affordance would be a good fix, but it would only have told you "auth not forwardable", not fixed it.
Not tracked: #3705 / #3667 / #3668 cover api_key / bearer / header forwarding only. Nothing covers oauth2 β ACP, so this needs a fresh issue β happy to file it with the repro above if you'd like.
Fix sketch: ACP's McpServerHttp carries headers only, so the fix is to materialise the stored OAuth access token (refreshing if expired, via the same token store the native path uses) into Authorization: Bearer when building the ACP server entry, plus a decision on what to do when refresh can't complete. Worth noting acp_isolate_data_dir relocates CODEX_HOME per conversation, so even a host-side codex mcp login wouldn't be visible to the subprocess on cloud.
Caveat: this is from reading `main`; a runtime capture of the forwarded mcp_servers payload would confirm it outright.
This reply was generated by an AI agent (OpenHands) on behalf of the user.limited-student-10747
10/15/2026, 3:45 PMelegant-branch-54423
10/16/2026, 1:23 PMlimited-student-10747
10/16/2026, 1:23 PMfresh-machine-37269
10/16/2026, 1:24 PMlimited-student-10747
10/16/2026, 1:24 PMfresh-machine-37269
10/16/2026, 1:32 PMOpenHands/software-agent-sdk (or OpenHands/OpenHands) matching this: no OAuthβACP credentials issue, and no bot-authored issue in that repo since late September.
What is tracked (and only partially overlaps) is the earlier round of ACP MCP forwarding work β #3705 / #3667 / #3668 cover api_key / bearer / header forwarding, and #5743 (closed) covered sub-agents inheriting the parent's MCP servers. Nothing covers the actual bug you hit: OAuth2 MCP credentials are never forwarded to the ACP subprocess, so Codex gets the bare URL with no Authorization header and reports "not logged in, run `codex mcp login`".
Want me to file it now? I have the repro and the fix sketch ready (materialise the stored OAuth access token β refreshing if expired, via the same token store the native path uses β into Authorization: Bearer when building the ACP server entry), plus a failing test covering OAuth2 vs. bearer forwarding. Say the word and I'll open the issue and the PR.limited-student-10747
10/16/2026, 1:39 PMfresh-machine-37269
10/16/2026, 2:08 PM