Skip to content

Commit 78ef0f9

Browse files
authored
Process JSONRPCRequest with default param (#42) (#46)
1 parent 0d6fa86 commit 78ef0f9

File tree

3 files changed

+78
-2
lines changed

3 files changed

+78
-2
lines changed

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ public abstract class Protocol(
440440
val serializer = McpJson.serializersModule.serializer(requestType)
441441

442442
requestHandlers[method.value] = { request, extraHandler ->
443-
val result = request.params?.let { McpJson.decodeFromJsonElement(serializer, it) }
443+
val result = McpJson.decodeFromJsonElement(serializer, request.params)
444444
val response = if (result != null) {
445445
@Suppress("UNCHECKED_CAST")
446446
block(result as T, extraHandler)

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ public sealed interface JSONRPCMessage
215215
public data class JSONRPCRequest(
216216
val id: RequestId = RequestId.NumberId(REQUEST_MESSAGE_ID.incrementAndGet()),
217217
val method: String,
218-
val params: JsonElement? = null,
218+
val params: JsonElement = EmptyJsonObject,
219219
val jsonrpc: String = JSONRPC_VERSION,
220220
) : JSONRPCMessage
221221

src/jvmTest/kotlin/client/ClientTest.kt

+76
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import io.modelcontextprotocol.kotlin.sdk.Role
2424
import io.modelcontextprotocol.kotlin.sdk.SUPPORTED_PROTOCOL_VERSIONS
2525
import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities
2626
import io.modelcontextprotocol.kotlin.sdk.TextContent
27+
import io.modelcontextprotocol.kotlin.sdk.Tool
2728
import kotlinx.coroutines.CompletableDeferred
2829
import kotlinx.coroutines.TimeoutCancellationException
2930
import kotlinx.coroutines.cancel
@@ -38,6 +39,7 @@ import org.junit.jupiter.api.Test
3839
import io.modelcontextprotocol.kotlin.sdk.server.Server
3940
import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions
4041
import io.modelcontextprotocol.kotlin.sdk.shared.AbstractTransport
42+
import org.junit.jupiter.api.assertInstanceOf
4143
import kotlin.coroutines.cancellation.CancellationException
4244
import kotlin.test.assertEquals
4345
import kotlin.test.assertFailsWith
@@ -494,5 +496,79 @@ class ClientTest {
494496
}
495497
}
496498

499+
@Test
500+
fun `JSONRPCRequest with ToolsList method and default params returns list of tools`() = runTest {
501+
val serverOptions = ServerOptions(
502+
capabilities = ServerCapabilities(
503+
tools = ServerCapabilities.Tools(null)
504+
)
505+
)
506+
val server = Server(
507+
Implementation(name = "test server", version = "1.0"),
508+
serverOptions
509+
)
510+
511+
server.setRequestHandler<InitializeRequest>(Method.Defined.Initialize) { request, _ ->
512+
InitializeResult(
513+
protocolVersion = LATEST_PROTOCOL_VERSION,
514+
capabilities = ServerCapabilities(
515+
resources = ServerCapabilities.Resources(null, null),
516+
tools = ServerCapabilities.Tools(null)
517+
),
518+
serverInfo = Implementation(name = "test", version = "1.0")
519+
)
520+
}
521+
val serverListToolsResult = ListToolsResult(
522+
tools = listOf(
523+
Tool(
524+
name = "testTool",
525+
description = "testTool description",
526+
inputSchema = Tool.Input()
527+
)
528+
), nextCursor = null
529+
)
530+
531+
server.setRequestHandler<ListToolsRequest>(Method.Defined.ToolsList) { request, _ ->
532+
serverListToolsResult
533+
}
534+
535+
val (clientTransport, serverTransport) = InMemoryTransport.createLinkedPair()
536+
537+
val client = Client(
538+
clientInfo = Implementation(name = "test client", version = "1.0"),
539+
options = ClientOptions(
540+
capabilities = ClientCapabilities(sampling = EmptyJsonObject),
541+
)
542+
)
543+
544+
var receivedMessage: JSONRPCMessage? = null
545+
clientTransport.onMessage { msg ->
546+
receivedMessage = msg
547+
}
548+
549+
listOf(
550+
launch {
551+
client.connect(clientTransport)
552+
},
553+
launch {
554+
server.connect(serverTransport)
555+
}
556+
).joinAll()
557+
558+
val serverCapabilities = client.serverCapabilities
559+
assertEquals(ServerCapabilities.Tools(null), serverCapabilities?.tools)
560+
561+
val request = JSONRPCRequest(
562+
method = Method.Defined.ToolsList.value
563+
)
564+
clientTransport.send(request)
565+
566+
assertInstanceOf<JSONRPCResponse>(receivedMessage)
567+
val receivedAsResponse = receivedMessage as JSONRPCResponse
568+
assertEquals(request.id, receivedAsResponse.id)
569+
assertEquals(request.jsonrpc, receivedAsResponse.jsonrpc)
570+
assertEquals(serverListToolsResult, receivedAsResponse.result)
571+
assertEquals(null, receivedAsResponse.error)
572+
}
497573

498574
}

0 commit comments

Comments
 (0)