Forward turn metadata for app-server MCP calls

This commit is contained in:
miaolin
2026-05-22 00:00:35 -07:00
parent b14f11d3d2
commit 10a6d8c033
2 changed files with 45 additions and 0 deletions
@@ -402,6 +402,10 @@ impl McpRequestProcessor {
let thread_id = params.thread_id.clone();
let (_, thread) = self.load_thread(&thread_id).await?;
let meta = with_mcp_tool_call_thread_id_meta(params.meta, &thread_id);
let meta = with_mcp_tool_call_turn_metadata_meta(
meta,
thread.current_mcp_request_turn_metadata().await,
);
let request_id = request_id.clone();
tokio::spawn(async move {
@@ -416,6 +420,34 @@ impl McpRequestProcessor {
}
}
fn with_mcp_tool_call_turn_metadata_meta(
meta: Option<serde_json::Value>,
turn_metadata: Option<serde_json::Value>,
) -> Option<serde_json::Value> {
let Some(turn_metadata) = turn_metadata else {
return meta;
};
match meta {
Some(serde_json::Value::Object(mut map)) => {
map.insert(
codex_core::X_CODEX_TURN_METADATA_HEADER.to_string(),
turn_metadata,
);
Some(serde_json::Value::Object(map))
}
None => {
let mut map = serde_json::Map::new();
map.insert(
codex_core::X_CODEX_TURN_METADATA_HEADER.to_string(),
turn_metadata,
);
Some(serde_json::Value::Object(map))
}
other => other,
}
}
fn with_mcp_tool_call_thread_id_meta(
meta: Option<serde_json::Value>,
thread_id: &str,
+13
View File
@@ -5,6 +5,7 @@ use crate::goals::GoalRuntimeEvent;
use crate::session::Codex;
use crate::session::SessionSettingsUpdate;
use crate::session::SteerInputError;
use crate::turn_metadata::McpTurnMetadataContext;
use codex_features::Feature;
use codex_otel::SessionTelemetry;
use codex_protocol::config_types::ApprovalsReviewer;
@@ -502,6 +503,18 @@ impl CodexThread {
self.codex.session.get_config().await
}
pub async fn current_mcp_request_turn_metadata(&self) -> Option<serde_json::Value> {
let active = self.codex.session.active_turn.lock().await;
let (_, active_task) = active.as_ref()?.tasks.first()?;
let turn_context = active_task.turn_context.as_ref();
turn_context
.turn_metadata_state
.current_meta_value_for_mcp_request(McpTurnMetadataContext {
model: turn_context.model_info.slug.as_str(),
reasoning_effort: turn_context.effective_reasoning_effort(),
})
}
/// Refresh the thread's layer-backed user config state from a caller-supplied
/// config snapshot. Thread-scoped layers and session-static settings remain
/// unchanged.