mirror of
https://github.com/openai/codex.git
synced 2026-05-20 03:05:02 +00:00
## DISCLAIMER This is experimental and no production service must rely on this ## Why Built-in MCPs are product-owned runtime capabilities, but they were previously flattened into the same config-backed stdio path as user-configured servers. That made them depend on a hidden `codex builtin-mcp` re-exec path, exposed them through config-oriented CLI flows, and erased distinctions the runtime needs to preserve—most notably whether an MCP call should count as external context for memory-mode pollution. ## What changed - Model product-owned built-ins separately from config-backed MCP servers via `BuiltinMcpServer` and `EffectiveMcpServer`. - Launch built-ins in process through a reusable async transport instead of the hidden `builtin-mcp` stdio subcommand. - Keep config-oriented CLI operations such as `codex mcp list/get/login/logout` scoped to configured servers, while merging built-ins only into the effective runtime server set. - Retain server metadata after launch so parallel-tool support and context classification come from the live server set; built-in `memories` is now classified as local Codex state rather than external context. ## Test plan - `cargo test -p codex-mcp` - `cargo test -p codex-core --test suite builtin_memories_mcp_call_does_not_mark_thread_memory_mode_polluted_when_configured` --------- Co-authored-by: Codex <noreply@openai.com>
40 lines
1.2 KiB
Rust
40 lines
1.2 KiB
Rust
use std::io;
|
|
use std::path::PathBuf;
|
|
|
|
use codex_builtin_mcps::BuiltinMcpServer;
|
|
use codex_rmcp_client::InProcessTransportFactory;
|
|
use futures::FutureExt;
|
|
use futures::future::BoxFuture;
|
|
|
|
#[derive(Clone)]
|
|
pub(crate) struct BuiltinMcpServerFactory {
|
|
server: BuiltinMcpServer,
|
|
codex_home: PathBuf,
|
|
}
|
|
|
|
impl BuiltinMcpServerFactory {
|
|
pub(crate) fn new(server: BuiltinMcpServer, codex_home: PathBuf) -> Self {
|
|
Self { server, codex_home }
|
|
}
|
|
}
|
|
|
|
impl InProcessTransportFactory for BuiltinMcpServerFactory {
|
|
fn open(&self) -> BoxFuture<'static, io::Result<tokio::io::DuplexStream>> {
|
|
let server = self.server;
|
|
let codex_home = self.codex_home.clone();
|
|
async move {
|
|
let (client_transport, server_transport) = tokio::io::duplex(64 * 1024);
|
|
tokio::spawn(async move {
|
|
if let Err(err) = server.serve(&codex_home, server_transport).await {
|
|
tracing::warn!(
|
|
server = server.name(),
|
|
"built-in MCP server exited: {err:#}"
|
|
);
|
|
}
|
|
});
|
|
Ok(client_transport)
|
|
}
|
|
.boxed()
|
|
}
|
|
}
|