From f576c9b5ae5c1b980592a655abb8bcb2cfdd73a2 Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Fri, 15 May 2026 20:09:38 -0700 Subject: [PATCH] Preserve MCP metadata --- .../exec/src/event_processor_with_jsonl_output.rs | 1 + codex-rs/exec/src/exec_events.rs | 3 +++ .../exec/tests/event_processor_with_json_output.rs | 14 ++++++++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/codex-rs/exec/src/event_processor_with_jsonl_output.rs b/codex-rs/exec/src/event_processor_with_jsonl_output.rs index 045baacc7b..781d852d5d 100644 --- a/codex-rs/exec/src/event_processor_with_jsonl_output.rs +++ b/codex-rs/exec/src/event_processor_with_jsonl_output.rs @@ -224,6 +224,7 @@ impl EventProcessorWithJsonOutput { result: result.map(|result| McpToolCallItemResult { content: result.content, structured_content: result.structured_content, + meta: result.meta, }), error: error.map(|error| McpToolCallItemError { message: error.message, diff --git a/codex-rs/exec/src/exec_events.rs b/codex-rs/exec/src/exec_events.rs index 4a84ef7494..8d6c5d96e6 100644 --- a/codex-rs/exec/src/exec_events.rs +++ b/codex-rs/exec/src/exec_events.rs @@ -267,6 +267,9 @@ pub struct McpToolCallItemResult { // easy to export. pub content: Vec, pub structured_content: Option, + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + #[ts(optional, rename = "_meta")] + pub meta: Option, } /// Error details reported by a failed MCP tool invocation. diff --git a/codex-rs/exec/tests/event_processor_with_json_output.rs b/codex-rs/exec/tests/event_processor_with_json_output.rs index efda58f412..1ef5c4e420 100644 --- a/codex-rs/exec/tests/event_processor_with_json_output.rs +++ b/codex-rs/exec/tests/event_processor_with_json_output.rs @@ -541,6 +541,7 @@ fn mcp_tool_call_begin_and_end_emit_item_events() { result: Some(McpToolCallItemResult { content: Vec::new(), structured_content: None, + meta: None, }), error: None, status: McpToolCallStatus::Completed, @@ -601,7 +602,7 @@ fn mcp_tool_call_failure_sets_failed_status() { } #[test] -fn mcp_tool_call_defaults_arguments_and_preserves_structured_content() { +fn mcp_tool_call_defaults_arguments_and_preserves_structured_content_and_meta() { let mut processor = EventProcessorWithJsonOutput::new(/*last_message_path*/ None); let started = @@ -636,7 +637,11 @@ fn mcp_tool_call_defaults_arguments_and_preserves_structured_content() { "text": "done", })], structured_content: Some(json!({ "status": "ok" })), - meta: None, + meta: Some(json!({ + "raw_messages": [ + { "ref_id": "abc123" } + ], + })), })), error: None, duration_ms: Some(10), @@ -682,6 +687,11 @@ fn mcp_tool_call_defaults_arguments_and_preserves_structured_content() { "text": "done", })], structured_content: Some(json!({ "status": "ok" })), + meta: Some(json!({ + "raw_messages": [ + { "ref_id": "abc123" } + ], + })), }), error: None, status: McpToolCallStatus::Completed,