mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-06-17 02:05:22 -04:00
fix: close AsyncExitStack on MCP init/tool-discovery failure (#1493)
If session.initialize() or list_tools() raises after the stdio subprocess or SSE connection is already open, the AsyncExitStack is never closed — leaking the child process or HTTP connection. Wrap the setup phase in try/except to aclose() the stack before re-raising.
This commit is contained in:
committed by
GitHub
parent
8c4ea484a9
commit
1feb2ae7d5
+20
-12
@@ -89,14 +89,18 @@ class McpManager:
|
|||||||
)
|
)
|
||||||
|
|
||||||
stack = AsyncExitStack()
|
stack = AsyncExitStack()
|
||||||
transport = await stack.enter_async_context(stdio_client(server_params))
|
try:
|
||||||
read_stream, write_stream = transport
|
transport = await stack.enter_async_context(stdio_client(server_params))
|
||||||
session = await stack.enter_async_context(ClientSession(read_stream, write_stream))
|
read_stream, write_stream = transport
|
||||||
|
session = await stack.enter_async_context(ClientSession(read_stream, write_stream))
|
||||||
|
|
||||||
await session.initialize()
|
await session.initialize()
|
||||||
|
|
||||||
# Discover tools
|
# Discover tools
|
||||||
tools_result = await session.list_tools()
|
tools_result = await session.list_tools()
|
||||||
|
except Exception:
|
||||||
|
await stack.aclose()
|
||||||
|
raise
|
||||||
tools = []
|
tools = []
|
||||||
for tool in tools_result.tools:
|
for tool in tools_result.tools:
|
||||||
tools.append({
|
tools.append({
|
||||||
@@ -142,14 +146,18 @@ class McpManager:
|
|||||||
from contextlib import AsyncExitStack
|
from contextlib import AsyncExitStack
|
||||||
|
|
||||||
stack = AsyncExitStack()
|
stack = AsyncExitStack()
|
||||||
transport = await stack.enter_async_context(sse_client(url))
|
try:
|
||||||
read_stream, write_stream = transport
|
transport = await stack.enter_async_context(sse_client(url))
|
||||||
session = await stack.enter_async_context(ClientSession(read_stream, write_stream))
|
read_stream, write_stream = transport
|
||||||
|
session = await stack.enter_async_context(ClientSession(read_stream, write_stream))
|
||||||
|
|
||||||
await session.initialize()
|
await session.initialize()
|
||||||
|
|
||||||
# Discover tools
|
# Discover tools
|
||||||
tools_result = await session.list_tools()
|
tools_result = await session.list_tools()
|
||||||
|
except Exception:
|
||||||
|
await stack.aclose()
|
||||||
|
raise
|
||||||
tools = []
|
tools = []
|
||||||
for tool in tools_result.tools:
|
for tool in tools_result.tools:
|
||||||
tools.append({
|
tools.append({
|
||||||
|
|||||||
Reference in New Issue
Block a user