45 lines
2.1 KiB
JavaScript
45 lines
2.1 KiB
JavaScript
import { z } from 'zod';
|
|
import { config } from '../../config.js';
|
|
import { errorResult, jsonResult, toErrorMessage } from '../shared.js';
|
|
import { browserManager } from './browserManager.js';
|
|
export function registerBrowserScreenshotTool(server) {
|
|
server.registerTool('browser_screenshot', {
|
|
title: 'Browser Screenshot',
|
|
description: 'Capture a screenshot of the current page or a specific element. Returns the image as a base64 data URI (PNG).',
|
|
inputSchema: {
|
|
selector: z.string().optional().describe('CSS selector of the element to screenshot. If omitted, captures the full page.'),
|
|
fullPage: z
|
|
.boolean()
|
|
.optional()
|
|
.default(false)
|
|
.describe('Capture the full scrollable page (only used when selector is omitted).'),
|
|
},
|
|
}, async ({ selector, fullPage }) => {
|
|
try {
|
|
const session = await browserManager.getSession();
|
|
let 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 base64 = buffer.toString('base64');
|
|
const dataUri = `data:image/png;base64,${base64}`;
|
|
return jsonResult({
|
|
selector: selector ?? null,
|
|
fullPage: selector ? false : fullPage,
|
|
sizeBytes: buffer.length,
|
|
dataUri,
|
|
truncatedDataUri: dataUri.length > config.maxToolOutputChars ? `${dataUri.slice(0, config.maxToolOutputChars)}...` : dataUri,
|
|
note: 'The full dataUri is returned above. If it is truncated, use the returned base64 value directly from your client.',
|
|
});
|
|
}
|
|
catch (error) {
|
|
return errorResult(toErrorMessage(error));
|
|
}
|
|
});
|
|
}
|
|
//# sourceMappingURL=screenshot.js.map
|