mcp: keep elicitation requests below app wire types (#29724)

## Why

Core and tools need to request MCP elicitation without constructing
app-server wire payloads. The request should remain a neutral protocol
concept until app-server serializes it for a client.

## What changed

- Switched core and tools to
`codex_protocol::approvals::ElicitationRequest`.
- Derived turn and server context inside core instead of carrying
app-server request types through lower layers.
- Kept the app-server payload unchanged through an explicit boundary
conversion.
- Removed the remaining production app-server-protocol dependency from
tools.

## Stack

This is PR 5 of 6, stacked on [PR
#29723](https://github.com/openai/codex/pull/29723). Review only the
delta from `codex/split-connector-metadata-types`. Next: [PR
#29725](https://github.com/openai/codex/pull/29725).

## Validation

- `codex-core` MCP coverage passed: 87 tests.
- Tools elicitation and app-server round-trip coverage passed.
This commit is contained in:
Adam Perry @ OpenAI
2026-06-24 20:53:27 +00:00
committed by GitHub
parent a33ad93996
commit df1ee09ec5
10 changed files with 173 additions and 288 deletions
@@ -173,15 +173,14 @@ impl RequestPluginInstallHandler {
let tool_type = tool.tool_type();
let request_id = RequestId::String(format!("request_plugin_install_{call_id}").into());
let params = build_request_plugin_install_elicitation_request(
CODEX_APPS_MCP_SERVER_NAME,
session.thread_id.to_string(),
turn.sub_id.clone(),
suggest_reason,
&tool,
);
let request = build_request_plugin_install_elicitation_request(suggest_reason, &tool);
let elicitation = session
.request_mcp_server_elicitation(turn.as_ref(), request_id, params)
.request_mcp_server_elicitation(
turn.as_ref(),
CODEX_APPS_MCP_SERVER_NAME.to_string(),
request_id,
request,
)
.await;
let response = elicitation.response;
if let Some(response) = response.as_ref() {