Skip to content

Commit 71a6bf0

Browse files
author
Alpha Intelligence
committed
fix(client): allow ClientSessionGroup to connect to servers exposing no components
1 parent 4d6f87e commit 71a6bf0

2 files changed

Lines changed: 25 additions & 5 deletions

File tree

src/mcp/client/session_group.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -414,11 +414,6 @@ async def _aggregate_components(self, server_info: types.Implementation, session
414414
except MCPError as err: # pragma: no cover
415415
logging.warning(f"Could not fetch tools: {err}")
416416

417-
# Clean up exit stack for session if we couldn't retrieve anything
418-
# from the server.
419-
if not any((prompts_temp, resources_temp, tools_temp)):
420-
del self._session_exit_stacks[session] # pragma: no cover
421-
422417
# Check for duplicates.
423418
matching_prompts = prompts_temp.keys() & self._prompts.keys()
424419
if matching_prompts:

tests/client/test_session_group.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,31 @@ async def test_client_session_group_disconnect_non_existent_server():
295295
await group.disconnect_from_server(session)
296296

297297

298+
@pytest.mark.anyio
299+
async def test_client_session_group_connect_empty_server_succeeds():
300+
"""Test connecting to a server that exposes no tools, resources, or prompts."""
301+
group = ClientSessionGroup()
302+
mock_session = mock.AsyncMock(spec=mcp.ClientSession)
303+
mock_session.list_tools.return_value = mock.AsyncMock(tools=[])
304+
mock_session.list_resources.return_value = mock.AsyncMock(resources=[])
305+
mock_session.list_prompts.return_value = mock.AsyncMock(prompts=[])
306+
307+
server_info = types.Implementation(name="empty_server", version="1.0")
308+
309+
# Should not raise KeyError when connecting via connect_with_session
310+
connected_session = await group.connect_with_session(server_info, mock_session)
311+
assert connected_session is mock_session
312+
assert mock_session in group._sessions
313+
assert len(group.tools) == 0
314+
assert len(group.resources) == 0
315+
assert len(group.prompts) == 0
316+
317+
# Should disconnect cleanly
318+
await group.disconnect_from_server(mock_session)
319+
assert mock_session not in group._sessions
320+
321+
322+
298323
# TODO(Marcelo): This is horrible. We should drop this test.
299324
@pytest.mark.anyio
300325
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)