Codex Handbook
ext/mcp/src/lib.rs 60 lines
use codex_core::config::Config;use codex_extension_api::ExtensionFuture;use codex_extension_api::ExtensionRegistryBuilder;use codex_extension_api::McpServerContribution;use codex_extension_api::McpServerContributionContext;use codex_extension_api::McpServerContributor;use codex_mcp::CODEX_APPS_MCP_SERVER_NAME;use codex_mcp::hosted_plugin_runtime_mcp_server_config;mod executor_plugin;struct HostedPluginRuntimeExtension;impl McpServerContributor<Config> for HostedPluginRuntimeExtension {    fn id(&self) -> &'static str {        "hosted_plugin_runtime"    }    fn contribute<'a>(        &'a self,        context: McpServerContributionContext<'a, Config>,    ) -> ExtensionFuture<'a, Vec<McpServerContribution>> {        Box::pin(async move {            let config = context.config();            let name = CODEX_APPS_MCP_SERVER_NAME.to_string();            if !config.features.enabled(codex_features::Feature::Apps) {                return vec![McpServerContribution::Remove { name }];            }            vec![McpServerContribution::Set {                name,                config: Box::new(hosted_plugin_runtime_mcp_server_config(                    &config.chatgpt_base_url,                    config.apps_mcp_product_sku.as_deref(),                )),            }]        })    }}pub fn install(builder: &mut ExtensionRegistryBuilder<Config>) {    builder.mcp_server_contributor(std::sync::Arc::new(HostedPluginRuntimeExtension));}/// Installs discovery for MCP servers declared by thread-selected executor plugins.pub fn install_executor_plugins(    builder: &mut ExtensionRegistryBuilder<Config>,    environment_manager: std::sync::Arc<codex_exec_server::EnvironmentManager>,) {    builder.mcp_server_contributor(std::sync::Arc::new(        executor_plugin::SelectedExecutorPluginMcpContributor::new(environment_manager),    ));}/// Seeds the per-thread snapshot used by selected executor plugin MCP discovery.pub fn initialize_executor_plugin_thread_data(    thread_init: &mut codex_extension_api::ExtensionDataInit,) {    executor_plugin::seed_thread_state(thread_init);}