diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte index 738746a697..9c94c05d66 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte @@ -6,7 +6,7 @@ ChatFormActionRecord, ChatFormActionSubmit, DialogMcpServersSettings, - McpActiveServersAvatars, + McpServerSelector, ModelsSelector } from '$lib/components/app'; import { mcpStore } from '$lib/stores/mcp.svelte'; @@ -180,7 +180,7 @@ onMcpServersClick={() => (showMcpDialog = true)} /> - (showMcpDialog = true)} /> + (showMcpDialog = true)} />
diff --git a/tools/server/webui/src/lib/components/app/mcp/McpActiveServersAvatars.svelte b/tools/server/webui/src/lib/components/app/mcp/McpActiveServersAvatars.svelte index 0c6cfcde12..433237ac00 100644 --- a/tools/server/webui/src/lib/components/app/mcp/McpActiveServersAvatars.svelte +++ b/tools/server/webui/src/lib/components/app/mcp/McpActiveServersAvatars.svelte @@ -7,11 +7,9 @@ interface Props { class?: string; - disabled?: boolean; - onSettingsClick?: () => void; } - let { class: className = '', disabled = false, onSettingsClick }: Props = $props(); + let { class: className = '' }: Props = $props(); let mcpServers = $derived(mcpStore.getServersSorted().filter((s) => s.enabled)); let enabledMcpServersForChat = $derived( @@ -34,17 +32,7 @@ {#if hasEnabledMcpServers && mcpFavicons.length > 0} - +
{/if} diff --git a/tools/server/webui/src/lib/components/app/mcp/McpServerSelector.svelte b/tools/server/webui/src/lib/components/app/mcp/McpServerSelector.svelte new file mode 100644 index 0000000000..5cf56d7a1e --- /dev/null +++ b/tools/server/webui/src/lib/components/app/mcp/McpServerSelector.svelte @@ -0,0 +1,139 @@ + + +{#if hasMcpServers && hasEnabledMcpServers && mcpFavicons.length > 0} + + {#snippet trigger()} + + {/snippet} + +
+ {#each filteredMcpServers as server (server.id)} + {@const healthState = mcpStore.getHealthCheckState(server.id)} + {@const hasError = healthState.status === HealthCheckStatus.ERROR} + {@const isEnabledForChat = isServerEnabledForChat(server.id)} + + + {/each} +
+ + {#snippet footer()} + + + Manage MCP Servers + + {/snippet} +
+{/if} diff --git a/tools/server/webui/src/lib/components/app/mcp/index.ts b/tools/server/webui/src/lib/components/app/mcp/index.ts index 5db701284e..372d5b7ab0 100644 --- a/tools/server/webui/src/lib/components/app/mcp/index.ts +++ b/tools/server/webui/src/lib/components/app/mcp/index.ts @@ -69,6 +69,33 @@ export { default as McpServersSettings } from './McpServersSettings.svelte'; */ export { default as McpActiveServersAvatars } from './McpActiveServersAvatars.svelte'; +/** + * **McpServerSelector** - Quick MCP server toggle dropdown + * + * Compact dropdown for quickly enabling/disabling MCP servers for the current chat. + * Uses McpActiveServersAvatars as trigger and shows searchable server list with switches. + * + * **Architecture:** + * - Uses DropdownMenuSearchable for searchable dropdown UI + * - McpActiveServersAvatars as the trigger element + * - Integrates with conversationsStore for per-chat toggle + * - Runs health checks on dropdown open + * + * **Features:** + * - Searchable server list by name/URL + * - Switch toggles matching McpServersSettings behavior + * - Error state display for unhealthy servers + * - Footer link to full MCP settings dialog + * + * @example + * ```svelte + * showMcpSettings = true} + * /> + * ``` + */ +export { default as McpServerSelector } from './McpServerSelector.svelte'; + /** * **McpCapabilitiesBadges** - Server capabilities display * diff --git a/tools/server/webui/src/lib/stores/mcp.svelte.ts b/tools/server/webui/src/lib/stores/mcp.svelte.ts index 61b1696c0d..0f72d0c90c 100644 --- a/tools/server/webui/src/lib/stores/mcp.svelte.ts +++ b/tools/server/webui/src/lib/stores/mcp.svelte.ts @@ -240,7 +240,7 @@ class MCPStore { /** * Check if there are any available MCP servers (enabled in settings). - * Used to determine if McpSelector should be shown. + * Used to determine if McpServerSelector should be shown. */ hasAvailableServers(): boolean { const servers = parseMcpServerSettings(config().mcpServers);