@@ -4,34 +4,48 @@ import cc.unitmesh.devti.agent.tool.AgentTool
4
4
import cc.unitmesh.devti.provider.toolchain.ToolchainFunctionProvider
5
5
import com.intellij.openapi.project.Project
6
6
import com.intellij.openapi.project.ProjectManager
7
+ import io.modelcontextprotocol.kotlin.sdk.Tool
7
8
import io.modelcontextprotocol.kotlin.sdk.Tool.Input
8
9
import kotlinx.serialization.json.Json
9
10
import kotlinx.serialization.encodeToString
10
11
11
12
class McpFunctionProvider : ToolchainFunctionProvider {
12
13
override suspend fun funcNames (): List <String > {
13
14
val project = ProjectManager .getInstance().openProjects.firstOrNull() ? : return emptyList()
14
- return CustomMcpServerManager .instance(project).collectServerInfos().map { it.name }
15
+ return CustomMcpServerManager .instance(project).collectServerInfos().values
16
+ .flatMap { it }
17
+ .map { it.name }
18
+ .distinct()
15
19
}
16
20
17
21
override suspend fun toolInfos (project : Project ): List <AgentTool > {
18
22
val manager = CustomMcpServerManager .instance(project)
19
- return manager.collectServerInfos().map {
20
- val schemaJson = Json .encodeToString<Input >(it.inputSchema)
21
- val mockData = Json .encodeToString(MockDataGenerator .generateMockData(it.inputSchema))
22
- AgentTool (
23
- it.name,
24
- it.description ? : " " ,
25
- " Here is command and JSON schema\n /${it.name} \n ```json\n $schemaJson \n ```" ,
26
- isMcp = true ,
27
- mcpGroup = it.name,
28
- completion = mockData
29
- )
23
+ val toolsMap = manager.collectServerInfos()
24
+
25
+ val agentTools = mutableListOf<AgentTool >()
26
+ for ((serverName, tools) in toolsMap) {
27
+ for (tool in tools) {
28
+ val schemaJson = Json .encodeToString<Input >(tool.inputSchema)
29
+ val mockData = Json .encodeToString(MockDataGenerator .generateMockData(tool.inputSchema))
30
+ agentTools.add(
31
+ AgentTool (
32
+ tool.name,
33
+ tool.description ? : " " ,
34
+ " Here is command and JSON schema\n /${tool.name} \n ```json\n $schemaJson \n ```" ,
35
+ isMcp = true ,
36
+ mcpGroup = serverName,
37
+ completion = mockData
38
+ )
39
+ )
40
+ }
30
41
}
42
+
43
+ return agentTools
31
44
}
32
45
33
46
override suspend fun isApplicable (project : Project , funcName : String ): Boolean {
34
- return CustomMcpServerManager .instance(project).collectServerInfos().any { it.name == funcName }
47
+ val toolsMap = CustomMcpServerManager .instance(project).collectServerInfos()
48
+ return toolsMap.any { (_, tools) -> tools.any { it.name == funcName } }
35
49
}
36
50
37
51
override suspend fun execute (
@@ -41,7 +55,10 @@ class McpFunctionProvider : ToolchainFunctionProvider {
41
55
allVariables : Map <String , Any ?>,
42
56
commandName : String
43
57
): Any {
44
- val tool = CustomMcpServerManager .instance(project).collectServerInfos().firstOrNull { it.name == commandName }
58
+ val toolsMap = CustomMcpServerManager .instance(project).collectServerInfos()
59
+ val tool = toolsMap.values.flatMap { it }
60
+ .firstOrNull { it.name == commandName }
61
+
45
62
if (tool == null ) {
46
63
return " No MCP such tool: $prop "
47
64
}
0 commit comments