diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index cbe8aa6937..206cd2ac41 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -631,6 +631,7 @@ checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" dependencies = [ "axum-core", "bytes", + "form_urlencoded", "futures-util", "http 1.3.1", "http-body", @@ -646,11 +647,13 @@ dependencies = [ "serde_core", "serde_json", "serde_path_to_error", + "serde_urlencoded", "sync_wrapper", "tokio", "tower", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -669,6 +672,7 @@ dependencies = [ "sync_wrapper", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -3870,7 +3874,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.5.10", "system-configuration", "tokio", "tower-service", @@ -3890,7 +3894,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.2", + "windows-core 0.58.0", ] [[package]] @@ -5864,7 +5868,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.1", + "socket2 0.5.10", "thiserror 2.0.17", "tokio", "tracing", @@ -5901,7 +5905,7 @@ dependencies = [ "cfg_aliases 0.2.1", "libc", "once_cell", - "socket2 0.6.1", + "socket2 0.5.10", "tracing", "windows-sys 0.60.2", ] @@ -6568,11 +6572,12 @@ dependencies = [ [[package]] name = "rmcp" -version = "0.12.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528d42f8176e6e5e71ea69182b17d1d0a19a6b3b894b564678b74cd7cab13cfa" +checksum = "0a621b37a548ff6ab6292d57841eb25785a7f146d89391a19c9f199414bd13da" dependencies = [ "async-trait", + "axum", "base64", "bytes", "chrono", @@ -6603,9 +6608,9 @@ dependencies = [ [[package]] name = "rmcp-macros" -version = "0.12.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3f81daaa494eb8e985c9462f7d6ce1ab05e5299f48aafd76cdd3d8b060e6f59" +checksum = "6b79ed92303f9262db79575aa8c3652581668e9d136be6fd0b9ededa78954c95" dependencies = [ "darling 0.23.0", "proc-macro2", @@ -9331,7 +9336,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/codex-rs/Cargo.toml b/codex-rs/Cargo.toml index 84210838fc..ad3261908f 100644 --- a/codex-rs/Cargo.toml +++ b/codex-rs/Cargo.toml @@ -189,7 +189,7 @@ ratatui-macros = "0.6.0" regex = "1.12.2" regex-lite = "0.1.8" reqwest = "0.12" -rmcp = { version = "0.12.0", default-features = false } +rmcp = { version = "0.14.0", default-features = false } runfiles = { git = "https://github.com/dzbarsky/rules_rust", rev = "b56cbaa8465e74127f1ea216f813cd377295ad81" } schemars = "0.8.22" seccompiler = "0.5.0" diff --git a/codex-rs/exec-server/src/posix/mcp_escalation_policy.rs b/codex-rs/exec-server/src/posix/mcp_escalation_policy.rs index 6d0c1bb338..bea1a348d0 100644 --- a/codex-rs/exec-server/src/posix/mcp_escalation_policy.rs +++ b/codex-rs/exec-server/src/posix/mcp_escalation_policy.rs @@ -88,6 +88,7 @@ impl McpEscalationPolicy { None, ) })?, + meta: None, }) .await .map_err(|e| McpError::internal_error(e.to_string(), None)) diff --git a/codex-rs/exec-server/tests/suite/accept_elicitation.rs b/codex-rs/exec-server/tests/suite/accept_elicitation.rs index eade4f6e56..13c18c9108 100644 --- a/codex-rs/exec-server/tests/suite/accept_elicitation.rs +++ b/codex-rs/exec-server/tests/suite/accept_elicitation.rs @@ -105,6 +105,8 @@ prefix_rule( "workdir": project_root_path.to_string_lossy(), } ))), + task: None, + meta: None, }) .await?; let tool_call_content = content diff --git a/codex-rs/rmcp-client/src/bin/rmcp_test_server.rs b/codex-rs/rmcp-client/src/bin/rmcp_test_server.rs index e609a657bb..81898b0bc7 100644 --- a/codex-rs/rmcp-client/src/bin/rmcp_test_server.rs +++ b/codex-rs/rmcp-client/src/bin/rmcp_test_server.rs @@ -5,11 +5,11 @@ use std::sync::Arc; use rmcp::ErrorData as McpError; use rmcp::ServiceExt; use rmcp::handler::server::ServerHandler; -use rmcp::model::CallToolRequestParam; +use rmcp::model::CallToolRequestParams; use rmcp::model::CallToolResult; use rmcp::model::JsonObject; use rmcp::model::ListToolsResult; -use rmcp::model::PaginatedRequestParam; +use rmcp::model::PaginatedRequestParams; use rmcp::model::ServerCapabilities; use rmcp::model::ServerInfo; use rmcp::model::Tool; @@ -73,7 +73,7 @@ impl ServerHandler for TestToolServer { fn list_tools( &self, - _request: Option, + _request: Option, _context: rmcp::service::RequestContext, ) -> impl std::future::Future> + Send + '_ { let tools = self.tools.clone(); @@ -88,7 +88,7 @@ impl ServerHandler for TestToolServer { async fn call_tool( &self, - request: CallToolRequestParam, + request: CallToolRequestParams, _context: rmcp::service::RequestContext, ) -> Result { match request.name.as_ref() { diff --git a/codex-rs/rmcp-client/src/bin/test_stdio_server.rs b/codex-rs/rmcp-client/src/bin/test_stdio_server.rs index 3719766acb..d7708bf5ed 100644 --- a/codex-rs/rmcp-client/src/bin/test_stdio_server.rs +++ b/codex-rs/rmcp-client/src/bin/test_stdio_server.rs @@ -5,16 +5,16 @@ use std::sync::Arc; use rmcp::ErrorData as McpError; use rmcp::ServiceExt; use rmcp::handler::server::ServerHandler; -use rmcp::model::CallToolRequestParam; +use rmcp::model::CallToolRequestParams; use rmcp::model::CallToolResult; use rmcp::model::JsonObject; use rmcp::model::ListResourceTemplatesResult; use rmcp::model::ListResourcesResult; use rmcp::model::ListToolsResult; -use rmcp::model::PaginatedRequestParam; +use rmcp::model::PaginatedRequestParams; use rmcp::model::RawResource; use rmcp::model::RawResourceTemplate; -use rmcp::model::ReadResourceRequestParam; +use rmcp::model::ReadResourceRequestParams; use rmcp::model::ReadResourceResult; use rmcp::model::Resource; use rmcp::model::ResourceContents; @@ -171,6 +171,7 @@ impl TestToolServer { "Template for memo://codex/{slug} resources used in tests.".to_string(), ), mime_type: Some("text/plain".to_string()), + icons: None, }; ResourceTemplate::new(raw, None) } @@ -227,7 +228,7 @@ impl ServerHandler for TestToolServer { fn list_tools( &self, - _request: Option, + _request: Option, _context: rmcp::service::RequestContext, ) -> impl std::future::Future> + Send + '_ { let tools = self.tools.clone(); @@ -242,7 +243,7 @@ impl ServerHandler for TestToolServer { fn list_resources( &self, - _request: Option, + _request: Option, _context: rmcp::service::RequestContext, ) -> impl std::future::Future> + Send + '_ { let resources = self.resources.clone(); @@ -257,7 +258,7 @@ impl ServerHandler for TestToolServer { async fn list_resource_templates( &self, - _request: Option, + _request: Option, _context: rmcp::service::RequestContext, ) -> Result { Ok(ListResourceTemplatesResult { @@ -269,7 +270,7 @@ impl ServerHandler for TestToolServer { async fn read_resource( &self, - ReadResourceRequestParam { uri }: ReadResourceRequestParam, + ReadResourceRequestParams { uri, .. }: ReadResourceRequestParams, _context: rmcp::service::RequestContext, ) -> Result { if uri == MEMO_URI { @@ -291,7 +292,7 @@ impl ServerHandler for TestToolServer { async fn call_tool( &self, - request: CallToolRequestParam, + request: CallToolRequestParams, _context: rmcp::service::RequestContext, ) -> Result { match request.name.as_ref() { @@ -357,7 +358,7 @@ impl ServerHandler for TestToolServer { impl TestToolServer { fn parse_call_args Deserialize<'de>>( - request: &CallToolRequestParam, + request: &CallToolRequestParams, tool_name: &'static str, ) -> Result { match request.arguments.as_ref() { diff --git a/codex-rs/rmcp-client/src/bin/test_streamable_http_server.rs b/codex-rs/rmcp-client/src/bin/test_streamable_http_server.rs index b1247968ec..821850d2a8 100644 --- a/codex-rs/rmcp-client/src/bin/test_streamable_http_server.rs +++ b/codex-rs/rmcp-client/src/bin/test_streamable_http_server.rs @@ -17,16 +17,16 @@ use axum::response::Response; use axum::routing::get; use rmcp::ErrorData as McpError; use rmcp::handler::server::ServerHandler; -use rmcp::model::CallToolRequestParam; +use rmcp::model::CallToolRequestParams; use rmcp::model::CallToolResult; use rmcp::model::JsonObject; use rmcp::model::ListResourceTemplatesResult; use rmcp::model::ListResourcesResult; use rmcp::model::ListToolsResult; -use rmcp::model::PaginatedRequestParam; +use rmcp::model::PaginatedRequestParams; use rmcp::model::RawResource; use rmcp::model::RawResourceTemplate; -use rmcp::model::ReadResourceRequestParam; +use rmcp::model::ReadResourceRequestParams; use rmcp::model::ReadResourceResult; use rmcp::model::Resource; use rmcp::model::ResourceContents; @@ -106,6 +106,7 @@ impl TestToolServer { "Template for memo://codex/{slug} resources used in tests.".to_string(), ), mime_type: Some("text/plain".to_string()), + icons: None, }; ResourceTemplate::new(raw, None) } @@ -136,7 +137,7 @@ impl ServerHandler for TestToolServer { fn list_tools( &self, - _request: Option, + _request: Option, _context: rmcp::service::RequestContext, ) -> impl std::future::Future> + Send + '_ { let tools = self.tools.clone(); @@ -151,7 +152,7 @@ impl ServerHandler for TestToolServer { fn list_resources( &self, - _request: Option, + _request: Option, _context: rmcp::service::RequestContext, ) -> impl std::future::Future> + Send + '_ { let resources = self.resources.clone(); @@ -166,7 +167,7 @@ impl ServerHandler for TestToolServer { async fn list_resource_templates( &self, - _request: Option, + _request: Option, _context: rmcp::service::RequestContext, ) -> Result { Ok(ListResourceTemplatesResult { @@ -178,7 +179,7 @@ impl ServerHandler for TestToolServer { async fn read_resource( &self, - ReadResourceRequestParam { uri }: ReadResourceRequestParam, + ReadResourceRequestParams { uri, .. }: ReadResourceRequestParams, _context: rmcp::service::RequestContext, ) -> Result { if uri == MEMO_URI { @@ -200,7 +201,7 @@ impl ServerHandler for TestToolServer { async fn call_tool( &self, - request: CallToolRequestParam, + request: CallToolRequestParams, _context: rmcp::service::RequestContext, ) -> Result { match request.name.as_ref() { diff --git a/codex-rs/rmcp-client/src/logging_client_handler.rs b/codex-rs/rmcp-client/src/logging_client_handler.rs index 0d2c3aaa97..cf655c33e3 100644 --- a/codex-rs/rmcp-client/src/logging_client_handler.rs +++ b/codex-rs/rmcp-client/src/logging_client_handler.rs @@ -4,7 +4,7 @@ use rmcp::ClientHandler; use rmcp::RoleClient; use rmcp::model::CancelledNotificationParam; use rmcp::model::ClientInfo; -use rmcp::model::CreateElicitationRequestParam; +use rmcp::model::CreateElicitationRequestParams; use rmcp::model::CreateElicitationResult; use rmcp::model::LoggingLevel; use rmcp::model::LoggingMessageNotificationParam; @@ -38,7 +38,7 @@ impl LoggingClientHandler { impl ClientHandler for LoggingClientHandler { async fn create_elicitation( &self, - request: CreateElicitationRequestParam, + request: CreateElicitationRequestParams, context: RequestContext, ) -> Result { let id = match context.id { diff --git a/codex-rs/rmcp-client/src/rmcp_client.rs b/codex-rs/rmcp-client/src/rmcp_client.rs index c1bf6d39d3..270927b4bf 100644 --- a/codex-rs/rmcp-client/src/rmcp_client.rs +++ b/codex-rs/rmcp-client/src/rmcp_client.rs @@ -25,17 +25,17 @@ use mcp_types::ReadResourceResult; use mcp_types::RequestId; use mcp_types::Tool; use reqwest::header::HeaderMap; -use rmcp::model::CallToolRequestParam; +use rmcp::model::CallToolRequestParams as RmcpCallToolRequestParams; use rmcp::model::ClientNotification; use rmcp::model::ClientRequest; -use rmcp::model::CreateElicitationRequestParam; +use rmcp::model::CreateElicitationRequestParams; use rmcp::model::CreateElicitationResult; use rmcp::model::CustomNotification; use rmcp::model::CustomRequest; use rmcp::model::Extensions; -use rmcp::model::InitializeRequestParam; -use rmcp::model::PaginatedRequestParam; -use rmcp::model::ReadResourceRequestParam; +use rmcp::model::InitializeRequestParams as RmcpInitializeRequestParams; +use rmcp::model::PaginatedRequestParams; +use rmcp::model::ReadResourceRequestParams as RmcpReadResourceRequestParams; use rmcp::model::ServerResult; use rmcp::service::RoleClient; use rmcp::service::RunningService; @@ -89,7 +89,7 @@ enum ClientState { }, } -pub type Elicitation = CreateElicitationRequestParam; +pub type Elicitation = CreateElicitationRequestParams; pub type ElicitationResponse = CreateElicitationResult; /// Interface for sending elicitation requests to the UI and awaiting a response. @@ -233,7 +233,7 @@ impl RmcpClient { timeout: Option, send_elicitation: SendElicitation, ) -> Result { - let rmcp_params: InitializeRequestParam = convert_to_rmcp(params.clone())?; + let rmcp_params: RmcpInitializeRequestParams = convert_to_rmcp(params.clone())?; let client_handler = LoggingClientHandler::new(rmcp_params, send_elicitation); let (transport, oauth_persistor) = { @@ -314,7 +314,7 @@ impl RmcpClient { self.refresh_oauth_if_needed().await; let service = self.service().await?; let rmcp_params = params - .map(convert_to_rmcp::<_, PaginatedRequestParam>) + .map(convert_to_rmcp::<_, PaginatedRequestParams>) .transpose()?; let fut = service.list_tools(rmcp_params); @@ -358,7 +358,7 @@ impl RmcpClient { self.refresh_oauth_if_needed().await; let service = self.service().await?; let rmcp_params = params - .map(convert_to_rmcp::<_, PaginatedRequestParam>) + .map(convert_to_rmcp::<_, PaginatedRequestParams>) .transpose()?; let fut = service.list_resources(rmcp_params); @@ -376,7 +376,7 @@ impl RmcpClient { self.refresh_oauth_if_needed().await; let service = self.service().await?; let rmcp_params = params - .map(convert_to_rmcp::<_, PaginatedRequestParam>) + .map(convert_to_rmcp::<_, PaginatedRequestParams>) .transpose()?; let fut = service.list_resource_templates(rmcp_params); @@ -393,7 +393,7 @@ impl RmcpClient { ) -> Result { self.refresh_oauth_if_needed().await; let service = self.service().await?; - let rmcp_params: ReadResourceRequestParam = convert_to_rmcp(params)?; + let rmcp_params: RmcpReadResourceRequestParams = convert_to_rmcp(params)?; let fut = service.read_resource(rmcp_params); let result = run_with_timeout(fut, timeout, "resources/read").await?; let converted = convert_to_mcp(result)?; @@ -410,7 +410,7 @@ impl RmcpClient { self.refresh_oauth_if_needed().await; let service = self.service().await?; let params = CallToolRequestParams { arguments, name }; - let rmcp_params: CallToolRequestParam = convert_to_rmcp(params)?; + let rmcp_params: RmcpCallToolRequestParams = convert_to_rmcp(params)?; let fut = service.call_tool(rmcp_params); let rmcp_result = run_with_timeout(fut, timeout, "tools/call").await?; let converted = convert_call_tool_result(rmcp_result)?;