From 36a0d0e380465aab37b4a43c708afb8419c9ed08 Mon Sep 17 00:00:00 2001 From: Konstantin Pavlov <1517853+kpavlov@users.noreply.github.com> Date: Thu, 23 Oct 2025 19:19:29 +0300 Subject: [PATCH 1/5] Add convenience constructors to JSONRPCRequest --- .../StreamableHttpClientTransportTest.kt | 5 +-- kotlin-sdk-core/api/kotlin-sdk-core.api | 25 +++++++++++ .../modelcontextprotocol/kotlin/sdk/types.kt | 44 ++++++++++++++++++- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransportTest.kt b/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransportTest.kt index 4c972728..42eb3799 100644 --- a/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransportTest.kt +++ b/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransportTest.kt @@ -16,7 +16,6 @@ import io.modelcontextprotocol.kotlin.sdk.Implementation import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage import io.modelcontextprotocol.kotlin.sdk.JSONRPCNotification import io.modelcontextprotocol.kotlin.sdk.JSONRPCRequest -import io.modelcontextprotocol.kotlin.sdk.RequestId import io.modelcontextprotocol.kotlin.sdk.shared.McpJson import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.TimeoutCancellationException @@ -51,7 +50,7 @@ class StreamableHttpClientTransportTest { @Test fun testSendJsonRpcMessage() = runTest { val message = JSONRPCRequest( - id = RequestId.StringId("test-id"), + id = "test-id", method = "test", params = buildJsonObject { }, ) @@ -79,7 +78,7 @@ class StreamableHttpClientTransportTest { @Test fun testStoreSessionId() = runTest { val initMessage = JSONRPCRequest( - id = RequestId.StringId("test-id"), + id = "test-id", method = "initialize", params = buildJsonObject { put( diff --git a/kotlin-sdk-core/api/kotlin-sdk-core.api b/kotlin-sdk-core/api/kotlin-sdk-core.api index d4d4b9d5..f4b9a5ea 100644 --- a/kotlin-sdk-core/api/kotlin-sdk-core.api +++ b/kotlin-sdk-core/api/kotlin-sdk-core.api @@ -1143,8 +1143,12 @@ public final class io/modelcontextprotocol/kotlin/sdk/JSONRPCNotification$Compan public final class io/modelcontextprotocol/kotlin/sdk/JSONRPCRequest : io/modelcontextprotocol/kotlin/sdk/JSONRPCMessage { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/JSONRPCRequest$Companion; + public fun (JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Lio/modelcontextprotocol/kotlin/sdk/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;)V public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/RequestId; public final fun component2 ()Ljava/lang/String; public final fun component3 ()Lkotlinx/serialization/json/JsonElement; @@ -3364,3 +3368,24 @@ public final class io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTranspo public static final field MCP_SUBPROTOCOL Ljava/lang/String; } +public class io/modelcontextprotocol/kotlin/sdk/testing/MockTransport : io/modelcontextprotocol/kotlin/sdk/shared/Transport { + public fun ()V + public fun (Lkotlin/jvm/functions/Function1;)V + public synthetic fun (Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun awaitMessage-ePrTys8 (JJLjava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun awaitMessage-ePrTys8$default (Lio/modelcontextprotocol/kotlin/sdk/testing/MockTransport;JJLjava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public fun close (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun getReceivedMessages (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun getSentMessages (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun onClose (Lkotlin/jvm/functions/Function0;)V + public fun onError (Lkotlin/jvm/functions/Function1;)V + public fun onMessage (Lkotlin/jvm/functions/Function2;)V + public final fun onMessageReply (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V + public final fun onMessageReplyError (Lio/modelcontextprotocol/kotlin/sdk/Method;Lkotlin/jvm/functions/Function1;)V + public static synthetic fun onMessageReplyError$default (Lio/modelcontextprotocol/kotlin/sdk/testing/MockTransport;Lio/modelcontextprotocol/kotlin/sdk/Method;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V + public final fun onMessageReplyResult (Lio/modelcontextprotocol/kotlin/sdk/Method;Lkotlin/jvm/functions/Function1;)V + public fun send (Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun setupInitializationResponse ()V + public fun start (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt index 927967af..80afc56f 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt @@ -19,6 +19,8 @@ import kotlin.concurrent.atomics.incrementAndFetch import kotlin.jvm.JvmInline import kotlin.time.ExperimentalTime import kotlin.time.Instant +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid public const val LATEST_PROTOCOL_VERSION: String = "2025-03-26" @@ -232,7 +234,36 @@ public data class JSONRPCRequest( val method: String, val params: JsonElement = EmptyJsonObject, val jsonrpc: String = JSONRPC_VERSION, -) : JSONRPCMessage +) : JSONRPCMessage { + + /** + * Creates a JSON-RPC request with a randomly generated string ID (using UUID) and the given method and parameters. + * + * @param id The string ID for the request. If not provided, a random UUID string is generated. + * @param method The method name for the request. + * @param params The parameters for the request as a JSON element. If not provided, an empty JSON object is used. + */ + @OptIn(ExperimentalUuidApi::class) + public constructor( + id: String = Uuid.random().toHexString(), + method: String, + params: JsonElement = EmptyJsonObject, + ) : this(id = RequestId.StringId(id), method = method, params = params) + + /** + * Creates a JSON-RPC request with a numeric ID (long) generated by a counter (to ensure uniqueness) + * and the given method and parameters. + * + * The `id` parameter is optional and defaults to a new unique long value generated + * by `REQUEST_MESSAGE_ID.incrementAndFetch()`. + * The `params` parameter is optional and defaults to an empty JSON object. + */ + public constructor( + id: Long = REQUEST_MESSAGE_ID.incrementAndFetch(), + method: String, + params: JsonElement = EmptyJsonObject, + ) : this(id = RequestId.NumberId(id), method = method, params = params) +} /** * A notification which does not expect a response. @@ -302,6 +333,7 @@ public data class JSONRPCError(val code: ErrorCode, val message: String, val dat public sealed interface NotificationParams : WithMeta /* Cancellation */ + /** * This notification can be sent by either side to indicate that it is cancelling a previously issued request. * @@ -334,6 +366,7 @@ public data class CancelledNotification(override val params: Params) : } /* Initialization */ + /** * Describes the name and version of an MCP implementation. */ @@ -531,6 +564,7 @@ public data class InitializedNotification(override val params: Params = Params() } /* Ping */ + /** * A ping, issued by either the server or the client, to check that the other party is still alive. * The receiver must promptly respond, or else it may be disconnected. @@ -564,6 +598,7 @@ public sealed interface ProgressBase { } /* Progress notifications */ + /** * Represents a progress notification. * @@ -623,6 +658,7 @@ public data class ProgressNotification(override val params: Params) : } /* Pagination */ + /** * Represents a request supporting pagination. */ @@ -650,6 +686,7 @@ public sealed interface PaginatedResult : RequestResult { } /* Resources */ + /** * The contents of a specific resource or sub-resource. */ @@ -892,6 +929,7 @@ public data class ResourceUpdatedNotification(override val params: Params) : Ser } /* Prompts */ + /** * Describes an argument that a prompt can accept. */ @@ -1162,6 +1200,7 @@ public data class PromptListChangedNotification(override val params: Params = Pa } /* Tools */ + /** * Additional properties describing a Tool to clients. * @@ -1340,6 +1379,7 @@ public data class ToolListChangedNotification(override val params: Params = Para } /* Logging */ + /** * The severity of a log message. */ @@ -1399,6 +1439,7 @@ public data class LoggingMessageNotification(override val params: Params) : Serv } /* Sampling */ + /** * Hints to use for model selection. */ @@ -1643,6 +1684,7 @@ public data class CompleteResult(val completion: Completion, override val _meta: } /* Roots */ + /** * Represents a root directory or file that the server can operate on. */ From 8909dee19efd3d465290ae49443478648f38037f Mon Sep 17 00:00:00 2001 From: Konstantin Pavlov <1517853+kpavlov@users.noreply.github.com> Date: Thu, 23 Oct 2025 19:19:29 +0300 Subject: [PATCH 2/5] Add convenience constructors to JSONRPCRequest --- .../StreamableHttpClientTransportTest.kt | 5 +-- kotlin-sdk-core/api/kotlin-sdk-core.api | 25 +++++++++++ .../modelcontextprotocol/kotlin/sdk/types.kt | 44 ++++++++++++++++++- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransportTest.kt b/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransportTest.kt index a72bd853..a6ff6646 100644 --- a/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransportTest.kt +++ b/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransportTest.kt @@ -16,7 +16,6 @@ import io.modelcontextprotocol.kotlin.sdk.Implementation import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage import io.modelcontextprotocol.kotlin.sdk.JSONRPCNotification import io.modelcontextprotocol.kotlin.sdk.JSONRPCRequest -import io.modelcontextprotocol.kotlin.sdk.RequestId import io.modelcontextprotocol.kotlin.sdk.shared.McpJson import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -50,7 +49,7 @@ class StreamableHttpClientTransportTest { @Test fun testSendJsonRpcMessage() = runTest { val message = JSONRPCRequest( - id = RequestId.StringId("test-id"), + id = "test-id", method = "test", params = buildJsonObject { }, ) @@ -78,7 +77,7 @@ class StreamableHttpClientTransportTest { @Test fun testStoreSessionId() = runTest { val initMessage = JSONRPCRequest( - id = RequestId.StringId("test-id"), + id = "test-id", method = "initialize", params = buildJsonObject { put( diff --git a/kotlin-sdk-core/api/kotlin-sdk-core.api b/kotlin-sdk-core/api/kotlin-sdk-core.api index d4d4b9d5..f4b9a5ea 100644 --- a/kotlin-sdk-core/api/kotlin-sdk-core.api +++ b/kotlin-sdk-core/api/kotlin-sdk-core.api @@ -1143,8 +1143,12 @@ public final class io/modelcontextprotocol/kotlin/sdk/JSONRPCNotification$Compan public final class io/modelcontextprotocol/kotlin/sdk/JSONRPCRequest : io/modelcontextprotocol/kotlin/sdk/JSONRPCMessage { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/JSONRPCRequest$Companion; + public fun (JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Lio/modelcontextprotocol/kotlin/sdk/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;)V public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/RequestId; public final fun component2 ()Ljava/lang/String; public final fun component3 ()Lkotlinx/serialization/json/JsonElement; @@ -3364,3 +3368,24 @@ public final class io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTranspo public static final field MCP_SUBPROTOCOL Ljava/lang/String; } +public class io/modelcontextprotocol/kotlin/sdk/testing/MockTransport : io/modelcontextprotocol/kotlin/sdk/shared/Transport { + public fun ()V + public fun (Lkotlin/jvm/functions/Function1;)V + public synthetic fun (Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun awaitMessage-ePrTys8 (JJLjava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun awaitMessage-ePrTys8$default (Lio/modelcontextprotocol/kotlin/sdk/testing/MockTransport;JJLjava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public fun close (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun getReceivedMessages (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun getSentMessages (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun onClose (Lkotlin/jvm/functions/Function0;)V + public fun onError (Lkotlin/jvm/functions/Function1;)V + public fun onMessage (Lkotlin/jvm/functions/Function2;)V + public final fun onMessageReply (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V + public final fun onMessageReplyError (Lio/modelcontextprotocol/kotlin/sdk/Method;Lkotlin/jvm/functions/Function1;)V + public static synthetic fun onMessageReplyError$default (Lio/modelcontextprotocol/kotlin/sdk/testing/MockTransport;Lio/modelcontextprotocol/kotlin/sdk/Method;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V + public final fun onMessageReplyResult (Lio/modelcontextprotocol/kotlin/sdk/Method;Lkotlin/jvm/functions/Function1;)V + public fun send (Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun setupInitializationResponse ()V + public fun start (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt index 927967af..80afc56f 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt @@ -19,6 +19,8 @@ import kotlin.concurrent.atomics.incrementAndFetch import kotlin.jvm.JvmInline import kotlin.time.ExperimentalTime import kotlin.time.Instant +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid public const val LATEST_PROTOCOL_VERSION: String = "2025-03-26" @@ -232,7 +234,36 @@ public data class JSONRPCRequest( val method: String, val params: JsonElement = EmptyJsonObject, val jsonrpc: String = JSONRPC_VERSION, -) : JSONRPCMessage +) : JSONRPCMessage { + + /** + * Creates a JSON-RPC request with a randomly generated string ID (using UUID) and the given method and parameters. + * + * @param id The string ID for the request. If not provided, a random UUID string is generated. + * @param method The method name for the request. + * @param params The parameters for the request as a JSON element. If not provided, an empty JSON object is used. + */ + @OptIn(ExperimentalUuidApi::class) + public constructor( + id: String = Uuid.random().toHexString(), + method: String, + params: JsonElement = EmptyJsonObject, + ) : this(id = RequestId.StringId(id), method = method, params = params) + + /** + * Creates a JSON-RPC request with a numeric ID (long) generated by a counter (to ensure uniqueness) + * and the given method and parameters. + * + * The `id` parameter is optional and defaults to a new unique long value generated + * by `REQUEST_MESSAGE_ID.incrementAndFetch()`. + * The `params` parameter is optional and defaults to an empty JSON object. + */ + public constructor( + id: Long = REQUEST_MESSAGE_ID.incrementAndFetch(), + method: String, + params: JsonElement = EmptyJsonObject, + ) : this(id = RequestId.NumberId(id), method = method, params = params) +} /** * A notification which does not expect a response. @@ -302,6 +333,7 @@ public data class JSONRPCError(val code: ErrorCode, val message: String, val dat public sealed interface NotificationParams : WithMeta /* Cancellation */ + /** * This notification can be sent by either side to indicate that it is cancelling a previously issued request. * @@ -334,6 +366,7 @@ public data class CancelledNotification(override val params: Params) : } /* Initialization */ + /** * Describes the name and version of an MCP implementation. */ @@ -531,6 +564,7 @@ public data class InitializedNotification(override val params: Params = Params() } /* Ping */ + /** * A ping, issued by either the server or the client, to check that the other party is still alive. * The receiver must promptly respond, or else it may be disconnected. @@ -564,6 +598,7 @@ public sealed interface ProgressBase { } /* Progress notifications */ + /** * Represents a progress notification. * @@ -623,6 +658,7 @@ public data class ProgressNotification(override val params: Params) : } /* Pagination */ + /** * Represents a request supporting pagination. */ @@ -650,6 +686,7 @@ public sealed interface PaginatedResult : RequestResult { } /* Resources */ + /** * The contents of a specific resource or sub-resource. */ @@ -892,6 +929,7 @@ public data class ResourceUpdatedNotification(override val params: Params) : Ser } /* Prompts */ + /** * Describes an argument that a prompt can accept. */ @@ -1162,6 +1200,7 @@ public data class PromptListChangedNotification(override val params: Params = Pa } /* Tools */ + /** * Additional properties describing a Tool to clients. * @@ -1340,6 +1379,7 @@ public data class ToolListChangedNotification(override val params: Params = Para } /* Logging */ + /** * The severity of a log message. */ @@ -1399,6 +1439,7 @@ public data class LoggingMessageNotification(override val params: Params) : Serv } /* Sampling */ + /** * Hints to use for model selection. */ @@ -1643,6 +1684,7 @@ public data class CompleteResult(val completion: Completion, override val _meta: } /* Roots */ + /** * Represents a root directory or file that the server can operate on. */ From e015f355fd71cd4603c146ec1ec7c07e065e36f8 Mon Sep 17 00:00:00 2001 From: Konstantin Pavlov <1517853+kpavlov@users.noreply.github.com> Date: Mon, 3 Nov 2025 22:19:59 +0200 Subject: [PATCH 3/5] Update API dump --- kotlin-sdk-core/api/kotlin-sdk-core.api | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/kotlin-sdk-core/api/kotlin-sdk-core.api b/kotlin-sdk-core/api/kotlin-sdk-core.api index f4b9a5ea..bb6f7d21 100644 --- a/kotlin-sdk-core/api/kotlin-sdk-core.api +++ b/kotlin-sdk-core/api/kotlin-sdk-core.api @@ -3368,24 +3368,3 @@ public final class io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTranspo public static final field MCP_SUBPROTOCOL Ljava/lang/String; } -public class io/modelcontextprotocol/kotlin/sdk/testing/MockTransport : io/modelcontextprotocol/kotlin/sdk/shared/Transport { - public fun ()V - public fun (Lkotlin/jvm/functions/Function1;)V - public synthetic fun (Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun awaitMessage-ePrTys8 (JJLjava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun awaitMessage-ePrTys8$default (Lio/modelcontextprotocol/kotlin/sdk/testing/MockTransport;JJLjava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public fun close (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun getReceivedMessages (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun getSentMessages (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun onClose (Lkotlin/jvm/functions/Function0;)V - public fun onError (Lkotlin/jvm/functions/Function1;)V - public fun onMessage (Lkotlin/jvm/functions/Function2;)V - public final fun onMessageReply (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V - public final fun onMessageReplyError (Lio/modelcontextprotocol/kotlin/sdk/Method;Lkotlin/jvm/functions/Function1;)V - public static synthetic fun onMessageReplyError$default (Lio/modelcontextprotocol/kotlin/sdk/testing/MockTransport;Lio/modelcontextprotocol/kotlin/sdk/Method;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V - public final fun onMessageReplyResult (Lio/modelcontextprotocol/kotlin/sdk/Method;Lkotlin/jvm/functions/Function1;)V - public fun send (Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun setupInitializationResponse ()V - public fun start (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - From 9ce219a79a5156c5c27095b315db35e4e37abbd0 Mon Sep 17 00:00:00 2001 From: Konstantin Pavlov <1517853+kpavlov@users.noreply.github.com> Date: Mon, 3 Nov 2025 22:30:44 +0200 Subject: [PATCH 4/5] Update API --- kotlin-sdk-core/api/kotlin-sdk-core.api | 1 + .../modelcontextprotocol/kotlin/sdk/types.kt | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/kotlin-sdk-core/api/kotlin-sdk-core.api b/kotlin-sdk-core/api/kotlin-sdk-core.api index bb6f7d21..300ccdf6 100644 --- a/kotlin-sdk-core/api/kotlin-sdk-core.api +++ b/kotlin-sdk-core/api/kotlin-sdk-core.api @@ -1147,6 +1147,7 @@ public final class io/modelcontextprotocol/kotlin/sdk/JSONRPCRequest : io/modelc public synthetic fun (JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Lio/modelcontextprotocol/kotlin/sdk/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;)V public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;)V public fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/RequestId; diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt index 80afc56f..e044d43d 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt @@ -250,6 +250,21 @@ public data class JSONRPCRequest( params: JsonElement = EmptyJsonObject, ) : this(id = RequestId.StringId(id), method = method, params = params) + /** + * Creates a JSON-RPC request with a numeric ID generated by a counter (to ensure uniqueness) + * and the given method name. + * + * This constructor initializes the `id` field with a `NumberId` instance using the counter + * value from `REQUEST_MESSAGE_ID.incrementAndFetch()`, and assigns the provided method name + * to the `method` field of the request. + * + * @param method The method name for the request. + */ + @OptIn(ExperimentalUuidApi::class) + public constructor( + method: String, + ) : this(id = RequestId.NumberId(REQUEST_MESSAGE_ID.incrementAndFetch()), method = method) + /** * Creates a JSON-RPC request with a numeric ID (long) generated by a counter (to ensure uniqueness) * and the given method and parameters. @@ -337,7 +352,8 @@ public sealed interface NotificationParams : WithMeta /** * This notification can be sent by either side to indicate that it is cancelling a previously issued request. * - * The request SHOULD still be in-flight, but due to communication latency, it is always possible that this notification MAY arrive after the request has already finished. + * The request SHOULD still be in-flight, but due to communication latency, + * it is always possible that this notification MAY arrive after the request has already finished. * * This notification indicates that the result will be unused, so any associated processing SHOULD cease. * From 878d59507a4e5c0e79c3dd5e74d4b4df6d2d86ea Mon Sep 17 00:00:00 2001 From: Konstantin Pavlov <1517853+kpavlov@users.noreply.github.com> Date: Mon, 3 Nov 2025 23:04:28 +0200 Subject: [PATCH 5/5] Update API --- kotlin-sdk-core/api/kotlin-sdk-core.api | 2 ++ .../io/modelcontextprotocol/kotlin/sdk/types.kt | 14 +++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/kotlin-sdk-core/api/kotlin-sdk-core.api b/kotlin-sdk-core/api/kotlin-sdk-core.api index 300ccdf6..489ad83c 100644 --- a/kotlin-sdk-core/api/kotlin-sdk-core.api +++ b/kotlin-sdk-core/api/kotlin-sdk-core.api @@ -1150,6 +1150,8 @@ public final class io/modelcontextprotocol/kotlin/sdk/JSONRPCRequest : io/modelc public fun (Ljava/lang/String;)V public fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/RequestId; public final fun component2 ()Ljava/lang/String; public final fun component3 ()Lkotlinx/serialization/json/JsonElement; diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt index e044d43d..4273b7de 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt @@ -17,6 +17,7 @@ import kotlin.concurrent.atomics.AtomicLong import kotlin.concurrent.atomics.ExperimentalAtomicApi import kotlin.concurrent.atomics.incrementAndFetch import kotlin.jvm.JvmInline +import kotlin.jvm.JvmOverloads import kotlin.time.ExperimentalTime import kotlin.time.Instant import kotlin.uuid.ExperimentalUuidApi @@ -251,19 +252,18 @@ public data class JSONRPCRequest( ) : this(id = RequestId.StringId(id), method = method, params = params) /** - * Creates a JSON-RPC request with a numeric ID generated by a counter (to ensure uniqueness) - * and the given method name. - * - * This constructor initializes the `id` field with a `NumberId` instance using the counter - * value from `REQUEST_MESSAGE_ID.incrementAndFetch()`, and assigns the provided method name - * to the `method` field of the request. + * Creates a JSON-RPC request with a randomly generated string ID (using UUID), + * the given method name and parameters. * * @param method The method name for the request. + * @param params The parameters for the request as a JSON element. If not provided, an empty JSON object is used. */ @OptIn(ExperimentalUuidApi::class) + @JvmOverloads public constructor( method: String, - ) : this(id = RequestId.NumberId(REQUEST_MESSAGE_ID.incrementAndFetch()), method = method) + params: JsonElement = EmptyJsonObject, + ) : this(id = RequestId.StringId(Uuid.random().toHexString()), method = method, params = params) /** * Creates a JSON-RPC request with a numeric ID (long) generated by a counter (to ensure uniqueness)