Skip to content

Commit 47aecdf

Browse files
MCPToggleModal - Add button to open config (RooCodeInc#2743)
* make ServerRow not optionally not expandable * changeset * factor out servers toggle list * changeset * add servers modal * changest * Reduce padding in modal * separate fetch useEffect for more efficient rendering * add button to open installed servers config * changeset * add mcptab type * change codicon * modify button display --------- Co-authored-by: Saoud Rizwan <[email protected]>
1 parent fb037a0 commit 47aecdf

File tree

8 files changed

+38
-9
lines changed

8 files changed

+38
-9
lines changed

.changeset/eleven-comics-roll.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"claude-dev": minor
3+
---
4+
5+
Add button to open config to MCP toggle modal

src/core/controller/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ export class Controller {
575575
break
576576
}
577577
case "showMcpView": {
578-
await this.postMessageToWebview({ type: "action", action: "mcpButtonClicked" })
578+
await this.postMessageToWebview({ type: "action", action: "mcpButtonClicked", tab: message.tab || undefined })
579579
break
580580
}
581581
case "openMcpSettings": {

src/shared/ExtensionMessage.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { AutoApprovalSettings } from "./AutoApprovalSettings"
66
import { BrowserSettings } from "./BrowserSettings"
77
import { ChatSettings } from "./ChatSettings"
88
import { HistoryItem } from "./HistoryItem"
9-
import { McpServer, McpMarketplaceCatalog, McpMarketplaceItem, McpDownloadResponse } from "./mcp"
9+
import { McpServer, McpMarketplaceCatalog, McpMarketplaceItem, McpDownloadResponse, McpViewTab } from "./mcp"
1010
import { TelemetrySetting } from "./TelemetrySetting"
1111
import type { BalanceResponse, UsageTransaction, PaymentTransaction } from "../shared/ClineAccount"
1212

@@ -106,6 +106,7 @@ export interface ExtensionMessage {
106106
serverName: string
107107
error?: string
108108
}
109+
tab?: McpViewTab
109110
}
110111

111112
export type Invoke = "sendMessage" | "primaryButtonClick" | "secondaryButtonClick"

src/shared/WebviewMessage.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ChatSettings } from "./ChatSettings"
55
import { UserInfo } from "./UserInfo"
66
import { ChatContent } from "./ChatContent"
77
import { TelemetrySetting } from "./TelemetrySetting"
8+
import { McpViewTab } from "./mcp"
89

910
export interface WebviewMessage {
1011
type:
@@ -93,6 +94,7 @@ export interface WebviewMessage {
9394
chatContent?: ChatContent
9495
mcpId?: string
9596
timeout?: number
97+
tab?: McpViewTab
9698
// For toggleToolAutoApprove
9799
serverName?: string
98100
serverUrl?: string

src/shared/mcp.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,5 @@ export interface McpDownloadResponse {
105105
llmsInstallationContent: string
106106
requiresApiKey: boolean
107107
}
108+
109+
export type McpViewTab = "marketplace" | "addRemote" | "installed"

webview-ui/src/App.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { ExtensionStateContextProvider, useExtensionState } from "./context/Exte
1010
import { FirebaseAuthProvider } from "./context/FirebaseAuthContext"
1111
import { vscode } from "./utils/vscode"
1212
import McpView from "./components/mcp/configuration/McpConfigurationView"
13+
import { McpViewTab } from "@shared/mcp"
1314

1415
const AppContent = () => {
1516
const { didHydrateState, showWelcome, shouldShowAnnouncement, telemetrySetting, vscMachineId } = useExtensionState()
@@ -18,6 +19,7 @@ const AppContent = () => {
1819
const [showMcp, setShowMcp] = useState(false)
1920
const [showAccount, setShowAccount] = useState(false)
2021
const [showAnnouncement, setShowAnnouncement] = useState(false)
22+
const [mcpTab, setMcpTab] = useState<McpViewTab | undefined>(undefined)
2123

2224
const handleMessage = useCallback((e: MessageEvent) => {
2325
const message: ExtensionMessage = e.data
@@ -39,6 +41,9 @@ const AppContent = () => {
3941
case "mcpButtonClicked":
4042
setShowSettings(false)
4143
setShowHistory(false)
44+
if (message.tab) {
45+
setMcpTab(message.tab)
46+
}
4247
setShowMcp(true)
4348
setShowAccount(false)
4449
break
@@ -89,7 +94,7 @@ const AppContent = () => {
8994
<>
9095
{showSettings && <SettingsView onDone={() => setShowSettings(false)} />}
9196
{showHistory && <HistoryView onDone={() => setShowHistory(false)} />}
92-
{showMcp && <McpView onDone={() => setShowMcp(false)} />}
97+
{showMcp && <McpView initialTab={mcpTab} onDone={() => setShowMcp(false)} />}
9398
{showAccount && <AccountView onDone={() => setShowAccount(false)} />}
9499
{/* Do not conditionally load ChatView, it's expensive and there's state we don't want to lose (user input, disableInput, askResponse promise, etc.) */}
95100
<ChatView

webview-ui/src/components/chat/ServersToggleModal.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,22 @@ const ServersToggleModal: React.FC = () => {
7373
}}
7474
/>
7575

76-
<div className="m-0 mb-2.5">MCP Servers</div>
77-
<div style={{ marginBottom: "-10px" }}>
78-
<ServersToggleList servers={mcpServers} isExpandable={false} hasTrashIcon={false} listGap="small" />
76+
<div className="flex justify-between items-center mb-2.5">
77+
<h3 className="m-0">MCP Servers</h3>
78+
<VSCodeButton
79+
appearance="icon"
80+
onClick={() => {
81+
vscode.postMessage({
82+
type: "showMcpView",
83+
tab: "installed",
84+
})
85+
setIsVisible(false)
86+
}}>
87+
<span className="codicon codicon-gear text-[10px]"></span>
88+
</VSCodeButton>
7989
</div>
90+
91+
<ServersToggleList servers={mcpServers} isExpandable={false} hasTrashIcon={false} listGap="small" />
8092
</div>
8193
)}
8294
</div>

webview-ui/src/components/mcp/configuration/McpConfigurationView.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,18 @@ import { vscode } from "@/utils/vscode"
66
import AddRemoteServerForm from "./tabs/add-server/AddRemoteServerForm"
77
import McpMarketplaceView from "./tabs/marketplace/McpMarketplaceView"
88
import InstalledServersView from "./tabs/installed/InstalledServersView"
9+
import { McpViewTab } from "@shared/mcp"
910

1011
type McpViewProps = {
1112
onDone: () => void
13+
initialTab?: McpViewTab
1214
}
1315

14-
const McpConfigurationView = ({ onDone }: McpViewProps) => {
16+
const McpConfigurationView = ({ onDone, initialTab }: McpViewProps) => {
1517
const { mcpMarketplaceEnabled } = useExtensionState()
16-
const [activeTab, setActiveTab] = useState(mcpMarketplaceEnabled ? "marketplace" : "installed")
18+
const [activeTab, setActiveTab] = useState<McpViewTab>(initialTab || (mcpMarketplaceEnabled ? "marketplace" : "installed"))
1719

18-
const handleTabChange = (tab: string) => {
20+
const handleTabChange = (tab: McpViewTab) => {
1921
setActiveTab(tab)
2022
}
2123

0 commit comments

Comments
 (0)