import { Logo } from "../components/Logo"; import { Badge } from "../components/primitives"; import { Icons, type IconName } from "../components/icons"; import { useSession } from "../lib/queries"; import { useT } from "../lib/i18n"; import { PublicControls } from "../components/PublicControls"; const GITHUB_URL = "https://github.com/airano-ir/mcphub"; const BLOG_URL = "https://blog.palebluedot.live/"; const SUPPORT_URL = "https://nowpayments.io/donation/airano"; const PUBLIC_PLUGINS = [ "WordPress", "WooCommerce", "WordPress Specialist", "Supabase", "OpenPanel", "Gitea", "n8n", "Coolify", ]; export function LandingPage() { const t = useT(); const session = useSession(); const signedIn = session.data?.authenticated === true; const servedFromPublicRoot = typeof window !== "undefined" && !window.location.pathname.startsWith("/dashboard"); const dashboardPath = (path: string) => (servedFromPublicRoot ? `/dashboard${path}` : path); const primaryTo = signedIn ? dashboardPath("/overview") : dashboardPath("/onboarding"); const primaryLabel = signedIn ? t("landing.continue_dashboard", "Continue to dashboard") : t("landing.start_60", "Start in 60 seconds"); const secondaryTo = signedIn ? dashboardPath("/sites") : dashboardPath("/login"); const secondaryLabel = signedIn ? t("my_sites", "Sites") : t("login.sign_in", "Sign in"); return (
{t("landing.hero_badge", "MCP 1.0 · Claude · ChatGPT · Cursor · Gemini")}

{t("landing.hero_title_line1", "One hub for every")}
{t("landing.hero_title_em", "AI connection")}{" "} {t("landing.hero_title_line2", "to your sites.")}

{t( "landing.hero_body", "MCP Hub is the control plane between your self-hosted services and the AI tools that work on them. Issue keys, connect Claude.ai, Claude Desktop, ChatGPT, Cursor, or Codex, and review every call from one clean surface.", )}

{t("landing.integrations.eyebrow", "Integrations")}

{t("landing.integrations.title", "Service-specific tools, one MCP surface.")}

{PUBLIC_PLUGINS.map((name) => (
{name}
{t("landing.integrations.tile", "Scoped tools, keys, health, and audit logs.")}
))}
{t("landing.features_eyebrow", "Features")}

{t("landing.features_title", "Everything your AI agents need, nothing they don't.")}

{( [ { icon: "sites", titleKey: "landing.feature.sites.title", title: "Services as first-class objects", descKey: "landing.feature.sites.desc", desc: "Register WordPress, WooCommerce, WordPress Specialist, Supabase, OpenPanel, Gitea, n8n, and Coolify. Each service becomes a discoverable MCP resource with its own tools and access level.", tagKey: "landing.feature.sites.tag", tag: "Core", }, { icon: "key", titleKey: "landing.feature.keys.title", title: "Scoped API keys", descKey: "landing.feature.keys.desc", desc: "Create keys for one service or all sites. Tool tiers stay service-specific and can be tightened later.", tagKey: "landing.feature.keys.tag", tag: "Security", }, { icon: "shield", titleKey: "landing.feature.oauth.title", title: "OAuth 2.1 + PKCE", descKey: "landing.feature.oauth.desc", desc: "Connect browser-based clients like Claude.ai Connectors and ChatGPT, while desktop clients can use direct URLs or bearer tokens.", tagKey: "landing.feature.oauth.tag", tag: "Auth", }, { icon: "activity", titleKey: "landing.feature.health.title", title: "Service health", descKey: "landing.feature.health.desc", desc: "Track credential checks, latency, and service status so agents know what is available before they act.", tagKey: "landing.feature.health.tag", tag: "Observability", }, { icon: "logs", titleKey: "landing.feature.audit.title", title: "Full audit trail", descKey: "landing.feature.audit.desc", desc: "Every tool call, auth event, and settings change is searchable and tied back to the user or key.", tagKey: "landing.feature.audit.tag", tag: "Compliance", }, { icon: "zap", titleKey: "landing.feature.protocol.title", title: "MCP-native tools", descKey: "landing.feature.protocol.desc", desc: "Expose plugin tools through MCP without forcing users to learn every service API by hand.", tagKey: "landing.feature.protocol.tag", tag: "Protocol", }, ] as { icon: IconName; titleKey: string; title: string; descKey: string; desc: string; tagKey: string; tag: string; }[] ).map((f) => { const Ic = Icons[f.icon]; return (
{t(f.tagKey, f.tag)}
{t(f.titleKey, f.title)}
{t(f.descKey, f.desc)}
); })}

{t("landing.cta_title", "Spin up your hub, in a minute.")}

{t( "landing.cta_body", "Deploy on any Coolify instance. Free for personal use. Self-hosted forever.", )}

); }