Skip to content

Commit 26be946

Browse files
committed
Add delete button to MCP server
1 parent a925e67 commit 26be946

File tree

5 files changed

+85
-0
lines changed

5 files changed

+85
-0
lines changed

src/core/webview/ClineProvider.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,12 @@ export class ClineProvider implements vscode.WebviewViewProvider {
791791
}
792792
break
793793
}
794+
case "deleteMcpServer": {
795+
if (message.serverName) {
796+
this.mcpHub?.deleteServer(message.serverName)
797+
}
798+
break
799+
}
794800
case "fetchLatestMcpServersFromHub": {
795801
this.mcpHub?.sendLatestMcpServers()
796802
break

src/services/mcp/McpHub.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,33 @@ export class McpHub {
636636
}
637637
}
638638

639+
public async deleteServer(serverName: string) {
640+
try {
641+
const settingsPath = await this.getMcpSettingsFilePath()
642+
const content = await fs.readFile(settingsPath, "utf-8")
643+
const config = JSON.parse(content)
644+
if (!config.mcpServers || typeof config.mcpServers !== "object") {
645+
config.mcpServers = {}
646+
}
647+
if (config.mcpServers[serverName]) {
648+
delete config.mcpServers[serverName]
649+
const updatedConfig = {
650+
mcpServers: config.mcpServers,
651+
}
652+
await fs.writeFile(settingsPath, JSON.stringify(updatedConfig, null, 2))
653+
await this.updateServerConnections(config.mcpServers)
654+
vscode.window.showInformationMessage(`Deleted ${serverName} MCP server`)
655+
} else {
656+
vscode.window.showWarningMessage(`${serverName} not found in MCP configuration`)
657+
}
658+
} catch (error) {
659+
vscode.window.showErrorMessage(
660+
`Failed to delete MCP server: ${error instanceof Error ? error.message : String(error)}`,
661+
)
662+
throw error
663+
}
664+
}
665+
639666
async dispose(): Promise<void> {
640667
this.removeAllFileWatchers()
641668
for (const connection of this.connections) {

src/shared/WebviewMessage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export interface WebviewMessage {
2929
| "refreshOpenAiModels"
3030
| "openMcpSettings"
3131
| "restartMcpServer"
32+
| "deleteMcpServer"
3233
| "autoApprovalSettings"
3334
| "browserSettings"
3435
| "togglePlanActMode"
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { VSCodeButton } from "@vscode/webview-ui-toolkit/react"
2+
import styled from "styled-components"
3+
4+
const StyledButton = styled(VSCodeButton)`
5+
--danger-button-bg: #c42b2b;
6+
--danger-button-hover: #a82424;
7+
--danger-button-active: #8f1f1f;
8+
9+
background-color: var(--danger-button-bg) !important;
10+
border-color: var(--danger-button-bg) !important;
11+
color: #ffffff !important;
12+
13+
&:hover {
14+
background-color: var(--danger-button-hover) !important;
15+
border-color: var(--danger-button-hover) !important;
16+
}
17+
18+
&:active {
19+
background-color: var(--danger-button-active) !important;
20+
border-color: var(--danger-button-active) !important;
21+
}
22+
`
23+
24+
interface DangerButtonProps extends React.ComponentProps<typeof VSCodeButton> {}
25+
26+
const DangerButton: React.FC<DangerButtonProps> = (props) => {
27+
return <StyledButton {...props} />
28+
}
29+
30+
export default DangerButton

webview-ui/src/components/mcp/McpView.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import McpResourceRow from "./McpResourceRow"
88
import McpMarketplaceView from "./marketplace/McpMarketplaceView"
99
import styled from "styled-components"
1010
import { getMcpServerDisplayName } from "../../utils/mcp"
11+
import DangerButton from "../common/DangerButton"
1112

1213
type McpViewProps = {
1314
onDone: () => void
@@ -240,6 +241,7 @@ const ServerRow = ({ server }: { server: McpServer }) => {
240241
const { mcpMarketplaceCatalog } = useExtensionState()
241242

242243
const [isExpanded, setIsExpanded] = useState(false)
244+
const [isDeleting, setIsDeleting] = useState(false)
243245

244246
const getStatusColor = () => {
245247
switch (server.status) {
@@ -265,6 +267,14 @@ const ServerRow = ({ server }: { server: McpServer }) => {
265267
})
266268
}
267269

270+
const handleDelete = () => {
271+
setIsDeleting(true)
272+
vscode.postMessage({
273+
type: "deleteMcpServer",
274+
serverName: server.name,
275+
})
276+
}
277+
268278
return (
269279
<div style={{ marginBottom: "10px" }}>
270280
<div
@@ -460,6 +470,17 @@ const ServerRow = ({ server }: { server: McpServer }) => {
460470
}}>
461471
{server.status === "connecting" ? "Restarting..." : "Restart Server"}
462472
</VSCodeButton>
473+
474+
<DangerButton
475+
// appearance="secondary"
476+
onClick={handleDelete}
477+
disabled={isDeleting}
478+
style={{
479+
width: "calc(100% - 14px)",
480+
margin: "5px 7px 3px 7px",
481+
}}>
482+
{isDeleting ? "Deleting..." : "Delete Server"}
483+
</DangerButton>
463484
</div>
464485
)
465486
)}

0 commit comments

Comments
 (0)