init project

This commit is contained in:
root
2026-07-31 13:12:54 -04:00
parent 0da92d5e02
commit f3863f760c
7215 changed files with 1860260 additions and 1 deletions
+53
View File
@@ -0,0 +1,53 @@
import { z } from 'zod';
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { writeBaseline, listBaselines } from '../../lib/baselines.js';
import { errorResult, jsonResult, toErrorMessage } from '../shared.js';
import { browserManager } from './browserManager.js';
export function registerBrowserScreenshotBaselineTool(server: McpServer): void {
server.registerTool(
'browser_screenshot_baseline',
{
title: 'Save Screenshot Baseline',
description:
'Capture the current page (or a CSS selector) and save it as a PNG baseline under `.web-dev-mcp/baselines/{name}.png` for later visual diffs.',
inputSchema: {
name: z
.string()
.min(1)
.describe('Baseline name (no path separators), e.g. "home" or "login-form".'),
selector: z.string().optional().describe('Optional CSS selector; if omitted, captures the page.'),
fullPage: z
.boolean()
.optional()
.default(false)
.describe('Capture the full scrollable page when selector is omitted.'),
},
},
async ({ name, selector, fullPage }) => {
try {
const session = await browserManager.getSession();
let buffer: Buffer;
if (selector) {
const element = await session.page.locator(selector).first();
await element.waitFor({ state: 'visible', timeout: 5000 });
buffer = await element.screenshot({ type: 'png' });
} else {
buffer = await session.page.screenshot({ fullPage, type: 'png' });
}
const saved = writeBaseline(name, buffer);
return jsonResult({
name,
selector: selector ?? null,
fullPage: selector ? false : fullPage,
sizeBytes: buffer.length,
relativePath: saved.relativePath,
baselines: listBaselines(),
});
} catch (error) {
return errorResult(toErrorMessage(error));
}
},
);
}