Skip to content
Draft
Next Next commit
fix leak
  • Loading branch information
phact committed Dec 12, 2025
commit 271a23059c808fc1c7d74ad391159af678a7c973
12 changes: 12 additions & 0 deletions src/backend/base/langflow/api/v2/mcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,11 +149,18 @@ async def get_servers(

# Check all of the tool counts for each server concurrently
async def check_server(server_name: str) -> dict:
from lfx.base.mcp.util import MCPStdioClient, MCPStreamableHttpClient

server_info: dict[str, str | int | None] = {"name": server_name, "mode": None, "toolsCount": None}
# Create clients that we control so we can clean them up after
mcp_stdio_client = MCPStdioClient()
mcp_streamable_http_client = MCPStreamableHttpClient()
try:
mode, tool_list, _ = await update_tools(
server_name=server_name,
server_config=server_list["mcpServers"][server_name],
mcp_stdio_client=mcp_stdio_client,
mcp_streamable_http_client=mcp_streamable_http_client,
)
server_info["mode"] = mode.lower()
server_info["toolsCount"] = len(tool_list)
Expand Down Expand Up @@ -199,6 +206,11 @@ async def check_server(server_name: str) -> dict:
else:
await logger.aexception(f"Error checking server {server_name}: {e}")
server_info["error"] = f"Error loading server: {e}"
finally:
# Always disconnect clients to prevent mcp-proxy process leaks
# These clients spawn subprocesses that need to be explicitly terminated
await mcp_stdio_client.disconnect()
await mcp_streamable_http_client.disconnect()
return server_info

# Run all server checks concurrently
Expand Down
Loading