Skip to content

Commit 922c795

Browse files
celestial-vaultElephant Lumps
andauthored
Migrate fetchLatestServersFromHub protobus (RooCodeInc#3621)
* migrate fetchLatestServerFromHub * changeset --------- Co-authored-by: Elephant Lumps <[email protected]>
1 parent fd85473 commit 922c795

File tree

8 files changed

+72
-12
lines changed

8 files changed

+72
-12
lines changed

.changeset/six-rice-end.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+
Migrate fetchLatestServersFromHub to protobus

proto/mcp.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ service McpService {
1919

2020
// Subscribe to MCP marketplace catalog updates
2121
rpc subscribeToMcpMarketplaceCatalog(EmptyRequest) returns (stream McpMarketplaceCatalog);
22+
rpc getLatestMcpServers(Empty) returns (McpServers);
2223
}
2324

2425
message ToggleMcpServerRequest {

src/core/controller/index.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,10 +255,7 @@ export class Controller {
255255

256256
// break
257257
// }
258-
case "fetchLatestMcpServersFromHub": {
259-
this.mcpHub?.sendLatestMcpServers()
260-
break
261-
}
258+
262259
// telemetry
263260
case "telemetrySetting": {
264261
if (message.telemetrySetting) {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import type { Empty } from "@shared/proto/common"
2+
import { McpServers } from "@shared/proto/mcp"
3+
import type { Controller } from "../index"
4+
import { convertMcpServersToProtoMcpServers } from "@/shared/proto-conversions/mcp/mcp-server-conversion"
5+
6+
/**
7+
* RPC handler for getting the latest MCP servers
8+
* @param controller The controller instance
9+
* @param _request Empty request
10+
* @returns McpServers response with list of all MCP servers
11+
*/
12+
export async function getLatestMcpServers(controller: Controller, _request: Empty): Promise<McpServers> {
13+
try {
14+
// Get sorted servers from mcpHub using the RPC variant
15+
const mcpServers = (await controller.mcpHub?.getLatestMcpServersRPC()) || []
16+
17+
// Convert to proto format
18+
const protoServers = convertMcpServersToProtoMcpServers(mcpServers)
19+
20+
return McpServers.create({ mcpServers: protoServers })
21+
} catch (error) {
22+
console.error("Error fetching latest MCP servers:", error)
23+
throw error
24+
}
25+
}

src/services/mcp/McpHub.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,17 @@ export class McpHub {
616616
await this.notifyWebviewOfServerChanges()
617617
}
618618

619+
async getLatestMcpServersRPC(): Promise<McpServer[]> {
620+
const settings = await this.readAndValidateMcpSettingsFile()
621+
if (!settings) {
622+
// Return empty array if settings can't be read or validated
623+
return []
624+
}
625+
626+
const serverOrder = Object.keys(settings.mcpServers || {})
627+
return this.getSortedMcpServers(serverOrder)
628+
}
629+
619630
// Using server
620631

621632
// Public methods for server management

src/shared/WebviewMessage.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,11 @@ export interface WebviewMessage {
1313
| "authStateChanged"
1414
| "fetchMcpMarketplace"
1515
| "searchCommits"
16-
| "fetchLatestMcpServersFromHub"
1716
| "telemetrySetting"
1817
| "clearAllTaskHistory"
1918
| "fetchUserCreditsData"
2019
| "grpc_request"
2120
| "grpc_request_cancel"
22-
| "toggleWorkflow"
2321

2422
text?: string
2523
disabled?: boolean

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@ import { useClickAway, useWindowSize } from "react-use"
33
import { useExtensionState } from "@/context/ExtensionStateContext"
44
import { CODE_BLOCK_BG_COLOR } from "@/components/common/CodeBlock"
55
import ServersToggleList from "@/components/mcp/configuration/tabs/installed/ServersToggleList"
6-
import { vscode } from "@/utils/vscode"
6+
7+
import { McpServiceClient } from "@/services/grpc-client"
78
import { VSCodeButton } from "@vscode/webview-ui-toolkit/react"
89
import Tooltip from "@/components/common/Tooltip"
10+
import { McpServers } from "@shared/proto/mcp"
11+
import { convertProtoMcpServersToMcpServers } from "@shared/proto-conversions/mcp/mcp-server-conversion"
12+
import { EmptyRequest } from "@shared/proto/common"
913

1014
const ServersToggleModal: React.FC = () => {
11-
const { mcpServers, navigateToMcp } = useExtensionState()
15+
const { mcpServers, navigateToMcp, setMcpServers } = useExtensionState()
1216
const [isVisible, setIsVisible] = useState(false)
1317
const buttonRef = useRef<HTMLDivElement>(null)
1418
const modalRef = useRef<HTMLDivElement>(null)
@@ -35,7 +39,16 @@ const ServersToggleModal: React.FC = () => {
3539

3640
useEffect(() => {
3741
if (isVisible) {
38-
vscode.postMessage({ type: "fetchLatestMcpServersFromHub" })
42+
McpServiceClient.getLatestMcpServers(EmptyRequest.create({}))
43+
.then((response: McpServers) => {
44+
if (response.mcpServers) {
45+
const mcpServers = convertProtoMcpServersToMcpServers(response.mcpServers)
46+
setMcpServers(mcpServers)
47+
}
48+
})
49+
.catch((error) => {
50+
console.error("Failed to fetch MCP servers:", error)
51+
})
3952
}
4053
}, [isVisible])
4154

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@ import styled from "styled-components"
99
import AddRemoteServerForm from "./tabs/add-server/AddRemoteServerForm"
1010
import InstalledServersView from "./tabs/installed/InstalledServersView"
1111
import McpMarketplaceView from "./tabs/marketplace/McpMarketplaceView"
12+
import { convertProtoMcpServersToMcpServers } from "@shared/proto-conversions/mcp/mcp-server-conversion"
13+
import { McpServers } from "@shared/proto/mcp"
1214

1315
type McpViewProps = {
1416
onDone: () => void
1517
initialTab?: McpViewTab
1618
}
1719

1820
const McpConfigurationView = ({ onDone, initialTab }: McpViewProps) => {
19-
const { mcpMarketplaceEnabled } = useExtensionState()
21+
const { mcpMarketplaceEnabled, setMcpServers } = useExtensionState()
2022
const [activeTab, setActiveTab] = useState<McpViewTab>(initialTab || (mcpMarketplaceEnabled ? "marketplace" : "installed"))
2123

2224
const handleTabChange = (tab: McpViewTab) => {
@@ -37,14 +39,22 @@ const McpConfigurationView = ({ onDone, initialTab }: McpViewProps) => {
3739
if (mcpMarketplaceEnabled) {
3840
McpServiceClient.refreshMcpMarketplace(EmptyRequest.create({}))
3941
.then((response) => {
40-
// Types are structurally identical, use response directly
4142
setMcpMarketplaceCatalog(response)
4243
})
4344
.catch((error) => {
4445
console.error("Error refreshing MCP marketplace:", error)
4546
})
4647

47-
vscode.postMessage({ type: "fetchLatestMcpServersFromHub" })
48+
McpServiceClient.getLatestMcpServers(EmptyRequest.create({}))
49+
.then((response: McpServers) => {
50+
if (response.mcpServers) {
51+
const mcpServers = convertProtoMcpServersToMcpServers(response.mcpServers)
52+
setMcpServers(mcpServers)
53+
}
54+
})
55+
.catch((error) => {
56+
console.error("Failed to fetch MCP servers:", error)
57+
})
4858
}
4959
}, [mcpMarketplaceEnabled])
5060

0 commit comments

Comments
 (0)