UNPKG

screen-view-mcp

Version:

MCP tool for capturing screenshots and analyzing them with Claude Vision API

81 lines (80 loc) 3.44 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.captureScreenshot = captureScreenshot; exports.saveScreenshotToFile = saveScreenshotToFile; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const screenshot_desktop_1 = __importDefault(require("screenshot-desktop")); /** * Captures a screenshot and returns it as a base64 string */ async function captureScreenshot() { try { // Capture the screenshot buffer const buffer = await (0, screenshot_desktop_1.default)(); // Log buffer info for debugging console.log('Debug: Screenshot buffer length:', buffer.length); // Check file signature/magic numbers to determine file type let fileType = 'unknown'; if (buffer.length > 4) { // Check PNG signature (89 50 4E 47) if (buffer[0] === 0x89 && buffer[1] === 0x50 && buffer[2] === 0x4E && buffer[3] === 0x47) { fileType = 'PNG'; } // Check JPEG signature (FF D8 FF) else if (buffer[0] === 0xFF && buffer[1] === 0xD8 && buffer[2] === 0xFF) { fileType = 'JPEG'; } // Check BMP signature (42 4D) else if (buffer[0] === 0x42 && buffer[1] === 0x4D) { fileType = 'BMP'; } } console.log('Debug: Detected file type:', fileType); console.log('Debug: First 8 bytes:', Array.from(buffer.slice(0, 8)).map(b => '0x' + b.toString(16).padStart(2, '0')).join(' ')); // Save a debug copy of the raw screenshot const debugDir = path_1.default.join(process.cwd(), 'debug'); if (!fs_1.default.existsSync(debugDir)) { fs_1.default.mkdirSync(debugDir, { recursive: true }); } const debugPath = path_1.default.join(debugDir, `raw_screenshot_${Date.now()}.png`); fs_1.default.writeFileSync(debugPath, buffer); console.log(`Debug: Raw screenshot saved to ${debugPath}`); // Convert to base64 const base64Data = buffer.toString('base64'); // Also save the base64 for debugging fs_1.default.writeFileSync(path_1.default.join(debugDir, 'last_base64.txt'), base64Data); return base64Data; } catch (error) { console.error('Error capturing screenshot:', error); throw error; } } /** * Saves a base64 image to a file * @param base64Image - The base64 string of the image * @param filePath - The path where to save the file */ async function saveScreenshotToFile(base64Image, filePath) { try { // Create directory if it doesn't exist const dir = path_1.default.dirname(filePath); if (!fs_1.default.existsSync(dir)) { fs_1.default.mkdirSync(dir, { recursive: true }); } // Remove data URI prefix if present const base64Data = base64Image.replace(/^data:image\/\w+;base64,/, ''); // Convert base64 to buffer and save directly const buffer = Buffer.from(base64Data, 'base64'); fs_1.default.writeFileSync(filePath, buffer); console.log(`Screenshot saved to ${filePath}`); } catch (error) { console.error('Error saving screenshot:', error); throw error; } }