'use client'; import { StatusPill } from '@/components/status-pill'; import { Button } from '@/components/ui/button'; import { apiFetch } from '@/lib/api'; import Link from 'next/link'; import { useEffect, useState } from 'react'; interface ServerRow { id: string; name: string; slug: string; status: string; publicUrl: string | null; createdAt: string; } export default function Overview() { const [servers, setServers] = useState(null); const [err, setErr] = useState(null); useEffect(() => { apiFetch<{ servers: ServerRow[] }>('/v1/servers') .then((r) => setServers(r.servers)) .catch((e) => setErr((e as Error).message)); }, []); if (err?.includes('401')) { if (typeof window !== 'undefined') { window.location.href = '/login'; } return null; } const total = servers?.length ?? 0; const live = servers?.filter((s) => s.status === 'live').length ?? 0; return (

Overview

Your MCP servers, calls and recent builds.

Recent servers

View all →
{servers === null && (
Loading…
)} {servers && servers.length === 0 && (

No servers yet.

Describe the tool you want — we host the server.

)} {servers && servers.length > 0 && ( {servers.slice(0, 5).map((s) => ( ))}
Name Slug Status URL
{s.name} {s.slug} {s.publicUrl ?? '—'}
)}
); } function Card({ label, value, sub }: { label: string; value: string; sub: string }) { return (
{label}
{value}
{sub}
); }