import { GitHubIcon, NotionIcon, PostgresIcon, RestIcon, SalesforceCloudIcon, StripeIcon, } from '@/components/brand-icons'; import { HeroStepRotator } from '@/components/hero-step-rotator'; import { HeroVideo } from '@/components/hero-video'; import { JsonLd } from '@/components/json-ld'; import { ParticleHero } from '@/components/particle-hero'; import { PulseLink } from '@/components/pulse'; import { ScrollCue } from '@/components/scroll-cue'; import { TIERS } from '@/lib/pricing'; import { FAQ, faqJsonLd } from '@/lib/seo'; import { Activity, ChevronDown, Container, ShieldCheck } from 'lucide-react'; import Link from 'next/link'; import type { ComponentType } from 'react'; interface ExampleEntry { title: string; desc: string; /** Brand logo component rendered inside the coloured chip. */ Icon: ComponentType<{ size?: number; className?: string }>; /** Official brand colour for the chip background. */ bg: string; /** Foreground colour the icon paints in. */ fg: string; } const EXAMPLES: ExampleEntry[] = [ { title: 'PostgreSQL', desc: 'Read-only access to your tables with schema introspection.', Icon: PostgresIcon, bg: '#336791', fg: '#ffffff', }, { title: 'Salesforce', desc: 'Query opportunities, accounts and leads from Claude.', Icon: SalesforceCloudIcon, bg: '#00a1e0', fg: '#ffffff', }, { title: 'Notion', desc: 'Search pages, read content, append blocks.', Icon: NotionIcon, bg: '#ffffff', fg: '#0a0a0b', }, { title: 'GitHub', desc: 'List issues, search code, post comments. Scoped to one repo.', Icon: GitHubIcon, bg: '#181717', fg: '#ffffff', }, { title: 'Stripe', desc: 'Look up charges, customers, refunds (read-only by default).', Icon: StripeIcon, bg: '#635bff', fg: '#ffffff', }, { title: 'Custom REST', desc: 'Wrap any HTTP API behind one prompt-defined tool surface.', Icon: RestIcon, bg: '#6366f1', fg: '#ffffff', }, ]; // Honest marketplace preview data: template names + tool counts only. These // mirror the first-party starter templates; no invented fork counts, no // "verified" theatre — the frame is labelled as a preview of the card format. const PREVIEW_TEMPLATES: { name: string; author: string; tools: number }[] = [ { name: 'notion-search', author: 'core', tools: 2 }, { name: 'github-issues', author: 'core', tools: 3 }, { name: 'stripe-readonly', author: 'core', tools: 4 }, { name: 'postgres-readonly', author: 'core', tools: 3 }, ]; const MARKETPLACE_POINTS: { t: string; d: string }[] = [ { t: 'Fork and own', d: 'Start from a server someone already shipped. Fork it, paste your own credentials, deploy. No prompt required.', }, { t: 'Secrets never travel', d: "A template carries the spec and generated code, never the author's API keys. You add your own on fork.", }, { t: 'Open from day one', d: 'Publish a server you built and anyone can fork it. The marketplace is young — early templates set the standard.', }, ]; // Proof-by-specificity band: three claims a visitor can verify with one // click instead of taking our word for it. Substitute for social proof // until there is social proof. const PROOF_POINTS: { t: string; d: string; href: string; linkLabel: string; Icon: ComponentType<{ size?: number; className?: string }>; }[] = [ { t: 'OAuth 2.1 authorization server', d: 'PKCE, Dynamic Client Registration and Resource Indicators (RFC 8707) in front of every server.', href: '/docs/oauth', linkLabel: 'Read the auth docs', Icon: ShieldCheck, }, { t: 'Live system status', d: 'Uptime and incident history, public. If a build queue slows down, you see it before we tell you.', href: '/status', linkLabel: 'Check status now', Icon: Activity, }, { t: 'Per-server container isolation', d: 'Every generated server runs in its own Docker container. Secrets AES-256-GCM encrypted at rest.', href: '/security', linkLabel: 'Security architecture', Icon: Container, }, ]; const PIPELINE_STEPS: { n: string; t: string; d: string }[] = [ { n: '01', t: 'Describe your tool', d: 'A sentence is enough. List your secrets and which APIs to call.', }, { n: '02', t: 'We generate, check, deploy', d: 'Claude writes the spec. We render TypeScript, run static checks, build a container, deploy to your subdomain.', }, { n: '03', t: 'Install in your client', d: 'Copy the snippet into Claude Desktop, Cursor or ChatGPT. OAuth flow on first use.', }, ]; /** Mono shell-comment section kicker: `## how_it_works` */ function Kicker({ children }: { children: string }) { return

## {children}

; } export default function Landing() { const teaserTiers = TIERS.filter((t) => t.name === 'Hobby' || t.name === 'Pro'); return ( <> {/* Hero — left: copy + CTAs, right: cycling terminal tile. The WebGL particle field sits behind at z-0 with pointer-events:none so the CTAs stay interactive. */}

Describe your tool.
We host the server.
AI uses it.

From a prompt to a production MCP server — OAuth 2.1, Streamable HTTP, ready for Claude, Cursor and ChatGPT.

Start building free → Watch a build
OAuth 2.1 + PKCE Streamable HTTP AES-256 secrets Per-server isolation
{/* Flow video — full-width edge-to-edge under the hero. Plays when scrolled into view (see hero-video.tsx); preload=metadata keeps the 2.6 MB mp4 off the critical path on mobile. */}
{/* How it works — three pipeline nodes joined by a gradient connector. Desktop: horizontal line behind the numbered nodes. Mobile: the grid stacks and each card keeps its own node, joined by a left rail. */}
how_it_works

Three steps. No JSON to write, no Docker to manage.

{/* Gradient connector — desktop only, sits behind the node row. */}
{/* Mobile left rail joining the stacked nodes. */}
{PIPELINE_STEPS.map((s) => (
{s.n}

{s.t}

{s.d}

))}
{/* Proof by specificity — three verifiable claims, each one click from its evidence. Replaces the old pseudo-logo row: no invented marks, just a plain-text compatibility line. */}
verify_it_yourself

Don't take our word for it.
Every claim links to its proof.

{PROOF_POINTS.map((p) => { const Icon = p.Icon; return (

{p.t}

{p.d}

{p.linkLabel} → ); })}

Works with Claude Desktop, Cursor, ChatGPT, VS Code Copilot and Continue.dev — anything that speaks MCP.

{/* Use cases — brand-coloured integration grid. No bottom hairline: the marketplace section below brings its own border-y. */}
use_cases

Wrap any HTTP API.
From one prompt.

Each shipped from a single prompt.

{EXAMPLES.map((e) => { const Icon = e.Icon; return (

{e.title}

{e.desc}

); })}
{/* Marketplace — split layout: selling points left, honest preview frame right. Elevated background (no hairline) so the page reads in blocks instead of one continuously ruled ledger. */}
marketplace

Skip the prompt.
Fork what works.

The marketplace is a library of working MCP servers. Fork one, paste your credentials, deploy. Or publish yours and let others build on it.

    {MARKETPLACE_POINTS.map((p) => (
  • {p.t}

    {p.d}

  • ))}
Browse the marketplace →
{/* Pricing teaser — Hobby + Pro only; the full matrix lives on /pricing. Data is shared via lib/pricing.ts so it can't drift. */}
pricing

Pay for tool calls.
Not for boilerplate.

{teaserTiers.map((t) => { const featured = Boolean(t.highlight); return (
{featured && ( Recommended )}
{t.name}
{t.price} {t.tag}

{t.description}

    {t.features.map((f) => (
  • {f}
  • ))}
{t.cta}
); })}
See all plans — Team, Enterprise →
{/* FAQ — collapsible accordion using native
. Crawlers and screen readers see the full Q+A in the HTML. */}
faq

Questions, answered straight.

{FAQ.map((f) => (
{f.q}

{f.a}

))}
{/* Final CTA — the page must not end on FAQ. Gradient top border keeps the brand mark scarce but present at the exit point. */}

Your first server is one prompt away.

Free tier, full source export, no lock-in. If it doesn't work for you, take the TypeScript and leave.

Start building free → Read the docs
); } /** * Honest marketplace preview. * * Static, server-rendered browser frame showing what a template card looks * like. Card data mirrors the first-party starter templates — names, author * and tool counts only. No fork counts, no "verified" badges: the frame is * explicitly labelled a preview, not live marketplace traffic. */ function MarketplacePreview() { return (
{/* Browser chrome */}
buildmymcpserver.com/templates
{/* Toolbar inside the page chrome */}
Templates preview
{/* Template cards grid */}
{PREVIEW_TEMPLATES.map((t) => (
{t.name}
{t.author} template
{t.tools} tools
))}
); }