Include connector IDs in MCP tool call analytics (#32867)

## What changed

- Add the optional `connector_id` to `codex_mcp_tool_call_event` parameters.
- Populate it from the MCP tool call's `app_context` when available.

## Testing

- Extend the completed tool item analytics test to verify the connector ID is serialized.

GitOrigin-RevId: ea62202318dd492fa0ffd4ff1d48a66d1cc37e96
This commit is contained in:
Chris Dong
2026-07-13 20:16:38 +00:00
committed by copyberry
parent 6e113acf5f
commit bbfa08fe3b
3 changed files with 18 additions and 1 deletions
@@ -111,6 +111,7 @@ use codex_app_server_protocol::ItemCompletedNotification;
use codex_app_server_protocol::ItemGuardianApprovalReviewCompletedNotification;
use codex_app_server_protocol::ItemStartedNotification;
use codex_app_server_protocol::JSONRPCErrorError;
use codex_app_server_protocol::McpToolCallAppContext;
use codex_app_server_protocol::McpToolCallStatus;
use codex_app_server_protocol::NonSteerableTurnKind;
use codex_app_server_protocol::PatchApplyStatus;
@@ -4353,7 +4354,14 @@ async fn turn_event_counts_completed_tool_items() {
tool: "search".to_string(),
status,
arguments: json!({}),
app_context: None,
app_context: Some(McpToolCallAppContext {
connector_id: "connector-test".to_string(),
link_id: None,
resource_uri: None,
app_name: None,
template_id: None,
action_name: None,
}),
mcp_app_resource_uri: None,
plugin_id: Some("sample@test".to_string()),
result: None,
@@ -4445,6 +4453,10 @@ async fn turn_event_counts_completed_tool_items() {
.expect("MCP tool call event should be emitted");
let payload = serde_json::to_value(mcp_tool_call_event).expect("serialize MCP tool call event");
assert_eq!(payload["event_params"]["plugin_id"], json!("sample@test"));
assert_eq!(
payload["event_params"]["connector_id"],
json!("connector-test")
);
reducer
.ingest(
+1
View File
@@ -674,6 +674,7 @@ pub(crate) struct CodexMcpToolCallEventParams {
pub(crate) mcp_tool_name: String,
pub(crate) mcp_error_present: bool,
pub(crate) plugin_id: Option<String>,
pub(crate) connector_id: Option<String>,
}
#[derive(Serialize)]
+4
View File
@@ -1884,6 +1884,7 @@ fn tool_item_event(input: ToolItemEventInput<'_>) -> Option<TrackEventRequest> {
error,
duration_ms,
plugin_id,
app_context,
..
} => {
let (terminal_status, failure_kind) = mcp_tool_call_outcome(status)?;
@@ -1915,6 +1916,9 @@ fn tool_item_event(input: ToolItemEventInput<'_>) -> Option<TrackEventRequest> {
mcp_tool_name: tool.clone(),
mcp_error_present: error.is_some(),
plugin_id: plugin_id.clone(),
connector_id: app_context
.as_ref()
.map(|app_context| app_context.connector_id.clone()),
},
},
))