"""Structured errors safe to return to MCP clients.""" from __future__ import annotations from dataclasses import dataclass, field from typing import Any @dataclass class LabyricornMcpError(Exception): code: str message: str details: dict[str, Any] = field(default_factory=dict) def __str__(self) -> str: return self.message def as_dict(self) -> dict[str, Any]: result: dict[str, Any] = {"code": self.code, "message": self.message} if self.details: result["details"] = self.details return result def require(condition: bool, code: str, message: str, **details: Any) -> None: if not condition: raise LabyricornMcpError(code, message, details)