import { useEffect, useMemo, useState } from 'react'; import { classNames } from '~/utils/classNames'; import { Dialog, DialogRoot, DialogClose, DialogTitle, DialogButton } from '~/components/ui/Dialog'; import { IconButton } from '~/components/ui/IconButton'; import { useMCPStore } from '~/lib/stores/mcp'; import McpServerList from '~/components/@settings/tabs/mcp/McpServerList'; export function McpTools() { const isInitialized = useMCPStore((state) => state.isInitialized); const serverTools = useMCPStore((state) => state.serverTools); const initialize = useMCPStore((state) => state.initialize); const checkServersAvailabilities = useMCPStore((state) => state.checkServersAvailabilities); const [isDialogOpen, setIsDialogOpen] = useState(false); const [error, setError] = useState(null); const [isCheckingServers, setIsCheckingServers] = useState(false); const [expandedServer, setExpandedServer] = useState(null); useEffect(() => { if (!isInitialized) { initialize(); } }, [isInitialized]); const checkServerAvailability = async () => { setIsCheckingServers(true); setError(null); try { await checkServersAvailabilities(); } catch (e) { setError(`Failed to check server availability: ${e instanceof Error ? e.message : String(e)}`); } finally { setIsCheckingServers(false); } }; const toggleServerExpanded = (serverName: string) => { setExpandedServer(expandedServer === serverName ? null : serverName); }; const handleDialogOpen = (open: boolean) => { setIsDialogOpen(open); }; const serverEntries = useMemo(() => Object.entries(serverTools), [serverTools]); return (
setIsDialogOpen(!isDialogOpen)} title="MCP Tools Available" disabled={!isInitialized} className="transition-all disabled:opacity-50 disabled:cursor-not-allowed" > {!isInitialized ? (
) : (
)}
{isDialogOpen && (
MCP tools
{serverEntries.length > 0 ? ( ) : (

No MCP servers configured

Configure servers in Settings → MCP Servers

)}
{error &&

{error}

}
Close
)}
); }