Skip to content

Commit 706a47f

Browse files
committed
feat(devti): add MCP group support and refactor toolchain functions
- Add MCP group field to AgentTool - Refactor toolInfos() method to use project parameter - Update allToolchains() method to handle null project - Modify database and MCP function providers to use new method signature - Update completion provider to use new allToolchains method
1 parent 2e0d1c7 commit 706a47f

File tree

7 files changed

+24
-12
lines changed

7 files changed

+24
-12
lines changed

core/src/main/kotlin/cc/unitmesh/devti/agent/tool/AgentTool.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ data class AgentTool(
99
val example: String,
1010
val isMcp: Boolean = false,
1111
val completion: String = "",
12+
val mcpGroup: String = "",
1213
) : Tool {
1314
override fun toString(): String {
1415
val string = if (description.isEmpty()) "" else """desc: $description"""

core/src/main/kotlin/cc/unitmesh/devti/bridge/BridgeToolProvider.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ object BridgeToolProvider {
1919
val functions = ToolchainFunctionProvider.all()
2020

2121
commonTools += functions.flatMap {
22-
if (it.toolInfos().isNotEmpty()) {
23-
return@flatMap it.toolInfos()
22+
val toolInfos = it.toolInfos(project)
23+
if (toolInfos.isNotEmpty()) {
24+
return@flatMap toolInfos
2425
}
2526

2627
val funcNames = it.funcNames()

core/src/main/kotlin/cc/unitmesh/devti/devin/dataprovider/BuiltinCommand.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import cc.unitmesh.devti.agent.Tool
66
import cc.unitmesh.devti.agent.tool.AgentTool
77
import cc.unitmesh.devti.provider.toolchain.ToolchainFunctionProvider
88
import com.intellij.icons.AllIcons
9+
import com.intellij.openapi.project.Project
910
import com.intellij.openapi.project.ProjectManager
1011
import java.nio.charset.StandardCharsets
1112
import javax.swing.Icon
@@ -178,9 +179,11 @@ enum class BuiltinCommand(
178179
return providerName
179180
}
180181

181-
suspend fun allToolchains(): List<AgentTool> {
182+
suspend fun allToolchains(project: Project?): List<AgentTool> {
183+
if (project == null) return emptyList()
184+
182185
return ToolchainFunctionProvider.all().map {
183-
val toolInfo: List<AgentTool> = it.toolInfos()
186+
val toolInfo: List<AgentTool> = it.toolInfos(project)
184187
if (toolInfo.isNotEmpty()) {
185188
return@map toolInfo
186189
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@ class McpFunctionProvider : ToolchainFunctionProvider {
1414
return CustomMcpServerManager.instance(project).collectServerInfos().map { it.name }
1515
}
1616

17-
override suspend fun toolInfos(): List<AgentTool> {
18-
val manager = CustomMcpServerManager.instance(
19-
ProjectManager.getInstance().openProjects.firstOrNull() ?: return emptyList()
20-
)
17+
override suspend fun toolInfos(project: Project): List<AgentTool> {
18+
val manager = CustomMcpServerManager.instance(project)
2119
return manager.collectServerInfos().map {
2220
val schemaJson = Json.encodeToString<Input>(it.inputSchema)
2321
val mockData = Json.encodeToString(MockDataGenerator.generateMockData(it.inputSchema))
@@ -26,6 +24,7 @@ class McpFunctionProvider : ToolchainFunctionProvider {
2624
it.description ?: "",
2725
"Here is command and JSON schema\n/${it.name}\n```json\n$schemaJson\n```",
2826
isMcp = true,
27+
mcpGroup = it.name,
2928
completion = mockData
3029
)
3130
}

core/src/main/kotlin/cc/unitmesh/devti/provider/toolchain/ToolchainFunctionProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.intellij.openapi.extensions.ExtensionPointName
55
import com.intellij.openapi.project.Project
66

77
interface ToolchainFunctionProvider {
8-
suspend fun toolInfos(): List<AgentTool> = emptyList()
8+
suspend fun toolInfos(project: Project): List<AgentTool> = emptyList()
99

1010
suspend fun funcNames(): List<String>
1111

exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/completion/provider/ToolchainCommandCompletion.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class ToolchainCommandCompletion : CompletionProvider<CompletionParameters>() {
1616
result: CompletionResultSet,
1717
) {
1818
runBlocking {
19-
BuiltinCommand.allToolchains().forEach {
19+
BuiltinCommand.allToolchains(parameters.originalFile.project).forEach {
2020
val lookupElement = createCommandCompletionCandidate(it)
2121
result.addElement(lookupElement)
2222
}
@@ -30,12 +30,20 @@ class ToolchainCommandCompletion : CompletionProvider<CompletionParameters>() {
3030
}
3131

3232
val element = LookupElementBuilder.create(tool.name).withIcon(AutoDevIcons.MCP)
33-
.withTailText(tool.description)
33+
.withTailText(getText(tool))
3434
.withInsertHandler { context, _ ->
3535
context.editor.caretModel.moveToOffset(context.tailOffset)
3636
context.editor.document.insertString(context.tailOffset, "\n````json\n${tool.completion}\n```")
3737
}
3838

3939
return PrioritizedLookupElement.withPriority(element, 97.0)
4040
}
41+
42+
private fun getText(tool: AgentTool): String {
43+
return return if (tool.mcpGroup.isNotEmpty()) {
44+
" ${tool.mcpGroup}: ${tool.description}"
45+
} else {
46+
tool.description
47+
}
48+
}
4149
}

exts/ext-database/src/main/kotlin/cc/unitmesh/database/provider/DatabaseFunctionProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import com.intellij.openapi.project.Project
1313
import com.intellij.openapi.util.NlsSafe
1414

1515
class DatabaseFunctionProvider : ToolchainFunctionProvider {
16-
override suspend fun toolInfos(): List<AgentTool> {
16+
override suspend fun toolInfos(project: Project): List<AgentTool> {
1717
val example = BuiltinCommand.example("database")
1818
return listOf(AgentTool("database", "Database schema and query tool", example))
1919
}

0 commit comments

Comments
 (0)