import React from 'react'; import { Spinner } from '@librechat/client'; import { SettingsIcon, AlertTriangle, KeyRound, PlugZap, X } from 'lucide-react'; import type { MCPServerStatus, TPlugin } from 'librechat-data-provider'; import { useLocalize } from '~/hooks'; let localize: ReturnType; interface StatusIconProps { serverName: string; onConfigClick: (e: React.MouseEvent) => void; } interface InitializingStatusProps extends StatusIconProps { onCancel: (e: React.MouseEvent) => void; canCancel: boolean; } interface MCPServerStatusIconProps { serverName: string; serverStatus?: MCPServerStatus; tool?: TPlugin; onConfigClick: (e: React.MouseEvent) => void; isInitializing: boolean; canCancel: boolean; onCancel: (e: React.MouseEvent) => void; hasCustomUserVars?: boolean; } /** * Renders the appropriate status icon for an MCP server based on its state */ export default function MCPServerStatusIcon({ serverName, serverStatus, tool, onConfigClick, isInitializing, canCancel, onCancel, hasCustomUserVars = false, }: MCPServerStatusIconProps) { localize = useLocalize(); if (isInitializing) { return ( ); } if (!serverStatus) { return null; } const { connectionState, requiresOAuth } = serverStatus; if (connectionState === 'connecting') { return ; } if (connectionState === 'disconnected') { if (requiresOAuth) { return ; } return ; } if (connectionState === 'error') { return ; } if (connectionState === 'connected') { // Only show config button if there are customUserVars to configure if (hasCustomUserVars) { const isAuthenticated = tool?.authenticated || requiresOAuth; return ( ); } return null; // No config button for connected servers without customUserVars } return null; } function InitializingStatusIcon({ serverName, onCancel, canCancel }: InitializingStatusProps) { if (canCancel) { return ( ); } return (
); } function ConnectingStatusIcon({ serverName }: StatusIconProps) { return (
); } function DisconnectedOAuthStatusIcon({ serverName, onConfigClick }: StatusIconProps) { return ( ); } function DisconnectedStatusIcon({ serverName, onConfigClick }: StatusIconProps) { return ( ); } function ErrorStatusIcon({ serverName, onConfigClick }: StatusIconProps) { return ( ); } interface AuthenticatedStatusProps extends StatusIconProps { isAuthenticated: boolean; } function AuthenticatedStatusIcon({ serverName, onConfigClick, isAuthenticated, }: AuthenticatedStatusProps) { return ( ); }