Vibe Eyes
HTTP-SSEMCP server enabling LLMs to see browser-based games through vectorized canvas visualization and debug information
MCP server enabling LLMs to see browser-based games through vectorized canvas visualization and debug information
An MCP server that enables LLMs to "see" what's happening in browser-based games and applications through vectorized canvas visualization and debug information.
Vibe-Eyes uses a client-server architecture where a lightweight browser client captures canvas content and debug information, sends it to a Node.js server via WebSockets, which then vectorizes the images into compact SVG representations and makes them available to LLMs through the Model Context Protocol (MCP).
flowchart LR A["Browser Game/App<br/>(Canvas + JavaScript)"] -->|"Captures"| B["Vibe-Eyes Client<br/>(vibe-eyes-client)"] B -->|"WebSocket<br/>(CORS-free)"| C["Socket.IO Server"] subgraph server["Vibe-Eyes Server (mcp.js)"] C -->|"Process"| D["Vectorization<br/>(vectorizer.js)"] C -->|"Store"| E["Debug Data<br/>(logs, errors, exceptions)"] D -->|"Rough SVG"| F["MCP Tool: getGameDebug()"] E --> F end F -->|"SVG + Debug Info"| G["Claude/LLM<br/>(MCP Client)"] G -->|"Debugging<br/>Assistance"| A classDef default color:#000,font-weight:bold classDef edgeLabel color:#333,font-size:12px style A fill:#c0e0ff,stroke:#000,stroke-width:2px style B fill:#ffe0a0,stroke:#000,stroke-width:2px style C fill:#a0d0ff,stroke:#000,stroke-width:2px style D fill:#b0e0a0,stroke:#000,stroke-width:2px style E fill:#ffb0b0,stroke:#000,stroke-width:2px style F fill:#d0b0ff,stroke:#000,stroke-width:2px style G fill:#ffb0d0,stroke:#000,stroke-width:2px style server fill:#f0f0f0,stroke:#666,stroke-width:1px,stroke-dasharray: 5 5,color:#000
Note: This project is experimental and designed to enhance "vibe coding" sessions with LLMs by providing visual context and rich debug information.
mcp.js)The core server that:
The browser client is available at vibe-eyes-client repository.
A lightweight browser integration that:
vectorizer.js)A high-quality SVG vectorization library that:
To install Vibe-Eyes for Claude Desktop automatically via Smithery:
npx -y @smithery/cli install @monteslu/vibe-eyes --client claude
# Clone the repository git clone https://github.com/monteslu/vibe-eyes.git cd vibe-eyes # Install dependencies npm install
Register the MCP server with your AI agent:
# For Claude Code claude mcp add
This enables Claude to use the Vibe-Eyes capabilities via MCP.
Add the client to your browser application by including the required scripts:
<!-- Include Socket.IO client --> <script src="https://cdn.socket.io/4.7.4/socket.io.min.js"></script> <!-- Include Vibe-Eyes client --> <script src="https://cdn.jsdelivr.net/npm/vibe-eyes-client/dist/index.min.js"></script> <!-- Initialize the client --> <script> // Import the initialization function if using as module // import { initializeVibeEyes } from 'vibe-eyes-client'; // Initialize with configuration const vibeEyes = initializeVibeEyes({ // WebSocket URL to the Vibe-Eyes server serverUrl: 'ws://localhost:8869', // Capture interval in milliseconds captureDelay: 1000, // Start capturing automatically after connection autoCapture: true }); </script>
The MCP server exposes a tool for LLMs to access the latest visual and debug information via Model Context Protocol (MCP):
getGameDebug({ includeSvg: true/false })
The LLM will receive:
includeSvg is true)This allows the LLM to "see" what's happening in the application and provide better assistance.
To access Vibe-Eyes from Claude:
{ "name": "vibe-eyes", "url": "http://localhost:8869", "tools": [ { "name": "getGameDebug", "description": "Retrieves the most recent canvas visualization and debug information from a browser game or application" } ] }
Traditional "vibe coding" sessions require developers to manually take screenshots and describe what's happening in their application. Vibe-Eyes automates this process by:
For applications that want to reuse the vectorized SVG output:
WebSocket Response: The server includes the SVG directly in WebSocket responses:
socket.on('debugCapture', (data, callback) => { // Capture and process... callback({ success: true, id: "capture_123", svg: "<svg>...</svg>", // Vectorized SVG stats: { /* stats data */ } }); });
HTTP Endpoint: Access the latest capture via the /latest endpoint:
fetch('http://localhost:8869/latest') .then(res => res.json()) .then(data => { const svg = data.vectorized?.svg; // Use the SVG... });
// Initialize the client const vibeEyes = initializeVibeEyes({ serverUrl: 'ws://localhost:8869', captureDelay: 1000, // ms between captures maxLogs: 10, // Max console.log entries to store maxErrors: 10, // Max console.error entries to store autoCapture: true // Start capturing automatically }); // Manual control vibeEyes.startCaptureLoop(); // Start auto-capturing vibeEyes.stopCaptureLoop(); // Stop auto-capturing vibeEyes.captureAndSend(); // Trigger one capture immediately // The server responds with: // { // success: true, // id: "capture_1234567890", // processedAt: 1616161616161, // svg: "<svg>...</svg>", // The vectorized SVG for direct use // stats: { // vectorizeTime: 120, // optimizeTime: 30, // originalSize: 50000, // finalSize: 15000, // sizeReduction: 70 // } // }
// MCP tool available to LLMs getGameDebug({ includeSvg: true // Whether to include SVG visualization }) // Returns { success: true, capture: { id: "capture_123456789", timestamp: 1616161616161, console_logs: [ { timestamp: 1616161616000, data: ["Player position:", {x: 10, y: 20}] }, // ...more logs ], console_errors: [ // Any errors captured ], unhandled_exception: { timestamp: 1616161616100, message: "Uncaught SyntaxError: Unexpected token ';'", stack: "SyntaxError: Unexpected token ';'\n at game.js:42:10\n...", type: "SyntaxError", source: "game.js", line: 42, column: 10 }, vectorized: { svg: "<svg>...</svg>", // Only if includeSvg is true (rough approximation) imageType: "png", stats: { vectorizeTime: 120, optimizeTime: 30, originalSize: 50000, finalSize: 15000, sizeReduction: 70 } } } }
The project also includes a standalone CLI tool for vectorizing individual files:
# Install CLI globally npm install -g vibe-eyes # Use the CLI vibe-eyes-vectorize input.png output.svg # With options vibe-eyes-vectorize photo.jpg --color-precision 10 --max-iterations 100
ISC