ee0e234a2c
A multiplexed gateway ran `discover_mcp_tools()` once, unscoped, at boot and again on `/reload-mcp`, so only the launch profile's `mcp_servers` ever connected; secondary profiles' servers never registered, and a `/reload-mcp` from any profile tore down every profile's connections. - `_discover_gateway_mcp_tools()`: under multiplex, run discovery once per served profile inside `_profile_runtime_scope`, carried into the executor via `copy_context()` (same shape as `_run_in_executor_with_context`). Single-profile path unchanged. - `_execute_mcp_reload()`: enter the requesting profile's scope when the caller (e.g. button-confirm callback) did not; shut down / rediscover / report only that profile's servers; refresh only that profile's cached agents. - `shutdown_mcp_servers(scope=)`: scoped teardown keyed by the new `_server_scope_keys` ownership map; leaves the shared MCP loop running while other profiles' servers are live. Unscoped call keeps the full historical behavior. - MCP tools register into the owning profile's registry overlay (`registry.register(scope=...)`), and `registry.deregister()` gains a matching `scope=` kwarg. Plugin callers still cannot name another profile's scope; the plugin-vs-global guard is unchanged for them. Fixes #95518 Co-authored-by: fangliquanflq <fangliquan@qq.com> Co-authored-by: Kong <mgongzai@gmail.com> Co-authored-by: roraag <232666910+roraag@users.noreply.github.com>