@@ -3,6 +3,7 @@ package com.javaaidev.mcp.openapi
33import io.ktor.client.*
44import io.ktor.client.plugins.*
55import io.ktor.client.plugins.contentnegotiation.*
6+ import io.ktor.client.plugins.logging.*
67import io.ktor.client.request.*
78import io.ktor.client.statement.*
89import io.ktor.http.*
@@ -32,6 +33,11 @@ object McpToolHelper {
3233 prettyPrint = true
3334 })
3435 }
36+ install(Logging ) {
37+ logger = Logger .DEFAULT
38+ level = LogLevel .INFO
39+ sanitizeHeader { header -> header == HttpHeaders .Authorization }
40+ }
3541 }
3642
3743 fun toTools (openAPI : OpenAPI ): List <McpTool > {
@@ -58,7 +64,7 @@ object McpToolHelper {
5864 ): McpTool {
5965 val name = operation.operationId ? : " ${httpMethod} _$path "
6066 val description = operation.description ? : (operation.summary ? : " " )
61- val parameters = operationParameters(operation, components)
67+ val ( parameters, requiredParams) = operationParameters(operation, components)
6268 val requestBody = operationRequestBody(operation, components)
6369 val responseBody = operationResponseBody(operation, components)
6470 val toolAnnotations = if (httpMethod == " GET" )
@@ -76,15 +82,18 @@ object McpToolHelper {
7682 " parameters" to JsonObject (
7783 mapOf (
7884 " type" to JsonPrimitive (" object" ),
79- " properties" to parameters
85+ " properties" to parameters,
86+ " required" to JsonArray ((requiredParams ? : listOf ()).map {
87+ JsonPrimitive (it)
88+ })
8089 )
8190 ),
8291 " requestBody" to requestBody,
8392 )
8493 )
8594 )
8695 } else if (parameters?.isNotEmpty() == true ) {
87- Tool .Input (parameters, parameters.keys.toList() )
96+ Tool .Input (parameters, requiredParams )
8897 } else if (requestBody?.isNotEmpty() == true ) {
8998 Tool .Input (
9099 requestBody[" properties" ] as ? JsonObject ? : JsonObject (mapOf ()),
@@ -127,14 +136,16 @@ object McpToolHelper {
127136 private fun operationParameters (
128137 operation : Operation ,
129138 components : Map <String , Schema <* >>?
130- ): JsonObject ? {
131- return operation.parameters?.filter { parameter ->
139+ ): Pair < JsonObject ?, List < String > ? > {
140+ val parameters = operation.parameters?.filter { parameter ->
132141 setOf (" query" , " path" ).contains(parameter.`in `)
133- }?.associate { parameter ->
142+ }
143+ val required = parameters?.filter { it.required }?.map { it.name }
144+ return (parameters?.associate { parameter ->
134145 parameter.name to schemaToJsonObject(parameter.schema, components, parameter)
135146 }?.let {
136147 JsonObject (it)
137- }
148+ } to required)
138149 }
139150
140151 private fun operationRequestBody (operation : Operation , components : Map <String , Schema <* >>? ) =
@@ -232,7 +243,9 @@ object McpToolHelper {
232243 private fun expandUriTemplate (template : String , values : JsonObject ): String {
233244 var result = template
234245 values.forEach { (key, value) ->
235- result = result.replace(" {$key }" , value.toString())
246+ if (value is JsonPrimitive ) {
247+ result = result.replace(" {$key }" , value.contentOrNull ? : " " )
248+ }
236249 }
237250 return result
238251 }
0 commit comments