Compare commits

...
Author SHA1 Message Date
celestial-vault ead075f40c merge conflicts 2025-06-06 19:28:27 -07:00
celestial-vault 7a2447489b merge conflicts 2025-06-06 19:22:08 -07:00
Elephant Lumps c895e4a70c merge conflicts 2025-05-20 17:54:55 -07:00
Elephant Lumps dbee83bf35 changeset 2025-05-18 17:09:50 -07:00
Elephant Lumps 376a0d5866 migrate fetchLatestServerFromHub 2025-05-18 17:09:21 -07:00
8 changed files with 72 additions and 12 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"claude-dev": minor
---
Migrate fetchLatestServersFromHub to protobus
+1
View File
@@ -19,6 +19,7 @@ service McpService {
// Subscribe to MCP marketplace catalog updates
rpc subscribeToMcpMarketplaceCatalog(EmptyRequest) returns (stream McpMarketplaceCatalog);
rpc getLatestMcpServers(Empty) returns (McpServers);
}
message ToggleMcpServerRequest {
+1 -4
View File
@@ -255,10 +255,7 @@ export class Controller {
// break
// }
case "fetchLatestMcpServersFromHub": {
this.mcpHub?.sendLatestMcpServers()
break
}
// telemetry
case "telemetrySetting": {
if (message.telemetrySetting) {
@@ -0,0 +1,25 @@
import type { Empty } from "@shared/proto/common"
import { McpServers } from "@shared/proto/mcp"
import type { Controller } from "../index"
import { convertMcpServersToProtoMcpServers } from "@/shared/proto-conversions/mcp/mcp-server-conversion"
/**
* RPC handler for getting the latest MCP servers
* @param controller The controller instance
* @param _request Empty request
* @returns McpServers response with list of all MCP servers
*/
export async function getLatestMcpServers(controller: Controller, _request: Empty): Promise<McpServers> {
try {
// Get sorted servers from mcpHub using the RPC variant
const mcpServers = (await controller.mcpHub?.getLatestMcpServersRPC()) || []
// Convert to proto format
const protoServers = convertMcpServersToProtoMcpServers(mcpServers)
return McpServers.create({ mcpServers: protoServers })
} catch (error) {
console.error("Error fetching latest MCP servers:", error)
throw error
}
}
+11
View File
@@ -616,6 +616,17 @@ export class McpHub {
await this.notifyWebviewOfServerChanges()
}
async getLatestMcpServersRPC(): Promise<McpServer[]> {
const settings = await this.readAndValidateMcpSettingsFile()
if (!settings) {
// Return empty array if settings can't be read or validated
return []
}
const serverOrder = Object.keys(settings.mcpServers || {})
return this.getSortedMcpServers(serverOrder)
}
// Using server
// Public methods for server management
-2
View File
@@ -13,13 +13,11 @@ export interface WebviewMessage {
| "authStateChanged"
| "fetchMcpMarketplace"
| "searchCommits"
| "fetchLatestMcpServersFromHub"
| "telemetrySetting"
| "clearAllTaskHistory"
| "fetchUserCreditsData"
| "grpc_request"
| "grpc_request_cancel"
| "toggleWorkflow"
text?: string
disabled?: boolean
@@ -3,12 +3,16 @@ import { useClickAway, useWindowSize } from "react-use"
import { useExtensionState } from "@/context/ExtensionStateContext"
import { CODE_BLOCK_BG_COLOR } from "@/components/common/CodeBlock"
import ServersToggleList from "@/components/mcp/configuration/tabs/installed/ServersToggleList"
import { vscode } from "@/utils/vscode"
import { McpServiceClient } from "@/services/grpc-client"
import { VSCodeButton } from "@vscode/webview-ui-toolkit/react"
import Tooltip from "@/components/common/Tooltip"
import { McpServers } from "@shared/proto/mcp"
import { convertProtoMcpServersToMcpServers } from "@shared/proto-conversions/mcp/mcp-server-conversion"
import { EmptyRequest } from "@shared/proto/common"
const ServersToggleModal: React.FC = () => {
const { mcpServers, navigateToMcp } = useExtensionState()
const { mcpServers, navigateToMcp, setMcpServers } = useExtensionState()
const [isVisible, setIsVisible] = useState(false)
const buttonRef = useRef<HTMLDivElement>(null)
const modalRef = useRef<HTMLDivElement>(null)
@@ -35,7 +39,16 @@ const ServersToggleModal: React.FC = () => {
useEffect(() => {
if (isVisible) {
vscode.postMessage({ type: "fetchLatestMcpServersFromHub" })
McpServiceClient.getLatestMcpServers(EmptyRequest.create({}))
.then((response: McpServers) => {
if (response.mcpServers) {
const mcpServers = convertProtoMcpServersToMcpServers(response.mcpServers)
setMcpServers(mcpServers)
}
})
.catch((error) => {
console.error("Failed to fetch MCP servers:", error)
})
}
}, [isVisible])
@@ -9,6 +9,8 @@ import styled from "styled-components"
import AddRemoteServerForm from "./tabs/add-server/AddRemoteServerForm"
import InstalledServersView from "./tabs/installed/InstalledServersView"
import McpMarketplaceView from "./tabs/marketplace/McpMarketplaceView"
import { convertProtoMcpServersToMcpServers } from "@shared/proto-conversions/mcp/mcp-server-conversion"
import { McpServers } from "@shared/proto/mcp"
type McpViewProps = {
onDone: () => void
@@ -16,7 +18,7 @@ type McpViewProps = {
}
const McpConfigurationView = ({ onDone, initialTab }: McpViewProps) => {
const { mcpMarketplaceEnabled } = useExtensionState()
const { mcpMarketplaceEnabled, setMcpServers } = useExtensionState()
const [activeTab, setActiveTab] = useState<McpViewTab>(initialTab || (mcpMarketplaceEnabled ? "marketplace" : "installed"))
const handleTabChange = (tab: McpViewTab) => {
@@ -37,14 +39,22 @@ const McpConfigurationView = ({ onDone, initialTab }: McpViewProps) => {
if (mcpMarketplaceEnabled) {
McpServiceClient.refreshMcpMarketplace(EmptyRequest.create({}))
.then((response) => {
// Types are structurally identical, use response directly
setMcpMarketplaceCatalog(response)
})
.catch((error) => {
console.error("Error refreshing MCP marketplace:", error)
})
vscode.postMessage({ type: "fetchLatestMcpServersFromHub" })
McpServiceClient.getLatestMcpServers(EmptyRequest.create({}))
.then((response: McpServers) => {
if (response.mcpServers) {
const mcpServers = convertProtoMcpServersToMcpServers(response.mcpServers)
setMcpServers(mcpServers)
}
})
.catch((error) => {
console.error("Failed to fetch MCP servers:", error)
})
}
}, [mcpMarketplaceEnabled])