diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index d98e44a6fc..7a1590f99b 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -2824,8 +2824,42 @@ impl Session { request_id: RequestId, params: McpServerElicitationRequestParams, ) -> Option { - let (tx_response, rx_response) = oneshot::channel(); let server_name = params.server_name.clone(); + let request = match params.request { + McpServerElicitationRequest::Form { + meta, + message, + requested_schema, + } => { + let requested_schema = match serde_json::to_value(requested_schema) { + Ok(requested_schema) => requested_schema, + Err(err) => { + warn!( + "failed to serialize MCP elicitation schema for server_name: {server_name}, request_id: {request_id}: {err:#}" + ); + return None; + } + }; + codex_protocol::approvals::ElicitationRequest::Form { + meta, + message, + requested_schema, + } + } + McpServerElicitationRequest::Url { + meta, + message, + url, + elicitation_id, + } => codex_protocol::approvals::ElicitationRequest::Url { + meta, + message, + url, + elicitation_id, + }, + }; + + let (tx_response, rx_response) = oneshot::channel(); let prev_entry = { let mut active = self.active_turn.lock().await; match active.as_mut() { @@ -2845,30 +2879,6 @@ impl Session { "Overwriting existing pending elicitation for server_name: {server_name}, request_id: {request_id}" ); } - - let request = match params.request { - McpServerElicitationRequest::Form { - meta, - message, - requested_schema, - } => codex_protocol::approvals::ElicitationRequest::Form { - meta, - message, - requested_schema: serde_json::to_value(requested_schema) - .expect("typed MCP elicitation schema should serialize"), - }, - McpServerElicitationRequest::Url { - meta, - message, - url, - elicitation_id, - } => codex_protocol::approvals::ElicitationRequest::Url { - meta, - message, - url, - elicitation_id, - }, - }; let id = match request_id { rmcp::model::NumberOrString::String(value) => { codex_protocol::mcp::RequestId::String(value.to_string()) diff --git a/codex-rs/core/src/mcp_tool_call.rs b/codex-rs/core/src/mcp_tool_call.rs index 0aeafc55d4..3900ea417a 100644 --- a/codex-rs/core/src/mcp_tool_call.rs +++ b/codex-rs/core/src/mcp_tool_call.rs @@ -116,10 +116,8 @@ pub(crate) async fn handle_mcp_tool_call( sess.as_ref(), turn_context, &call_id, - &server, - &tool_name, + &invocation, metadata.as_ref(), - arguments_value.as_ref(), app_tool_policy.approval, ) .await @@ -378,10 +376,8 @@ async fn maybe_request_mcp_tool_approval( sess: &Session, turn_context: &TurnContext, call_id: &str, - server: &str, - tool_name: &str, + invocation: &McpInvocation, metadata: Option<&McpToolApprovalMetadata>, - tool_params: Option<&serde_json::Value>, approval_mode: AppToolApproval, ) -> Option { if approval_mode == AppToolApproval::Approve { @@ -399,13 +395,13 @@ async fn maybe_request_mcp_tool_approval( let approval_key = if approval_mode == AppToolApproval::Auto { let connector_id = metadata.and_then(|metadata| metadata.connector_id.clone()); - if server == CODEX_APPS_MCP_SERVER_NAME && connector_id.is_none() { + if invocation.server == CODEX_APPS_MCP_SERVER_NAME && connector_id.is_none() { None } else { Some(McpToolApprovalKey { - server: server.to_string(), + server: invocation.server.clone(), connector_id, - tool_name: tool_name.to_string(), + tool_name: invocation.tool.clone(), }) } } else { @@ -420,8 +416,8 @@ async fn maybe_request_mcp_tool_approval( let question_id = format!("{MCP_TOOL_APPROVAL_QUESTION_ID_PREFIX}_{call_id}"); let question = build_mcp_tool_approval_question( question_id.clone(), - server, - tool_name, + &invocation.server, + &invocation.tool, metadata.and_then(|metadata| metadata.tool_title.as_deref()), metadata.and_then(|metadata| metadata.connector_name.as_deref()), annotations, @@ -438,9 +434,9 @@ async fn maybe_request_mcp_tool_approval( let params = build_mcp_tool_approval_elicitation_request( sess, turn_context, - server, + &invocation.server, metadata, - tool_params, + invocation.arguments.as_ref(), question.clone(), approval_key.is_some(), );