Skip to content

MillPond Storefront

The reference implementation of the PACE Pattern.


Overview

MillPond is the first and most complete implementation of PACE. It's a conversational storefront for MCP servers featuring Cormorant, an AI guide that helps users discover products through natural dialogue.

Live Demo: millpond.cormorantforaging.devSource Code: GitHub


Key Features

1. Conversational Guide

Meet Cormorant - your AI guide inspired by the diving waterbird.

Greeting:

"Welcome to the pond. What are you fishing for?"

Conversation Example:

User: "I need something for database work"

Cormorant: "For database work, I'd recommend:

1. SQL MCP — Query databases with natural language
2. Schema Explorer — Visual database browsing
3. Query Builder — Interactive SQL generation

Which sounds most useful?"

User: "Tell me more about SQL MCP"

Cormorant: "SQL MCP connects Claude to your database.
You can ask questions like 'Show me users who signed up last week'
and it generates the SQL query for you.

[Try it] [View docs] [See examples]"

2. Adaptive Intelligence

Cormorant adjusts responses based on user expertise:

Beginner User:

User: "What's an MCP server?"

Cormorant: "Great question! Think of MCP servers like plugins for Claude.
They let Claude connect to tools like databases, APIs, or file systems."

Advanced User:

User: "Does SQL MCP support stdio transport?"

Cormorant: "Yes — SQL MCP implements the MCP protocol spec:
- stdio transport (default)
- JSON-RPC 2.0 message format
- Supports tools, resources, and prompts"

3. Executive Summary

Real-time tracking of the conversation:

Conversation Summary
User is exploring database tools. Technical background.
Focused on SQL integration.

Products Discussed
✅ SQL MCP — Primary interest
🔍 Schema Explorer — Mentioned
⏭️  Query Builder — Deferred

Detected Interests
#database #sql #mcp-servers #postgresql

Expertise Level
Advanced — User mentioned "JSON-RPC", "stdio transport"

Suggested Next Steps
- [Try SQL MCP →]
- [View documentation →]
- [Compare with Query Builder →]

Architecture

Tech Stack

Frontend:
- PACE.js (15KB)
- Alpine.js (for reactivity)
- Marked.js (markdown rendering)

AI:
- Claude 3.5 Sonnet (via Anthropic API)

Styling:
- Custom CSS (purple gradient theme)
- Phosphor Icons

Hosting:
- Cloudflare Pages
- Custom domain: millpond.cormorantforaging.dev

File Structure

millpond-storefront/
├── public/
│   ├── index.html           # Main app (Alpine.js + PACE.js)
│   ├── products.json        # 5 MCP server products
│   └── cormorant-prompt.md  # System prompt for Claude
├── package.json
└── README.md

Key Implementation Details

1. Alpine.js Integration

javascript
<div x-data="paceApp()">
  <!-- Product Catalog -->
  <div x-show="activeView === 'product'" x-cloak>
    <template x-for="product in filteredProducts" :key="product.id">
      <!-- Product cards -->
    </template>
  </div>

  <!-- Chat Widget -->
  <div x-show="activeView === 'chat'" x-cloak>
    <template x-for="message in chatHistory" :key="message.timestamp">
      <!-- Chat messages -->
    </template>
  </div>
</div>

2. Claude Integration

javascript
async function sendMessage(userMessage) {
  const response = await fetch('https://api.anthropic.com/v1/messages', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'x-api-key': CLAUDE_API_KEY,
      'anthropic-version': '2023-06-01'
    },
    body: JSON.stringify({
      model: 'claude-3-5-sonnet-20241022',
      max_tokens: 1024,
      system: systemPrompt,
      messages: conversationHistory
    })
  })

  const data = await response.json()
  return data.content[0].text
}

3. System Prompt

markdown
You are Cormorant, a guide implementing the PACE Pattern.

## Your Role
Help users find the right MCP server for their needs.

## PACE Principles
- Proactive: Suggest products without being asked
- Adaptive: Match user's technical level
- Contextual: Remember previous messages
- Efficient: Be concise and actionable

## Available Products
${JSON.stringify(products, null, 2)}

## Examples
Beginner: "Think of MCP servers like plugins..."
Expert: "Implements JSON-RPC 2.0 over stdio..."

Products

MillPond features 5 MCP servers:

1. SQL MCP

Category: Database Tools Tagline: Query databases with natural language

2. GitHub MCP

Category: Developer Tools Tagline: Interact with GitHub repositories

3. Filesystem MCP

Category: System Tools Tagline: Safe file operations through Claude

4. API MCP

Category: Integration Tagline: Connect to REST APIs

5. Analytics MCP

Category: Data & Analytics Tagline: Query analytics platforms


Design Philosophy

Purple Gradient Theme

Inspired by cormorant feathers and sunset reflections on water:

css
:root {
  --primary: #667eea;
  --accent: #764ba2;
  --gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}

Typography

css
font-family: Inter, system-ui, sans-serif;

Clean, readable, modern.

Icons

Phosphor Icons (duotone style):

  • Product: ph-package
  • About: ph-info
  • Chat: ph-chat-circle-dots
  • Summary: ph-target

User Journey

1. Landing

User arrives at millpond.cormorantforaging.dev

Sees:

  • Purple gradient sidebar
  • Product catalog (default view)
  • 5 MCP servers grouped by category
  • Search bar

2. Exploration

Option A: Browse Products

  • Click product cards
  • Read markdown descriptions
  • Click "Install" or "Get Started"

Option B: Use Chat

  • Click Chat in sidebar
  • Cormorant greets: "Welcome to the pond..."
  • Ask questions in natural language

3. Discovery

Through Chat:

User: "I'm new to MCP, where should I start?"

Cormorant: "Welcome! For beginners, I recommend:

1. Filesystem MCP — Simple file operations
2. GitHub MCP — If you use GitHub daily
3. SQL MCP — If you work with databases

What kind of work do you do?"

4. Decision

Product Recommendation:

User: "I'm a developer working with PostgreSQL"

Cormorant: "Perfect! SQL MCP is ideal for you:

✅ Native PostgreSQL support
✅ Natural language queries
✅ Safe read-only mode
✅ Query result formatting

[Install SQL MCP →]

5. Conversion

  • Click install button
  • Redirected to GitHub repo
  • Follow installation instructions

Metrics

Performance

Bundle size: ~50KB total
- PACE.js: 15KB
- Alpine.js: 20KB
- Marked.js: 15KB

Load time: < 1s on 3G
Time to interactive: < 500ms
Lighthouse score: 95+

User Engagement

Example metrics (actual implementation would track):

Avg session time: 3.5 minutes
Products viewed per session: 2.3
Chat messages per session: 4.2
Conversion rate: 18%

Code Highlights

Product Card Rendering

javascript
function renderProduct(product) {
  return `
    <div class="product-card" data-product-id="${product.id}">
      <h3>${product.name}</h3>
      <p class="tagline">${product.tagline}</p>
      <div class="description">
        ${marked.parse(product.description)}
      </div>
      <a href="${product.action_url}" class="action-btn">
        ${product.action_label || 'Learn More'}
      </a>
    </div>
  `
}

Search Implementation

javascript
function searchProducts(query) {
  if (!query) return products

  const lowerQuery = query.toLowerCase()
  return products.filter(product =>
    product.name.toLowerCase().includes(lowerQuery) ||
    product.tagline.toLowerCase().includes(lowerQuery) ||
    product.description.toLowerCase().includes(lowerQuery)
  )
}

Executive Summary Update

javascript
function updateExecutiveSummary() {
  const summary = {
    conversationSummary: generateSummary(chatHistory),
    productsDiscussed: getDiscussedProducts(chatHistory),
    userExpertise: detectExpertise(chatHistory),
    suggestedNextSteps: generateSuggestions()
  }

  Alpine.store('executiveSummary', summary)
}

Deployment

Cloudflare Pages

bash
# Build
npm run build

# Deploy
wrangler pages deploy public

Custom Domain

Domain: millpond.cormorantforaging.dev
SSL: Automatic (Cloudflare)
CDN: Global (Cloudflare)

Lessons Learned

What Worked Well

AI as guide - Users prefer conversation over browsing ✅ Adaptive responses - Matching expertise level increases engagement ✅ Executive summary - Users like seeing conversation progress ✅ Purple gradient - Distinctive, memorable branding ✅ Simple stack - Alpine.js + PACE.js = fast, lightweight

What We'd Improve

🔄 Add streaming - Real-time AI responses (character by character) 🔄 Persist chat - Save conversation history in localStorage 🔄 Add voice - Voice input for mobile users 🔄 Multi-language - i18n support 🔄 A/B testing - Different greeting variations


Try It Yourself

Run Locally

bash
git clone https://github.com/semanticintent/millpond-storefront.git
cd millpond-storefront
npm install
npm run dev

Open http://localhost:5173

Customize

  1. Change Products: Edit public/products.json
  2. Change Theme: Edit CSS variables in public/index.html
  3. Change AI: Update system prompt in public/cormorant-prompt.md
  4. Change Greeting: Update greeting text

Resources


MillPond: Where PACE meets production. 🐦✨