import { useState, useRef, useMemo } from 'react'; import { Plus } from 'lucide-react'; import { PermissionTypes, Permissions } from 'librechat-data-provider'; import { Button, Spinner, FilterInput, OGDialogTrigger, TooltipAnchor } from '@librechat/client'; import { useLocalize, useMCPServerManager, useHasAccess } from '~/hooks'; import MCPConfigDialog from '~/components/MCP/MCPConfigDialog'; import MCPAdminSettings from './MCPAdminSettings'; import MCPServerDialog from './MCPServerDialog'; import MCPServerList from './MCPServerList'; export default function MCPBuilderPanel() { const localize = useLocalize(); const { availableMCPServers, isLoading, getServerStatusIconProps, getConfigDialogProps } = useMCPServerManager(); const hasCreateAccess = useHasAccess({ permissionType: PermissionTypes.MCP_SERVERS, permission: Permissions.CREATE, }); const [showDialog, setShowDialog] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const addButtonRef = useRef(null); const configDialogProps = getConfigDialogProps(); const filteredServers = useMemo(() => { if (!searchQuery.trim()) { return availableMCPServers; } const query = searchQuery.toLowerCase(); return availableMCPServers.filter((server) => { const displayName = server.config?.title || server.serverName; return ( displayName.toLowerCase().includes(query) || server.serverName.toLowerCase().includes(query) ); }); }, [availableMCPServers, searchQuery]); return (
{/* Toolbar: Search + Add Button */}
setSearchQuery(e.target.value)} containerClassName="flex-1" /> {hasCreateAccess && ( setShowDialog(true)} aria-label={localize('com_ui_add_mcp')} > )}
{/* Server Cards List */} {isLoading ? (
) : ( 0} /> )} {/* Config Dialog for custom user vars */} {configDialogProps && } {/* Admin Settings Section */}
); }