"""Dependency-free Blessbri MCP stdio reference client (Python 3.9+).""" from __future__ import annotations import json import subprocess from pathlib import Path from typing import Any class BlessbriMcpClient: def __init__(self, executable: str | Path) -> None: self.process = subprocess.Popen( [str(executable), "--agent-bridge-stdio"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True, encoding="utf-8", ) self._next_id = 1 def request(self, method: str, params: dict[str, Any] | None = None) -> dict[str, Any]: if self.process.stdin is None or self.process.stdout is None: raise RuntimeError("Blessbri MCP process is unavailable.") request_id = self._next_id self._next_id += 1 message = {"jsonrpc": "2.0", "id": request_id, "method": method} if params is not None: message["params"] = params self.process.stdin.write(json.dumps(message, separators=(",", ":")) + "\n") self.process.stdin.flush() response = json.loads(self.process.stdout.readline()) if response.get("id") != request_id or "error" in response: raise RuntimeError(f"Blessbri MCP request failed: {response}") return response["result"] def initialize(self) -> dict[str, Any]: return self.request( "initialize", { "protocolVersion": "2025-06-18", "capabilities": {}, "clientInfo": {"name": "blessbri-python-reference", "version": "1"}, }, ) def list_tools(self) -> dict[str, Any]: return self.request("tools/list", {}) def call_tool(self, name: str, arguments: dict[str, Any]) -> dict[str, Any]: return self.request("tools/call", {"name": name, "arguments": arguments}) def close(self) -> None: if self.process.stdin is not None: self.process.stdin.close() self.process.wait(timeout=10)