loading…
Search for a command to run...
loading…
Multi-framework MCP server that enables AI to generate clean, semantic CSS class names (e.g., btn-primary) instead of verbose utility strings, with support for
Multi-framework MCP server that enables AI to generate clean, semantic CSS class names (e.g., btn-primary) instead of verbose utility strings, with support for Tailwind, Bootstrap, UnoCSS, Tachyons, SSR safety, and minification for token savings.
Multi-Framework MCP Server for AI-Optimized CSS Generation
Stop wasting tokens on long utility class strings. Let AI generate code with semantic class names like btn-primary and card - with full SSR safety awareness and optional minification.
Supports Tailwind CSS, Bootstrap 5, UnoCSS, and Tachyons.
When AI generates utility-first CSS code, it creates verbose class strings:
<button class="inline-flex items-center justify-center px-4 py-2 bg-blue-600 text-white text-sm font-medium rounded-lg hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors">
Click me
</button>
This wastes:
classmcp provides semantic class names to AI assistants:
<!-- Semantic -->
<button class="btn-primary">Click me</button>
<!-- Or ultra-minified for maximum savings -->
<button class="a">Click me</button>
The AI queries available patterns, uses short names, and you get clean, readable code that's SSR-safe.
Add to your claude_desktop_config.json:
{
"mcpServers": {
"classmcp": {
"command": "npx",
"args": ["classmcp"]
}
}
}
npx classmcp
Switch between CSS frameworks instantly:
set_framework: "tailwind" # Default
set_framework: "bootstrap" # Bootstrap 5
set_framework: "unocss" # UnoCSS
set_framework: "tachyons" # Tachyons
Every pattern is marked for server-side rendering compatibility:
get_ssr_info: "modal-overlay"
→ Status: ⚠️ Requires Client JS
→ Warning: Modal visibility controlled by JS
→ Recommendations: Use useEffect to add client-only classes
Filter for SSR-safe patterns only:
list_classes: { ssrSafeOnly: true }
Generate ultra-short class names for maximum token savings:
get_class: { name: "btn-primary", minified: true }
→ Class: "a" (saves 11 chars per usage)
Define your own semantic class names by creating a .classmcp.json file in your project root:
Simple format:
{
"customPatterns": [
{ "id": "brand-btn", "classes": "px-4 py-2 bg-brand-600 text-white rounded-lg font-semibold" },
{ "id": "pricing-card", "classes": "p-8 border-2 border-gray-100 rounded-2xl shadow-xl" }
]
}
With states and metadata:
{
"customPatterns": [
{
"id": "brand-btn",
"category": "buttons",
"description": "Brand-colored primary button",
"classes": {
"base": "px-4 py-2 bg-brand-600 text-white rounded-lg font-semibold",
"hover": "hover:bg-brand-700 hover:shadow-md",
"focus": "focus:ring-2 focus:ring-brand-300"
}
}
],
"overrideBuiltins": false,
"defaultFramework": "tailwind"
}
Config options:
| Option | Description |
|---|---|
customPatterns |
Array of custom pattern definitions |
overrideBuiltins |
If true, custom patterns replace built-ins with same ID |
defaultFramework |
Default framework to use (tailwind, bootstrap, unocss, tachyons) |
Pattern options:
| Field | Required | Description |
|---|---|---|
id |
Yes | Unique identifier (e.g., "brand-btn") |
classes |
Yes | CSS classes (string or state object with base/hover/focus/active/disabled) |
category |
No | Category for organization (defaults to "custom") |
name |
No | Human-readable name (defaults to id) |
description |
No | Description of when to use |
frameworks |
No | Limit to specific frameworks (e.g., ["tailwind"]) |
ssr.safe |
No | Whether pattern is SSR-safe |
Alternative config locations:
.classmcp.json (recommended)classmcp.config.jsonpackage.json under "classmcp" keyAfter modifying your config, use the reload_config tool to apply changes without restarting.
| Tool | Description |
|---|---|
set_framework |
Set CSS framework (tailwind, bootstrap, unocss, tachyons) |
get_class |
Get utility classes for a semantic name |
list_classes |
List available classes (filter by category, SSR-safe) |
search_classes |
Search for classes by name or description |
generate_css |
Generate CSS file with all class definitions |
get_component |
Get complete HTML component examples |
get_ssr_info |
Check SSR/hydration safety for a pattern |
list_frameworks |
List all available frameworks with statistics |
reload_config |
Reload custom patterns from config file |
list_custom_patterns |
List all user-defined custom patterns |
Ask Claude:
"Create a card with a user profile, showing avatar, name, email, and action buttons"
Claude will use classmcp to generate:
<div class="card">
<div class="flex-start space-x-4">
<div class="avatar-lg">JD</div>
<div class="stack">
<h3 class="heading-sm">John Doe</h3>
<p class="text-muted">[email protected]</p>
</div>
</div>
<div class="card-footer">
<button class="btn-primary">Message</button>
<button class="btn-secondary">Profile</button>
</div>
</div>
# Ask Claude to use the generate_css tool, or:
npx classmcp generate-css > src/classmcp.css
Tailwind:
@import "tailwindcss";
@import "./classmcp.css";
Bootstrap:
@import "bootstrap/dist/css/bootstrap.min.css";
@import "./classmcp.css";
| Component | Without classmcp | With classmcp | Minified | Savings |
|---|---|---|---|---|
| Button | 180 chars | 12 chars | 1 char | 99% |
| Card | 85 chars | 5 chars | 1 char | 99% |
| Input | 145 chars | 6 chars | 1 char | 99% |
| Modal | 200+ chars | 12 chars | 1 char | 99% |
Over a full page with 50+ components, this adds up to thousands of tokens saved.
modal-overlay - visibility needs JStoggle - checked statespinner - animation timingalert-dismissible - close buttonUse ssrSafeOnly: true or check with get_ssr_info when building Next.js/Nuxt/Remix apps.
| Framework | Patterns | SSR-Safe | Categories |
|---|---|---|---|
| Tailwind CSS | 70+ | 65+ | 14 |
| Bootstrap 5 | 70+ | 65+ | 14 |
| UnoCSS | 70+ | 65+ | 14 |
| Tachyons | 70+ | 65+ | 14 |
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Claude │────▶│ classmcp │────▶│ Your Code │
│ │ │ (MCP) │ │ │
│ "Make a │ │ │ │ <button │
│ button" │ │ get_class │ │ class= │
│ │◀────│ btn-primary │ │ "btn- │
│ │ │ (SSR-safe) │ │ primary"> │
└─────────────┘ └─────────────┘ └─────────────┘
They're complementary:
MIT
Run in your terminal:
claude mcp add classmcp -- npx Security
Low riskAutomated heuristic from public metadata — not a security guarantee.