Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions codex-rs/cli/src/mcp_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@ async fn run_add(config_overrides: &CliConfigOverrides, add_args: AddArgs) -> Re

let new_entry = McpServerConfig {
transport: transport.clone(),
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down
1 change: 1 addition & 0 deletions codex-rs/codex-mcp/src/mcp/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ fn codex_apps_mcp_server_config(config: &McpConfig, auth: Option<&CodexAuth>) ->
http_headers,
env_http_headers: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down
2 changes: 2 additions & 0 deletions codex-rs/codex-mcp/src/mcp/mod_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ async fn effective_mcp_servers_preserve_user_servers_and_add_codex_apps() {
http_headers: None,
env_http_headers: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand All @@ -215,6 +216,7 @@ async fn effective_mcp_servers_preserve_user_servers_and_add_codex_apps() {
http_headers: None,
env_http_headers: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down
2 changes: 2 additions & 0 deletions codex-rs/codex-mcp/src/mcp/skill_dependencies.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ fn mcp_dependency_to_server_config(
http_headers: None,
env_http_headers: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -146,6 +147,7 @@ fn mcp_dependency_to_server_config(
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down
2 changes: 2 additions & 0 deletions codex-rs/codex-mcp/src/mcp/skill_dependencies_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ fn collect_missing_respects_canonical_installed_key() {
http_headers: None,
env_http_headers: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -90,6 +91,7 @@ fn collect_missing_dedupes_by_canonical_key_but_preserves_original_name() {
http_headers: None,
env_http_headers: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down
2 changes: 2 additions & 0 deletions codex-rs/codex-mcp/src/mcp_connection_manager_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -792,6 +792,7 @@ fn mcp_init_error_display_prompts_for_github_pat() {
http_headers: None,
env_http_headers: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -842,6 +843,7 @@ fn mcp_init_error_display_reports_generic_errors() {
http_headers: None,
env_http_headers: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down
1 change: 1 addition & 0 deletions codex-rs/config/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ pub use mcp_edit::load_global_mcp_servers;
pub use mcp_types::AppToolApproval;
pub use mcp_types::McpServerConfig;
pub use mcp_types::McpServerDisabledReason;
pub use mcp_types::McpServerEnvironment;
pub use mcp_types::McpServerToolConfig;
pub use mcp_types::McpServerTransportConfig;
pub use mcp_types::RawMcpServerConfig;
Expand Down
4 changes: 4 additions & 0 deletions codex-rs/config/src/mcp_edit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ use toml_edit::value;
use crate::AppToolApproval;
use crate::CONFIG_TOML_FILE;
use crate::McpServerConfig;
use crate::McpServerEnvironment;
use crate::McpServerTransportConfig;

pub async fn load_global_mcp_servers(
Expand Down Expand Up @@ -174,6 +175,9 @@ fn serialize_mcp_server(config: &McpServerConfig) -> TomlItem {
if !config.enabled {
entry["enabled"] = value(false);
}
if matches!(config.environment, McpServerEnvironment::Remote) {
entry["environment"] = value("remote");
}
if config.required {
entry["required"] = value(true);
}
Expand Down
1 change: 1 addition & 0 deletions codex-rs/config/src/mcp_edit_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ async fn replace_mcp_servers_serializes_per_tool_approval_overrides() -> anyhow:
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: true,
Expand Down
22 changes: 22 additions & 0 deletions codex-rs/config/src/mcp_types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ pub struct McpServerConfig {
#[serde(flatten)]
pub transport: McpServerTransportConfig,

/// Where Codex should start this MCP server.
#[serde(default, skip_serializing_if = "McpServerEnvironment::is_local")]
pub environment: McpServerEnvironment,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

make it a string.
experimental_environment too.


/// When `false`, Codex skips initializing this MCP server.
#[serde(default = "default_enabled")]
pub enabled: bool,
Expand Down Expand Up @@ -139,6 +143,8 @@ pub struct RawMcpServerConfig {

// shared
#[serde(default)]
pub environment: Option<McpServerEnvironment>,
#[serde(default)]
pub startup_timeout_sec: Option<f64>,
#[serde(default)]
pub startup_timeout_ms: Option<u64>,
Expand Down Expand Up @@ -181,6 +187,7 @@ impl TryFrom<RawMcpServerConfig> for McpServerConfig {
url,
bearer_token,
bearer_token_env_var,
environment,
startup_timeout_sec,
startup_timeout_ms,
tool_timeout_sec,
Expand Down Expand Up @@ -246,6 +253,7 @@ impl TryFrom<RawMcpServerConfig> for McpServerConfig {

Ok(Self {
transport,
environment: environment.unwrap_or_default(),
startup_timeout_sec,
tool_timeout_sec,
enabled: enabled.unwrap_or_else(default_enabled),
Expand All @@ -272,6 +280,20 @@ impl<'de> Deserialize<'de> for McpServerConfig {
}
}

#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Default, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum McpServerEnvironment {
#[default]
Local,
Remote,
}

impl McpServerEnvironment {
pub fn is_local(&self) -> bool {
matches!(self, Self::Local)
}
}

const fn default_enabled() -> bool {
true
}
Expand Down
1 change: 1 addition & 0 deletions codex-rs/config/src/mcp_types_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@ fn deserialize_ignores_unknown_server_fields() {
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down
1 change: 1 addition & 0 deletions codex-rs/config/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
pub use crate::mcp_types::AppToolApproval;
pub use crate::mcp_types::McpServerConfig;
pub use crate::mcp_types::McpServerDisabledReason;
pub use crate::mcp_types::McpServerEnvironment;
pub use crate::mcp_types::McpServerToolConfig;
pub use crate::mcp_types::McpServerTransportConfig;
pub use crate::mcp_types::RawMcpServerConfig;
Expand Down
15 changes: 15 additions & 0 deletions codex-rs/core/config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -818,6 +818,13 @@
],
"type": "string"
},
"McpServerEnvironment": {
"enum": [
"local",
"remote"
],
"type": "string"
},
"McpServerToolConfig": {
"additionalProperties": false,
"description": "Per-tool approval settings for a single MCP server tool.",
Expand Down Expand Up @@ -1492,6 +1499,14 @@
},
"type": "array"
},
"environment": {
"allOf": [
{
"$ref": "#/definitions/McpServerEnvironment"
}
],
"default": null
},
"http_headers": {
"additionalProperties": {
"type": "string"
Expand Down
16 changes: 16 additions & 0 deletions codex-rs/core/src/config/config_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ fn stdio_mcp(command: &str) -> McpServerConfig {
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand All @@ -103,6 +104,7 @@ fn http_mcp(url: &str) -> McpServerConfig {
http_headers: None,
env_http_headers: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2011,6 +2013,7 @@ async fn replace_mcp_servers_round_trips_entries() -> anyhow::Result<()> {
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2258,6 +2261,7 @@ async fn replace_mcp_servers_serializes_env_sorted() -> anyhow::Result<()> {
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2332,6 +2336,7 @@ async fn replace_mcp_servers_serializes_env_vars() -> anyhow::Result<()> {
env_vars: vec!["ALPHA".to_string(), "BETA".to_string()],
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2386,6 +2391,7 @@ async fn replace_mcp_servers_serializes_cwd() -> anyhow::Result<()> {
env_vars: Vec::new(),
cwd: Some(cwd_path.clone()),
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2438,6 +2444,7 @@ async fn replace_mcp_servers_streamable_http_serializes_bearer_token() -> anyhow
http_headers: None,
env_http_headers: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2506,6 +2513,7 @@ async fn replace_mcp_servers_streamable_http_serializes_custom_headers() -> anyh
"DOCS_AUTH".to_string(),
)])),
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2586,6 +2594,7 @@ async fn replace_mcp_servers_streamable_http_removes_optional_sections() -> anyh
"DOCS_AUTH".to_string(),
)])),
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2619,6 +2628,7 @@ async fn replace_mcp_servers_streamable_http_removes_optional_sections() -> anyh
http_headers: None,
env_http_headers: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2687,6 +2697,7 @@ async fn replace_mcp_servers_streamable_http_isolates_headers_between_servers()
"DOCS_AUTH".to_string(),
)])),
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand All @@ -2710,6 +2721,7 @@ async fn replace_mcp_servers_streamable_http_isolates_headers_between_servers()
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2796,6 +2808,7 @@ async fn replace_mcp_servers_serializes_disabled_flag() -> anyhow::Result<()> {
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: false,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2844,6 +2857,7 @@ async fn replace_mcp_servers_serializes_required_flag() -> anyhow::Result<()> {
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: true,
required: true,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2892,6 +2906,7 @@ async fn replace_mcp_servers_serializes_tool_filters() -> anyhow::Result<()> {
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -2944,6 +2959,7 @@ async fn replace_mcp_servers_streamable_http_serializes_oauth_resource() -> anyh
http_headers: None,
env_http_headers: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down
7 changes: 7 additions & 0 deletions codex-rs/core/src/config/edit_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@ fn blocking_replace_mcp_servers_round_trips() {
env_vars: vec!["FOO".to_string()],
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: true,
Expand Down Expand Up @@ -602,6 +603,7 @@ fn blocking_replace_mcp_servers_round_trips() {
),
env_http_headers: None,
},
environment: Default::default(),
enabled: false,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -666,6 +668,7 @@ fn blocking_replace_mcp_servers_serializes_tool_approval_overrides() {
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -727,6 +730,7 @@ foo = { command = "cmd" }
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -779,6 +783,7 @@ foo = { command = "cmd" } # keep me
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: false,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -830,6 +835,7 @@ foo = { command = "cmd", args = ["--flag"] } # keep me
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: true,
required: false,
supports_parallel_tool_calls: false,
Expand Down Expand Up @@ -882,6 +888,7 @@ foo = { command = "cmd" }
env_vars: Vec::new(),
cwd: None,
},
environment: Default::default(),
enabled: false,
required: false,
supports_parallel_tool_calls: false,
Expand Down
Loading
Loading