Fix MCP close tool method signature error (GH #107)

Renamed BdDaemonClient.close() cleanup method to cleanup() to eliminate
method name collision with async close(params) method for closing issues.

Root cause: Python method resolution meant the non-async close(self)
cleanup method was shadowing the async close(self, params) method that
closes issues, causing 'takes 1 positional argument but 2 were given'.

Changes:
- bd_daemon_client.py: Renamed close() -> cleanup()
- server.py: Updated cleanup code to call cleanup() instead of close()
- test_lifecycle.py: Updated tests to use cleanup()

All close-related tests pass. Fixes GitHub issue #107.
Tracked in bd-67 (closed).
This commit is contained in:
Steve Yegge
2025-10-22 17:43:11 -07:00
parent a777e97287
commit 42762188ed
4 changed files with 9 additions and 8 deletions

1
.beads/daemon.lock Normal file
View File

@@ -0,0 +1 @@
92502

View File

@@ -431,7 +431,7 @@ class BdDaemonClient(BdClientBase):
except (DaemonNotRunningError, DaemonConnectionError, DaemonError): except (DaemonNotRunningError, DaemonConnectionError, DaemonError):
return False return False
def close(self) -> None: def cleanup(self) -> None:
"""Close daemon client connections and cleanup resources. """Close daemon client connections and cleanup resources.
This is called during MCP server shutdown to ensure clean termination. This is called during MCP server shutdown to ensure clean termination.

View File

@@ -70,8 +70,8 @@ def cleanup() -> None:
# Close all daemon client connections # Close all daemon client connections
for client in _daemon_clients: for client in _daemon_clients:
try: try:
if hasattr(client, 'close'): if hasattr(client, 'cleanup'):
client.close() client.cleanup()
logger.debug(f"Closed daemon client: {client}") logger.debug(f"Closed daemon client: {client}")
except Exception as e: except Exception as e:
logger.warning(f"Error closing daemon client: {e}") logger.warning(f"Error closing daemon client: {e}")

View File

@@ -40,8 +40,8 @@ def test_cleanup_function_safe_to_call_multiple_times():
cleanup() cleanup()
cleanup() cleanup()
# Client should only be closed once # Client should only be cleaned up once
assert mock_client.close.call_count == 1 assert mock_client.cleanup.call_count == 1
assert len(_daemon_clients) == 0 assert len(_daemon_clients) == 0
@@ -55,7 +55,7 @@ def test_cleanup_handles_client_errors_gracefully():
# Create mock clients - one that raises, one that doesn't # Create mock clients - one that raises, one that doesn't
failing_client = MagicMock() failing_client = MagicMock()
failing_client.close.side_effect = Exception("Connection failed") failing_client.cleanup.side_effect = Exception("Connection failed")
good_client = MagicMock() good_client = MagicMock()
@@ -66,8 +66,8 @@ def test_cleanup_handles_client_errors_gracefully():
cleanup() cleanup()
# Both clients should have been attempted # Both clients should have been attempted
assert failing_client.close.called assert failing_client.cleanup.called
assert good_client.close.called assert good_client.cleanup.called
assert len(_daemon_clients) == 0 assert len(_daemon_clients) == 0