From 376948e1c1734ed277e733468acba65be94a7ca1 Mon Sep 17 00:00:00 2001 From: devcrocod Date: Fri, 18 Jul 2025 02:47:14 +0200 Subject: [PATCH] Refactor JSON processing to exclude "method" in serialization --- .../kotlin/sdk/shared/Protocol.kt | 5 +---- .../modelcontextprotocol/kotlin/sdk/types.kt | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt b/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt index 8ad733b1..06ce6baa 100644 --- a/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt +++ b/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt @@ -465,10 +465,7 @@ public abstract class Protocol( val transport = this.transport ?: error("Not connected") assertNotificationCapability(notification.method) - val message = JSONRPCNotification( - notification.method.value, - params = McpJson.encodeToJsonElement(notification) as JsonObject, - ) + val message = notification.toJSON() transport.send(message) } diff --git a/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt b/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt index c93519b4..130585bf 100644 --- a/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt +++ b/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt @@ -8,8 +8,10 @@ import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.decodeFromJsonElement import kotlinx.serialization.json.encodeToJsonElement +import kotlinx.serialization.json.jsonObject import kotlin.concurrent.atomics.AtomicLong import kotlin.concurrent.atomics.ExperimentalAtomicApi import kotlin.concurrent.atomics.incrementAndFetch @@ -123,9 +125,10 @@ public sealed interface Request { * @return The JSON-RPC request representation. */ internal fun Request.toJSON(): JSONRPCRequest { + val encoded = JsonObject(McpJson.encodeToJsonElement(this).jsonObject.minus("method")) return JSONRPCRequest( method = method.value, - params = McpJson.encodeToJsonElement(this), + params = encoded, jsonrpc = JSONRPC_VERSION, ) } @@ -135,10 +138,11 @@ internal fun Request.toJSON(): JSONRPCRequest { * * @return The decoded [Request] or null */ -internal fun JSONRPCRequest.fromJSON(): Request? { - val serializer = selectRequestDeserializer(method) - val params = params - return McpJson.decodeFromJsonElement(serializer, params) +internal fun JSONRPCRequest.fromJSON(): Request { + val requestData = JsonObject(params.jsonObject.plus("method" to JsonPrimitive(method))) + + val deserializer = selectRequestDeserializer(method) + return McpJson.decodeFromJsonElement(deserializer, requestData) } /** @@ -163,7 +167,7 @@ public sealed interface Notification { * @return The JSON-RPC notification representation. */ internal fun Notification.toJSON(): JSONRPCNotification { - val encoded = McpJson.encodeToJsonElement(this) + val encoded = JsonObject(McpJson.encodeToJsonElement(this).jsonObject.minus("method")) return JSONRPCNotification( method.value, params = encoded @@ -176,7 +180,8 @@ internal fun Notification.toJSON(): JSONRPCNotification { * @return The decoded [Notification]. */ internal fun JSONRPCNotification.fromJSON(): Notification { - return McpJson.decodeFromJsonElement(params) + val data = JsonObject(params.jsonObject.plus("method" to JsonPrimitive(method))) + return McpJson.decodeFromJsonElement(data) } /**