Skip to content

Commit 772195b

Browse files
authored
Drop generics from Protocol class (#30)
The generic types in the Protocol class were not providing significant value and made the code more complex. This change simplifies the API by removing these generic parameters while maintaining the same functionality.
1 parent 9931b1e commit 772195b

File tree

3 files changed

+18
-72
lines changed

3 files changed

+18
-72
lines changed

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

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,7 @@
11
package io.modelcontextprotocol.kotlin.sdk.client
22

3-
import io.modelcontextprotocol.kotlin.sdk.CallToolRequest
4-
import io.modelcontextprotocol.kotlin.sdk.CallToolResult
5-
import io.modelcontextprotocol.kotlin.sdk.CallToolResultBase
6-
import io.modelcontextprotocol.kotlin.sdk.ClientCapabilities
7-
import io.modelcontextprotocol.kotlin.sdk.ClientNotification
8-
import io.modelcontextprotocol.kotlin.sdk.ClientRequest
9-
import io.modelcontextprotocol.kotlin.sdk.ClientResult
10-
import io.modelcontextprotocol.kotlin.sdk.CompatibilityCallToolResult
11-
import io.modelcontextprotocol.kotlin.sdk.CompleteRequest
12-
import io.modelcontextprotocol.kotlin.sdk.CompleteResult
13-
import io.modelcontextprotocol.kotlin.sdk.EmptyRequestResult
14-
import io.modelcontextprotocol.kotlin.sdk.GetPromptRequest
15-
import io.modelcontextprotocol.kotlin.sdk.GetPromptResult
16-
import io.modelcontextprotocol.kotlin.sdk.Implementation
17-
import io.modelcontextprotocol.kotlin.sdk.InitializeRequest
18-
import io.modelcontextprotocol.kotlin.sdk.InitializeResult
19-
import io.modelcontextprotocol.kotlin.sdk.InitializedNotification
20-
import io.modelcontextprotocol.kotlin.sdk.LATEST_PROTOCOL_VERSION
21-
import io.modelcontextprotocol.kotlin.sdk.ListPromptsRequest
22-
import io.modelcontextprotocol.kotlin.sdk.ListPromptsResult
23-
import io.modelcontextprotocol.kotlin.sdk.ListResourceTemplatesRequest
24-
import io.modelcontextprotocol.kotlin.sdk.ListResourceTemplatesResult
25-
import io.modelcontextprotocol.kotlin.sdk.ListResourcesRequest
26-
import io.modelcontextprotocol.kotlin.sdk.ListResourcesResult
27-
import io.modelcontextprotocol.kotlin.sdk.ListToolsRequest
28-
import io.modelcontextprotocol.kotlin.sdk.ListToolsResult
29-
import io.modelcontextprotocol.kotlin.sdk.LoggingLevel
3+
import io.modelcontextprotocol.kotlin.sdk.*
304
import io.modelcontextprotocol.kotlin.sdk.LoggingMessageNotification.SetLevelRequest
31-
import io.modelcontextprotocol.kotlin.sdk.Method
32-
import io.modelcontextprotocol.kotlin.sdk.PingRequest
33-
import io.modelcontextprotocol.kotlin.sdk.ReadResourceRequest
34-
import io.modelcontextprotocol.kotlin.sdk.ReadResourceResult
35-
import io.modelcontextprotocol.kotlin.sdk.RootsListChangedNotification
36-
import io.modelcontextprotocol.kotlin.sdk.SUPPORTED_PROTOCOL_VERSIONS
37-
import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities
38-
import io.modelcontextprotocol.kotlin.sdk.SubscribeRequest
39-
import io.modelcontextprotocol.kotlin.sdk.UnsubscribeRequest
405
import io.modelcontextprotocol.kotlin.sdk.shared.Protocol
416
import io.modelcontextprotocol.kotlin.sdk.shared.ProtocolOptions
427
import io.modelcontextprotocol.kotlin.sdk.shared.RequestOptions
@@ -45,6 +10,7 @@ import kotlinx.serialization.json.JsonElement
4510
import kotlinx.serialization.json.JsonNull
4611
import kotlinx.serialization.json.JsonObject
4712
import kotlinx.serialization.json.JsonPrimitive
13+
4814
/**
4915
* Options for configuring the MCP client.
5016
*
@@ -70,7 +36,7 @@ public class ClientOptions(
7036
public open class Client(
7137
private val clientInfo: Implementation,
7238
options: ClientOptions = ClientOptions(),
73-
) : Protocol<ClientRequest, ClientNotification, ClientResult>(options) {
39+
) : Protocol(options) {
7440

7541
private var serverCapabilities: ServerCapabilities? = null
7642
private var serverVersion: Implementation? = null

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package io.modelcontextprotocol.kotlin.sdk.server
22

33
import io.github.oshai.kotlinlogging.KotlinLogging
4-
import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities
5-
import kotlinx.coroutines.CompletableDeferred
6-
import kotlinx.serialization.json.JsonObject
74
import io.modelcontextprotocol.kotlin.sdk.*
85
import io.modelcontextprotocol.kotlin.sdk.shared.Protocol
96
import io.modelcontextprotocol.kotlin.sdk.shared.ProtocolOptions
107
import io.modelcontextprotocol.kotlin.sdk.shared.RequestOptions
8+
import kotlinx.coroutines.CompletableDeferred
9+
import kotlinx.serialization.json.JsonObject
1110

1211
private val logger = KotlinLogging.logger {}
1312

@@ -37,7 +36,7 @@ public open class Server(
3736
private val serverInfo: Implementation,
3837
options: ServerOptions,
3938
public var onCloseCallback: (() -> Unit)? = null
40-
) : Protocol<ServerRequest, ServerNotification, ServerResult>(options) {
39+
) : Protocol(options) {
4140

4241
/**
4342
* The client's reported capabilities after initialization.

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

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,7 @@
11
package io.modelcontextprotocol.kotlin.sdk.shared
22

33
import io.github.oshai.kotlinlogging.KotlinLogging
4-
import io.modelcontextprotocol.kotlin.sdk.CancelledNotification
5-
import io.modelcontextprotocol.kotlin.sdk.EmptyRequestResult
6-
import io.modelcontextprotocol.kotlin.sdk.ErrorCode
7-
import io.modelcontextprotocol.kotlin.sdk.JSONRPCError
8-
import io.modelcontextprotocol.kotlin.sdk.JSONRPCNotification
9-
import io.modelcontextprotocol.kotlin.sdk.JSONRPCRequest
10-
import io.modelcontextprotocol.kotlin.sdk.JSONRPCResponse
11-
import io.modelcontextprotocol.kotlin.sdk.McpError
12-
import io.modelcontextprotocol.kotlin.sdk.Method
13-
import io.modelcontextprotocol.kotlin.sdk.Notification
14-
import io.modelcontextprotocol.kotlin.sdk.PingRequest
15-
import io.modelcontextprotocol.kotlin.sdk.Progress
16-
import io.modelcontextprotocol.kotlin.sdk.ProgressNotification
17-
import io.modelcontextprotocol.kotlin.sdk.Request
18-
import io.modelcontextprotocol.kotlin.sdk.RequestId
19-
import io.modelcontextprotocol.kotlin.sdk.RequestResult
20-
import io.modelcontextprotocol.kotlin.sdk.fromJSON
21-
import io.modelcontextprotocol.kotlin.sdk.toJSON
4+
import io.modelcontextprotocol.kotlin.sdk.*
225
import kotlinx.coroutines.CompletableDeferred
236
import kotlinx.coroutines.Deferred
247
import kotlinx.coroutines.TimeoutCancellationException
@@ -107,14 +90,14 @@ internal val COMPLETED = CompletableDeferred(Unit).also { it.complete(Unit) }
10790
* Implements MCP protocol framing on top of a pluggable transport, including
10891
* features like request/response linking, notifications, and progress.
10992
*/
110-
public abstract class Protocol<SendRequestT : Request, SendNotificationT : Notification, SendResultT : RequestResult>(
93+
public abstract class Protocol(
11194
@PublishedApi internal val options: ProtocolOptions?,
11295
) {
11396
public var transport: Transport? = null
11497
private set
11598

11699
@PublishedApi
117-
internal val requestHandlers: MutableMap<String, suspend (request: JSONRPCRequest, extra: RequestHandlerExtra) -> SendResultT?> =
100+
internal val requestHandlers: MutableMap<String, suspend (request: JSONRPCRequest, extra: RequestHandlerExtra) -> RequestResult?> =
118101
mutableMapOf()
119102
public val notificationHandlers: MutableMap<String, suspend (notification: JSONRPCNotification) -> Unit> =
120103
mutableMapOf()
@@ -143,7 +126,7 @@ public abstract class Protocol<SendRequestT : Request, SendNotificationT : Notif
143126
/**
144127
* A handler to invoke for any request types that do not have their own handler installed.
145128
*/
146-
public var fallbackRequestHandler: (suspend (request: JSONRPCRequest, extra: RequestHandlerExtra) -> SendResultT?)? =
129+
public var fallbackRequestHandler: (suspend (request: JSONRPCRequest, extra: RequestHandlerExtra) -> RequestResult?)? =
147130
null
148131

149132
/**
@@ -158,8 +141,7 @@ public abstract class Protocol<SendRequestT : Request, SendNotificationT : Notif
158141
}
159142

160143
setRequestHandler<PingRequest>(Method.Defined.Ping) { request, _ ->
161-
@Suppress("UNCHECKED_CAST")
162-
EmptyRequestResult() as SendResultT
144+
EmptyRequestResult()
163145
}
164146
}
165147

@@ -344,12 +326,12 @@ public abstract class Protocol<SendRequestT : Request, SendNotificationT : Notif
344326
public abstract fun assertRequestHandlerCapability(method: Method)
345327

346328
/**
347-
* Sends a request and wait for a response.
329+
* Sends a request and waits for a response.
348330
*
349331
* Do not use this method to emit notifications! Use notification() instead.
350332
*/
351333
public suspend fun <T : RequestResult> request(
352-
request: SendRequestT,
334+
request: Request,
353335
options: RequestOptions? = null,
354336
): T {
355337
LOGGER.trace { "Sending request: ${request.method}" }
@@ -427,7 +409,7 @@ public abstract class Protocol<SendRequestT : Request, SendNotificationT : Notif
427409
/**
428410
* Emits a notification, which is a one-way message that does not expect a response.
429411
*/
430-
public suspend fun notification(notification: SendNotificationT) {
412+
public suspend fun notification(notification: Notification) {
431413
LOGGER.trace { "Sending notification: ${notification.method}" }
432414
val transport = this.transport ?: error("Not connected")
433415
assertNotificationCapability(notification.method)
@@ -446,7 +428,7 @@ public abstract class Protocol<SendRequestT : Request, SendNotificationT : Notif
446428
*/
447429
public inline fun <reified T : Request> setRequestHandler(
448430
method: Method,
449-
noinline block: suspend (T, RequestHandlerExtra) -> SendResultT?,
431+
noinline block: suspend (T, RequestHandlerExtra) -> RequestResult?,
450432
) {
451433
setRequestHandler(typeOf<T>(), method, block)
452434
}
@@ -455,7 +437,7 @@ public abstract class Protocol<SendRequestT : Request, SendNotificationT : Notif
455437
internal fun <T : Request> setRequestHandler(
456438
requestType: KType,
457439
method: Method,
458-
block: suspend (T, RequestHandlerExtra) -> SendResultT?,
440+
block: suspend (T, RequestHandlerExtra) -> RequestResult?,
459441
) {
460442
assertRequestHandlerCapability(method)
461443

@@ -470,8 +452,7 @@ public abstract class Protocol<SendRequestT : Request, SendNotificationT : Notif
470452
EmptyRequestResult()
471453
}
472454

473-
@Suppress("UNCHECKED_CAST")
474-
response as SendResultT
455+
response
475456
}
476457
}
477458

@@ -500,4 +481,4 @@ public abstract class Protocol<SendRequestT : Request, SendNotificationT : Notif
500481
public fun removeNotificationHandler(method: Method) {
501482
this.notificationHandlers.remove(method.value)
502483
}
503-
}
484+
}

0 commit comments

Comments
 (0)