Skip to content

Commit 4acdadd

Browse files
committed
feat(mcp): enhance tool execution with JSON argument parsing #330
- Modify `execute` method to parse JSON arguments for tool execution. - Update `McpFunctionProvider` to include JSON schema in tool description. - Simplify argument handling in `McpFunctionProvider` to use first argument as JSON string.
1 parent 2d91b91 commit 4acdadd

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

core/src/main/kotlin/cc/unitmesh/devti/mcp/CustomMcpServerManager.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ import io.modelcontextprotocol.kotlin.sdk.client.StdioClientTransport
1313
import kotlinx.io.asSink
1414
import kotlinx.io.asSource
1515
import kotlinx.io.buffered
16+
import kotlinx.serialization.json.JsonElement
17+
import kotlinx.serialization.json.JsonObject
18+
import kotlinx.serialization.json.jsonObject
1619
import java.util.concurrent.CompletableFuture
20+
import kotlin.text.get
1721

1822
@Serializable
1923
data class McpConfig(
@@ -119,14 +123,21 @@ class CustomMcpServerManager(val project: Project) {
119123
return tools
120124
}
121125

122-
fun execute(project: Project, tool: Tool, map: List<String>): Any {
126+
fun execute(project: Project, tool: Tool, map: String): Any {
123127
toolClientMap[tool]?.let {
124128
val future = CompletableFuture<Any>()
125129
kotlinx.coroutines.runBlocking {
126130
try {
127-
val result = it.callTool(tool.name, mapOf<String, Any?>(), true, null)
131+
val arguments = try {
132+
Json.decodeFromString<JsonObject>(map).jsonObject.mapValues { it.value }
133+
} catch (e: Exception) {
134+
logger<CustomMcpServerManager>().warn("Failed to parse arguments: $e")
135+
return@runBlocking future.complete("Invalid arguments: $e")
136+
}
137+
138+
val result = it.callTool(tool.name, arguments, true, null)
128139
future.complete(result)
129-
} catch (e: java.lang.Error) {
140+
} catch (e: Error) {
130141
logger<CustomMcpServerManager>().warn("Failed to execute tool ${tool.name}: $e")
131142
future.complete("Failed to execute tool ${tool.name}: $e")
132143
}

core/src/main/kotlin/cc/unitmesh/devti/mcp/provider/McpFunctionProvider.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import cc.unitmesh.devti.mcp.CustomMcpServerManager
55
import cc.unitmesh.devti.provider.toolchain.ToolchainFunctionProvider
66
import com.intellij.openapi.project.Project
77
import com.intellij.openapi.project.ProjectManager
8+
import io.modelcontextprotocol.kotlin.sdk.Tool.Input
9+
import kotlinx.serialization.json.Json
10+
import kotlinx.serialization.encodeToString
811

912
class McpFunctionProvider : ToolchainFunctionProvider {
1013
override fun funcNames(): List<String> {
@@ -17,7 +20,12 @@ class McpFunctionProvider : ToolchainFunctionProvider {
1720
ProjectManager.getInstance().openProjects.firstOrNull() ?: return emptyList()
1821
)
1922
return manager.collectServerInfos().map {
20-
AgentTool(it.name, it.description ?: "", "")
23+
val encodeToString = Json.encodeToString<Input>(it.inputSchema)
24+
AgentTool(
25+
it.name,
26+
it.description ?: "",
27+
"Here is command and JSON schema\n/${it.name}\n```json\n$encodeToString\n```"
28+
)
2129
}
2230
}
2331

@@ -36,6 +44,6 @@ class McpFunctionProvider : ToolchainFunctionProvider {
3644
return "No such tool: $prop"
3745
}
3846

39-
return CustomMcpServerManager.instance(project).execute(project, tool, args.map { it.toString() })
47+
return CustomMcpServerManager.instance(project).execute(project, tool, args.firstOrNull().toString())
4048
}
4149
}

0 commit comments

Comments
 (0)