diff --git a/apps/web/app/(marketing)/page.tsx b/apps/web/app/(marketing)/page.tsx index 9c75b4d..40a2894 100644 --- a/apps/web/app/(marketing)/page.tsx +++ b/apps/web/app/(marketing)/page.tsx @@ -29,13 +29,53 @@ const INSTALL_SNIPPET = `{ } }`; -const EXAMPLES: { title: string; desc: string }[] = [ - { title: 'Postgres reader', desc: 'Read-only access to your tables with schema introspection.' }, - { title: 'Salesforce', desc: 'Query opportunities, accounts and leads from Claude.' }, - { title: 'Notion', desc: 'Search pages, read content, append blocks.' }, - { title: 'GitHub', desc: 'List issues, search code, post comments — scoped to one repo.' }, - { title: 'Stripe', desc: 'Look up charges, customers, refunds (read-only by default).' }, - { title: 'Custom REST', desc: 'Wrap any HTTP API behind one prompt-defined tool surface.' }, +interface ExampleEntry { + title: string; + desc: string; + /** Single-character or short symbol shown in the brand-colored mark. */ + mark: string; + /** Brand background colour for the mark. */ + bg: string; + /** Foreground colour of the mark glyph. */ + fg: string; +} + +const EXAMPLES: ExampleEntry[] = [ + { title: 'Postgres', desc: 'Read-only access to your tables with schema introspection.', mark: 'P', bg: '#336791', fg: '#ffffff' }, + { title: 'Salesforce', desc: 'Query opportunities, accounts and leads from Claude.', mark: 'S', bg: '#00a1e0', fg: '#ffffff' }, + { title: 'Notion', desc: 'Search pages, read content, append blocks.', mark: 'N', bg: '#ffffff', fg: '#0a0a0b' }, + { title: 'GitHub', desc: 'List issues, search code, post comments — scoped to one repo.', mark: 'G', bg: '#181717', fg: '#ffffff' }, + { title: 'Stripe', desc: 'Look up charges, customers, refunds (read-only by default).', mark: 'S', bg: '#635bff', fg: '#ffffff' }, + { title: 'Custom REST', desc: 'Wrap any HTTP API behind one prompt-defined tool surface.', mark: '{}', 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 }[] = [ @@ -237,110 +277,219 @@ export default function Landing() { - {/* Works with */} -
+ {/* ── 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. */} +
-

- Works with the clients you already use -

-
- {['Claude Desktop', 'Cursor', 'ChatGPT', 'VS Code Copilot', 'Continue.dev'].map((t) => ( - - - {t} - +

+ Connects everywhere your AI lives +

+
+ {CLIENTS.map((c) => ( +
+ + {c.mark} + + + {c.name} + +
))}
- {/* Examples */} -
+ {/* ── 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. */} +
-
-

- Built for the work you actually have -

-

- Anything with an HTTP API or a database, in minutes. +

+
+

+ Use cases +

+

+ Wrap any HTTP API. +
+ In minutes. +

+
+

+ Real integrations our customers ship today — built from one prompt each.

-
+ +
{EXAMPLES.map((e) => (
-
{e.title}
-

- {e.desc} -

+
1 ? 16 : 20, + }} + > + {e.mark} +
+
+

{e.title}

+

+ {e.desc} +

+
))}
- {/* Marketplace */} -
-
-
-
-

- Start from a template, ship in seconds -

-

- The marketplace is a library of working MCP servers the community already built. - Fork one to skip the prompt — or publish your own and let others build on 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 → - -
-
- {MARKETPLACE_POINTS.map((p) => ( -
-

{p.t}

-

{p.d}

-
- ))} +
+ + {/* Right — mock marketplace browser frame */} +
- {/* Pricing */} -
+ {/* ── 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. +

+

+ Pricing

+

+ Pay for tool calls. +
+ Not for boilerplate. +

-
- {TIERS.map((t, i) => ( -
-
- {t.name} + +
+ {TIERS.map((t) => { + const featured = t.name === 'Pro'; + return ( +
+ {featured && ( + + Recommended + + )} + +
+
+ {t.name} +
+
+ + {t.price} + + {t.tag} +
+
+ +
    + {t.features.map((f) => ( +
  • + + {f} +
  • + ))} +
-
- {t.price} - {t.tag} -
-
    - {t.features.map((f) => ( -
  • — {f}
  • - ))} -
-
- ))} + ); + })}
@@ -379,3 +528,105 @@ export default function Landing() { ); } + +/** + * 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 ( + + + + + + + + ); +}