diff --git a/navi/core/subagent_runner.py b/navi/core/subagent_runner.py index d147e18..b2a2330 100644 --- a/navi/core/subagent_runner.py +++ b/navi/core/subagent_runner.py @@ -101,9 +101,29 @@ exclude = set(exclude_tools or []) tool_source = profile.subagent_tools if profile.subagent_tools else profile.enabled_tools + + # If subagent_tools is a strict whitelist, filter mcp_servers to only + # include MCP tools explicitly listed in the whitelist. This prevents + # a profile from accidentally granting sub-agents access to MCP servers + # that are meant for the main agent only. + mcp_servers = profile.mcp_servers + if profile.subagent_tools: + mcp_tool_names = {n for n in profile.subagent_tools if n.startswith("mcp:")} + if mcp_tool_names: + filtered_mcp_servers: dict[str, list[str]] = {} + for server_name, groups in (profile.mcp_servers or {}).items(): + for group_name in groups: + for tool_name in self._mcp_manager.resolve_group(server_name, group_name): + full_name = f"mcp:{server_name}:{tool_name}" + if full_name in mcp_tool_names: + filtered_mcp_servers.setdefault(server_name, []).append(group_name) + mcp_servers = filtered_mcp_servers or None + else: + mcp_servers = None + tools = [ t - for t in build_tool_list(tool_source, profile.mcp_servers, self._tools, self._mcp_manager) + for t in build_tool_list(tool_source, mcp_servers, self._tools, self._mcp_manager) if t.name not in exclude ] tool_schemas = [t.schema() for t in tools]