jarvis_mcp/client.py aktualisiert

This commit is contained in:
2026-07-05 12:08:20 +00:00
parent 1b0adde674
commit 181b921a99
+23 -25
View File
@@ -9,9 +9,10 @@ logger = get_logger("MCP")
class MCPClient: class MCPClient:
def __init__(self, url: str): def __init__(self, url: str):
# Entferne eventuelle doppelte /mcp und füge korrekt hinzu # Sauberes URL-Handling
base = url.rstrip('/') self.url = url.rstrip('/')
if not self.url.endswith('/mcp'):
self.url += '/mcp'
self.session = None self.session = None
self._client_context = None self._client_context = None
@@ -20,7 +21,7 @@ class MCPClient:
if self.session is not None: if self.session is not None:
return return
logger.info(f"Verbinde mit OpenHAB MCP: {self.url}") logger.info(f"Verbinde mit OpenHAB MCP Server: {self.url}")
try: try:
self._client_context = streamablehttp_client( self._client_context = streamablehttp_client(
@@ -30,22 +31,22 @@ class MCPClient:
streams = await self._client_context.__aenter__() streams = await self._client_context.__aenter__()
if isinstance(streams, tuple) and len(streams) == 3: # Flexibles Unpacking
read, write, _ = streams if isinstance(streams, tuple):
read, write = streams[:2] # nimm nur die ersten zwei
else: else:
read, write = streams raise ValueError("Unerwartetes Response-Format vom Client")
self.session = ClientSession(read, write) self.session = ClientSession(read, write)
await asyncio.wait_for(self.session.initialize(), timeout=12.0)
await asyncio.wait_for(self.session.initialize(), timeout=10.0)
logger.info("✅ OpenHAB MCP Verbindung erfolgreich hergestellt") logger.info("✅ OpenHAB MCP Verbindung erfolgreich hergestellt!")
except asyncio.TimeoutError: except asyncio.TimeoutError:
logger.error("❌ Timeout beim Verbinden mit MCP-Server") logger.error("❌ Timeout - MCP Server antwortet nicht rechtzeitig")
raise raise
except Exception as e: except Exception as e:
logger.error(f"❌ MCP Connect Fehler: {e}") logger.error(f"❌ MCP Verbindungsfehler: {e}")
raise raise
async def list_tools(self): async def list_tools(self):
@@ -57,18 +58,15 @@ class MCPClient:
return await self.session.call_tool(name, arguments) return await self.session.call_tool(name, arguments)
async def close(self): async def close(self):
if self.session: for obj in [self.session, self._client_context]:
try: if obj:
if hasattr(self.session, "close"): try:
await self.session.close() if hasattr(obj, "close"):
except Exception: await obj.close()
pass elif hasattr(obj, "__aexit__"):
await obj.__aexit__(None, None, None)
if self._client_context: except Exception as e:
try: logger.warning(f"Close Warning: {e}")
await self._client_context.__aexit__(None, None, None)
except Exception:
pass
self.session = None self.session = None
self._client_context = None self._client_context = None