1313import importlib
1414import logging
1515import pkgutil
16+ from collections .abc import Mapping
1617from collections import deque
1718from pathlib import Path
1819from typing import TYPE_CHECKING , Callable
@@ -70,6 +71,7 @@ def build_registry(
7071 session_id : str | None = None ,
7172 event_callback : Callable [[str , dict ], None ] | None = None ,
7273 warn_callback : Callable [[str ], None ] | None = None ,
74+ _mcp_server_tool_name_segments : Mapping [str , str ] | None = None ,
7375) -> ToolRegistry :
7476 """Build the tool registry via auto-discovery, optionally enriched with MCP tools.
7577
@@ -132,10 +134,16 @@ def build_registry(
132134 if agent_config and agent_config .mcp_servers :
133135 from src .tools .mcp import build_mcp_tool_wrappers , resolve_mcp_server_tool_name_segments
134136
135- local_server_names = resolve_mcp_server_tool_name_segments (
136- agent_config .mcp_servers .keys (),
137- warn_callback = warn_callback ,
138- )
137+ if _mcp_server_tool_name_segments is None :
138+ local_server_names = resolve_mcp_server_tool_name_segments (
139+ agent_config .mcp_servers .keys (),
140+ warn_callback = warn_callback ,
141+ )
142+ else :
143+ local_server_names = {
144+ server_name : _mcp_server_tool_name_segments [server_name ]
145+ for server_name in agent_config .mcp_servers
146+ }
139147
140148 for server_name , server_config in agent_config .mcp_servers .items ():
141149 try :
@@ -212,25 +220,29 @@ def build_swarm_registry(
212220 ToolRegistry containing the whitelist intersection of local tools
213221 and any operator-surfaced MCP tools.
214222 """
215- swarm_agent_config = _prune_agent_config_for_swarm_tools (agent_config , tool_names )
223+ swarm_agent_config , swarm_local_server_names = _prune_agent_config_for_swarm_tools (
224+ agent_config ,
225+ tool_names ,
226+ )
216227 full = build_registry (
217228 agent_config = swarm_agent_config ,
218229 include_shell_tools = include_shell_tools ,
230+ _mcp_server_tool_name_segments = swarm_local_server_names ,
219231 )
220232 return _filter_registry (full , tool_names , include_shell_tools = include_shell_tools )
221233
222234
223235def _prune_agent_config_for_swarm_tools (
224236 agent_config : "AgentConfig | None" ,
225237 tool_names : list [str ],
226- ) -> "AgentConfig | None" :
238+ ) -> tuple [ "AgentConfig | None" , dict [ str , str ] | None ] :
227239 """Keep only MCP servers whose local tool prefix appears in ``tool_names``."""
228240 if not agent_config or not agent_config .mcp_servers :
229- return agent_config
241+ return agent_config , None
230242
231243 requested_mcp_tool_names = [name for name in tool_names if name .startswith ("mcp_" )]
232244 if not requested_mcp_tool_names :
233- return None
245+ return None , None
234246
235247 from src .config .schema import AgentConfig
236248 from src .tools .mcp import resolve_mcp_server_tool_name_segments
@@ -244,7 +256,11 @@ def _prune_agent_config_for_swarm_tools(
244256 for tool_name in requested_mcp_tool_names
245257 )
246258 }
247- return AgentConfig (mcp_servers = selected_servers )
259+ selected_local_server_names = {
260+ server_name : local_server_names [server_name ]
261+ for server_name in selected_servers
262+ }
263+ return AgentConfig (mcp_servers = selected_servers ), selected_local_server_names
248264
249265
250266def _filter_registry (
0 commit comments