mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
Scope MCP sandbox metadata to server environment (#28914)
Scope MCP sandbox metadata to the MCP server's owning environment. Previously, `codex/sandbox-state-meta` always used the turn's primary cwd and rebuilt a legacy sandbox policy from that cwd. That can be wrong for MCP servers owned by a different execution environment. This now sends the owning environment cwd as a `file:` URI in `sandboxCwd`, keeps `permissionProfile` as the permission source of truth, and omits sandbox-state metadata when a non-default server environment is not selected for the turn. Local/default MCP servers keep the existing fallback cwd behavior. Tests: - `just fmt` - `just bazel-lock-update` - `just bazel-lock-check` - `just test -p codex-mcp` - `just test -p codex-core mcp_sandbox_cwd` - `cargo build -p codex-rmcp-client --bin test_stdio_server` - `just test -p codex-core stdio_mcp_tool_call_includes_sandbox_state_meta`
This commit is contained in:
@@ -370,6 +370,12 @@ impl McpConnectionManager {
|
||||
.map(super::server::McpServerOrigin::as_str)
|
||||
}
|
||||
|
||||
pub fn server_environment_id(&self, server_name: &str) -> Option<&str> {
|
||||
self.server_metadata
|
||||
.get(server_name)
|
||||
.map(|metadata| metadata.environment_id.as_str())
|
||||
}
|
||||
|
||||
pub fn server_pollutes_memory(&self, server_name: &str) -> bool {
|
||||
self.server_metadata
|
||||
.get(server_name)
|
||||
|
||||
@@ -1127,6 +1127,7 @@ async fn list_all_tools_adds_server_metadata_to_cached_tools() {
|
||||
manager.server_metadata.insert(
|
||||
server_name.to_string(),
|
||||
McpServerMetadata {
|
||||
environment_id: codex_config::DEFAULT_MCP_SERVER_ENVIRONMENT_ID.to_string(),
|
||||
pollutes_memory: true,
|
||||
origin: Some(McpServerOrigin::StreamableHttp(
|
||||
"https://docs.example".to_string(),
|
||||
@@ -1162,6 +1163,7 @@ fn server_metadata_preserves_tool_approval_policy() {
|
||||
"https://docs.example",
|
||||
/*apps_mcp_product_sku*/ None,
|
||||
);
|
||||
config.environment_id = "remote".to_string();
|
||||
config.default_tools_approval_mode = Some(AppToolApproval::Prompt);
|
||||
config.tools.insert(
|
||||
"search".to_string(),
|
||||
@@ -1171,6 +1173,7 @@ fn server_metadata_preserves_tool_approval_policy() {
|
||||
);
|
||||
let metadata = McpServerMetadata::from(&EffectiveMcpServer::configured(config));
|
||||
|
||||
assert_eq!(metadata.environment_id, "remote");
|
||||
assert_eq!(metadata.tool_approval_mode("read"), AppToolApproval::Prompt);
|
||||
assert_eq!(
|
||||
metadata.tool_approval_mode("search"),
|
||||
|
||||
@@ -12,7 +12,7 @@ use std::time::Duration;
|
||||
use codex_exec_server::Environment;
|
||||
use codex_exec_server::EnvironmentManager;
|
||||
use codex_protocol::models::PermissionProfile;
|
||||
use codex_protocol::protocol::SandboxPolicy;
|
||||
use codex_utils_path_uri::PathUri;
|
||||
|
||||
use serde::Deserialize;
|
||||
use serde::Serialize;
|
||||
@@ -22,9 +22,8 @@ use serde::Serialize;
|
||||
pub struct SandboxState {
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub permission_profile: Option<PermissionProfile>,
|
||||
pub sandbox_policy: SandboxPolicy,
|
||||
pub codex_linux_sandbox_exe: Option<PathBuf>,
|
||||
pub sandbox_cwd: PathBuf,
|
||||
pub sandbox_cwd: PathUri,
|
||||
#[serde(default)]
|
||||
pub use_legacy_landlock: bool,
|
||||
}
|
||||
|
||||
@@ -75,6 +75,7 @@ impl McpServerOrigin {
|
||||
/// Semantic metadata that must survive after the server is launched.
|
||||
#[derive(Debug, Clone)]
|
||||
pub(crate) struct McpServerMetadata {
|
||||
pub environment_id: String,
|
||||
pub pollutes_memory: bool,
|
||||
pub origin: Option<McpServerOrigin>,
|
||||
pub supports_parallel_tool_calls: bool,
|
||||
@@ -96,6 +97,7 @@ impl From<&EffectiveMcpServer> for McpServerMetadata {
|
||||
fn from(server: &EffectiveMcpServer) -> Self {
|
||||
match server.launch() {
|
||||
McpServerLaunch::Configured(config) => Self {
|
||||
environment_id: config.environment_id.clone(),
|
||||
pollutes_memory: true,
|
||||
origin: McpServerOrigin::from_transport(&config.transport),
|
||||
supports_parallel_tool_calls: config.supports_parallel_tool_calls,
|
||||
|
||||
Reference in New Issue
Block a user