Skip to content

Commit a67f55d

Browse files
committed
Improved types, added comment and added test (#158)
1 parent 0b6311e commit a67f55d

File tree

3 files changed

+73
-8
lines changed

3 files changed

+73
-8
lines changed

kotlin-sdk-core/api/kotlin-sdk-core.api

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,10 @@ public final class io/modelcontextprotocol/kotlin/sdk/ContentBlock$Companion {
458458
public final fun serializer ()Lkotlinx/serialization/KSerializer;
459459
}
460460

461+
public abstract interface class io/modelcontextprotocol/kotlin/sdk/ContentWithType {
462+
public abstract fun getType ()Ljava/lang/String;
463+
}
464+
461465
public final class io/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest : io/modelcontextprotocol/kotlin/sdk/ServerRequest, io/modelcontextprotocol/kotlin/sdk/WithMeta {
462466
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$Companion;
463467
public fun <init> (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;Lkotlinx/serialization/json/JsonObject;)V
@@ -664,7 +668,7 @@ public final class io/modelcontextprotocol/kotlin/sdk/CreateMessageResult$Compan
664668
public final fun serializer ()Lkotlinx/serialization/KSerializer;
665669
}
666670

667-
public abstract interface class io/modelcontextprotocol/kotlin/sdk/CreateMessageResultContent : io/modelcontextprotocol/kotlin/sdk/ContentBlock {
671+
public abstract interface class io/modelcontextprotocol/kotlin/sdk/CreateMessageResultContent : io/modelcontextprotocol/kotlin/sdk/ContentWithType {
668672
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/CreateMessageResultContent$Companion;
669673
}
670674

@@ -2039,8 +2043,7 @@ public final class io/modelcontextprotocol/kotlin/sdk/PromptMessage$Companion {
20392043
public final fun serializer ()Lkotlinx/serialization/KSerializer;
20402044
}
20412045

2042-
public abstract interface class io/modelcontextprotocol/kotlin/sdk/PromptMessageContent {
2043-
public abstract fun getType ()Ljava/lang/String;
2046+
public abstract interface class io/modelcontextprotocol/kotlin/sdk/PromptMessageContent : io/modelcontextprotocol/kotlin/sdk/ContentWithType {
20442047
}
20452048

20462049
public abstract interface class io/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal : io/modelcontextprotocol/kotlin/sdk/PromptMessageContent {
@@ -2635,7 +2638,7 @@ public final class io/modelcontextprotocol/kotlin/sdk/SamplingMessage$Companion
26352638
public final fun serializer ()Lkotlinx/serialization/KSerializer;
26362639
}
26372640

2638-
public abstract interface class io/modelcontextprotocol/kotlin/sdk/SamplingMessageContent : io/modelcontextprotocol/kotlin/sdk/ContentBlock {
2641+
public abstract interface class io/modelcontextprotocol/kotlin/sdk/SamplingMessageContent : io/modelcontextprotocol/kotlin/sdk/ContentWithType {
26392642
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/SamplingMessageContent$Companion;
26402643
}
26412644

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -974,11 +974,22 @@ public data class GetPromptRequest(
974974
override val method: Method = Method.Defined.PromptsGet
975975
}
976976

977-
@Deprecated("For backwards compatibility; use ContentBlock instead", ReplaceWith("ContentBlock"))
978-
public sealed interface PromptMessageContent {
977+
/**
978+
* The server's response content indicating the type of content.
979+
*/
980+
public sealed interface ContentWithType {
979981
public val type: String
980982
}
981983

984+
/**
985+
* Represents the content of a prompt message. Deprecated.
986+
*/
987+
@Deprecated("For backwards compatibility; use ContentBlock instead", ReplaceWith("ContentBlock"))
988+
public sealed interface PromptMessageContent : ContentWithType
989+
990+
/**
991+
* Represents multimodal content of a prompt message. Deprecated.
992+
*/
982993
@Deprecated(
983994
"For backwards compatibility; use CreateMessageResultContent or SamplingMessageContent instead",
984995
ReplaceWith("CreateMessageResultContent"),
@@ -995,13 +1006,13 @@ public sealed interface ContentBlock : PromptMessageContent
9951006
* Represents content for the CreateMessageResult
9961007
*/
9971008
@Serializable(with = CreateMessageResultContentMultimodalPolymorphicSerializer::class)
998-
public sealed interface CreateMessageResultContent : ContentBlock
1009+
public sealed interface CreateMessageResultContent : ContentWithType
9991010

10001011
/**
10011012
* Represents content for the SamplingMessage
10021013
*/
10031014
@Serializable(with = SamplingMessageContentMultimodalPolymorphicSerializer::class)
1004-
public sealed interface SamplingMessageContent : ContentBlock
1015+
public sealed interface SamplingMessageContent : ContentWithType
10051016

10061017
/**
10071018
* Text provided to or from an LLM.

kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/RequestSerializerTest.kt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,57 @@ class RequestSerializerTest {
281281
assertEquals(buildJsonObject { put("result", "Legacy tool result") }, decoded.toolResult)
282282
}
283283

284+
// Only supported content types
285+
@Test
286+
fun `should not deserialize ResourceLink in CreateMessageResult`() {
287+
val json = """{
288+
"model": "test-model",
289+
"role": "assistant",
290+
"content": {
291+
"type": "resource_link",
292+
"uri": "file:///project/src/main.rs",
293+
"name": "main.rs",
294+
"description": "Primary application entry point",
295+
"mimeType": "text/x-rust"
296+
},
297+
"stopReason": "endTurn"
298+
}"""
299+
300+
val decoded = McpJson.decodeFromString<RequestResult>(json)
301+
302+
assertIs<CreateMessageResult>(decoded)
303+
assertEquals("test-model", decoded.model)
304+
assertEquals(Role.assistant, decoded.role)
305+
assertEquals(StopReason.EndTurn, decoded.stopReason)
306+
assertIs<UnknownContent>(decoded.content)
307+
}
308+
309+
// Only supported content types
310+
@Test
311+
fun `should not deserialize EmbeddedResource in CreateMessageResult`() {
312+
val json = """{
313+
"model": "test-model",
314+
"role": "assistant",
315+
"content": {
316+
"type": "resource",
317+
"resource": {
318+
"uri": "file:///test.txt",
319+
"mimeType": "text/plain",
320+
"text": "content"
321+
}
322+
},
323+
"stopReason": "endTurn"
324+
}"""
325+
326+
val decoded = McpJson.decodeFromString<RequestResult>(json)
327+
328+
assertIs<CreateMessageResult>(decoded)
329+
assertEquals("test-model", decoded.model)
330+
assertEquals(Role.assistant, decoded.role)
331+
assertEquals(StopReason.EndTurn, decoded.stopReason)
332+
assertIs<UnknownContent>(decoded.content)
333+
}
334+
284335
// Fallback Test
285336
@Test
286337
fun `should deserialize EmptyRequestResult for unknown result type`() {

0 commit comments

Comments
 (0)