Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 8 additions & 19 deletions codex-rs/app-server/tests/suite/v2/thread_resume.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2755,7 +2755,7 @@ async fn thread_resume_with_overrides_defers_updated_at_until_turn_start() -> Re
}

#[tokio::test]
async fn thread_resume_fails_when_required_mcp_server_fails_to_initialize() -> Result<()> {
async fn thread_resume_returns_before_required_mcp_server_initializes() -> Result<()> {
let server = create_mock_responses_server_repeating_assistant("Done").await;
let codex_home = TempDir::new()?;
let rollout = setup_rollout_fixture(codex_home.path(), &server.uri())?;
Expand All @@ -2770,24 +2770,13 @@ async fn thread_resume_fails_when_required_mcp_server_fails_to_initialize() -> R
..Default::default()
})
.await?;
let err: JSONRPCError = timeout(
DEFAULT_READ_TIMEOUT,
mcp.read_stream_until_error_message(RequestId::Integer(resume_id)),
)
.await??;

assert!(
err.error
.message
.contains("required MCP servers failed to initialize"),
"unexpected error message: {}",
err.error.message
);
assert!(
err.error.message.contains("required_broken"),
"unexpected error message: {}",
err.error.message
);
let _: ThreadResumeResponse = to_response(
timeout(
DEFAULT_READ_TIMEOUT,
mcp.read_stream_until_response_message(RequestId::Integer(resume_id)),
)
.await??,
)?;

Ok(())
}
Expand Down
27 changes: 8 additions & 19 deletions codex-rs/app-server/tests/suite/v2/thread_start.rs
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ async fn thread_start_ephemeral_remains_pathless() -> Result<()> {
}

#[tokio::test]
async fn thread_start_fails_when_required_mcp_server_fails_to_initialize() -> Result<()> {
async fn thread_start_returns_before_required_mcp_server_initializes() -> Result<()> {
let server = create_mock_responses_server_repeating_assistant("Done").await;

let codex_home = TempDir::new()?;
Expand All @@ -599,24 +599,13 @@ async fn thread_start_fails_when_required_mcp_server_fails_to_initialize() -> Re
.send_thread_start_request(ThreadStartParams::default())
.await?;

let err: JSONRPCError = timeout(
DEFAULT_READ_TIMEOUT,
mcp.read_stream_until_error_message(RequestId::Integer(req_id)),
)
.await??;

assert!(
err.error
.message
.contains("required MCP servers failed to initialize"),
"unexpected error message: {}",
err.error.message
);
assert!(
err.error.message.contains("required_broken"),
"unexpected error message: {}",
err.error.message
);
let _: ThreadStartResponse = to_response(
timeout(
DEFAULT_READ_TIMEOUT,
mcp.read_stream_until_response_message(RequestId::Integer(req_id)),
)
.await??,
)?;

Ok(())
}
Expand Down
3 changes: 3 additions & 0 deletions codex-rs/core/src/mcp_tool_call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@ async fn handle_approved_mcp_tool_call(
let arguments_value = invocation.arguments.clone();
let connector_id = metadata.and_then(|metadata| metadata.connector_id.as_deref());
let connector_name = metadata.and_then(|metadata| metadata.connector_name.as_deref());
sess.ensure_mcp_connection_manager_initialized().await;
let server_origin = sess
.services
.mcp_connection_manager
Expand Down Expand Up @@ -1480,6 +1481,7 @@ pub(crate) async fn lookup_mcp_tool_metadata(
server: &str,
tool_name: &str,
) -> Option<McpToolApprovalMetadata> {
sess.ensure_mcp_connection_manager_initialized().await;
let tools = sess
.services
.mcp_connection_manager
Expand Down Expand Up @@ -1575,6 +1577,7 @@ async fn lookup_mcp_app_usage_metadata(
server: &str,
tool_name: &str,
) -> Option<McpAppUsageMetadata> {
sess.ensure_mcp_connection_manager_initialized().await;
let tools = sess
.services
.mcp_connection_manager
Expand Down
2 changes: 1 addition & 1 deletion codex-rs/core/src/session/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ pub async fn dynamic_tool_response(sess: &Arc<Session>, id: String, response: Dy
}

pub async fn refresh_mcp_servers(sess: &Arc<Session>, refresh_config: McpServerRefreshConfig) {
let mut guard = sess.pending_mcp_server_refresh_config.lock().await;
let mut guard = sess.pending_mcp_server_refresh.lock().await;
*guard = Some(refresh_config);
}

Expand Down
Loading
Loading