Repository files navigation

 _ ______
| | | ____|
| | __ _ | |__ ___ _ __ __ _ ___
| | / _` | | __/ _ \| '__/ _` |/ _ \
| |___| (_| | | | | (_) | | | (_| | __/
|______\__,_| |_| \___/|_| \__, |\___|
__/ |
|___/ MCP

░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░


A Model Context Protocol (MCP) server that gives AI coding assistants the visual perception they lack.

The Problem

When AI coding assistants (like Claude Code) work on CSS/HTML:

  • They can see the code, but can't truly "see" the rendered result
  • Screenshots are interpreted semantically, not pixel-precisely
  • CSS inheritance and cascade can cause unexpected results invisible in source code
  • A black screen might be reported as "looks good" because there's nothing to semantically parse

The Solution

┌─ VISOR ONLINE ──────────────────────────────────────────────────────────┐
│ │
│ ◉ Pixel-level diffing Catches ANY visual difference │
│ ◉ Computed style extraction See what CSS is ACTUALLY applied │
│ ◉ CSS rule chain analysis Find which rules override your styles │
│ ◉ Problem region detection Automatically identify differing areas │
│ │
└─────────────────────────────────────────────────────────────────────────┘

Quick Install

One-Liner (macOS/Linux)

curl -fsSL https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.sh | bash

One-Liner (Windows PowerShell)

irm https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.ps1| iex

Manual Install

# Clone the repo
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git ~/.la-forge-mcp
cd~/.la-forge-mcp
# Run installer
chmod +x install.sh
./install.sh

Requirements

  • Node.js 18+
  • Claude Code CLI (claude command)
  • Google Chrome or Chromium

Quick Start

1. Start Chrome and Navigate to Your App

start_chrome("http://localhost:3000")

2. Capture a Reference (When Things Look Right)

capture_reference("homepage", selectors=[".header", ".nav", ".hero", ".footer"])

3. Make Your CSS Changes

Edit your code as normal...

4. Verify Against Reference

verify_against_reference("homepage")

Returns a detailed report:

{
"passed": false,
"summary": {
"match_percentage": 94.2,
"problem_region_count": 2
},
"problem_areas": [{
"region": {"area": "top-center"},
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".header", "source": "component.css"},
{"selector": "header", "source": "reset.css"}
]
}],
"recommendation": "Check problem_areas for CSS rule conflicts."
}

Available Tools

Chrome Management

ToolDescription
start_chrome(url, port, headless)Start Chrome with debugging enabled
navigate(url)Navigate to a URL
check_connection()Verify Chrome connection status

Reference Management

ToolDescription
capture_reference(name, selectors, full_page)Save screenshot + computed styles as reference
list_references()List all saved references

Visual Verification

ToolDescription
verify_against_reference(name, threshold)Main tool — Compare current state against reference
quick_visual_check(url)Quick sanity check for black screens, loading states

Element Analysis

ToolDescription
get_element_debug_info(selector)Deep dive on element's computed styles + rule chain
compare_elements(selector, expected)Compare element against expected style values
screenshot_element(selector)Screenshot a single element

Example Debugging Session

User: "The header height seems wrong after my changes"
Claude: Let me check what's happening.
> verify_against_reference("homepage")
{
"passed": false,
"problem_areas": [{
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".main-header", "source": "header.css", "styles": "height: 64px"},
{"selector": "header", "source": "reset.css", "styles": "height: auto"}
]
}]
}
Claude: Found it! Your reset.css has `header { height: auto }` which is overriding `.main-header { height: 64px }`. The reset rule appears later in the cascade.
Fix options:
1. Increase specificity: `header.main-header { height: 64px }`
2. Use !important: `.main-header { height: 64px !important }`
3. Reorder stylesheet imports

Black Screen Detection

The quick_visual_check() tool programmatically detects rendering issues:

{
"healthy": false,
"issues": [
"Screen appears black/very dark",
"Page has no visible text content"
],
"metrics": {
"mean_brightness": 2.3,
"std_deviation": 1.1
}
}

No more "looks good" on a black screen!


CLAUDE.md Integration

For best results, add the snippet from CLAUDE_SNIPPET.md to your user-level CLAUDE.md:

# Find your Claude config location
claude config get
# Append the snippet
cat CLAUDE_SNIPPET.md >>~/.claude/CLAUDE.md

This teaches Claude Code when and how to use the visual debugging tools automatically.


Configuration

Environment Variables

VariableDescriptionDefault
CHROME_PATHPath to Chrome executableAuto-detected
CHROME_DEBUG_PORTPort for Chrome debugging9222

Setting Chrome Path

If Chrome isn't auto-detected:

# macOSexport CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"# Linux export CHROME_PATH="/usr/bin/google-chrome"# Windowsset CHROME_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"

How It Works

Pixel Diffing

Uses sharp to compare images pixel-by-pixel. Outputs a diff image with mismatched areas highlighted in magenta. Connected components analysis identifies distinct problem regions.

Computed Style Extraction

Uses Chrome DevTools Protocol to query window.getComputedStyle() for any element. Shows the actual applied values after CSS cascade, not just source file values.

CSS Rule Chain

Iterates through all stylesheets via CDP to find every rule matching an element. Shows source file, selector, and styles. Reveals which rule is "winning" for each property.


Troubleshooting

Server won't start

# Test directly
node ~/.la-forge-mcp/dist/index.js
# Should hang waiting for input (Ctrl+C to exit)# If errors appear, check Node version and run npm install

"Chrome not found"

Set CHROME_PATH environment variable or pass chrome_path to start_chrome().

"No Chrome instance found"

Start Chrome manually with debugging:

google-chrome --remote-debugging-port=9222

Or use start_chrome() tool which does this automatically.

Module import errors

Reinstall and rebuild:

cd~/.la-forge-mcp
npm install
npm run build

Claude Code shows "Failed to connect"

  1. Check registration: claude mcp get la-forge
  2. Test server manually (see above)
  3. Remove and re-add:
    claude mcp remove la-forge -s user
    claude mcp add la-forge node ~/.la-forge-mcp/dist/index.js -s user

Development

# Clone
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git
cd la-forge-mcp
# Install deps
npm install
# Development (with hot reload)
npm run dev
# Build
npm run build
# Run built version
npm start

Uninstall

# Remove from Claude Code
claude mcp remove la-forge -s user
# Remove files
rm -rf ~/.la-forge-mcp

License

MIT — see LICENSE


╔═══════════════════════════════════════════════════════════════════════════╗
║ ║
║ LA FORGE MCP ║
║ ║
║ ░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░ ║
║ ║
║ Made with ◉ by Monomyth Development ║
║ ║
╚═══════════════════════════════════════════════════════════════════════════╝

About

Visual CSS debugging for AI coding assistants — an MCP server for pixel-perfect screenshot comparison, computed-style extraction, and CSS rule-chain analysis.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

 _ ______
| | | ____|
| | __ _ | |__ ___ _ __ __ _ ___
| | / _` | | __/ _ \| '__/ _` |/ _ \
| |___| (_| | | | | (_) | | | (_| | __/
|______\__,_| |_| \___/|_| \__, |\___|
__/ |
|___/ MCP

░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░


A Model Context Protocol (MCP) server that gives AI coding assistants the visual perception they lack.

The Problem

When AI coding assistants (like Claude Code) work on CSS/HTML:

  • They can see the code, but can't truly "see" the rendered result
  • Screenshots are interpreted semantically, not pixel-precisely
  • CSS inheritance and cascade can cause unexpected results invisible in source code
  • A black screen might be reported as "looks good" because there's nothing to semantically parse

The Solution

┌─ VISOR ONLINE ──────────────────────────────────────────────────────────┐
│ │
│ ◉ Pixel-level diffing Catches ANY visual difference │
│ ◉ Computed style extraction See what CSS is ACTUALLY applied │
│ ◉ CSS rule chain analysis Find which rules override your styles │
│ ◉ Problem region detection Automatically identify differing areas │
│ │
└─────────────────────────────────────────────────────────────────────────┘

Quick Install

One-Liner (macOS/Linux)

curl -fsSL https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.sh | bash

One-Liner (Windows PowerShell)

irm https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.ps1| iex

Manual Install

# Clone the repo
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git ~/.la-forge-mcp
cd~/.la-forge-mcp
# Run installer
chmod +x install.sh
./install.sh

Requirements

  • Node.js 18+
  • Claude Code CLI (claude command)
  • Google Chrome or Chromium

Quick Start

1. Start Chrome and Navigate to Your App

start_chrome("http://localhost:3000")

2. Capture a Reference (When Things Look Right)

capture_reference("homepage", selectors=[".header", ".nav", ".hero", ".footer"])

3. Make Your CSS Changes

Edit your code as normal...

4. Verify Against Reference

verify_against_reference("homepage")

Returns a detailed report:

{
"passed": false,
"summary": {
"match_percentage": 94.2,
"problem_region_count": 2
},
"problem_areas": [{
"region": {"area": "top-center"},
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".header", "source": "component.css"},
{"selector": "header", "source": "reset.css"}
]
}],
"recommendation": "Check problem_areas for CSS rule conflicts."
}

Available Tools

Chrome Management

ToolDescription
start_chrome(url, port, headless)Start Chrome with debugging enabled
navigate(url)Navigate to a URL
check_connection()Verify Chrome connection status

Reference Management

ToolDescription
capture_reference(name, selectors, full_page)Save screenshot + computed styles as reference
list_references()List all saved references

Visual Verification

ToolDescription
verify_against_reference(name, threshold)Main tool — Compare current state against reference
quick_visual_check(url)Quick sanity check for black screens, loading states

Element Analysis

ToolDescription
get_element_debug_info(selector)Deep dive on element's computed styles + rule chain
compare_elements(selector, expected)Compare element against expected style values
screenshot_element(selector)Screenshot a single element

Example Debugging Session

User: "The header height seems wrong after my changes"
Claude: Let me check what's happening.
> verify_against_reference("homepage")
{
"passed": false,
"problem_areas": [{
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".main-header", "source": "header.css", "styles": "height: 64px"},
{"selector": "header", "source": "reset.css", "styles": "height: auto"}
]
}]
}
Claude: Found it! Your reset.css has `header { height: auto }` which is overriding `.main-header { height: 64px }`. The reset rule appears later in the cascade.
Fix options:
1. Increase specificity: `header.main-header { height: 64px }`
2. Use !important: `.main-header { height: 64px !important }`
3. Reorder stylesheet imports

Black Screen Detection

The quick_visual_check() tool programmatically detects rendering issues:

{
"healthy": false,
"issues": [
"Screen appears black/very dark",
"Page has no visible text content"
],
"metrics": {
"mean_brightness": 2.3,
"std_deviation": 1.1
}
}

No more "looks good" on a black screen!


CLAUDE.md Integration

For best results, add the snippet from CLAUDE_SNIPPET.md to your user-level CLAUDE.md:

# Find your Claude config location
claude config get
# Append the snippet
cat CLAUDE_SNIPPET.md >>~/.claude/CLAUDE.md

This teaches Claude Code when and how to use the visual debugging tools automatically.


Configuration

Environment Variables

VariableDescriptionDefault
CHROME_PATHPath to Chrome executableAuto-detected
CHROME_DEBUG_PORTPort for Chrome debugging9222

Setting Chrome Path

If Chrome isn't auto-detected:

# macOSexport CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"# Linux export CHROME_PATH="/usr/bin/google-chrome"# Windowsset CHROME_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"

How It Works

Pixel Diffing

Uses sharp to compare images pixel-by-pixel. Outputs a diff image with mismatched areas highlighted in magenta. Connected components analysis identifies distinct problem regions.

Computed Style Extraction

Uses Chrome DevTools Protocol to query window.getComputedStyle() for any element. Shows the actual applied values after CSS cascade, not just source file values.

CSS Rule Chain

Iterates through all stylesheets via CDP to find every rule matching an element. Shows source file, selector, and styles. Reveals which rule is "winning" for each property.


Troubleshooting

Server won't start

# Test directly
node ~/.la-forge-mcp/dist/index.js
# Should hang waiting for input (Ctrl+C to exit)# If errors appear, check Node version and run npm install

"Chrome not found"

Set CHROME_PATH environment variable or pass chrome_path to start_chrome().

"No Chrome instance found"

Start Chrome manually with debugging:

google-chrome --remote-debugging-port=9222

Or use start_chrome() tool which does this automatically.

Module import errors

Reinstall and rebuild:

cd~/.la-forge-mcp
npm install
npm run build

Claude Code shows "Failed to connect"

  1. Check registration: claude mcp get la-forge
  2. Test server manually (see above)
  3. Remove and re-add:
    claude mcp remove la-forge -s user
    claude mcp add la-forge node ~/.la-forge-mcp/dist/index.js -s user

Development

# Clone
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git
cd la-forge-mcp
# Install deps
npm install
# Development (with hot reload)
npm run dev
# Build
npm run build
# Run built version
npm start

Uninstall

# Remove from Claude Code
claude mcp remove la-forge -s user
# Remove files
rm -rf ~/.la-forge-mcp

License

MIT — see LICENSE


╔═══════════════════════════════════════════════════════════════════════════╗
║ ║
║ LA FORGE MCP ║
║ ║
║ ░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░ ║
║ ║
║ Made with ◉ by Monomyth Development ║
║ ║
╚═══════════════════════════════════════════════════════════════════════════╝

About

Visual CSS debugging for AI coding assistants — an MCP server for pixel-perfect screenshot comparison, computed-style extraction, and CSS rule-chain analysis.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

 _ ______
| | | ____|
| | __ _ | |__ ___ _ __ __ _ ___
| | / _` | | __/ _ \| '__/ _` |/ _ \
| |___| (_| | | | | (_) | | | (_| | __/
|______\__,_| |_| \___/|_| \__, |\___|
__/ |
|___/ MCP

░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░


A Model Context Protocol (MCP) server that gives AI coding assistants the visual perception they lack.

The Problem

When AI coding assistants (like Claude Code) work on CSS/HTML:

  • They can see the code, but can't truly "see" the rendered result
  • Screenshots are interpreted semantically, not pixel-precisely
  • CSS inheritance and cascade can cause unexpected results invisible in source code
  • A black screen might be reported as "looks good" because there's nothing to semantically parse

The Solution

┌─ VISOR ONLINE ──────────────────────────────────────────────────────────┐
│ │
│ ◉ Pixel-level diffing Catches ANY visual difference │
│ ◉ Computed style extraction See what CSS is ACTUALLY applied │
│ ◉ CSS rule chain analysis Find which rules override your styles │
│ ◉ Problem region detection Automatically identify differing areas │
│ │
└─────────────────────────────────────────────────────────────────────────┘

Quick Install

One-Liner (macOS/Linux)

curl -fsSL https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.sh | bash

One-Liner (Windows PowerShell)

irm https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.ps1| iex

Manual Install

# Clone the repo
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git ~/.la-forge-mcp
cd~/.la-forge-mcp
# Run installer
chmod +x install.sh
./install.sh

Requirements

  • Node.js 18+
  • Claude Code CLI (claude command)
  • Google Chrome or Chromium

Quick Start

1. Start Chrome and Navigate to Your App

start_chrome("http://localhost:3000")

2. Capture a Reference (When Things Look Right)

capture_reference("homepage", selectors=[".header", ".nav", ".hero", ".footer"])

3. Make Your CSS Changes

Edit your code as normal...

4. Verify Against Reference

verify_against_reference("homepage")

Returns a detailed report:

{
"passed": false,
"summary": {
"match_percentage": 94.2,
"problem_region_count": 2
},
"problem_areas": [{
"region": {"area": "top-center"},
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".header", "source": "component.css"},
{"selector": "header", "source": "reset.css"}
]
}],
"recommendation": "Check problem_areas for CSS rule conflicts."
}

Available Tools

Chrome Management

ToolDescription
start_chrome(url, port, headless)Start Chrome with debugging enabled
navigate(url)Navigate to a URL
check_connection()Verify Chrome connection status

Reference Management

ToolDescription
capture_reference(name, selectors, full_page)Save screenshot + computed styles as reference
list_references()List all saved references

Visual Verification

ToolDescription
verify_against_reference(name, threshold)Main tool — Compare current state against reference
quick_visual_check(url)Quick sanity check for black screens, loading states

Element Analysis

ToolDescription
get_element_debug_info(selector)Deep dive on element's computed styles + rule chain
compare_elements(selector, expected)Compare element against expected style values
screenshot_element(selector)Screenshot a single element

Example Debugging Session

User: "The header height seems wrong after my changes"
Claude: Let me check what's happening.
> verify_against_reference("homepage")
{
"passed": false,
"problem_areas": [{
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".main-header", "source": "header.css", "styles": "height: 64px"},
{"selector": "header", "source": "reset.css", "styles": "height: auto"}
]
}]
}
Claude: Found it! Your reset.css has `header { height: auto }` which is overriding `.main-header { height: 64px }`. The reset rule appears later in the cascade.
Fix options:
1. Increase specificity: `header.main-header { height: 64px }`
2. Use !important: `.main-header { height: 64px !important }`
3. Reorder stylesheet imports

Black Screen Detection

The quick_visual_check() tool programmatically detects rendering issues:

{
"healthy": false,
"issues": [
"Screen appears black/very dark",
"Page has no visible text content"
],
"metrics": {
"mean_brightness": 2.3,
"std_deviation": 1.1
}
}

No more "looks good" on a black screen!


CLAUDE.md Integration

For best results, add the snippet from CLAUDE_SNIPPET.md to your user-level CLAUDE.md:

# Find your Claude config location
claude config get
# Append the snippet
cat CLAUDE_SNIPPET.md >>~/.claude/CLAUDE.md

This teaches Claude Code when and how to use the visual debugging tools automatically.


Configuration

Environment Variables

VariableDescriptionDefault
CHROME_PATHPath to Chrome executableAuto-detected
CHROME_DEBUG_PORTPort for Chrome debugging9222

Setting Chrome Path

If Chrome isn't auto-detected:

# macOSexport CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"# Linux export CHROME_PATH="/usr/bin/google-chrome"# Windowsset CHROME_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"

How It Works

Pixel Diffing

Uses sharp to compare images pixel-by-pixel. Outputs a diff image with mismatched areas highlighted in magenta. Connected components analysis identifies distinct problem regions.

Computed Style Extraction

Uses Chrome DevTools Protocol to query window.getComputedStyle() for any element. Shows the actual applied values after CSS cascade, not just source file values.

CSS Rule Chain

Iterates through all stylesheets via CDP to find every rule matching an element. Shows source file, selector, and styles. Reveals which rule is "winning" for each property.


Troubleshooting

Server won't start

# Test directly
node ~/.la-forge-mcp/dist/index.js
# Should hang waiting for input (Ctrl+C to exit)# If errors appear, check Node version and run npm install

"Chrome not found"

Set CHROME_PATH environment variable or pass chrome_path to start_chrome().

"No Chrome instance found"

Start Chrome manually with debugging:

google-chrome --remote-debugging-port=9222

Or use start_chrome() tool which does this automatically.

Module import errors

Reinstall and rebuild:

cd~/.la-forge-mcp
npm install
npm run build

Claude Code shows "Failed to connect"

  1. Check registration: claude mcp get la-forge
  2. Test server manually (see above)
  3. Remove and re-add:
    claude mcp remove la-forge -s user
    claude mcp add la-forge node ~/.la-forge-mcp/dist/index.js -s user

Development

# Clone
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git
cd la-forge-mcp
# Install deps
npm install
# Development (with hot reload)
npm run dev
# Build
npm run build
# Run built version
npm start

Uninstall

# Remove from Claude Code
claude mcp remove la-forge -s user
# Remove files
rm -rf ~/.la-forge-mcp

License

MIT — see LICENSE


╔═══════════════════════════════════════════════════════════════════════════╗
║ ║
║ LA FORGE MCP ║
║ ║
║ ░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░ ║
║ ║
║ Made with ◉ by Monomyth Development ║
║ ║
╚═══════════════════════════════════════════════════════════════════════════╝

About

Visual CSS debugging for AI coding assistants — an MCP server for pixel-perfect screenshot comparison, computed-style extraction, and CSS rule-chain analysis.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

 _ ______
| | | ____|
| | __ _ | |__ ___ _ __ __ _ ___
| | / _` | | __/ _ \| '__/ _` |/ _ \
| |___| (_| | | | | (_) | | | (_| | __/
|______\__,_| |_| \___/|_| \__, |\___|
__/ |
|___/ MCP

░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░


A Model Context Protocol (MCP) server that gives AI coding assistants the visual perception they lack.

The Problem

When AI coding assistants (like Claude Code) work on CSS/HTML:

  • They can see the code, but can't truly "see" the rendered result
  • Screenshots are interpreted semantically, not pixel-precisely
  • CSS inheritance and cascade can cause unexpected results invisible in source code
  • A black screen might be reported as "looks good" because there's nothing to semantically parse

The Solution

┌─ VISOR ONLINE ──────────────────────────────────────────────────────────┐
│ │
│ ◉ Pixel-level diffing Catches ANY visual difference │
│ ◉ Computed style extraction See what CSS is ACTUALLY applied │
│ ◉ CSS rule chain analysis Find which rules override your styles │
│ ◉ Problem region detection Automatically identify differing areas │
│ │
└─────────────────────────────────────────────────────────────────────────┘

Quick Install

One-Liner (macOS/Linux)

curl -fsSL https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.sh | bash

One-Liner (Windows PowerShell)

irm https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.ps1| iex

Manual Install

# Clone the repo
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git ~/.la-forge-mcp
cd~/.la-forge-mcp
# Run installer
chmod +x install.sh
./install.sh

Requirements

  • Node.js 18+
  • Claude Code CLI (claude command)
  • Google Chrome or Chromium

Quick Start

1. Start Chrome and Navigate to Your App

start_chrome("http://localhost:3000")

2. Capture a Reference (When Things Look Right)

capture_reference("homepage", selectors=[".header", ".nav", ".hero", ".footer"])

3. Make Your CSS Changes

Edit your code as normal...

4. Verify Against Reference

verify_against_reference("homepage")

Returns a detailed report:

{
"passed": false,
"summary": {
"match_percentage": 94.2,
"problem_region_count": 2
},
"problem_areas": [{
"region": {"area": "top-center"},
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".header", "source": "component.css"},
{"selector": "header", "source": "reset.css"}
]
}],
"recommendation": "Check problem_areas for CSS rule conflicts."
}

Available Tools

Chrome Management

ToolDescription
start_chrome(url, port, headless)Start Chrome with debugging enabled
navigate(url)Navigate to a URL
check_connection()Verify Chrome connection status

Reference Management

ToolDescription
capture_reference(name, selectors, full_page)Save screenshot + computed styles as reference
list_references()List all saved references

Visual Verification

ToolDescription
verify_against_reference(name, threshold)Main tool — Compare current state against reference
quick_visual_check(url)Quick sanity check for black screens, loading states

Element Analysis

ToolDescription
get_element_debug_info(selector)Deep dive on element's computed styles + rule chain
compare_elements(selector, expected)Compare element against expected style values
screenshot_element(selector)Screenshot a single element

Example Debugging Session

User: "The header height seems wrong after my changes"
Claude: Let me check what's happening.
> verify_against_reference("homepage")
{
"passed": false,
"problem_areas": [{
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".main-header", "source": "header.css", "styles": "height: 64px"},
{"selector": "header", "source": "reset.css", "styles": "height: auto"}
]
}]
}
Claude: Found it! Your reset.css has `header { height: auto }` which is overriding `.main-header { height: 64px }`. The reset rule appears later in the cascade.
Fix options:
1. Increase specificity: `header.main-header { height: 64px }`
2. Use !important: `.main-header { height: 64px !important }`
3. Reorder stylesheet imports

Black Screen Detection

The quick_visual_check() tool programmatically detects rendering issues:

{
"healthy": false,
"issues": [
"Screen appears black/very dark",
"Page has no visible text content"
],
"metrics": {
"mean_brightness": 2.3,
"std_deviation": 1.1
}
}

No more "looks good" on a black screen!


CLAUDE.md Integration

For best results, add the snippet from CLAUDE_SNIPPET.md to your user-level CLAUDE.md:

# Find your Claude config location
claude config get
# Append the snippet
cat CLAUDE_SNIPPET.md >>~/.claude/CLAUDE.md

This teaches Claude Code when and how to use the visual debugging tools automatically.


Configuration

Environment Variables

VariableDescriptionDefault
CHROME_PATHPath to Chrome executableAuto-detected
CHROME_DEBUG_PORTPort for Chrome debugging9222

Setting Chrome Path

If Chrome isn't auto-detected:

# macOSexport CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"# Linux export CHROME_PATH="/usr/bin/google-chrome"# Windowsset CHROME_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"

How It Works

Pixel Diffing

Uses sharp to compare images pixel-by-pixel. Outputs a diff image with mismatched areas highlighted in magenta. Connected components analysis identifies distinct problem regions.

Computed Style Extraction

Uses Chrome DevTools Protocol to query window.getComputedStyle() for any element. Shows the actual applied values after CSS cascade, not just source file values.

CSS Rule Chain

Iterates through all stylesheets via CDP to find every rule matching an element. Shows source file, selector, and styles. Reveals which rule is "winning" for each property.


Troubleshooting

Server won't start

# Test directly
node ~/.la-forge-mcp/dist/index.js
# Should hang waiting for input (Ctrl+C to exit)# If errors appear, check Node version and run npm install

"Chrome not found"

Set CHROME_PATH environment variable or pass chrome_path to start_chrome().

"No Chrome instance found"

Start Chrome manually with debugging:

google-chrome --remote-debugging-port=9222

Or use start_chrome() tool which does this automatically.

Module import errors

Reinstall and rebuild:

cd~/.la-forge-mcp
npm install
npm run build

Claude Code shows "Failed to connect"

  1. Check registration: claude mcp get la-forge
  2. Test server manually (see above)
  3. Remove and re-add:
    claude mcp remove la-forge -s user
    claude mcp add la-forge node ~/.la-forge-mcp/dist/index.js -s user

Development

# Clone
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git
cd la-forge-mcp
# Install deps
npm install
# Development (with hot reload)
npm run dev
# Build
npm run build
# Run built version
npm start

Uninstall

# Remove from Claude Code
claude mcp remove la-forge -s user
# Remove files
rm -rf ~/.la-forge-mcp

License

MIT — see LICENSE


╔═══════════════════════════════════════════════════════════════════════════╗
║ ║
║ LA FORGE MCP ║
║ ║
║ ░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░ ║
║ ║
║ Made with ◉ by Monomyth Development ║
║ ║
╚═══════════════════════════════════════════════════════════════════════════╝

About

Visual CSS debugging for AI coding assistants — an MCP server for pixel-perfect screenshot comparison, computed-style extraction, and CSS rule-chain analysis.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

 _ ______
| | | ____|
| | __ _ | |__ ___ _ __ __ _ ___
| | / _` | | __/ _ \| '__/ _` |/ _ \
| |___| (_| | | | | (_) | | | (_| | __/
|______\__,_| |_| \___/|_| \__, |\___|
__/ |
|___/ MCP

░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░


A Model Context Protocol (MCP) server that gives AI coding assistants the visual perception they lack.

The Problem

When AI coding assistants (like Claude Code) work on CSS/HTML:

  • They can see the code, but can't truly "see" the rendered result
  • Screenshots are interpreted semantically, not pixel-precisely
  • CSS inheritance and cascade can cause unexpected results invisible in source code
  • A black screen might be reported as "looks good" because there's nothing to semantically parse

The Solution

┌─ VISOR ONLINE ──────────────────────────────────────────────────────────┐
│ │
│ ◉ Pixel-level diffing Catches ANY visual difference │
│ ◉ Computed style extraction See what CSS is ACTUALLY applied │
│ ◉ CSS rule chain analysis Find which rules override your styles │
│ ◉ Problem region detection Automatically identify differing areas │
│ │
└─────────────────────────────────────────────────────────────────────────┘

Quick Install

One-Liner (macOS/Linux)

curl -fsSL https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.sh | bash

One-Liner (Windows PowerShell)

irm https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.ps1| iex

Manual Install

# Clone the repo
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git ~/.la-forge-mcp
cd~/.la-forge-mcp
# Run installer
chmod +x install.sh
./install.sh

Requirements

  • Node.js 18+
  • Claude Code CLI (claude command)
  • Google Chrome or Chromium

Quick Start

1. Start Chrome and Navigate to Your App

start_chrome("http://localhost:3000")

2. Capture a Reference (When Things Look Right)

capture_reference("homepage", selectors=[".header", ".nav", ".hero", ".footer"])

3. Make Your CSS Changes

Edit your code as normal...

4. Verify Against Reference

verify_against_reference("homepage")

Returns a detailed report:

{
"passed": false,
"summary": {
"match_percentage": 94.2,
"problem_region_count": 2
},
"problem_areas": [{
"region": {"area": "top-center"},
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".header", "source": "component.css"},
{"selector": "header", "source": "reset.css"}
]
}],
"recommendation": "Check problem_areas for CSS rule conflicts."
}

Available Tools

Chrome Management

ToolDescription
start_chrome(url, port, headless)Start Chrome with debugging enabled
navigate(url)Navigate to a URL
check_connection()Verify Chrome connection status

Reference Management

ToolDescription
capture_reference(name, selectors, full_page)Save screenshot + computed styles as reference
list_references()List all saved references

Visual Verification

ToolDescription
verify_against_reference(name, threshold)Main tool — Compare current state against reference
quick_visual_check(url)Quick sanity check for black screens, loading states

Element Analysis

ToolDescription
get_element_debug_info(selector)Deep dive on element's computed styles + rule chain
compare_elements(selector, expected)Compare element against expected style values
screenshot_element(selector)Screenshot a single element

Example Debugging Session

User: "The header height seems wrong after my changes"
Claude: Let me check what's happening.
> verify_against_reference("homepage")
{
"passed": false,
"problem_areas": [{
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".main-header", "source": "header.css", "styles": "height: 64px"},
{"selector": "header", "source": "reset.css", "styles": "height: auto"}
]
}]
}
Claude: Found it! Your reset.css has `header { height: auto }` which is overriding `.main-header { height: 64px }`. The reset rule appears later in the cascade.
Fix options:
1. Increase specificity: `header.main-header { height: 64px }`
2. Use !important: `.main-header { height: 64px !important }`
3. Reorder stylesheet imports

Black Screen Detection

The quick_visual_check() tool programmatically detects rendering issues:

{
"healthy": false,
"issues": [
"Screen appears black/very dark",
"Page has no visible text content"
],
"metrics": {
"mean_brightness": 2.3,
"std_deviation": 1.1
}
}

No more "looks good" on a black screen!


CLAUDE.md Integration

For best results, add the snippet from CLAUDE_SNIPPET.md to your user-level CLAUDE.md:

# Find your Claude config location
claude config get
# Append the snippet
cat CLAUDE_SNIPPET.md >>~/.claude/CLAUDE.md

This teaches Claude Code when and how to use the visual debugging tools automatically.


Configuration

Environment Variables

VariableDescriptionDefault
CHROME_PATHPath to Chrome executableAuto-detected
CHROME_DEBUG_PORTPort for Chrome debugging9222

Setting Chrome Path

If Chrome isn't auto-detected:

# macOSexport CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"# Linux export CHROME_PATH="/usr/bin/google-chrome"# Windowsset CHROME_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"

How It Works

Pixel Diffing

Uses sharp to compare images pixel-by-pixel. Outputs a diff image with mismatched areas highlighted in magenta. Connected components analysis identifies distinct problem regions.

Computed Style Extraction

Uses Chrome DevTools Protocol to query window.getComputedStyle() for any element. Shows the actual applied values after CSS cascade, not just source file values.

CSS Rule Chain

Iterates through all stylesheets via CDP to find every rule matching an element. Shows source file, selector, and styles. Reveals which rule is "winning" for each property.


Troubleshooting

Server won't start

# Test directly
node ~/.la-forge-mcp/dist/index.js
# Should hang waiting for input (Ctrl+C to exit)# If errors appear, check Node version and run npm install

"Chrome not found"

Set CHROME_PATH environment variable or pass chrome_path to start_chrome().

"No Chrome instance found"

Start Chrome manually with debugging:

google-chrome --remote-debugging-port=9222

Or use start_chrome() tool which does this automatically.

Module import errors

Reinstall and rebuild:

cd~/.la-forge-mcp
npm install
npm run build

Claude Code shows "Failed to connect"

  1. Check registration: claude mcp get la-forge
  2. Test server manually (see above)
  3. Remove and re-add:
    claude mcp remove la-forge -s user
    claude mcp add la-forge node ~/.la-forge-mcp/dist/index.js -s user

Development

# Clone
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git
cd la-forge-mcp
# Install deps
npm install
# Development (with hot reload)
npm run dev
# Build
npm run build
# Run built version
npm start

Uninstall

# Remove from Claude Code
claude mcp remove la-forge -s user
# Remove files
rm -rf ~/.la-forge-mcp

License

MIT — see LICENSE


╔═══════════════════════════════════════════════════════════════════════════╗
║ ║
║ LA FORGE MCP ║
║ ║
║ ░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░ ║
║ ║
║ Made with ◉ by Monomyth Development ║
║ ║
╚═══════════════════════════════════════════════════════════════════════════╝

About

Visual CSS debugging for AI coding assistants — an MCP server for pixel-perfect screenshot comparison, computed-style extraction, and CSS rule-chain analysis.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

 _ ______
| | | ____|
| | __ _ | |__ ___ _ __ __ _ ___
| | / _` | | __/ _ \| '__/ _` |/ _ \
| |___| (_| | | | | (_) | | | (_| | __/
|______\__,_| |_| \___/|_| \__, |\___|
__/ |
|___/ MCP

░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░


A Model Context Protocol (MCP) server that gives AI coding assistants the visual perception they lack.

The Problem

When AI coding assistants (like Claude Code) work on CSS/HTML:

  • They can see the code, but can't truly "see" the rendered result
  • Screenshots are interpreted semantically, not pixel-precisely
  • CSS inheritance and cascade can cause unexpected results invisible in source code
  • A black screen might be reported as "looks good" because there's nothing to semantically parse

The Solution

┌─ VISOR ONLINE ──────────────────────────────────────────────────────────┐
│ │
│ ◉ Pixel-level diffing Catches ANY visual difference │
│ ◉ Computed style extraction See what CSS is ACTUALLY applied │
│ ◉ CSS rule chain analysis Find which rules override your styles │
│ ◉ Problem region detection Automatically identify differing areas │
│ │
└─────────────────────────────────────────────────────────────────────────┘

Quick Install

One-Liner (macOS/Linux)

curl -fsSL https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.sh | bash

One-Liner (Windows PowerShell)

irm https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.ps1| iex

Manual Install

# Clone the repo
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git ~/.la-forge-mcp
cd~/.la-forge-mcp
# Run installer
chmod +x install.sh
./install.sh

Requirements

  • Node.js 18+
  • Claude Code CLI (claude command)
  • Google Chrome or Chromium

Quick Start

1. Start Chrome and Navigate to Your App

start_chrome("http://localhost:3000")

2. Capture a Reference (When Things Look Right)

capture_reference("homepage", selectors=[".header", ".nav", ".hero", ".footer"])

3. Make Your CSS Changes

Edit your code as normal...

4. Verify Against Reference

verify_against_reference("homepage")

Returns a detailed report:

{
"passed": false,
"summary": {
"match_percentage": 94.2,
"problem_region_count": 2
},
"problem_areas": [{
"region": {"area": "top-center"},
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".header", "source": "component.css"},
{"selector": "header", "source": "reset.css"}
]
}],
"recommendation": "Check problem_areas for CSS rule conflicts."
}

Available Tools

Chrome Management

ToolDescription
start_chrome(url, port, headless)Start Chrome with debugging enabled
navigate(url)Navigate to a URL
check_connection()Verify Chrome connection status

Reference Management

ToolDescription
capture_reference(name, selectors, full_page)Save screenshot + computed styles as reference
list_references()List all saved references

Visual Verification

ToolDescription
verify_against_reference(name, threshold)Main tool — Compare current state against reference
quick_visual_check(url)Quick sanity check for black screens, loading states

Element Analysis

ToolDescription
get_element_debug_info(selector)Deep dive on element's computed styles + rule chain
compare_elements(selector, expected)Compare element against expected style values
screenshot_element(selector)Screenshot a single element

Example Debugging Session

User: "The header height seems wrong after my changes"
Claude: Let me check what's happening.
> verify_against_reference("homepage")
{
"passed": false,
"problem_areas": [{
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".main-header", "source": "header.css", "styles": "height: 64px"},
{"selector": "header", "source": "reset.css", "styles": "height: auto"}
]
}]
}
Claude: Found it! Your reset.css has `header { height: auto }` which is overriding `.main-header { height: 64px }`. The reset rule appears later in the cascade.
Fix options:
1. Increase specificity: `header.main-header { height: 64px }`
2. Use !important: `.main-header { height: 64px !important }`
3. Reorder stylesheet imports

Black Screen Detection

The quick_visual_check() tool programmatically detects rendering issues:

{
"healthy": false,
"issues": [
"Screen appears black/very dark",
"Page has no visible text content"
],
"metrics": {
"mean_brightness": 2.3,
"std_deviation": 1.1
}
}

No more "looks good" on a black screen!


CLAUDE.md Integration

For best results, add the snippet from CLAUDE_SNIPPET.md to your user-level CLAUDE.md:

# Find your Claude config location
claude config get
# Append the snippet
cat CLAUDE_SNIPPET.md >>~/.claude/CLAUDE.md

This teaches Claude Code when and how to use the visual debugging tools automatically.


Configuration

Environment Variables

VariableDescriptionDefault
CHROME_PATHPath to Chrome executableAuto-detected
CHROME_DEBUG_PORTPort for Chrome debugging9222

Setting Chrome Path

If Chrome isn't auto-detected:

# macOSexport CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"# Linux export CHROME_PATH="/usr/bin/google-chrome"# Windowsset CHROME_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"

How It Works

Pixel Diffing

Uses sharp to compare images pixel-by-pixel. Outputs a diff image with mismatched areas highlighted in magenta. Connected components analysis identifies distinct problem regions.

Computed Style Extraction

Uses Chrome DevTools Protocol to query window.getComputedStyle() for any element. Shows the actual applied values after CSS cascade, not just source file values.

CSS Rule Chain

Iterates through all stylesheets via CDP to find every rule matching an element. Shows source file, selector, and styles. Reveals which rule is "winning" for each property.


Troubleshooting

Server won't start

# Test directly
node ~/.la-forge-mcp/dist/index.js
# Should hang waiting for input (Ctrl+C to exit)# If errors appear, check Node version and run npm install

"Chrome not found"

Set CHROME_PATH environment variable or pass chrome_path to start_chrome().

"No Chrome instance found"

Start Chrome manually with debugging:

google-chrome --remote-debugging-port=9222

Or use start_chrome() tool which does this automatically.

Module import errors

Reinstall and rebuild:

cd~/.la-forge-mcp
npm install
npm run build

Claude Code shows "Failed to connect"

  1. Check registration: claude mcp get la-forge
  2. Test server manually (see above)
  3. Remove and re-add:
    claude mcp remove la-forge -s user
    claude mcp add la-forge node ~/.la-forge-mcp/dist/index.js -s user

Development

# Clone
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git
cd la-forge-mcp
# Install deps
npm install
# Development (with hot reload)
npm run dev
# Build
npm run build
# Run built version
npm start

Uninstall

# Remove from Claude Code
claude mcp remove la-forge -s user
# Remove files
rm -rf ~/.la-forge-mcp

License

MIT — see LICENSE


╔═══════════════════════════════════════════════════════════════════════════╗
║ ║
║ LA FORGE MCP ║
║ ║
║ ░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░ ║
║ ║
║ Made with ◉ by Monomyth Development ║
║ ║
╚═══════════════════════════════════════════════════════════════════════════╝

About

Visual CSS debugging for AI coding assistants — an MCP server for pixel-perfect screenshot comparison, computed-style extraction, and CSS rule-chain analysis.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

 _ ______
| | | ____|
| | __ _ | |__ ___ _ __ __ _ ___
| | / _` | | __/ _ \| '__/ _` |/ _ \
| |___| (_| | | | | (_) | | | (_| | __/
|______\__,_| |_| \___/|_| \__, |\___|
__/ |
|___/ MCP

░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░


A Model Context Protocol (MCP) server that gives AI coding assistants the visual perception they lack.

The Problem

When AI coding assistants (like Claude Code) work on CSS/HTML:

  • They can see the code, but can't truly "see" the rendered result
  • Screenshots are interpreted semantically, not pixel-precisely
  • CSS inheritance and cascade can cause unexpected results invisible in source code
  • A black screen might be reported as "looks good" because there's nothing to semantically parse

The Solution

┌─ VISOR ONLINE ──────────────────────────────────────────────────────────┐
│ │
│ ◉ Pixel-level diffing Catches ANY visual difference │
│ ◉ Computed style extraction See what CSS is ACTUALLY applied │
│ ◉ CSS rule chain analysis Find which rules override your styles │
│ ◉ Problem region detection Automatically identify differing areas │
│ │
└─────────────────────────────────────────────────────────────────────────┘

Quick Install

One-Liner (macOS/Linux)

curl -fsSL https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.sh | bash

One-Liner (Windows PowerShell)

irm https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.ps1| iex

Manual Install

# Clone the repo
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git ~/.la-forge-mcp
cd~/.la-forge-mcp
# Run installer
chmod +x install.sh
./install.sh

Requirements

  • Node.js 18+
  • Claude Code CLI (claude command)
  • Google Chrome or Chromium

Quick Start

1. Start Chrome and Navigate to Your App

start_chrome("http://localhost:3000")

2. Capture a Reference (When Things Look Right)

capture_reference("homepage", selectors=[".header", ".nav", ".hero", ".footer"])

3. Make Your CSS Changes

Edit your code as normal...

4. Verify Against Reference

verify_against_reference("homepage")

Returns a detailed report:

{
"passed": false,
"summary": {
"match_percentage": 94.2,
"problem_region_count": 2
},
"problem_areas": [{
"region": {"area": "top-center"},
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".header", "source": "component.css"},
{"selector": "header", "source": "reset.css"}
]
}],
"recommendation": "Check problem_areas for CSS rule conflicts."
}

Available Tools

Chrome Management

ToolDescription
start_chrome(url, port, headless)Start Chrome with debugging enabled
navigate(url)Navigate to a URL
check_connection()Verify Chrome connection status

Reference Management

ToolDescription
capture_reference(name, selectors, full_page)Save screenshot + computed styles as reference
list_references()List all saved references

Visual Verification

ToolDescription
verify_against_reference(name, threshold)Main tool — Compare current state against reference
quick_visual_check(url)Quick sanity check for black screens, loading states

Element Analysis

ToolDescription
get_element_debug_info(selector)Deep dive on element's computed styles + rule chain
compare_elements(selector, expected)Compare element against expected style values
screenshot_element(selector)Screenshot a single element

Example Debugging Session

User: "The header height seems wrong after my changes"
Claude: Let me check what's happening.
> verify_against_reference("homepage")
{
"passed": false,
"problem_areas": [{
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".main-header", "source": "header.css", "styles": "height: 64px"},
{"selector": "header", "source": "reset.css", "styles": "height: auto"}
]
}]
}
Claude: Found it! Your reset.css has `header { height: auto }` which is overriding `.main-header { height: 64px }`. The reset rule appears later in the cascade.
Fix options:
1. Increase specificity: `header.main-header { height: 64px }`
2. Use !important: `.main-header { height: 64px !important }`
3. Reorder stylesheet imports

Black Screen Detection

The quick_visual_check() tool programmatically detects rendering issues:

{
"healthy": false,
"issues": [
"Screen appears black/very dark",
"Page has no visible text content"
],
"metrics": {
"mean_brightness": 2.3,
"std_deviation": 1.1
}
}

No more "looks good" on a black screen!


CLAUDE.md Integration

For best results, add the snippet from CLAUDE_SNIPPET.md to your user-level CLAUDE.md:

# Find your Claude config location
claude config get
# Append the snippet
cat CLAUDE_SNIPPET.md >>~/.claude/CLAUDE.md

This teaches Claude Code when and how to use the visual debugging tools automatically.


Configuration

Environment Variables

VariableDescriptionDefault
CHROME_PATHPath to Chrome executableAuto-detected
CHROME_DEBUG_PORTPort for Chrome debugging9222

Setting Chrome Path

If Chrome isn't auto-detected:

# macOSexport CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"# Linux export CHROME_PATH="/usr/bin/google-chrome"# Windowsset CHROME_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"

How It Works

Pixel Diffing

Uses sharp to compare images pixel-by-pixel. Outputs a diff image with mismatched areas highlighted in magenta. Connected components analysis identifies distinct problem regions.

Computed Style Extraction

Uses Chrome DevTools Protocol to query window.getComputedStyle() for any element. Shows the actual applied values after CSS cascade, not just source file values.

CSS Rule Chain

Iterates through all stylesheets via CDP to find every rule matching an element. Shows source file, selector, and styles. Reveals which rule is "winning" for each property.


Troubleshooting

Server won't start

# Test directly
node ~/.la-forge-mcp/dist/index.js
# Should hang waiting for input (Ctrl+C to exit)# If errors appear, check Node version and run npm install

"Chrome not found"

Set CHROME_PATH environment variable or pass chrome_path to start_chrome().

"No Chrome instance found"

Start Chrome manually with debugging:

google-chrome --remote-debugging-port=9222

Or use start_chrome() tool which does this automatically.

Module import errors

Reinstall and rebuild:

cd~/.la-forge-mcp
npm install
npm run build

Claude Code shows "Failed to connect"

  1. Check registration: claude mcp get la-forge
  2. Test server manually (see above)
  3. Remove and re-add:
    claude mcp remove la-forge -s user
    claude mcp add la-forge node ~/.la-forge-mcp/dist/index.js -s user

Development

# Clone
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git
cd la-forge-mcp
# Install deps
npm install
# Development (with hot reload)
npm run dev
# Build
npm run build
# Run built version
npm start

Uninstall

# Remove from Claude Code
claude mcp remove la-forge -s user
# Remove files
rm -rf ~/.la-forge-mcp

License

MIT — see LICENSE


╔═══════════════════════════════════════════════════════════════════════════╗
║ ║
║ LA FORGE MCP ║
║ ║
║ ░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░ ║
║ ║
║ Made with ◉ by Monomyth Development ║
║ ║
╚═══════════════════════════════════════════════════════════════════════════╝

About

Visual CSS debugging for AI coding assistants — an MCP server for pixel-perfect screenshot comparison, computed-style extraction, and CSS rule-chain analysis.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

 _ ______
| | | ____|
| | __ _ | |__ ___ _ __ __ _ ___
| | / _` | | __/ _ \| '__/ _` |/ _ \
| |___| (_| | | | | (_) | | | (_| | __/
|______\__,_| |_| \___/|_| \__, |\___|
__/ |
|___/ MCP

░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░


A Model Context Protocol (MCP) server that gives AI coding assistants the visual perception they lack.

The Problem

When AI coding assistants (like Claude Code) work on CSS/HTML:

  • They can see the code, but can't truly "see" the rendered result
  • Screenshots are interpreted semantically, not pixel-precisely
  • CSS inheritance and cascade can cause unexpected results invisible in source code
  • A black screen might be reported as "looks good" because there's nothing to semantically parse

The Solution

┌─ VISOR ONLINE ──────────────────────────────────────────────────────────┐
│ │
│ ◉ Pixel-level diffing Catches ANY visual difference │
│ ◉ Computed style extraction See what CSS is ACTUALLY applied │
│ ◉ CSS rule chain analysis Find which rules override your styles │
│ ◉ Problem region detection Automatically identify differing areas │
│ │
└─────────────────────────────────────────────────────────────────────────┘

Quick Install

One-Liner (macOS/Linux)

curl -fsSL https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.sh | bash

One-Liner (Windows PowerShell)

irm https://raw.githubusercontent.com/MonomythDevelopment/la-forge-mcp/main/install-remote.ps1| iex

Manual Install

# Clone the repo
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git ~/.la-forge-mcp
cd~/.la-forge-mcp
# Run installer
chmod +x install.sh
./install.sh

Requirements

  • Node.js 18+
  • Claude Code CLI (claude command)
  • Google Chrome or Chromium

Quick Start

1. Start Chrome and Navigate to Your App

start_chrome("http://localhost:3000")

2. Capture a Reference (When Things Look Right)

capture_reference("homepage", selectors=[".header", ".nav", ".hero", ".footer"])

3. Make Your CSS Changes

Edit your code as normal...

4. Verify Against Reference

verify_against_reference("homepage")

Returns a detailed report:

{
"passed": false,
"summary": {
"match_percentage": 94.2,
"problem_region_count": 2
},
"problem_areas": [{
"region": {"area": "top-center"},
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".header", "source": "component.css"},
{"selector": "header", "source": "reset.css"}
]
}],
"recommendation": "Check problem_areas for CSS rule conflicts."
}

Available Tools

Chrome Management

ToolDescription
start_chrome(url, port, headless)Start Chrome with debugging enabled
navigate(url)Navigate to a URL
check_connection()Verify Chrome connection status

Reference Management

ToolDescription
capture_reference(name, selectors, full_page)Save screenshot + computed styles as reference
list_references()List all saved references

Visual Verification

ToolDescription
verify_against_reference(name, threshold)Main tool — Compare current state against reference
quick_visual_check(url)Quick sanity check for black screens, loading states

Element Analysis

ToolDescription
get_element_debug_info(selector)Deep dive on element's computed styles + rule chain
compare_elements(selector, expected)Compare element against expected style values
screenshot_element(selector)Screenshot a single element

Example Debugging Session

User: "The header height seems wrong after my changes"
Claude: Let me check what's happening.
> verify_against_reference("homepage")
{
"passed": false,
"problem_areas": [{
"style_differences": [
{"property": "height", "expected": "64px", "actual": "48px"}
],
"css_rules": [
{"selector": ".main-header", "source": "header.css", "styles": "height: 64px"},
{"selector": "header", "source": "reset.css", "styles": "height: auto"}
]
}]
}
Claude: Found it! Your reset.css has `header { height: auto }` which is overriding `.main-header { height: 64px }`. The reset rule appears later in the cascade.
Fix options:
1. Increase specificity: `header.main-header { height: 64px }`
2. Use !important: `.main-header { height: 64px !important }`
3. Reorder stylesheet imports

Black Screen Detection

The quick_visual_check() tool programmatically detects rendering issues:

{
"healthy": false,
"issues": [
"Screen appears black/very dark",
"Page has no visible text content"
],
"metrics": {
"mean_brightness": 2.3,
"std_deviation": 1.1
}
}

No more "looks good" on a black screen!


CLAUDE.md Integration

For best results, add the snippet from CLAUDE_SNIPPET.md to your user-level CLAUDE.md:

# Find your Claude config location
claude config get
# Append the snippet
cat CLAUDE_SNIPPET.md >>~/.claude/CLAUDE.md

This teaches Claude Code when and how to use the visual debugging tools automatically.


Configuration

Environment Variables

VariableDescriptionDefault
CHROME_PATHPath to Chrome executableAuto-detected
CHROME_DEBUG_PORTPort for Chrome debugging9222

Setting Chrome Path

If Chrome isn't auto-detected:

# macOSexport CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"# Linux export CHROME_PATH="/usr/bin/google-chrome"# Windowsset CHROME_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"

How It Works

Pixel Diffing

Uses sharp to compare images pixel-by-pixel. Outputs a diff image with mismatched areas highlighted in magenta. Connected components analysis identifies distinct problem regions.

Computed Style Extraction

Uses Chrome DevTools Protocol to query window.getComputedStyle() for any element. Shows the actual applied values after CSS cascade, not just source file values.

CSS Rule Chain

Iterates through all stylesheets via CDP to find every rule matching an element. Shows source file, selector, and styles. Reveals which rule is "winning" for each property.


Troubleshooting

Server won't start

# Test directly
node ~/.la-forge-mcp/dist/index.js
# Should hang waiting for input (Ctrl+C to exit)# If errors appear, check Node version and run npm install

"Chrome not found"

Set CHROME_PATH environment variable or pass chrome_path to start_chrome().

"No Chrome instance found"

Start Chrome manually with debugging:

google-chrome --remote-debugging-port=9222

Or use start_chrome() tool which does this automatically.

Module import errors

Reinstall and rebuild:

cd~/.la-forge-mcp
npm install
npm run build

Claude Code shows "Failed to connect"

  1. Check registration: claude mcp get la-forge
  2. Test server manually (see above)
  3. Remove and re-add:
    claude mcp remove la-forge -s user
    claude mcp add la-forge node ~/.la-forge-mcp/dist/index.js -s user

Development

# Clone
git clone https://github.com/MonomythDevelopment/la-forge-mcp.git
cd la-forge-mcp
# Install deps
npm install
# Development (with hot reload)
npm run dev
# Build
npm run build
# Run built version
npm start

Uninstall

# Remove from Claude Code
claude mcp remove la-forge -s user
# Remove files
rm -rf ~/.la-forge-mcp

License

MIT — see LICENSE


╔═══════════════════════════════════════════════════════════════════════════╗
║ ║
║ LA FORGE MCP ║
║ ║
║ ░▒▓█ A PIXEL PERFECT VISOR FOR AI CODING ASSISTANTS █▓▒░ ║
║ ║
║ Made with ◉ by Monomyth Development ║
║ ║
╚═══════════════════════════════════════════════════════════════════════════╝

About

Visual CSS debugging for AI coding assistants — an MCP server for pixel-perfect screenshot comparison, computed-style extraction, and CSS rule-chain analysis.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages