Compare commits

...
Author SHA1 Message Date
Elephant Lumps db9e24a28b merge conflicts 2025-05-18 19:39:30 -07:00
Elephant Lumps 161782659e changed to stringrequest 2025-05-18 15:07:20 -07:00
Elephant Lumps dd317fd3de changeset 2025-05-18 09:54:26 -07:00
Elephant Lumps 106a339849 migrate deleteMcpServer 2025-05-18 09:53:56 -07:00
10 changed files with 70 additions and 18 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"claude-dev": minor
---
Migrate the deleteMcpServer message to protobus
+1
View File
@@ -12,6 +12,7 @@ service McpService {
rpc addRemoteMcpServer(AddRemoteMcpServerRequest) returns (McpServers); rpc addRemoteMcpServer(AddRemoteMcpServerRequest) returns (McpServers);
rpc downloadMcp(StringRequest) returns (Empty); rpc downloadMcp(StringRequest) returns (Empty);
rpc restartMcpServer(StringRequest) returns (McpServers); rpc restartMcpServer(StringRequest) returns (McpServers);
rpc deleteMcpServer(StringRequest) returns (McpServers);
} }
message ToggleMcpServerRequest { message ToggleMcpServerRequest {
+1 -6
View File
@@ -482,12 +482,7 @@ export class Controller {
this.refreshTotalTasksSize() this.refreshTotalTasksSize()
break break
} }
case "deleteMcpServer": {
if (message.serverName) {
this.mcpHub?.deleteServer(message.serverName)
}
break
}
case "fetchLatestMcpServersFromHub": { case "fetchLatestMcpServersFromHub": {
this.mcpHub?.sendLatestMcpServers() this.mcpHub?.sendLatestMcpServers()
break break
@@ -0,0 +1,25 @@
import type { Controller } from "../index"
import type { McpServers } from "../../../shared/proto/mcp"
import { convertMcpServersToProtoMcpServers } from "../../../shared/proto-conversions/mcp/mcp-server-conversion"
import { StringRequest } from "@/shared/proto/common"
/**
* Deletes an MCP server
* @param controller The controller instance
* @param request The delete server request
* @returns The list of remaining MCP servers after deletion
*/
export async function deleteMcpServer(controller: Controller, request: StringRequest): Promise<McpServers> {
try {
// Call the RPC variant to delete the server and get updated server list
const mcpServers = (await controller.mcpHub?.deleteServerRPC(request.value)) || []
// Convert application types to protobuf types
const protoServers = convertMcpServersToProtoMcpServers(mcpServers)
return { mcpServers: protoServers }
} catch (error) {
console.error(`Failed to delete MCP server: ${error}`)
throw error
}
}
+2
View File
@@ -4,6 +4,7 @@
// Import all method implementations // Import all method implementations
import { registerMethod } from "./index" import { registerMethod } from "./index"
import { addRemoteMcpServer } from "./addRemoteMcpServer" import { addRemoteMcpServer } from "./addRemoteMcpServer"
import { deleteMcpServer } from "./deleteMcpServer"
import { downloadMcp } from "./downloadMcp" import { downloadMcp } from "./downloadMcp"
import { restartMcpServer } from "./restartMcpServer" import { restartMcpServer } from "./restartMcpServer"
import { toggleMcpServer } from "./toggleMcpServer" import { toggleMcpServer } from "./toggleMcpServer"
@@ -13,6 +14,7 @@ import { updateMcpTimeout } from "./updateMcpTimeout"
export function registerAllMethods(): void { export function registerAllMethods(): void {
// Register each method with the registry // Register each method with the registry
registerMethod("addRemoteMcpServer", addRemoteMcpServer) registerMethod("addRemoteMcpServer", addRemoteMcpServer)
registerMethod("deleteMcpServer", deleteMcpServer)
registerMethod("downloadMcp", downloadMcp) registerMethod("downloadMcp", downloadMcp)
registerMethod("restartMcpServer", restartMcpServer) registerMethod("restartMcpServer", restartMcpServer)
registerMethod("toggleMcpServer", toggleMcpServer) registerMethod("toggleMcpServer", toggleMcpServer)
+14 -7
View File
@@ -883,7 +883,12 @@ export class McpHub {
} }
} }
public async deleteServer(serverName: string) { /**
* RPC variant of deleteServer that returns the updated server list directly
* @param serverName The name of the server to delete
* @returns Array of remaining MCP servers
*/
public async deleteServerRPC(serverName: string): Promise<McpServer[]> {
try { try {
const settingsPath = await this.getMcpSettingsFilePath() const settingsPath = await this.getMcpSettingsFilePath()
const content = await fs.readFile(settingsPath, "utf-8") const content = await fs.readFile(settingsPath, "utf-8")
@@ -891,21 +896,23 @@ export class McpHub {
if (!config.mcpServers || typeof config.mcpServers !== "object") { if (!config.mcpServers || typeof config.mcpServers !== "object") {
config.mcpServers = {} config.mcpServers = {}
} }
if (config.mcpServers[serverName]) { if (config.mcpServers[serverName]) {
delete config.mcpServers[serverName] delete config.mcpServers[serverName]
const updatedConfig = { const updatedConfig = {
mcpServers: config.mcpServers, mcpServers: config.mcpServers,
} }
await fs.writeFile(settingsPath, JSON.stringify(updatedConfig, null, 2)) await fs.writeFile(settingsPath, JSON.stringify(updatedConfig, null, 2))
await this.updateServerConnections(config.mcpServers) await this.updateServerConnectionsRPC(config.mcpServers)
vscode.window.showInformationMessage(`Deleted ${serverName} MCP server`)
// Get the servers in their correct order from settings
const serverOrder = Object.keys(config.mcpServers || {})
return this.getSortedMcpServers(serverOrder)
} else { } else {
vscode.window.showWarningMessage(`${serverName} not found in MCP configuration`) throw new Error(`${serverName} not found in MCP configuration`)
} }
} catch (error) { } catch (error) {
vscode.window.showErrorMessage( console.error(`Failed to delete MCP server: ${error instanceof Error ? error.message : String(error)}`)
`Failed to delete MCP server: ${error instanceof Error ? error.message : String(error)}`,
)
throw error throw error
} }
} }
-1
View File
@@ -20,7 +20,6 @@ export interface WebviewMessage {
| "showChatView" | "showChatView"
| "refreshClineRules" | "refreshClineRules"
| "openMcpSettings" | "openMcpSettings"
| "deleteMcpServer"
| "autoApprovalSettings" | "autoApprovalSettings"
| "browserRelaunchResult" | "browserRelaunchResult"
| "togglePlanActMode" | "togglePlanActMode"
+8
View File
@@ -1020,6 +1020,14 @@ export const McpServiceDefinition = {
responseStream: false, responseStream: false,
options: {}, options: {},
}, },
deleteMcpServer: {
name: "deleteMcpServer",
requestType: StringRequest,
requestStream: false,
responseType: McpServers,
responseStream: false,
options: {},
},
}, },
} as const } as const
+2
View File
@@ -34,6 +34,7 @@ import { updateMcpTimeout } from "../core/controller/mcp/updateMcpTimeout"
import { addRemoteMcpServer } from "../core/controller/mcp/addRemoteMcpServer" import { addRemoteMcpServer } from "../core/controller/mcp/addRemoteMcpServer"
import { downloadMcp } from "../core/controller/mcp/downloadMcp" import { downloadMcp } from "../core/controller/mcp/downloadMcp"
import { restartMcpServer } from "../core/controller/mcp/restartMcpServer" import { restartMcpServer } from "../core/controller/mcp/restartMcpServer"
import { deleteMcpServer } from "../core/controller/mcp/deleteMcpServer"
// Models Service // Models Service
import { getOllamaModels } from "../core/controller/models/getOllamaModels" import { getOllamaModels } from "../core/controller/models/getOllamaModels"
@@ -117,6 +118,7 @@ export function addServices(
addRemoteMcpServer: wrapper(addRemoteMcpServer, controller), addRemoteMcpServer: wrapper(addRemoteMcpServer, controller),
downloadMcp: wrapper(downloadMcp, controller), downloadMcp: wrapper(downloadMcp, controller),
restartMcpServer: wrapper(restartMcpServer, controller), restartMcpServer: wrapper(restartMcpServer, controller),
deleteMcpServer: wrapper(deleteMcpServer, controller),
}) })
// Models Service // Models Service
@@ -117,10 +117,18 @@ const ServerRow = ({
const handleDelete = () => { const handleDelete = () => {
setIsDeleting(true) setIsDeleting(true)
vscode.postMessage({ McpServiceClient.deleteMcpServer({
type: "deleteMcpServer", value: server.name,
serverName: server.name, } as StringRequest)
}) .then((response: McpServers) => {
const mcpServers = convertProtoMcpServersToMcpServers(response.mcpServers)
setMcpServers(mcpServers)
setIsDeleting(false)
})
.catch((error) => {
console.error("Error deleting MCP server", error)
setIsDeleting(false)
})
} }
const handleAutoApproveChange = () => { const handleAutoApproveChange = () => {