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 for HostedPluginRuntimeExtension { fn id(&self) -> &'static str { "hosted_plugin_runtime" } fn contribute<'a>( &'a self, context: McpServerContributionContext<'a, Config>, ) -> ExtensionFuture<'a, Vec> { 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) { 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, environment_manager: std::sync::Arc, ) { builder.mcp_server_contributor(std::sync::Arc::new( executor_plugin::SelectedExecutorPluginMcpContributor::new(environment_manager), )); }