Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions codex-rs/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion codex-rs/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ ratatui-macros = "0.6.0"
regex = "1.12.3"
regex-lite = "0.1.8"
reqwest = "0.12"
rmcp = { version = "0.14.0", default-features = false }
rmcp = { version = "0.15.0", default-features = false }
runfiles = { git = "https://github.com/dzbarsky/rules_rust", rev = "b56cbaa8465e74127f1ea216f813cd377295ad81" }
rustls = { version = "0.23", default-features = false, features = [
"ring",
Expand Down
1 change: 1 addition & 0 deletions codex-rs/core/src/codex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5393,6 +5393,7 @@ mod tests {
input_schema: Arc::new(JsonObject::default()),
output_schema: None,
annotations: None,
execution: None,
icons: None,
meta: None,
},
Expand Down
21 changes: 19 additions & 2 deletions codex-rs/core/src/mcp_connection_manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@ use futures::future::BoxFuture;
use futures::future::FutureExt;
use futures::future::Shared;
use rmcp::model::ClientCapabilities;
use rmcp::model::CreateElicitationRequestParams;
use rmcp::model::ElicitationCapability;
use rmcp::model::FormElicitationCapability;
use rmcp::model::Implementation;
use rmcp::model::InitializeRequestParams;
use rmcp::model::ListResourceTemplatesResult;
Expand Down Expand Up @@ -223,7 +225,16 @@ impl ElicitationRequestManager {
ProtocolRequestId::Integer(value)
}
},
message: elicitation.message,
message: match elicitation {
CreateElicitationRequestParams::FormElicitationParams {
message,
..
}
| CreateElicitationRequestParams::UrlElicitationParams {
message,
..
} => message,
},
}),
})
.await;
Expand Down Expand Up @@ -985,19 +996,24 @@ async fn start_server_task(
meta: None,
capabilities: ClientCapabilities {
experimental: None,
extensions: None,
roots: None,
sampling: None,
// https://modelcontextprotocol.io/specification/2025-06-18/client/elicitation#capabilities
// indicates this should be an empty object.
elicitation: Some(ElicitationCapability {
schema_validation: None,
form: Some(FormElicitationCapability {
schema_validation: None,
}),
url: None,
}),
tasks: None,
},
client_info: Implementation {
name: "codex-mcp-client".to_owned(),
version: env!("CARGO_PKG_VERSION").to_owned(),
title: Some("Codex".into()),
description: None,
icons: None,
website_url: None,
},
Expand Down Expand Up @@ -1247,6 +1263,7 @@ mod tests {
input_schema: Arc::new(JsonObject::default()),
output_schema: None,
annotations: None,
execution: None,
icons: None,
meta: None,
},
Expand Down
18 changes: 16 additions & 2 deletions codex-rs/core/src/project_doc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -543,9 +543,16 @@ mod tests {
);

let skills = load_skills(&cfg);
let local_skills_root = dunce::canonicalize(cfg.codex_home.join("skills").as_path())
Comment thread
gpeal marked this conversation as resolved.
Outdated
.unwrap_or_else(|_| cfg.codex_home.join("skills"));
let local_skills = skills
.skills
.into_iter()
.filter(|skill| skill.path.starts_with(&local_skills_root))
.collect::<Vec<_>>();
let res = get_user_instructions(
&cfg,
skills.errors.is_empty().then_some(skills.skills.as_slice()),
skills.errors.is_empty().then_some(local_skills.as_slice()),
)
.await
.expect("instructions expected");
Expand All @@ -570,9 +577,16 @@ mod tests {
create_skill(cfg.codex_home.clone(), "linting", "run clippy");

let skills = load_skills(&cfg);
let local_skills_root = dunce::canonicalize(cfg.codex_home.join("skills").as_path())
.unwrap_or_else(|_| cfg.codex_home.join("skills"));
let local_skills = skills
.skills
.into_iter()
.filter(|skill| skill.path.starts_with(&local_skills_root))
.collect::<Vec<_>>();
let res = get_user_instructions(
&cfg,
skills.errors.is_empty().then_some(skills.skills.as_slice()),
skills.errors.is_empty().then_some(local_skills.as_slice()),
)
.await
.expect("instructions expected");
Expand Down
2 changes: 2 additions & 0 deletions codex-rs/core/src/tools/spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1624,6 +1624,7 @@ mod tests {
input_schema: std::sync::Arc::new(rmcp::model::object(input_schema)),
output_schema: None,
annotations: None,
execution: None,
icons: None,
meta: None,
}
Expand All @@ -1641,6 +1642,7 @@ mod tests {
input_schema: std::sync::Arc::new(schema),
output_schema: None,
annotations: None,
execution: None,
icons: None,
meta: None,
};
Expand Down
2 changes: 1 addition & 1 deletion codex-rs/exec-server/src/posix/mcp_escalation_policy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ impl McpEscalationPolicy {
.pause_for(async {
context
.peer
.create_elicitation(CreateElicitationRequestParams {
.create_elicitation(CreateElicitationRequestParams::FormElicitationParams {
meta: None,
message: format!(
"Allow agent to run `{command}` in `{}`?",
Expand Down
6 changes: 5 additions & 1 deletion codex-rs/exec-server/tests/common/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,11 @@ impl ClientHandler for InteractiveClient {
.unwrap()
.push(request.clone());

let accept = self.elicitations_to_accept.contains(&request.message);
let message = match &request {
CreateElicitationRequestParams::FormElicitationParams { message, .. }
| CreateElicitationRequestParams::UrlElicitationParams { message, .. } => message,
};
let accept = self.elicitations_to_accept.contains(message);
async move {
if accept {
Ok(CreateElicitationResult {
Expand Down
9 changes: 8 additions & 1 deletion codex-rs/exec-server/tests/suite/accept_elicitation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,14 @@ prefix_rule(
.lock()
.unwrap()
.iter()
.map(|r| r.message.clone())
.map(|r| match r {
rmcp::model::CreateElicitationRequestParams::FormElicitationParams {
message, ..
}
| rmcp::model::CreateElicitationRequestParams::UrlElicitationParams {
message, ..
} => message.clone(),
})
.collect::<Vec<_>>();
assert_eq!(vec![expected_elicitation_message], elicitation_messages);

Expand Down
1 change: 1 addition & 0 deletions codex-rs/exec-server/tests/suite/list_tools.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ async fn list_tools() -> Result<()> {
"type": "object",
}))),
output_schema: None,
execution: None,
annotations: None,
icons: None,
meta: None
Expand Down
2 changes: 2 additions & 0 deletions codex-rs/mcp-server/src/codex_tool_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ pub(crate) fn create_tool_for_codex_tool_call_param() -> Tool {
.into(),
),
annotations: None,
execution: None,
icons: None,
meta: None,
}
Expand Down Expand Up @@ -248,6 +249,7 @@ pub(crate) fn create_tool_for_codex_tool_call_reply_param() -> Tool {
"Continue a Codex conversation by providing the thread id and prompt.".into(),
),
annotations: None,
execution: None,
icons: None,
meta: None,
}
Expand Down
1 change: 1 addition & 0 deletions codex-rs/mcp-server/src/message_processor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ impl MessageProcessor {
name: "codex-mcp-server".to_string(),
title: Some("Codex".to_string()),
version: env!("CARGO_PKG_VERSION").to_string(),
description: None,
icons: None,
website_url: None,
};
Expand Down
8 changes: 7 additions & 1 deletion codex-rs/mcp-server/tests/common/mcp_process.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ use rmcp::model::ClientCapabilities;
use rmcp::model::CustomNotification;
use rmcp::model::CustomRequest;
use rmcp::model::ElicitationCapability;
use rmcp::model::FormElicitationCapability;
use rmcp::model::Implementation;
use rmcp::model::InitializeRequestParams;
use rmcp::model::JsonRpcMessage;
Expand Down Expand Up @@ -116,9 +117,13 @@ impl McpProcess {
meta: None,
capabilities: ClientCapabilities {
elicitation: Some(ElicitationCapability {
schema_validation: None,
form: Some(FormElicitationCapability {
schema_validation: None,
}),
url: None,
}),
experimental: None,
extensions: None,
roots: None,
sampling: None,
tasks: None,
Expand All @@ -127,6 +132,7 @@ impl McpProcess {
name: "elicitation test".into(),
title: Some("Elicitation Test".into()),
version: "0.0.0".into(),
description: None,
icons: None,
website_url: None,
},
Expand Down
8 changes: 7 additions & 1 deletion codex-rs/rmcp-client/tests/resources.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use futures::FutureExt as _;
use rmcp::model::AnnotateAble;
use rmcp::model::ClientCapabilities;
use rmcp::model::ElicitationCapability;
use rmcp::model::FormElicitationCapability;
use rmcp::model::Implementation;
use rmcp::model::InitializeRequestParams;
use rmcp::model::ListResourceTemplatesResult;
Expand All @@ -29,17 +30,22 @@ fn init_params() -> InitializeRequestParams {
meta: None,
capabilities: ClientCapabilities {
experimental: None,
extensions: None,
roots: None,
sampling: None,
elicitation: Some(ElicitationCapability {
schema_validation: None,
form: Some(FormElicitationCapability {
schema_validation: None,
}),
url: None,
}),
tasks: None,
},
client_info: Implementation {
name: "codex-test".into(),
version: "0.0.0-test".into(),
title: Some("Codex rmcp resource test".into()),
description: None,
icons: None,
website_url: None,
},
Expand Down
Loading