mirror of
https://github.com/openai/codex.git
synced 2026-09-04 15:08:45 +00:00
## Stack - Base: #27184 - This PR is the second vertical and should be reviewed against `jif/external-plugins-1`, not `main`. ## Why CCA is moving toward a split runtime where the orchestrator may have no filesystem or executor, but it still needs to activate remotely hosted plugin components. HTTP MCP servers are the simplest complete example: they need configuration and host authentication, but they do not need an executor process. The Apps MCP endpoint is currently synthesized by a special-purpose loader inside the MCP runtime. That works locally, but it leaves hosted MCP activation outside the extension model being established in #27184. It also makes the Apps path a poor foundation for plugins whose skills, MCP servers, connectors, and hooks may come from different sources or execute in different places. This PR moves that one behavior behind an extension-owned contribution while preserving the existing local fallback. It deliberately does not introduce a generic plugin activation framework. ## What changed ### MCP extension contribution `codex-extension-api` gains an ordered `McpServerContributor` contract. A contributor returns typed `Set` or `Remove` overlays for MCP server configuration; later contributors win for the names they own. The contract stays at the existing MCP configuration boundary. Extensions do not create a second connection manager or transport abstraction. ### Hosted Apps MCP extension A new `codex-mcp-extension` contributes the reserved `codex_apps` server from the existing Apps feature, ChatGPT base URL, path override, and product SKU configuration. When `apps_mcp_path_override` is enabled for `https://chatgpt.com`, the resulting streamable HTTP endpoint is `https://chatgpt.com/backend-api/ps/mcp`. The existing ChatGPT-auth gate remains authoritative, so this server can run in an orchestrator-only process without being exposed for API-key sessions. ### One resolved runtime view `McpManager` now distinguishes three views: - **configured:** config- and plugin-backed servers before extension overlays; - **runtime:** configured servers plus host-installed extension contributions; - **effective:** runtime servers after auth gating and compatibility built-ins. App-server installs the hosted MCP extension and uses the runtime view for thread startup, refresh, status, threadless resource reads, connector discovery, and MCP OAuth lookup. This keeps `mcpServer/oauth/login` consistent with the servers exposed by the other MCP APIs. The hosted Apps server itself continues to use existing ChatGPT host authentication rather than MCP OAuth. ## Compatibility Hosts that do not install the MCP extension retain the existing Apps MCP synthesis path. This preserves current local-only, CLI, and standalone-host behavior while app-server exercises the extension path. Disabling Apps removes the reserved `codex_apps` entry, and losing ChatGPT auth removes it from the effective runtime view. Executor availability is not consulted for this HTTP transport. ## Follow-ups The next vertical will resolve a manifest-declared stdio MCP server from an executor-selected plugin root and execute it in the environment that owns that root. Later verticals can add backend-owned skills, connector metadata, hooks, durable selection semantics, and incremental local convergence without changing the component-specific runtime boundaries introduced here. ## Verification Focused coverage was added for: - contributing the hosted Apps MCP at `/backend-api/ps/mcp` without an executor; - requiring ChatGPT auth in the effective runtime view; - removing a reserved configured Apps server when the Apps feature is disabled. `cargo check -p codex-app-server -p codex-mcp-extension -p codex-extension-api -p codex-mcp` passed. Tests and Clippy were not run locally under the current development instruction; CI provides the full validation pass.
65 lines
2.3 KiB
Rust
65 lines
2.3 KiB
Rust
pub use connection_manager::McpConnectionManager;
|
|
pub use connection_manager::tool_is_model_visible;
|
|
pub use elicitation::ElicitationReviewRequest;
|
|
pub use elicitation::ElicitationReviewer;
|
|
pub use elicitation::ElicitationReviewerHandle;
|
|
pub use rmcp_client::MCP_SANDBOX_STATE_META_CAPABILITY;
|
|
pub use runtime::McpRuntimeContext;
|
|
pub use runtime::SandboxState;
|
|
pub use tools::ToolInfo;
|
|
|
|
pub use mcp::CODEX_APPS_MCP_SERVER_NAME;
|
|
pub use mcp::McpConfig;
|
|
pub use mcp::ToolPluginProvenance;
|
|
pub use server::EffectiveMcpServer;
|
|
|
|
pub use auth_elicitation::CodexAppsAuthElicitation;
|
|
pub use auth_elicitation::CodexAppsAuthElicitationPlan;
|
|
pub use auth_elicitation::CodexAppsConnectorAuthFailure;
|
|
pub use auth_elicitation::MCP_TOOL_CODEX_APPS_META_KEY;
|
|
pub use auth_elicitation::auth_elicitation_completed_result;
|
|
pub use auth_elicitation::auth_elicitation_id;
|
|
pub use auth_elicitation::build_auth_elicitation;
|
|
pub use auth_elicitation::build_auth_elicitation_plan;
|
|
pub use auth_elicitation::connector_auth_failure_from_tool_result;
|
|
pub use codex_apps::CodexAppsToolsCacheKey;
|
|
pub use codex_apps::codex_apps_tools_cache_key;
|
|
pub use mcp::codex_apps_mcp_server_config;
|
|
pub use mcp::configured_mcp_servers;
|
|
pub use mcp::effective_mcp_servers;
|
|
pub use mcp::effective_mcp_servers_from_configured;
|
|
pub use mcp::host_owned_codex_apps_enabled;
|
|
pub use mcp::tool_plugin_provenance;
|
|
pub use mcp::with_codex_apps_mcp;
|
|
|
|
pub use mcp::McpServerStatusSnapshot;
|
|
pub use mcp::McpSnapshotDetail;
|
|
pub use mcp::collect_mcp_server_status_snapshot_with_detail;
|
|
pub use mcp::read_mcp_resource;
|
|
|
|
pub use mcp::McpAuthStatusEntry;
|
|
pub use mcp::McpOAuthLoginConfig;
|
|
pub use mcp::McpOAuthLoginSupport;
|
|
pub use mcp::McpOAuthScopesSource;
|
|
pub use mcp::ResolvedMcpOAuthScopes;
|
|
pub use mcp::compute_auth_statuses;
|
|
pub use mcp::discover_supported_scopes;
|
|
pub use mcp::oauth_login_support;
|
|
pub use mcp::resolve_oauth_scopes;
|
|
pub use mcp::should_retry_without_scopes;
|
|
|
|
pub use mcp::McpPermissionPromptAutoApproveContext;
|
|
pub use mcp::mcp_permission_prompt_is_auto_approved;
|
|
pub use mcp::qualified_mcp_tool_name_prefix;
|
|
pub use tools::declared_openai_file_input_param_names;
|
|
|
|
pub(crate) mod auth_elicitation;
|
|
pub(crate) mod codex_apps;
|
|
pub(crate) mod connection_manager;
|
|
pub(crate) mod elicitation;
|
|
pub(crate) mod mcp;
|
|
pub(crate) mod rmcp_client;
|
|
pub(crate) mod runtime;
|
|
pub(crate) mod server;
|
|
pub(crate) mod tools;
|