import { createFileRoute, useNavigate } from '@tanstack/react-router'
import { Plus, Server, Terminal, Wrench } from 'lucide-react'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { AddServerDialog } from '@/components/mcp/add-server-dialog'
import { ServerList } from '@/components/mcp/server-list'
import { ToolList } from '@/components/mcp/tool-list'
import { ToolTester } from '@/components/mcp/tool-tester'
import { Button } from '@/components/ui/button'
import { Card, CardContent } from '@/components/ui/card'
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
export const Route = createFileRoute('/mcp')({
component: McpPage,
validateSearch: (search: Record<string, unknown>) => ({
tab: (search.tab as string) || undefined,
}),
})
function McpPage() {
const { t } = useTranslation()
const [addDialogOpen, setAddDialogOpen] = useState(false)
const navigate = useNavigate({ from: Route.id })
const { tab: tabParam } = Route.useSearch()
const tab = tabParam === 'tools' || tabParam === 'test' ? tabParam : 'servers'
return (
<div className="space-y-6">
<div className="flex items-center justify-between">
<div>
<h1 className="text-2xl font-bold">{t('mcp.title')}</h1>
<p className="text-muted-foreground">{t('mcp.subtitle')}</p>
</div>
{tab === 'servers' && (
<Button onClick={() => setAddDialogOpen(true)}>
<Plus className="h-4 w-4 mr-1" /> {t('mcp.addServer')}
</Button>
)}
</div>
<Tabs
value={tab}
onValueChange={(v) =>
navigate({
search: (prev) => ({ ...prev, tab: v === 'servers' ? undefined : v }),
replace: true,
})
}
>
<TabsList>
<TabsTrigger value="servers" className="flex items-center gap-1.5">
<Server className="h-4 w-4" /> {t('mcp.servers')}
</TabsTrigger>
<TabsTrigger value="tools" className="flex items-center gap-1.5">
<Wrench className="h-4 w-4" /> {t('mcp.tools')}
</TabsTrigger>
<TabsTrigger value="test" className="flex items-center gap-1.5">
<Terminal className="h-4 w-4" /> {t('mcp.test')}
</TabsTrigger>
</TabsList>
<TabsContent value="servers">
<Card>
<CardContent className="pt-6">
<ServerList />
</CardContent>
</Card>
</TabsContent>
<TabsContent value="tools">
<Card>
<CardContent className="pt-6">
<ToolList />
</CardContent>
</Card>
</TabsContent>
<TabsContent value="test">
<Card>
<CardContent className="pt-6">
<ToolTester />
</CardContent>
</Card>
</TabsContent>
</Tabs>
<AddServerDialog open={addDialogOpen} onOpenChange={setAddDialogOpen} />
</div>
)
}