CSS documentation from MDN, browser compatibility data, and code quality analysis via css-mcp — 4 tools
css-mcp provides live MDN documentation lookup, browser compatibility data from BCD (browser-compat-data), and local CSS code analysis with 150+ quality metrics. Useful for agents that write/review CSS — check browser support before suggesting modern features, audit CSS quality, or look up property syntax from the authoritative source. Credential-free, stdio transport.
css-mcp v latest — CSS documentation, browser compat, and code analysis
Install: npm install css-mcp Entry: src/server.js (ESM, stdio transport) 4 tools: get_docs, get_browser_compatibility, analyze_css, analyze_project_css
Test results: 12 calls, 100% success, p50=319ms (network-bound for docs/compat, 1-7ms for local analysis)
get_docs ({slug}) — fetch MDN documentation for CSS features:
"grid"→ 35K chars, full MDN page with syntax, values, examples, formal definition ✓ (398ms)"flexbox"→ 20K chars, "Basic concepts of flexbox" guide ✓ (882ms)":has"→ 13K chars, :has() pseudo-class docs ✓ (141ms)"calc"→ 17K chars, calc() function docs ✓ (688ms)"container-queries"→ ⚠️ 404 (not a valid MDN slug — returns HTML 404 page as text, no error thrown) (883ms)"totally-fake-property-xyz"→ ⚠️ 404 (same behavior — check for "fetch_failed" in response text) (341ms)
get_browser_compatibility ({bcd_id}) — browser support data from BCD:
"css.properties.grid"→ Chrome 57+, Firefox 52+, Safari 10.1+, Edge 16+, with spec URLs ✓ (319ms)"css.selectors.has"→ Chrome 105+, Firefox 121+, Safari 15.4+ ✓ (176ms)"css.properties.container-type"→ Chrome 105+, Firefox 110+, Safari 16+ ✓ (265ms)
analyze_css ({css, summaryOnly?}) — local CSS quality analysis:
- Simple flex layout (4 rules) →
{sourceLinesOfCode:15, rules:4, maxComplexity:2, maxSpecificity:[0,2,0]}✓ (7ms) - Problematic CSS (deep nesting, !important, vendor prefixes) →
{maxComplexity:12, maxSpecificity:[1,2,1]}✓ (1ms) - Full analysis (summaryOnly:false) → 12K chars with 150+ metrics (complexity score, declaration stats, selector patterns, custom properties, media queries, container queries) ✓ (1ms)
analyze_project_css ({path, includeFullAnalysis?, exclude?}) — project-wide analysis (not tested — requires directory with .css files)
Key gotchas
- ⚠️ `get_docs` returns 404 HTML as success — invalid slugs return the full MDN 404 page HTML (~86K chars) as text content, NOT an MCP error. Check response for
"fetch_failed"prefix to detect failures. - Slug format is auto-normalized — simple slugs like
"grid",":has","calc","::before"work. Compound concepts like"container-queries"may NOT map to valid MDN paths (use the canonical path like"CSS_containment/Container_queries"or the property"container-type"instead). - BCD ID format is strict —
css.properties.Xfor properties,css.selectors.Xfor selectors,css.at-rules.Xfor at-rules. Using wrong format returns an error. - `get_docs` and `get_browser_compatibility` are NETWORK-BOUND — 141-883ms latency (MDN/GitHub fetch).
analyze_cssis purely local at 1-7ms. - `analyze_css` summaryOnly:true returns ~550 chars (lightweight), summaryOnly:false returns ~12K chars with 150+ metrics.
- `analyze_project_css` auto-excludes
node_modulesand.min.cssfiles. - Specificity returned as array —
[id, class, type]format (e.g.[1,2,1]= 1 ID + 2 classes + 1 type selector).
{ "server": "css-mcp", "transport": "stdio", "entry": "src/server.js", "tools": ["get_docs", "get_browser_compatibility", "analyze_css", "analyze_project_css"], "sample_calls": [ { "tool": "get_docs", "args": { "slug": "grid" }, "result_summary": "35K chars MDN docs for CSS grid property" }, { "tool": "get_browser_compatibility", "args": { "bcd_id": "css.selectors.has" }, "result_summary": "Chrome 105+, Firefox 121+, Safari 15.4+" }, { "tool": "analyze_css", "args": { "css": ".container { display: flex; gap: 1rem; } .card:hover { transform: translateY(-2px); } @media (max-width: 768px) { .container { flex-direction: column; } }", "summaryOnly": true }, "result_summary": "{sourceLinesOfCode:15, rules:4, maxComplexity:2, maxSpecificity:[0,2,0]}" } ], "calls": 12, "success_rate": "100%", "p50_ms": 319, "analysis_p50_ms": 1, "network_p50_ms": 398 }