Migrate delete mcp server protobus (#3612)

* migrate deleteMcpServer

* changeset

* changed to stringrequest

---------

Co-authored-by: Elephant Lumps <celestial_vault@Elephants-MacBook-Pro.local>
This commit is contained in:
Evan 2025-05-19 20:17:58 -07:00 committed by GitHub
parent 1700c0e4f8
commit 5efbf77f7c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 70 additions and 18 deletions

View File

@ -0,0 +1,5 @@
---
"claude-dev": minor
---
Migrate the deleteMcpServer message to protobus

View File

@ -12,6 +12,7 @@ service McpService {
rpc addRemoteMcpServer(AddRemoteMcpServerRequest) returns (McpServers);
rpc downloadMcp(StringRequest) returns (Empty);
rpc restartMcpServer(StringRequest) returns (McpServers);
rpc deleteMcpServer(StringRequest) returns (McpServers);
}
message ToggleMcpServerRequest {

View File

@ -482,12 +482,7 @@ export class Controller {
this.refreshTotalTasksSize()
break
}
case "deleteMcpServer": {
if (message.serverName) {
this.mcpHub?.deleteServer(message.serverName)
}
break
}
case "fetchLatestMcpServersFromHub": {
this.mcpHub?.sendLatestMcpServers()
break

View File

@ -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
}
}

View File

@ -4,6 +4,7 @@
// Import all method implementations
import { registerMethod } from "./index"
import { addRemoteMcpServer } from "./addRemoteMcpServer"
import { deleteMcpServer } from "./deleteMcpServer"
import { downloadMcp } from "./downloadMcp"
import { restartMcpServer } from "./restartMcpServer"
import { toggleMcpServer } from "./toggleMcpServer"
@ -13,6 +14,7 @@ import { updateMcpTimeout } from "./updateMcpTimeout"
export function registerAllMethods(): void {
// Register each method with the registry
registerMethod("addRemoteMcpServer", addRemoteMcpServer)
registerMethod("deleteMcpServer", deleteMcpServer)
registerMethod("downloadMcp", downloadMcp)
registerMethod("restartMcpServer", restartMcpServer)
registerMethod("toggleMcpServer", toggleMcpServer)

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 {
const settingsPath = await this.getMcpSettingsFilePath()
const content = await fs.readFile(settingsPath, "utf-8")
@ -891,21 +896,23 @@ export class McpHub {
if (!config.mcpServers || typeof config.mcpServers !== "object") {
config.mcpServers = {}
}
if (config.mcpServers[serverName]) {
delete config.mcpServers[serverName]
const updatedConfig = {
mcpServers: config.mcpServers,
}
await fs.writeFile(settingsPath, JSON.stringify(updatedConfig, null, 2))
await this.updateServerConnections(config.mcpServers)
vscode.window.showInformationMessage(`Deleted ${serverName} MCP server`)
await this.updateServerConnectionsRPC(config.mcpServers)
// Get the servers in their correct order from settings
const serverOrder = Object.keys(config.mcpServers || {})
return this.getSortedMcpServers(serverOrder)
} else {
vscode.window.showWarningMessage(`${serverName} not found in MCP configuration`)
throw new Error(`${serverName} not found in MCP configuration`)
}
} catch (error) {
vscode.window.showErrorMessage(
`Failed to delete MCP server: ${error instanceof Error ? error.message : String(error)}`,
)
console.error(`Failed to delete MCP server: ${error instanceof Error ? error.message : String(error)}`)
throw error
}
}

View File

@ -20,7 +20,6 @@ export interface WebviewMessage {
| "showChatView"
| "refreshClineRules"
| "openMcpSettings"
| "deleteMcpServer"
| "autoApprovalSettings"
| "browserRelaunchResult"
| "togglePlanActMode"

View File

@ -1020,6 +1020,14 @@ export const McpServiceDefinition = {
responseStream: false,
options: {},
},
deleteMcpServer: {
name: "deleteMcpServer",
requestType: StringRequest,
requestStream: false,
responseType: McpServers,
responseStream: false,
options: {},
},
},
} as const

View File

@ -35,6 +35,7 @@ import { updateMcpTimeout } from "../core/controller/mcp/updateMcpTimeout"
import { addRemoteMcpServer } from "../core/controller/mcp/addRemoteMcpServer"
import { downloadMcp } from "../core/controller/mcp/downloadMcp"
import { restartMcpServer } from "../core/controller/mcp/restartMcpServer"
import { deleteMcpServer } from "../core/controller/mcp/deleteMcpServer"
// Models Service
import { getOllamaModels } from "../core/controller/models/getOllamaModels"
@ -119,6 +120,7 @@ export function addServices(
addRemoteMcpServer: wrapper(addRemoteMcpServer, controller),
downloadMcp: wrapper(downloadMcp, controller),
restartMcpServer: wrapper(restartMcpServer, controller),
deleteMcpServer: wrapper(deleteMcpServer, controller),
})
// Models Service

View File

@ -117,10 +117,18 @@ const ServerRow = ({
const handleDelete = () => {
setIsDeleting(true)
vscode.postMessage({
type: "deleteMcpServer",
serverName: server.name,
})
McpServiceClient.deleteMcpServer({
value: 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 = () => {