Compare commits

...

9 Commits

Author SHA1 Message Date
Jeremy Rose
9e81cfdbb1 Merge branch 'main' into nornagon/per-profile-mcps 2025-09-08 11:26:17 -07:00
Jeremy Rose
c3b4611d33 fix 2025-09-04 14:22:44 -07:00
Jeremy Rose
a22aeebfd6 Merge branch 'main' into nornagon/per-profile-mcps 2025-09-04 12:33:16 -07:00
Jeremy Rose
9e3448d4b9 Merge branch 'main' into nornagon/per-profile-mcps 2025-09-04 09:24:02 -07:00
Jeremy Rose
3c3f4ffed2 Merge remote-tracking branch 'origin/main' into nornagon/per-profile-mcps 2025-09-03 13:50:00 -07:00
Jeremy Rose
ae08d043de fix docs 2025-08-28 19:43:39 -07:00
Jeremy Rose
13d04e9785 Merge remote-tracking branch 'origin/main' into nornagon/per-profile-mcps 2025-08-28 10:45:05 -07:00
Jeremy Rose
0cd85cad9d simplify readme 2025-08-26 09:47:31 -07:00
Jeremy Rose
c57c16461d support separate mcp server configs per profile 2025-08-26 09:43:02 -07:00
4 changed files with 57 additions and 2 deletions

View File

@@ -3,4 +3,4 @@
This file has moved. Please see the latest configuration documentation here:
- Full config docs: [docs/config.md](../docs/config.md)
- MCP servers section: [docs/config.md#mcp_servers](../docs/config.md#mcp_servers)
- MCP servers section: [docs/config.md#mcp_servers](../docs/config.md#mcp_servers)

View File

@@ -794,7 +794,23 @@ impl Config {
notify: cfg.notify,
user_instructions,
base_instructions,
mcp_servers: cfg.mcp_servers,
// Merge top-level and per-profile MCP servers.
// Defaults: inherit globals unless explicitly disabled; on key
// conflicts, profile entries take precedence.
mcp_servers: {
let inherit = config_profile.inherit_global_mcp_servers.unwrap_or(true);
let mut merged = if inherit {
cfg.mcp_servers
} else {
Default::default()
};
if let Some(profile_servers) = config_profile.mcp_servers {
for (k, v) in profile_servers {
merged.insert(k, v);
}
}
merged
},
model_providers,
project_doc_max_bytes: cfg.project_doc_max_bytes.unwrap_or(PROJECT_DOC_MAX_BYTES),
codex_home,

View File

@@ -1,6 +1,8 @@
use serde::Deserialize;
use std::collections::HashMap;
use std::path::PathBuf;
use crate::config_types::McpServerConfig;
use crate::protocol::AskForApproval;
use codex_protocol::config_types::ReasoningEffort;
use codex_protocol::config_types::ReasoningSummary;
@@ -20,6 +22,16 @@ pub struct ConfigProfile {
pub model_verbosity: Option<Verbosity>,
pub chatgpt_base_url: Option<String>,
pub experimental_instructions_file: Option<PathBuf>,
/// Per-profile MCP server definitions. When present, these entries are
/// merged with the top-level `mcp_servers` map. On key conflicts, the
/// profile entries take precedence. To opt out of inheriting global
/// servers, set `inherit_global_mcp_servers` to `false`.
pub mcp_servers: Option<HashMap<String, McpServerConfig>>,
/// Whether this profile should inherit the top-level `mcp_servers`.
/// Defaults to `true` when not specified.
pub inherit_global_mcp_servers: Option<bool>,
}
impl From<ConfigProfile> for codex_protocol::mcp_protocol::Profile {

View File

@@ -360,10 +360,37 @@ Should be represented as follows in `~/.codex/config.toml`:
command = "npx"
args = ["-y", "mcp-server"]
env = { "API_KEY" = "value" }
```
### Per-profile MCP servers
You can scope MCP servers to a specific profile and optionally inherit the global set. Profile entries override globals on key conflicts.
```toml
# Global servers (available to all profiles unless opted out)
[mcp_servers.some_server]
command = "some_server"
# Profile-specific MCP server
[profiles.ops.mcp_servers.analysis]
command = "ops_mcp"
# You can disable inheriting the global MCP servers in a specific profile
[profiles.minimal]
inherit_global_mcp_servers = false # only profile servers (none defined => none)
# Optional: override the default 10s startup timeout
startup_timeout_ms = 20_000
```
## disable_response_storage
Currently, customers whose accounts are set to use Zero Data Retention (ZDR) must set `disable_response_storage` to `true` so that Codex uses an alternative to the Responses API that works with ZDR:
```toml
disable_response_storage = true
```
## shell_environment_policy
Codex spawns subprocesses (e.g. when executing a `local_shell` tool-call suggested by the assistant). By default it now passes **your full environment** to those subprocesses. You can tune this behavior via the **`shell_environment_policy`** block in `config.toml`: