Fix KeyError and exit stack leak on empty servers in ClientSessionGroup (#3384) - #3419
Conversation
…up (modelcontextprotocol#3384) - Avoid attempting to delete session from _session_exit_stacks in _aggregate_components when a server exposes no tools, resources, or prompts - Fixes KeyError on connect_with_session with empty servers - Preserves exit stack tracking on connect_to_server so disconnect_from_server can cleanly aclose the stack - Add comprehensive unit tests for both connection modes with empty servers
|
This PR has been closed automatically. This repo only keeps pull requests open when they come from a maintainer, or from a contributor a maintainer has assigned to the linked issue, and you aren't currently assigned to #3384. If a maintainer assigns you to #3384, this PR reopens on its own and there's nothing more you need to do here. Assignment is a maintainer call based on capacity; comments that only ask to be assigned don't factor in. What does help is engaging on the issue itself by confirming the repro, explaining why it matters for your use case, or describing the approach you'd take. You're welcome to keep pushing commits here (just avoid force-pushing, since GitHub can't reopen a rewritten branch), but that on its own won't get the PR reviewed or the issue assigned, and realistically most auto-closed PRs stay closed. There's no need to open a new PR either way. CONTRIBUTING.md has the full reasoning, but in short:
Maintainers: reopen, remove |
Description
Fixes #3384.
Connecting a
ClientSessionGroupto a server that exposes no tools, resources, or prompts previously caused two distinct issues due todel self._session_exit_stacks[session]in_aggregate_components:connect_with_session(), the caller manages the session lifecycle, sosessionis not present in_session_exit_stacks. The unconditional deletion raised a rawKeyError.connect_to_server(), the deletion dropped the tracking entry without closing the underlyingsession_stack. The session was still registered inself._sessions, but callingdisconnect_from_server(session)subsequently failed to close the session's exit stack becausesession in self._session_exit_stackswasFalse.Changes
_session_exit_stacks[session]in_aggregate_components.ClientSessionGroup.connect_with_sessionandconnect_to_serverlifecycles on empty servers.Testing
tests/client/test_session_group.py:test_client_session_group_connect_empty_server_with_sessiontest_client_session_group_connect_empty_server_via_connect_to_serveruv run pytest tests/client/test_session_group.pyuv run ruff checkanduv run ruff format --check