Keep same-named MCP servers separate across environments (#60905)

## 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
This commit is contained in:
sayan-oai
2026-11-11 23:36:19 +00:00
committed by copyberry
parent 8a4b226ad5
commit 561f0f5cf0
100 changed files with 3305 additions and 1106 deletions
@@ -401,7 +401,7 @@ fn resolves_apps_hook_metadata_from_the_registered_connector() {
|server, tool| {
tool_info
.as_ref()
.filter(|info| info.server_name == server && info.tool.name == tool)
.filter(|info| info.server_name() == server && info.tool.name == tool)
},
);
let expected = if admitted {