[mcp] Support MCP Apps part 3 - Add mcp tool call support. (#17364)

- [x] Add a new app-server method so that MCP Apps can call their own
MCP server directly.
This commit is contained in:
Matthew Zeng
2026-04-10 21:39:19 -07:00
committed by GitHub
parent f8bb088617
commit b7139a7e8f
112 changed files with 871 additions and 238 deletions

View File

@@ -85,6 +85,8 @@ use codex_app_server_protocol::McpServerOauthLoginResponse;
use codex_app_server_protocol::McpServerRefreshResponse;
use codex_app_server_protocol::McpServerStatus;
use codex_app_server_protocol::McpServerStatusDetail;
use codex_app_server_protocol::McpServerToolCallParams;
use codex_app_server_protocol::McpServerToolCallResponse;
use codex_app_server_protocol::MockExperimentalMethodParams;
use codex_app_server_protocol::MockExperimentalMethodResponse;
use codex_app_server_protocol::ModelListParams;
@@ -901,6 +903,10 @@ impl CodexMessageProcessor {
self.read_mcp_resource(to_connection_request_id(request_id), params)
.await;
}
ClientRequest::McpServerToolCall { request_id, params } => {
self.call_mcp_server_tool(to_connection_request_id(request_id), params)
.await;
}
ClientRequest::WindowsSandboxSetupStart { request_id, params } => {
self.windows_sandbox_setup_start(to_connection_request_id(request_id), params)
.await;
@@ -5350,6 +5356,46 @@ impl CodexMessageProcessor {
});
}
async fn call_mcp_server_tool(
&self,
request_id: ConnectionRequestId,
params: McpServerToolCallParams,
) {
let outgoing = Arc::clone(&self.outgoing);
let (_, thread) = match self.load_thread(&params.thread_id).await {
Ok(thread) => thread,
Err(error) => {
self.outgoing.send_error(request_id, error).await;
return;
}
};
tokio::spawn(async move {
let result = thread
.call_mcp_tool(&params.server, &params.tool, params.arguments, params.meta)
.await;
match result {
Ok(result) => {
outgoing
.send_response(request_id, McpServerToolCallResponse::from(result))
.await;
}
Err(error) => {
outgoing
.send_error(
request_id,
JSONRPCErrorError {
code: INTERNAL_ERROR_CODE,
message: format!("{error:#}"),
data: None,
},
)
.await;
}
}
});
}
async fn send_invalid_request_error(&self, request_id: ConnectionRequestId, message: String) {
let error = JSONRPCErrorError {
code: INVALID_REQUEST_ERROR_CODE,