'use client'; import Link from 'next/link'; import { useEffect, useState } from 'react'; import { apiFetch } from '@/lib/api'; import { StatusPill } from '@/components/status-pill'; import { Button } from '@/components/ui/button'; interface ServerRow { id: string; name: string; slug: string; status: string; publicUrl: string | null; createdAt: string; updatedAt: string; } export default function ServersPage() { const [servers, setServers] = useState(null); const [q, setQ] = useState(''); useEffect(() => { apiFetch<{ servers: ServerRow[] }>('/v1/servers').then((r) => setServers(r.servers)); }, []); const filtered = servers?.filter((s) => q ? s.name.toLowerCase().includes(q.toLowerCase()) || s.slug.includes(q.toLowerCase()) : true, ); return (

Servers

All your hosted MCP servers.

setQ(e.target.value)} placeholder="Search by name or slug…" className="h-8 w-72 rounded-md border border-[--color-border] bg-[--color-bg-subtle] px-2.5 text-[13px] placeholder:text-[--color-fg-subtle] focus:border-[--color-accent] focus:outline-none" />
{!filtered &&
Loading…
} {filtered && filtered.length === 0 && (
No servers match.
)} {filtered && filtered.length > 0 && ( {filtered.map((s) => ( ))}
Name Slug Status URL Updated
{s.name} {s.slug} {s.publicUrl ?? '—'} {new Date(s.updatedAt).toLocaleString()}
)}
); }