Skip to content

Commit d84b342

Browse files
committed
refactor remove and add public tools/roots/prompts for server
1 parent c5bf418 commit d84b342

File tree

4 files changed

+18
-30
lines changed

4 files changed

+18
-30
lines changed

api/kotlin-sdk.api

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2872,6 +2872,9 @@ public class io/modelcontextprotocol/kotlin/sdk/server/Server : io/modelcontextp
28722872
public static synthetic fun createMessage$default (Lio/modelcontextprotocol/kotlin/sdk/server/Server;Lio/modelcontextprotocol/kotlin/sdk/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
28732873
public final fun getClientCapabilities ()Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities;
28742874
public final fun getClientVersion ()Lio/modelcontextprotocol/kotlin/sdk/Implementation;
2875+
public final fun getPrompts ()Ljava/util/Map;
2876+
public final fun getResources ()Ljava/util/Map;
2877+
public final fun getTools ()Ljava/util/Map;
28752878
public final fun listRoots (Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
28762879
public static synthetic fun listRoots$default (Lio/modelcontextprotocol/kotlin/sdk/server/Server;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
28772880
public fun onClose ()V

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/Client.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import io.modelcontextprotocol.kotlin.sdk.ListResourceTemplatesRequest
2222
import io.modelcontextprotocol.kotlin.sdk.ListResourceTemplatesResult
2323
import io.modelcontextprotocol.kotlin.sdk.ListResourcesRequest
2424
import io.modelcontextprotocol.kotlin.sdk.ListResourcesResult
25+
import io.modelcontextprotocol.kotlin.sdk.ListRootsRequest
2526
import io.modelcontextprotocol.kotlin.sdk.ListRootsResult
2627
import io.modelcontextprotocol.kotlin.sdk.ListToolsRequest
2728
import io.modelcontextprotocol.kotlin.sdk.ListToolsResult
@@ -44,7 +45,9 @@ import io.modelcontextprotocol.kotlin.sdk.shared.Transport
4445
import kotlinx.atomicfu.atomic
4546
import kotlinx.atomicfu.getAndUpdate
4647
import kotlinx.atomicfu.update
48+
import kotlinx.collections.immutable.minus
4749
import kotlinx.collections.immutable.persistentMapOf
50+
import kotlinx.collections.immutable.toPersistentSet
4851
import kotlinx.serialization.json.JsonElement
4952
import kotlinx.serialization.json.JsonNull
5053
import kotlinx.serialization.json.JsonObject
@@ -105,7 +108,7 @@ public open class Client(
105108

106109
// Internal handlers for roots
107110
if (capabilities.roots != null) {
108-
setRequestHandler<ListToolsRequest>(Method.Defined.RootsList) { _, _ ->
111+
setRequestHandler<ListRootsRequest>(Method.Defined.RootsList) { _, _ ->
109112
handleListRoots()
110113
}
111114
}
@@ -544,12 +547,7 @@ public open class Client(
544547
}
545548
logger.info { "Removing ${uris.size} roots" }
546549

547-
val oldMap = roots.getAndUpdate { current ->
548-
uris.fold(current) { map, uri ->
549-
logger.debug { "Removing root: $uri" }
550-
map.remove(uri)
551-
}
552-
}
550+
val oldMap = roots.getAndUpdate { current -> current - uris.toPersistentSet() }
553551

554552
val removedCount = uris.count { it in oldMap }
555553

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ import io.modelcontextprotocol.kotlin.sdk.shared.RequestOptions
4747
import kotlinx.atomicfu.atomic
4848
import kotlinx.atomicfu.getAndUpdate
4949
import kotlinx.atomicfu.update
50+
import kotlinx.collections.immutable.minus
5051
import kotlinx.collections.immutable.persistentMapOf
52+
import kotlinx.collections.immutable.toPersistentSet
5153
import kotlinx.coroutines.CompletableDeferred
5254
import kotlinx.serialization.json.JsonObject
5355

@@ -98,11 +100,11 @@ public open class Server(
98100
private val _tools = atomic(persistentMapOf<String, RegisteredTool>())
99101
private val _prompts = atomic(persistentMapOf<String, RegisteredPrompt>())
100102
private val _resources = atomic(persistentMapOf<String, RegisteredResource>())
101-
private val tools: Map<String, RegisteredTool>
103+
public val tools: Map<String, RegisteredTool>
102104
get() = _tools.value
103-
private val prompts: Map<String, RegisteredPrompt>
105+
public val prompts: Map<String, RegisteredPrompt>
104106
get() = _prompts.value
105-
private val resources: Map<String, RegisteredResource>
107+
public val resources: Map<String, RegisteredResource>
106108
get() = _resources.value
107109

108110
init {
@@ -263,12 +265,7 @@ public open class Server(
263265
}
264266
logger.info { "Removing ${toolNames.size} tools" }
265267

266-
val oldMap = _tools.getAndUpdate { current ->
267-
toolNames.fold(current) { map, name ->
268-
logger.debug { "Removing tool: $name" }
269-
map.remove(name)
270-
}
271-
}
268+
val oldMap = _tools.getAndUpdate { current -> current - toolNames.toPersistentSet() }
272269

273270
val removedCount = toolNames.count { it in oldMap }
274271
logger.info {
@@ -372,12 +369,7 @@ public open class Server(
372369
}
373370
logger.info { "Removing ${promptNames.size} prompts" }
374371

375-
val oldMap = _prompts.getAndUpdate { current ->
376-
promptNames.fold(current) { map, name ->
377-
logger.debug { "Removing prompt: $name" }
378-
map.remove(name)
379-
}
380-
}
372+
val oldMap = _prompts.getAndUpdate { current -> current - promptNames.toPersistentSet() }
381373

382374
val removedCount = promptNames.count { it in oldMap }
383375

@@ -477,12 +469,7 @@ public open class Server(
477469
}
478470
logger.info { "Removing ${uris.size} resources" }
479471

480-
val oldMap = _resources.getAndUpdate { current ->
481-
uris.fold(current) { map, uri ->
482-
logger.debug { "Removing resource: $uri" }
483-
map.remove(uri)
484-
}
485-
}
472+
val oldMap = _resources.getAndUpdate { current -> current - uris.toPersistentSet() }
486473

487474
val removedCount = uris.count { it in oldMap }
488475

@@ -611,7 +598,7 @@ public open class Server(
611598

612599
private suspend fun handleCallTool(request: CallToolRequest): CallToolResult {
613600
logger.debug { "Handling tool call request for tool: ${request.name}" }
614-
val tool = tools[request.name]
601+
val tool = _tools.value[request.name]
615602
?: run {
616603
logger.error { "Tool not found: ${request.name}" }
617604
throw IllegalArgumentException("Tool not found: ${request.name}")

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ public abstract class Protocol(
239239
private suspend fun onRequest(request: JSONRPCRequest) {
240240
LOGGER.trace { "Received request: ${request.method} (id: ${request.id})" }
241241

242-
val handler = _requestHandlers.value[request.method] ?: fallbackRequestHandler
242+
val handler = requestHandlers[request.method] ?: fallbackRequestHandler
243243

244244
if (handler === null) {
245245
LOGGER.trace { "No handler found for request: ${request.method}" }

0 commit comments

Comments
 (0)