mirror of
https://github.com/openai/codex.git
synced 2026-11-12 21:20:34 +00:00
## Why MCP servers discovered on different executors can share a name. Resolving them by name alone exposes only one server and prevents tools and resources from being addressed independently. ## What changed - Add the disabled-by-default `multi_environment_mcp` feature to expose environment-scoped servers, including multiple installations of the same plugin. - Carry exact `McpServerKey` identities through catalogs, connections, tool calls, resources, and approval tracking. Give environment-scoped tools stable namespaces derived from their environment. - Include `environment_id` in scoped resource listings and accept it in resource requests. Require it for environment-owned servers when multiple environments are selected. - Preserve server ownership through hooks and use the owning environment's permissions for scoped elicitation review. ## Testing Add coverage for same-named servers across environments, independent calls and approvals, resource selection, plugin discovery, and rejection of hook changes to the tool environment. GitOrigin-RevId: 5593372b06a15c16aa3220faa3b19f5d3b20e67e
31 lines
994 B
Rust
31 lines
994 B
Rust
//! Read-only connection state; observing a server must not start it.
|
|
|
|
use std::collections::HashMap;
|
|
|
|
use codex_protocol::mcp::McpServerConnectionStatus;
|
|
|
|
use super::McpConnectionSet;
|
|
|
|
impl McpConnectionSet {
|
|
pub(crate) async fn connection_statuses(&self) -> HashMap<String, McpServerConnectionStatus> {
|
|
use McpServerConnectionStatus as Status;
|
|
|
|
let mut statuses = self
|
|
.disabled_servers
|
|
.iter()
|
|
.map(|name| (name.clone(), Status::Disabled))
|
|
.collect::<HashMap<_, _>>();
|
|
for (name, view) in self.legacy_servers() {
|
|
let connection = &view.connection;
|
|
let client = &connection.client;
|
|
let status = if connection.startup_is_dormant() && !client.cancel_token.is_cancelled() {
|
|
Status::NotStarted
|
|
} else {
|
|
client.connection_status().await
|
|
};
|
|
statuses.insert(name.to_owned(), status);
|
|
}
|
|
statuses
|
|
}
|
|
}
|