Skip to content

Commit 7fad1de

Browse files
committed
refactor(mcp): simplify message display and parsing #371
- Remove McpMessage.parseContent() as it's no longer needed - Replace detailed tool/parameters UI with single content display - Simplify tool result message formatting
1 parent 5317d20 commit 7fad1de

File tree

3 files changed

+25
-91
lines changed

3 files changed

+25
-91
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,7 @@ class CustomMcpServerManager(val project: Project) {
104104
future.complete("No result from tool ${tool.name}")
105105
} else {
106106
val result = json.encodeToString(result.content)
107-
val text = "Execute ${tool.name} tool's result\n"
108-
future.complete(text + result)
107+
future.complete(result)
109108
}
110109
} catch (e: Error) {
111110
logger<CustomMcpServerManager>().warn("Failed to execute tool ${tool.name}: $e")

core/src/main/kotlin/cc/unitmesh/devti/mcp/ui/McpMessageLogPanel.kt

Lines changed: 23 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@ package cc.unitmesh.devti.mcp.ui
33
import cc.unitmesh.devti.mcp.ui.model.McpMessage
44
import cc.unitmesh.devti.mcp.ui.model.MessageType
55
import com.intellij.ui.JBColor
6-
import com.intellij.ui.components.JBLabel
76
import com.intellij.ui.components.JBScrollPane
87
import com.intellij.ui.table.JBTable
98
import com.intellij.util.ui.JBUI
109
import java.awt.BorderLayout
1110
import java.awt.Component
1211
import java.awt.Dimension
13-
import java.awt.Point
1412
import java.time.format.DateTimeFormatter
1513
import javax.swing.*
1614
import javax.swing.table.DefaultTableCellRenderer
@@ -29,108 +27,64 @@ class McpMessageLogPanel : JPanel(BorderLayout()) {
2927
autoCreateRowSorter = true
3028
}
3129

32-
private val toolNameLabel = JBLabel("Tool Name:").apply {
33-
font = font.deriveFont(java.awt.Font.BOLD)
34-
border = JBUI.Borders.empty(10, 10, 5, 10)
35-
}
36-
37-
private val toolNameTextArea = JTextArea().apply {
38-
isEditable = false
39-
wrapStyleWord = true
40-
lineWrap = true
41-
border = JBUI.Borders.empty(5, 10, 10, 10)
42-
}
43-
44-
private val parametersLabel = JBLabel("Parameters:").apply {
45-
font = font.deriveFont(java.awt.Font.BOLD)
46-
border = JBUI.Borders.empty(10, 10, 5, 10)
47-
}
48-
49-
private val parametersTextArea = JTextArea().apply {
30+
private val detailTextArea = JTextArea().apply {
5031
isEditable = false
5132
wrapStyleWord = true
5233
lineWrap = true
53-
border = JBUI.Borders.empty(5, 10, 10, 10)
34+
border = JBUI.Borders.empty(10)
5435
}
55-
56-
private val detailPanel = JPanel().apply {
57-
layout = BoxLayout(this, BoxLayout.Y_AXIS)
58-
add(toolNameLabel)
59-
add(toolNameTextArea)
60-
add(parametersLabel)
61-
add(parametersTextArea)
62-
border = JBUI.Borders.empty(5)
63-
}
64-
65-
private val detailScrollPane = JBScrollPane(detailPanel)
6636

6737
init {
6838
table.getColumnModel().getColumn(0).cellRenderer = TypeColumnRenderer()
69-
39+
40+
// Create split pane
7041
val splitPane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT).apply {
7142
leftComponent = JBScrollPane(table)
72-
rightComponent = detailScrollPane
43+
rightComponent = JBScrollPane(detailTextArea)
7344
dividerLocation = 600
7445
resizeWeight = 0.5
7546
}
76-
47+
7748
add(splitPane, BorderLayout.CENTER)
7849
table.selectionModel.addListSelectionListener { e ->
7950
if (!e.valueIsAdjusting && table.selectedRow >= 0) {
8051
val selectedIndex = table.convertRowIndexToModel(table.selectedRow)
8152
if (selectedIndex >= 0 && selectedIndex < messages.size) {
82-
val message = messages[selectedIndex]
83-
84-
// Parse content if toolName and parameters are not explicitly set
85-
val (toolName, params) = if (message.toolName != null && message.parameters != null) {
86-
Pair(message.toolName, message.parameters)
87-
} else {
88-
McpMessage.parseContent(message.content)
89-
}
90-
91-
toolNameTextArea.text = toolName ?: "N/A"
92-
toolNameTextArea.caretPosition = 0
93-
94-
parametersTextArea.text = params ?: "N/A"
95-
parametersTextArea.caretPosition = 0
96-
97-
detailPanel.revalidate()
98-
detailPanel.repaint()
99-
detailScrollPane.viewport.viewPosition = Point(0, 0)
53+
detailTextArea.text = messages[selectedIndex].content
54+
detailTextArea.caretPosition = 0
10055
}
10156
}
10257
}
10358
}
104-
59+
10560
fun addMessage(message: McpMessage) {
10661
messages.add(message)
10762
tableModel.fireTableDataChanged()
10863
SwingUtilities.invokeLater {
10964
table.setRowSelectionInterval(messages.size - 1, messages.size - 1)
11065
}
11166
}
112-
67+
11368
fun clear() {
11469
messages.clear()
11570
tableModel.fireTableDataChanged()
116-
toolNameTextArea.text = ""
117-
parametersTextArea.text = ""
71+
detailTextArea.text = ""
11872
}
119-
73+
12074
private inner class MessageTableModel : DefaultTableModel() {
12175
private val columnNames = arrayOf(
12276
"Type",
12377
"Method",
12478
"Timestamp",
12579
"Duration"
12680
)
127-
81+
12882
override fun getColumnCount(): Int = columnNames.size
129-
83+
13084
override fun getRowCount(): Int = messages.size
131-
85+
13286
override fun getColumnName(column: Int): String = columnNames[column]
133-
87+
13488
override fun getValueAt(row: Int, column: Int): Any {
13589
val message = messages[row]
13690
return when (column) {
@@ -141,10 +95,10 @@ class McpMessageLogPanel : JPanel(BorderLayout()) {
14195
else -> ""
14296
}
14397
}
144-
98+
14599
override fun isCellEditable(row: Int, column: Int): Boolean = false
146100
}
147-
101+
148102
private class TypeColumnRenderer : DefaultTableCellRenderer() {
149103
override fun getTableCellRendererComponent(
150104
table: JTable?,
@@ -155,8 +109,8 @@ class McpMessageLogPanel : JPanel(BorderLayout()) {
155109
column: Int
156110
): Component {
157111
val label = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column) as JLabel
158-
label.horizontalAlignment = SwingConstants.CENTER
159-
112+
label.horizontalAlignment = CENTER
113+
160114
if (!isSelected) {
161115
when (value) {
162116
MessageType.REQUEST -> {
@@ -169,15 +123,15 @@ class McpMessageLogPanel : JPanel(BorderLayout()) {
169123
}
170124
}
171125
}
172-
126+
173127
label.text = when (value) {
174128
MessageType.REQUEST -> "REQUEST"
175129
MessageType.RESPONSE -> "RESPONSE"
176130
else -> ""
177131
}
178-
132+
179133
label.border = JBUI.Borders.empty(3, 5)
180-
134+
181135
return label
182136
}
183137
}

core/src/main/kotlin/cc/unitmesh/devti/mcp/ui/model/McpMessage.kt

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,4 @@ data class McpMessage(
1515
val content: String,
1616
val toolName: String? = null,
1717
val parameters: String? = null
18-
) {
19-
companion object {
20-
fun parseContent(content: String): Pair<String?, String?> {
21-
val toolNamePrefix = "Tool: "
22-
val paramsPrefix = "Parameters: "
23-
24-
val toolName = content.lineSequence()
25-
.find { it.startsWith(toolNamePrefix) }
26-
?.substringAfter(toolNamePrefix)
27-
?.trim()
28-
29-
val params = content.lineSequence()
30-
.find { it.startsWith(paramsPrefix) }
31-
?.substringAfter(paramsPrefix)
32-
?.trim()
33-
34-
return Pair(toolName, params)
35-
}
36-
}
37-
}
18+
)

0 commit comments

Comments
 (0)