mcp: allow background connect without registering tools; TUI starts background connect(register=False)

This commit is contained in:
giveen
2026-01-21 11:18:56 -07:00
parent d29e1f78e6
commit 1a54dea061
2 changed files with 34 additions and 14 deletions

View File

@@ -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

View File

@@ -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]: