Skip to content

Commit 07a522c

Browse files
committed
adds Tool.Builder
1 parent 6fdcf0e commit 07a522c

File tree

5 files changed

+75
-21
lines changed
  • kotlin-sdk-client/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client
  • kotlin-sdk-core
  • kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server
  • kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client

5 files changed

+75
-21
lines changed

kotlin-sdk-client/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTest.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,8 @@ internal class StreamableHttpClientTest : AbstractStreamableHttpClientTest() {
113113
}
114114
},
115115
"required": ["temperature"]
116-
}
116+
},
117+
"_meta": {}
117118
}
118119
]
119120
}
@@ -124,10 +125,10 @@ internal class StreamableHttpClientTest : AbstractStreamableHttpClientTest() {
124125

125126
val listToolsResult = client.listTools()
126127

127-
listToolsResult.tools shouldContain Tool(
128-
name = "get_weather",
129-
title = "Weather Information Provider",
130-
description = "Get current weather information for a location",
128+
listToolsResult.tools shouldContain Tool.build {
129+
name = "get_weather"
130+
title = "Weather Information Provider"
131+
description = "Get current weather information for a location"
131132
inputSchema = Tool.Input(
132133
properties = buildJsonObject {
133134
putJsonObject("location") {
@@ -136,7 +137,7 @@ internal class StreamableHttpClientTest : AbstractStreamableHttpClientTest() {
136137
}
137138
},
138139
required = listOf("location"),
139-
),
140+
)
140141
outputSchema = Tool.Output(
141142
properties = buildJsonObject {
142143
putJsonObject("temperature") {
@@ -145,9 +146,8 @@ internal class StreamableHttpClientTest : AbstractStreamableHttpClientTest() {
145146
}
146147
},
147148
required = listOf("temperature"),
148-
),
149-
annotations = null,
150-
)
149+
)
150+
}
151151

152152
mockMcp.mockUnsubscribeRequest(sessionId = sessionId)
153153

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2892,7 +2892,6 @@ public final class io/modelcontextprotocol/kotlin/sdk/TextResourceContents$Compa
28922892
public final class io/modelcontextprotocol/kotlin/sdk/Tool : io/modelcontextprotocol/kotlin/sdk/WithMeta {
28932893
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/Tool$Companion;
28942894
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/Tool$Input;Lio/modelcontextprotocol/kotlin/sdk/Tool$Output;Lio/modelcontextprotocol/kotlin/sdk/ToolAnnotations;Lkotlinx/serialization/json/JsonObject;)V
2895-
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/Tool$Input;Lio/modelcontextprotocol/kotlin/sdk/Tool$Output;Lio/modelcontextprotocol/kotlin/sdk/ToolAnnotations;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
28962895
public final fun component1 ()Ljava/lang/String;
28972896
public final fun component2 ()Ljava/lang/String;
28982897
public final fun component3 ()Ljava/lang/String;
@@ -2925,7 +2924,27 @@ public final synthetic class io/modelcontextprotocol/kotlin/sdk/Tool$$serializer
29252924
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
29262925
}
29272926

2927+
public final class io/modelcontextprotocol/kotlin/sdk/Tool$Builder {
2928+
public fun <init> ()V
2929+
public final fun build ()Lio/modelcontextprotocol/kotlin/sdk/Tool;
2930+
public final fun getAnnotations ()Lio/modelcontextprotocol/kotlin/sdk/ToolAnnotations;
2931+
public final fun getDescription ()Ljava/lang/String;
2932+
public final fun getInputSchema ()Lio/modelcontextprotocol/kotlin/sdk/Tool$Input;
2933+
public final fun getName ()Ljava/lang/String;
2934+
public final fun getOutputSchema ()Lio/modelcontextprotocol/kotlin/sdk/Tool$Output;
2935+
public final fun getTitle ()Ljava/lang/String;
2936+
public final fun get_meta ()Lkotlinx/serialization/json/JsonObject;
2937+
public final fun setAnnotations (Lio/modelcontextprotocol/kotlin/sdk/ToolAnnotations;)V
2938+
public final fun setDescription (Ljava/lang/String;)V
2939+
public final fun setInputSchema (Lio/modelcontextprotocol/kotlin/sdk/Tool$Input;)V
2940+
public final fun setName (Ljava/lang/String;)V
2941+
public final fun setOutputSchema (Lio/modelcontextprotocol/kotlin/sdk/Tool$Output;)V
2942+
public final fun setTitle (Ljava/lang/String;)V
2943+
public final fun set_meta (Lkotlinx/serialization/json/JsonObject;)V
2944+
}
2945+
29282946
public final class io/modelcontextprotocol/kotlin/sdk/Tool$Companion {
2947+
public final fun build (Lkotlin/jvm/functions/Function1;)Lio/modelcontextprotocol/kotlin/sdk/Tool;
29292948
public final fun serializer ()Lkotlinx/serialization/KSerializer;
29302949
}
29312950

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

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1246,7 +1246,7 @@ public data class Tool(
12461246
/**
12471247
* Optional metadata for the tool.
12481248
*/
1249-
override val _meta: JsonObject = EmptyJsonObject,
1249+
override val _meta: JsonObject,
12501250
) : WithMeta {
12511251
@Serializable
12521252
public data class Input(val properties: JsonObject = EmptyJsonObject, val required: List<String>? = null) {
@@ -1261,6 +1261,33 @@ public data class Tool(
12611261
@EncodeDefault
12621262
val type: String = "object"
12631263
}
1264+
1265+
public class Builder {
1266+
public var name: String? = null
1267+
public var title: String? = null
1268+
public var description: String? = null
1269+
public var inputSchema: Input = Input()
1270+
public var outputSchema: Output? = null
1271+
public var annotations: ToolAnnotations? = null
1272+
@Suppress("PropertyName")
1273+
public var _meta: JsonObject = EmptyJsonObject
1274+
1275+
public fun build(): Tool {
1276+
return Tool(
1277+
name = requireNotNull(name){ "Tool name is required" },
1278+
title = title,
1279+
description = description,
1280+
inputSchema = inputSchema,
1281+
outputSchema = outputSchema,
1282+
annotations = annotations,
1283+
_meta = _meta,
1284+
)
1285+
}
1286+
}
1287+
1288+
public companion object{
1289+
public fun build(builder: Builder.() -> Unit): Tool = Builder().apply(builder).build()
1290+
}
12641291
}
12651292

12661293
/**

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,18 @@ public open class Server(
230230
title: String? = null,
231231
outputSchema: Tool.Output? = null,
232232
toolAnnotations: ToolAnnotations? = null,
233-
@Suppress("LocalVariableName") _meta: JsonObject = EmptyJsonObject,
233+
@Suppress("LocalVariableName") _meta: JsonObject? = null,
234234
handler: suspend (CallToolRequest) -> CallToolResult,
235235
) {
236-
val tool = Tool(name, title, description, inputSchema, outputSchema, toolAnnotations, _meta)
236+
val tool = Tool.build{
237+
this.name = name
238+
this.description = description
239+
this.inputSchema = inputSchema
240+
title?.let { this.title = it }
241+
outputSchema?.let { this.outputSchema = it }
242+
toolAnnotations?.let { this.annotations = it }
243+
_meta?.let { this._meta = it }
244+
}
237245
addTool(tool, handler)
238246
}
239247

kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientTest.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -614,14 +614,14 @@ class ClientTest {
614614

615615
val serverListToolsResult = ListToolsResult(
616616
tools = listOf(
617-
Tool(
618-
name = "testTool",
619-
title = "testTool title",
620-
description = "testTool description",
621-
annotations = null,
622-
inputSchema = Tool.Input(),
623-
outputSchema = null,
624-
),
617+
Tool.build {
618+
name = "testTool"
619+
title = "testTool title"
620+
description = "testTool description"
621+
annotations = null
622+
inputSchema = Tool.Input()
623+
outputSchema = null
624+
},
625625
),
626626
nextCursor = null,
627627
)

0 commit comments

Comments
 (0)