jarvis_mcp/client.py aktualisiert
This commit is contained in:
+23
-25
@@ -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
|
||||||
Reference in New Issue
Block a user