From 181b921a99b07524af84ecb787718ec0e58f49c9 Mon Sep 17 00:00:00 2001 From: Till Immer Date: Sun, 5 Jul 2026 12:08:20 +0000 Subject: [PATCH] jarvis_mcp/client.py aktualisiert --- jarvis_mcp/client.py | 48 +++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/jarvis_mcp/client.py b/jarvis_mcp/client.py index 6396f96..1cc2955 100644 --- a/jarvis_mcp/client.py +++ b/jarvis_mcp/client.py @@ -9,9 +9,10 @@ logger = get_logger("MCP") class MCPClient: def __init__(self, url: str): - # Entferne eventuelle doppelte /mcp und füge korrekt hinzu - base = url.rstrip('/') - + # Sauberes URL-Handling + self.url = url.rstrip('/') + if not self.url.endswith('/mcp'): + self.url += '/mcp' self.session = None self._client_context = None @@ -20,7 +21,7 @@ class MCPClient: if self.session is not None: return - logger.info(f"Verbinde mit OpenHAB MCP: {self.url}") + logger.info(f"Verbinde mit OpenHAB MCP Server: {self.url}") try: self._client_context = streamablehttp_client( @@ -30,22 +31,22 @@ class MCPClient: streams = await self._client_context.__aenter__() - if isinstance(streams, tuple) and len(streams) == 3: - read, write, _ = streams + # Flexibles Unpacking + if isinstance(streams, tuple): + read, write = streams[:2] # nimm nur die ersten zwei else: - read, write = streams + raise ValueError("Unerwartetes Response-Format vom Client") self.session = ClientSession(read, write) - - await asyncio.wait_for(self.session.initialize(), timeout=10.0) + await asyncio.wait_for(self.session.initialize(), timeout=12.0) - logger.info("✅ OpenHAB MCP Verbindung erfolgreich hergestellt") + logger.info("✅ OpenHAB MCP Verbindung erfolgreich hergestellt!") except asyncio.TimeoutError: - logger.error("❌ Timeout beim Verbinden mit MCP-Server") + logger.error("❌ Timeout - MCP Server antwortet nicht rechtzeitig") raise except Exception as e: - logger.error(f"❌ MCP Connect Fehler: {e}") + logger.error(f"❌ MCP Verbindungsfehler: {e}") raise async def list_tools(self): @@ -57,18 +58,15 @@ class MCPClient: return await self.session.call_tool(name, arguments) async def close(self): - if self.session: - try: - if hasattr(self.session, "close"): - await self.session.close() - except Exception: - pass - - if self._client_context: - try: - await self._client_context.__aexit__(None, None, None) - except Exception: - pass - + for obj in [self.session, self._client_context]: + if obj: + try: + if hasattr(obj, "close"): + await obj.close() + elif hasattr(obj, "__aexit__"): + await obj.__aexit__(None, None, None) + except Exception as e: + logger.warning(f"Close Warning: {e}") + self.session = None self._client_context = None \ No newline at end of file