using ModelContextProtocol.Protocol; using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Nodes; namespace ModelContextProtocol; /// /// Represents an exception used to signal that a request requires a client capability that was not declared /// in the request's per-request _meta/io.modelcontextprotocol/clientCapabilities field. /// /// /// Introduced by the 2026-07-28 protocol revision (SEP-2575). Servers throw this exception when a handler cannot /// proceed because the client did not declare a required capability for the request. The exception is converted /// to a JSON-RPC error response with code (-32021) /// and a payload. /// public sealed class MissingRequiredClientCapabilityException : McpProtocolException { /// /// Initializes a new instance of the class. /// /// The capabilities the server requires for the request. /// A human-readable description of the error. If , a default message is used. public MissingRequiredClientCapabilityException(ClientCapabilities requiredCapabilities, string? message = null) : base(message ?? "The request requires client capabilities that were not declared in _meta/clientCapabilities.", McpErrorCode.MissingRequiredClientCapability) { Throw.IfNull(requiredCapabilities); RequiredCapabilities = requiredCapabilities; } /// Gets the client capabilities required for the request. public ClientCapabilities RequiredCapabilities { get; } internal JsonNode CreateErrorDataNode() { var payload = new MissingRequiredClientCapabilityErrorData { RequiredCapabilities = RequiredCapabilities, }; return JsonSerializer.SerializeToNode(payload, McpJsonUtilities.JsonContext.Default.MissingRequiredClientCapabilityErrorData)!; } internal static bool TryCreateFromError( string formattedMessage, JsonRpcErrorDetail detail, [NotNullWhen(true)] out MissingRequiredClientCapabilityException? exception) { exception = null; if (detail.Data is not JsonElement dataElement || dataElement.ValueKind is not JsonValueKind.Object) { return false; } var payload = dataElement.Deserialize(McpJsonUtilities.JsonContext.Default.MissingRequiredClientCapabilityErrorData); if (payload?.RequiredCapabilities is null) { return false; } exception = new MissingRequiredClientCapabilityException(payload.RequiredCapabilities, formattedMessage); return true; } }