import { useState, useRef } from 'react'; import { GearIcon, MCPIcon, OGDialogTrigger } from '@librechat/client'; import { PermissionBits, PermissionTypes, Permissions, hasPermissions, } from 'librechat-data-provider'; import { useLocalize, useHasAccess, MCPServerDefinition } from '~/hooks'; import MCPServerStatusIcon from '~/components/MCP/MCPServerStatusIcon'; import MCPServerDialog from './MCPServerDialog'; interface MCPServerListProps { servers: MCPServerDefinition[]; getServerStatusIconProps: ( serverName: string, ) => React.ComponentProps; isFiltered?: boolean; } // Self-contained edit button component (follows MemoryViewer pattern) const EditMCPServerButton = ({ server }: { server: MCPServerDefinition }) => { const localize = useLocalize(); const [open, setOpen] = useState(false); const triggerRef = useRef(null); return ( ); }; export default function MCPServerList({ servers, getServerStatusIconProps, isFiltered = false, }: MCPServerListProps) { const canCreateEditMCPs = useHasAccess({ permissionType: PermissionTypes.MCP_SERVERS, permission: Permissions.CREATE, }); const localize = useLocalize(); if (servers.length === 0) { return (
{isFiltered ? (

{localize('com_ui_no_mcp_servers_match')}

) : ( <>

{localize('com_ui_no_mcp_servers')}

{localize('com_ui_add_first_mcp_server')}

)}
); } return (
{servers.map((server) => { const canEditThisServer = hasPermissions(server.effectivePermissions, PermissionBits.EDIT); const displayName = server.config?.title || server.serverName; const serverKey = `key_${server.serverName}`; return (
{/* Server Icon */} {server.config?.iconPath ? ( {displayName} ) : ( )} {/* Server Info */}

{displayName}

{/* Edit Button - Only for DB servers and when user has CREATE access */} {canCreateEditMCPs && canEditThisServer && } {/* Connection Status Icon */}
); })}
); }