import React, { memo, useCallback } from 'react'; import { MultiSelect, MCPIcon } from '@librechat/client'; import MCPServerStatusIcon from '~/components/MCP/MCPServerStatusIcon'; import { useMCPServerManager } from '~/hooks/MCP/useMCPServerManager'; import MCPConfigDialog from '~/components/MCP/MCPConfigDialog'; function MCPSelect() { const { configuredServers, mcpValues, isPinned, placeholderText, batchToggleServers, getServerStatusIconProps, getConfigDialogProps, localize, } = useMCPServerManager(); const renderSelectedValues = useCallback( (values: string[], placeholder?: string) => { if (values.length === 0) { return placeholder || localize('com_ui_select') + '...'; } if (values.length === 1) { return values[0]; } return localize('com_ui_x_selected', { 0: values.length }); }, [localize], ); const renderItemContent = useCallback( (serverName: string, defaultContent: React.ReactNode) => { const statusIconProps = getServerStatusIconProps(serverName); // Common wrapper for the main content (check mark + text) // Ensures Check & Text are adjacent and the group takes available space. const mainContentWrapper = ( ); const statusIcon = statusIconProps && ; if (statusIcon) { return (
{mainContentWrapper}
{statusIcon}
); } return mainContentWrapper; }, [getServerStatusIconProps], ); // Don't render if no servers are selected and not pinned if ((!mcpValues || mcpValues.length === 0) && !isPinned) { return null; } // Don't render if no MCP servers are configured if (!configuredServers || configuredServers.length === 0) { return null; } const configDialogProps = getConfigDialogProps(); return ( <> } selectItemsClassName="border border-blue-600/50 bg-blue-500/10 hover:bg-blue-700/10" selectClassName="group relative inline-flex items-center justify-center md:justify-start gap-1.5 rounded-full border border-border-medium text-sm font-medium transition-all md:w-full size-9 p-2 md:p-3 bg-transparent shadow-sm hover:bg-surface-hover hover:shadow-md active:shadow-inner" /> {configDialogProps && } ); } export default memo(MCPSelect);