@@ -24,6 +24,7 @@ import io.modelcontextprotocol.kotlin.sdk.Role
2424import io.modelcontextprotocol.kotlin.sdk.SUPPORTED_PROTOCOL_VERSIONS
2525import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities
2626import io.modelcontextprotocol.kotlin.sdk.TextContent
27+ import io.modelcontextprotocol.kotlin.sdk.Tool
2728import kotlinx.coroutines.CompletableDeferred
2829import kotlinx.coroutines.TimeoutCancellationException
2930import kotlinx.coroutines.cancel
@@ -38,6 +39,7 @@ import org.junit.jupiter.api.Test
3839import io.modelcontextprotocol.kotlin.sdk.server.Server
3940import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions
4041import io.modelcontextprotocol.kotlin.sdk.shared.AbstractTransport
42+ import org.junit.jupiter.api.assertInstanceOf
4143import kotlin.coroutines.cancellation.CancellationException
4244import kotlin.test.assertEquals
4345import 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