From d189d4f56c56fcc0466a414b52afbadb79497322 Mon Sep 17 00:00:00 2001 From: devcrocod Date: Thu, 4 Dec 2025 20:14:27 +0100 Subject: [PATCH] Add PrimingEventMessage type and update Protocol to handle it Co-authored-by: @zshea --- kotlin-sdk-core/api/kotlin-sdk-core.api | 10 ++++++++++ .../modelcontextprotocol/kotlin/sdk/shared/Protocol.kt | 2 ++ .../io/modelcontextprotocol/kotlin/sdk/types/common.kt | 4 ++-- .../modelcontextprotocol/kotlin/sdk/types/jsonRpc.kt | 8 +++++++- .../kotlin/sdk/types/serializers.kt | 1 + 5 files changed, 22 insertions(+), 3 deletions(-) diff --git a/kotlin-sdk-core/api/kotlin-sdk-core.api b/kotlin-sdk-core/api/kotlin-sdk-core.api index 49b88cb3..f503fce6 100644 --- a/kotlin-sdk-core/api/kotlin-sdk-core.api +++ b/kotlin-sdk-core/api/kotlin-sdk-core.api @@ -988,6 +988,7 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/ClientResult$Default } public final class io/modelcontextprotocol/kotlin/sdk/types/CommonKt { + public static final field DEFAULT_NEGOTIATED_PROTOCOL_VERSION Ljava/lang/String; public static final field LATEST_PROTOCOL_VERSION Ljava/lang/String; public static final fun ProgressToken (J)Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; public static final fun ProgressToken (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; @@ -2947,6 +2948,15 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/PingRequestBuilder : public synthetic fun build$kotlin_sdk_core ()Lio/modelcontextprotocol/kotlin/sdk/types/Request; } +public final class io/modelcontextprotocol/kotlin/sdk/types/PrimingEventMessage : io/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/PrimingEventMessage; + public fun equals (Ljava/lang/Object;)Z + public fun getJsonrpc ()Ljava/lang/String; + public fun hashCode ()I + public final fun serializer ()Lkotlinx/serialization/KSerializer; + public fun toString ()Ljava/lang/String; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/Progress { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Progress$Companion; public fun (DLjava/lang/Double;Ljava/lang/String;)V diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt index 7dd04bc0..4e2ea29a 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt @@ -13,6 +13,7 @@ import io.modelcontextprotocol.kotlin.sdk.types.McpJson import io.modelcontextprotocol.kotlin.sdk.types.Method import io.modelcontextprotocol.kotlin.sdk.types.Notification import io.modelcontextprotocol.kotlin.sdk.types.PingRequest +import io.modelcontextprotocol.kotlin.sdk.types.PrimingEventMessage import io.modelcontextprotocol.kotlin.sdk.types.Progress import io.modelcontextprotocol.kotlin.sdk.types.ProgressNotification import io.modelcontextprotocol.kotlin.sdk.types.ProgressToken @@ -249,6 +250,7 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio is JSONRPCRequest -> onRequest(message) is JSONRPCNotification -> onNotification(message) is JSONRPCError -> onResponse(null, message) + is PrimingEventMessage -> Unit } } diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/common.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/common.kt index f715be73..e22dab7e 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/common.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/common.kt @@ -1,7 +1,5 @@ package io.modelcontextprotocol.kotlin.sdk.types -import io.modelcontextprotocol.kotlin.sdk.types.Icon.Theme.Dark -import io.modelcontextprotocol.kotlin.sdk.types.Icon.Theme.Light import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonObject @@ -12,6 +10,8 @@ import kotlinx.serialization.json.JsonObject public const val LATEST_PROTOCOL_VERSION: String = "2025-06-18" +public const val DEFAULT_NEGOTIATED_PROTOCOL_VERSION: String = "2025-03-26" + public val SUPPORTED_PROTOCOL_VERSIONS: List = listOf( LATEST_PROTOCOL_VERSION, "2025-03-26", diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/jsonRpc.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/jsonRpc.kt index 8a580eb0..30bd815f 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/jsonRpc.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/jsonRpc.kt @@ -85,6 +85,12 @@ public sealed interface JSONRPCMessage { public val jsonrpc: String } +@Serializable +public data object PrimingEventMessage : JSONRPCMessage { + @EncodeDefault + override val jsonrpc: String = JSONRPC_VERSION +} + // ============================================================================ // JSONRPCRequest // ============================================================================ @@ -197,7 +203,7 @@ public data class JSONRPCResponse(val id: RequestId, val result: RequestResult = * @property error Details about the error that occurred, including error code and message. */ @Serializable -public data class JSONRPCError(val id: RequestId, val error: RPCError) : JSONRPCMessage { +public data class JSONRPCError(val id: RequestId?, val error: RPCError) : JSONRPCMessage { @EncodeDefault override val jsonrpc: String = JSONRPC_VERSION } diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt index 721a2aac..f3000105 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt @@ -384,6 +384,7 @@ internal object JSONRPCMessagePolymorphicSerializer : "result" in jsonObject -> JSONRPCResponse.serializer() "method" in jsonObject && "id" in jsonObject -> JSONRPCRequest.serializer() "method" in jsonObject -> JSONRPCNotification.serializer() + jsonObject.isEmpty() || jsonObject.keys == setOf("jsonrpc") -> PrimingEventMessage.serializer() else -> throw SerializationException("Invalid JSONRPCMessage type: ${jsonObject.keys}") } }