Files
AI-System/jarvis_mcp/client.py
T

74 lines
2.1 KiB
Python

# jarvis_mcp/client.py
import asyncio
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
from util.logger import get_logger
logger = get_logger("MCP")
class MCPClient:
def __init__(self, url: str):
# Entferne eventuelle doppelte /mcp und füge korrekt hinzu
base = url.rstrip('/')
self.session = None
self._client_context = None
async def connect(self):
if self.session is not None:
return
logger.info(f"Verbinde mit OpenHAB MCP: {self.url}")
try:
self._client_context = streamablehttp_client(
self.url,
terminate_on_close=True
)
streams = await self._client_context.__aenter__()
if isinstance(streams, tuple) and len(streams) == 3:
read, write, _ = streams
else:
read, write = streams
self.session = ClientSession(read, write)
await asyncio.wait_for(self.session.initialize(), timeout=10.0)
logger.info("✅ OpenHAB MCP Verbindung erfolgreich hergestellt")
except asyncio.TimeoutError:
logger.error("❌ Timeout beim Verbinden mit MCP-Server")
raise
except Exception as e:
logger.error(f"❌ MCP Connect Fehler: {e}")
raise
async def list_tools(self):
await self.connect()
return await self.session.list_tools()
async def call_tool(self, name: str, arguments: dict):
await self.connect()
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
self.session = None
self._client_context = None