///|
/// MCP's wire layer bridges the transport layer and the canonical `jsonrpc` package.
///
/// It translates JSON-RPC envelopes into MCP semantics and errors without
/// re-implementing JSON-RPC wire parsing.
pub fn McpError::from_jsonrpc_decode_error(
  error : @jsonrpc.JsonRpcDecodeError,
) -> McpError {
  match error {
    InvalidMessage(message) => InvalidRequest(message)
  }
}

///|
pub fn decode_message(message : Json) -> @jsonrpc.Message raise McpError {
  @jsonrpc.decode(message) catch {
    error => raise McpError::from_jsonrpc_decode_error(error)
  }
}

///|
pub fn McpError::to_response(
  self : McpError,
  id? : @jsonrpc.RequestId,
) -> @jsonrpc.Response[Json] {
  Failure(id~, error=self.to_error_object())
}