[MCP] When MCP auth expires, prompt the user to log in again. (#5300)

Similar to https://github.com/openai/codex/pull/5193 but catches a case
where the user _has_ authenticated but the auth expired or was revoked.

Before:
<img width="2976" height="632" alt="CleanShot 2025-10-17 at 14 28 11"
src="https://github.com/user-attachments/assets/7c1bd11d-c075-46cb-9298-48891eaa77fe"
/>

After:
<img width="591" height="283" alt="image"
src="https://github.com/user-attachments/assets/fc14e08c-1a33-4077-8757-ff4ed3f00f8f"
/>
This commit is contained in:
Gabriel Peal
2025-10-17 15:16:22 -07:00
committed by GitHub
parent c1bde2a4ef
commit 41900e9d0f

View File

@@ -426,13 +426,16 @@ impl Session {
// Surface individual client start-up failures to the user.
if !failed_clients.is_empty() {
for (server_name, err) in failed_clients {
let auth_status = auth_statuses.get(&server_name);
let requires_login = match auth_status {
Some(McpAuthStatus::NotLoggedIn) => true,
Some(McpAuthStatus::OAuth) => is_mcp_client_auth_required_error(&err),
_ => false,
};
let log_message =
format!("MCP client for `{server_name}` failed to start: {err:#}");
error!("{log_message}");
let display_message = if matches!(
auth_statuses.get(&server_name),
Some(McpAuthStatus::NotLoggedIn)
) {
let display_message = if requires_login {
format!(
"The {server_name} MCP server is not logged in. Run `codex mcp login {server_name}` to log in."
)
@@ -2524,6 +2527,11 @@ pub(crate) async fn exit_review_mode(
.await;
}
fn is_mcp_client_auth_required_error(error: &anyhow::Error) -> bool {
// StreamableHttpError::AuthRequired from the MCP SDK.
error.to_string().contains("Auth required")
}
use crate::executor::errors::ExecError;
use crate::executor::linkers::PreparedExec;
use crate::tools::context::ApplyPatchCommandContext;