Skip to main content
Glama
home.tsx3.69 kB
'use client' import { useState } from 'react' import { Card, CardContent, CardHeader, CardTitle, CardAction } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Play, RefreshCcw, CheckCircle, XCircle, Clock, Power } from 'lucide-react' import { toast } from 'sonner' import { useLanguage } from '@/contexts/language-context' import { toastConfig } from '@/lib/utils' import { TokenUsageBarChart } from '@/components/token-usage-bar-chart' import { MCPConfigCodeBlock } from '@/components/mcp-config-code-block' import { MCPServerStatus } from '@/components/mcp-server-status' import { useDailyStats, useMCPHealth, useMCPStatusStream, useMCPControl } from '@/hooks' import type { MCPStatus } from '@/api/types' export function Home() { const { status: initStatus } = useMCPHealth() const [serviceStatus, setServiceStatus] = useState<MCPStatus>(initStatus) const { t } = useLanguage() useMCPStatusStream(setServiceStatus) const { handleControl: start } = useMCPControl('start') const { handleControl: stop } = useMCPControl('stop') const { handleControl: restart } = useMCPControl('restart') const getStatusIcon = () => { switch (serviceStatus) { case 'running': return <CheckCircle className='h-4 w-4 text-green-500' /> case 'stopped': return <XCircle className='h-4 w-4 text-red-500' /> case 'starting': return <Clock className='h-4 w-4 text-yellow-500 animate-spin' /> case 'stopping': return <Clock className='h-4 w-4 text-yellow-500 animate-spin' /> } } const { dailyStats, error } = useDailyStats() if (error) { toast.error('Failed to fetch token usage data', toastConfig) } // const { data: healthData } = useMCPHealth() // const { status } = useMCPStatusStream() return ( <div className='space-y-6'> {/* First row: Service status and configuration information */} {/* Service status card */} <Card> <CardHeader className='flex items-center justify-between'> <CardTitle className='flex items-center gap-2'> {getStatusIcon()} {t('home.graphitiMCPService')} <MCPServerStatus status={serviceStatus} /> </CardTitle> <CardAction> <div className='flex gap-4'> <Button variant='ghost' onClick={() => start()} disabled={serviceStatus !== 'stopped'} size='sm'> <Play className='h-4 w-4 mr-2' /> {t('home.start')} </Button> <Button onClick={() => restart()} disabled={serviceStatus !== 'running'} variant='ghost' size='sm'> <RefreshCcw className='h-4 w-4 mr-2' /> {t('home.restart')} </Button> <Button onClick={() => stop()} disabled={serviceStatus !== 'running'} variant='ghost' size='sm'> <Power className='h-4 w-4 mr-2' /> {t('home.stop')} </Button> </div> </CardAction> </CardHeader> <CardContent> <MCPConfigCodeBlock /> </CardContent> </Card> {/* Today's TOKEN consumption */} {dailyStats && ( <TokenUsageBarChart data={dailyStats} Title={ <div className='flex flex-1 flex-col justify-center gap-1 px-6 pt-4 pb-3 sm:!py-0'> <CardTitle>{t('home.tokenUsage')}</CardTitle> </div> } /> )} </div> ) }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/itcook/graphiti-mcp-pro'

If you have feedback or need assistance with the MCP directory API, please join our Discord server