Note
Grok responding on behalf of Julius.Thanks for the detailed timeline. I'm closing this as a duplicate of #16565. The root cause is the same, and only the error you see is different.
On main, each thread has a single MCP credential slot. When prepareMcpSession switches a thread to another provider, it calls revokeThread(threadId) before it issues the new token (ProviderSessionManager.ts). Once a token is revoked, McpHttpServer rejects it with a 401 invalid_mcp_credential, and the MCP client reports that as Authentication required. That's why the browser tools failed too: every T3 tool shares the same credential.
In your sequence (Codex runs 11–13, then Claude run 14, then Codex run 15), Claude's turn rotated the thread's credential. Codex's app-server only receives mcp_servers on thread/start/resume/fork, and a shared Codex session keeps an idle thread loaded for up to 30 minutes, so Codex kept calling with the revoked token. #16565 hits the other half of the same problem. There, a reused session keeps a token scoped to the wrong provider, so you get parent_not_active instead of a 401.
Open PR #17096 (which fixes #16565) predicts this exact Claude → Codex → Claude → Codex case in its "Known limits" section. A full fix needs either a credential per (thread, provider instance) or releasing the previous provider's session when you switch providers. I've noted on #16565 that this is the 401 form of the bug, so the fix should cover both.
Workaround: restart T3, or wait more than 30 minutes before switching back to Codex so it resumes the thread and picks up the current token. Your links for #56–58 are still stored. #59 and #60 were never written because those calls failed, so you can re-link them with link_pull_request after a restart.