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 { StaticCodeBlock } from '@/components/static-code-block'; import { FAQ, faqJsonLd } from '@/lib/seo'; import { ChevronDown } from 'lucide-react'; import type { ComponentType } from 'react'; import Link from 'next/link'; const PROMPT_EXAMPLE = `Create an MCP server that searches our Notion workspace. Tools: search_pages, get_page_content. Auth: NOTION_API_KEY.`; const OUTPUT_EXAMPLE = `> Generating spec... OK (2 tools) > Static checks OK > Building image bmm-mcp-notion OK 17.2s > Deploying container OK > Live at https://notion-x9.mcp.buildmymcpserver.com > First request: 401 → token → 200 OK`; const INSTALL_SNIPPET = `{ "mcpServers": { "notion": { "url": "https://notion-x9.mcp.buildmymcpserver.com/mcp", "auth": "oauth2" } } }`; 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' }, ]; interface ClientEntry { name: string; /** Single-character mark for inline visual identity. */ mark: string; } const CLIENTS: ClientEntry[] = [ { name: 'Claude Desktop', mark: 'C' }, { name: 'Cursor', mark: '⌘' }, { name: 'ChatGPT', mark: '✦' }, { name: 'VS Code Copilot', mark: '<>' }, { name: 'Continue.dev', mark: '→' }, ]; interface MockTemplate { name: string; author: string; tools: number; forks: number; verified: boolean; } const MOCK_TEMPLATES: MockTemplate[] = [ { name: 'notion-search', author: 'core', tools: 2, forks: 247, verified: true }, { name: 'github-issues', author: 'core', tools: 3, forks: 89, verified: true }, { name: 'stripe-readonly', author: 'core', tools: 4, forks: 156, verified: true }, { name: 'linear-tasks', author: 'community', tools: 5, forks: 34, verified: false }, ]; 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: 'Ranked by real usage', d: 'Templates rise on fork count and active deploys, not vanity stars. The useful ones surface themselves.', }, ]; const TIERS = [ { name: 'Hobby', price: '€0', tag: 'Forever free', features: ['1 server', '100k calls/mo', 'BMM subdomain', 'Community support'], }, { name: 'Pro', price: '€49', tag: '/ month', features: [ '5 servers', '1M calls/mo', 'Custom domain', 'Priority build queue', 'Email support', ], }, { name: 'Team', price: '€149', tag: '/ month', features: ['25 servers', '10M calls/mo', 'RBAC + audit log', 'SLA 99.9%', 'Slack support'], }, { name: 'Enterprise', price: '€499+', tag: '/ month', features: ['Unlimited', 'BYOC', 'SSO / SAML', 'Dedicated cluster', 'Customer success'], }, ]; export default function Landing() { return ( <> {/* Hero — left: copy + CTAs, right: cycling step-rotator tile. The old layout stacked three static code blocks vertically; the new layout shows one centered tile that cycles through the same three artifacts (prompt → build.log → claude config) with a mouse-reactive 3D tilt and a step indicator. Shorter overall so the video section below is teased above the fold. */}
{/* WebGL particle field — capability-detected client component. Sits behind the hero content at z-0 with pointer-events:none so the CTAs above remain fully interactive. The canvas listens for pointermove on window itself, so the ring still tracks the cursor through the content above. With the hero now filling the full first-viewport (minus the 48px sticky nav), the field has cinematic-scale room and the indigo radial glow + dot mask read as the dominant background motif. */}
v0.1 · updated 2026-05-20

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

From prompt to production MCP server in 60 seconds. OAuth 2.1, Streamable HTTP, ready for Claude, Cursor and ChatGPT.

Start building free Read the docs
OAuth 2.1 + PKCE Streamable HTTP AES-256 secrets Per-server isolation
{/* Scroll cue — fixed at the bottom of the loadscreen rather than inside the hero, so it sits at the natural lower edge of the first viewport regardless of how tall the hero ends up. Fades out once the user has scrolled past the loadscreen. */} {/* Flow video — full-width edge-to-edge under the hero. The clip shows the real flow (prompt → server schematic → live connection to Claude Desktop) in three smooth phases. autoplay-muted-loop + playsInline satisfies every mobile browser autoplay policy; the `poster` carries first paint while the video decodes. */}
{/* HeroVideo: native
{/* How it works */}

How it works

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

{/* The same video used to live here; it now has its own full-width section directly under the hero so it's teased above the fold and gets edge-to-edge real estate. This section keeps the three explanatory cards as supporting copy under the video. */}
{[ { 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.', }, ].map((s) => (
{s.n}

{s.t}

{s.d}

))}
{/* ── Clients · trust-signal row ───────────────────────────────── Archetype: typographic logo row. No panels, no bullets, just well-spaced word-marks with a small symbolic mark. The whole section breathes — generous py — so it reads as a moment of trust, not a feature card. */}

Connects everywhere your AI lives

{CLIENTS.map((c) => (
{c.mark} {c.name}
))}
{/* ── Examples · integration grid with brand-coloured marks ────── Archetype: 2-col header (title left, supporting copy right) + asymmetric 3-col card grid where each card carries a coloured square brand mark for the service. The marks give each card its own visual identity, breaking the "every card looks the same" pattern of the previous version. */}

Use cases

Wrap any HTTP API.
In minutes.

Real integrations our customers ship today. Built from one prompt each.

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

{e.title}

{e.desc}

); })}
{/* ── Marketplace · two-column with product preview ────────────── Archetype: split layout. Left column carries the headline, three bullet-form selling points, and the CTA. Right column carries a mock browser frame containing real-looking template cards — so the visitor SEES the marketplace, not just reads a description of it. */}
{/* Left — text + points + CTA */}

Marketplace

Skip the prompt.
Fork what works.

The marketplace is a library of working MCP servers the community already built. 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 →
{/* Right — mock marketplace browser frame */}
{/* ── Pricing · 4 cards with Pro highlighted as recommended ───── Archetype: centred header + 4-card row where the Pro tier is visually distinct (accent border, indigo glow shadow, floating "recommended" pill, slightly elevated). Other tiers stay calm so the eye lands on Pro first. Big price typography (text- [40px]) replaces the previous flat 26px. */}

Pricing

Pay for tool calls.
Not for boilerplate.

{TIERS.map((t) => { const featured = t.name === 'Pro'; return (
{featured && ( Recommended )}
{t.name}
{t.price} {t.tag}
    {t.features.map((f) => (
  • {f}
  • ))}
); })}
{/* FAQ — collapsible accordion using native
. Crawlers and screen readers still see the full Q+A in the HTML; users see one question at a time and expand on demand. No JS, no state, semantically correct. `list-none` + the WebKit-marker pseudo-class suppress the default disclosure triangle so we can render our own chevron that rotates via `group-open`. */}

FAQ

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

{f.a}

))}
); } /** * Mock marketplace preview. * * Static, server-rendered. Renders a faux-browser frame containing four * realistic template cards so the visitor sees what the marketplace * actually looks like rather than reading marketing copy about it. * * The card data lives in `MOCK_TEMPLATES` at the top of this file — * those are real template-flavoured names, modest fork counts, and the * `core` / `community` author tag. Numbers are deliberately small and * truthful-looking for a young marketplace; nothing here pretends to be * GitHub-trending traffic. */ function MarketplaceMock() { return (
{/* Browser chrome */}
buildmymcpserver.com/templates
{/* Toolbar inside the page chrome */}
Templates · {MOCK_TEMPLATES.length} live
trending
{/* Template cards grid */}
{MOCK_TEMPLATES.map((t) => (
{t.name}
{t.author} {t.verified && ( ✓ verified )}
{t.tools} tools {t.forks}
))}
); } function ForkGlyph() { return ( ); }