diff --git a/pentestagent/interface/tui.py b/pentestagent/interface/tui.py index a7aefa4..1070c1c 100644 --- a/pentestagent/interface/tui.py +++ b/pentestagent/interface/tui.py @@ -1323,8 +1323,20 @@ class PentestAgentTUI(App): from ..mcp import MCPManager self.mcp_manager = MCPManager() - # connected servers are available synchronously - mcp_server_count = len(self.mcp_manager.get_all_servers()) + # Start background connect without registering tools into the + # TUI process and suppress noisy prints. This keeps the MCP + # connection and control socket available while keeping the + # TUI's tool list unchanged for the operator. + try: + loop = asyncio.get_running_loop() + loop.create_task(self.mcp_manager.connect_all(register=False, quiet=True)) + except RuntimeError: + # No running loop (unlikely in Textual worker), run in thread + try: + asyncio.run(self.mcp_manager.connect_all(register=False, quiet=True)) + except Exception: + pass + mcp_server_count = len(self.mcp_manager.list_configured_servers()) except Exception: self.mcp_manager = None mcp_server_count = 0 diff --git a/pentestagent/mcp/manager.py b/pentestagent/mcp/manager.py index c340a65..ac65ba6 100644 --- a/pentestagent/mcp/manager.py +++ b/pentestagent/mcp/manager.py @@ -301,7 +301,7 @@ class MCPManager: for n, s in servers.items() ] - async def connect_all(self) -> List[Any]: + async def connect_all(self, register: bool = True, quiet: bool = False) -> List[Any]: servers_config = self._load_config() all_tools = [] # Connect to any configured servers but DO NOT auto-start vendored adapters. @@ -314,16 +314,18 @@ class MCPManager: self.servers[name] = server for tool_def in server.tools: tool = create_mcp_tool(tool_def, server, self) - # Register tool into global registry so it appears in `tools list` - try: - register_tool_instance(tool) - except Exception: - pass + if register: + # Register tool into global registry so it appears in `tools list` + try: + register_tool_instance(tool) + except Exception: + pass all_tools.append(tool) - print(f"[MCP] Connected to {name} with {len(server.tools)} tools") + if not quiet: + print(f"[MCP] Connected to {name} with {len(server.tools)} tools") return all_tools - async def connect_server(self, name: str) -> Optional[MCPServer]: + async def connect_server(self, name: str, register: bool = True, quiet: bool = False) -> Optional[MCPServer]: servers_config = self._load_config() if name not in servers_config: return None @@ -369,12 +371,18 @@ class MCPManager: try: for tool_def in server.tools: tool = create_mcp_tool(tool_def, server, self) - try: - register_tool_instance(tool) - except Exception: - pass + if register: + try: + register_tool_instance(tool) + except Exception: + pass except Exception: pass + if not quiet: + try: + print(f"[MCP] Connected to {name} with {len(server.tools)} tools") + except Exception: + pass return server async def _connect_server(self, config: MCPServerConfig) -> Optional[MCPServer]: