Skip to main content
Glama
gourraguis

Website Screenshot MCP

by gourraguis

screenshot

Capture website screenshots programmatically with customizable formats and viewport options for documentation, testing, or content creation.

Instructions

Takes a screenshot of a website.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlYes
outputPathYes
formatNo
fullPageNo
deviceNolaptop-hidpi

Implementation Reference

  • The screenshotHandler function that executes the tool logic: launches Puppeteer browser, emulates device, navigates to URL, takes screenshot and saves to outputPath, returns success/error response.
    export const screenshotHandler = async ({ url, outputPath, format = "png", fullPage = true, device }: ScreenshotParams) => {
      try {
        // Ensure the output path has the correct extension
        const extension = `.${format}`;
        let path = outputPath.endsWith(extension) ? outputPath : `${outputPath}${extension}`;
    
        if (!isScreenshotPath(path)) {
          // This should not happen due to the logic above, but it satisfies TypeScript
          throw new Error("Invalid screenshot path");
        }
    
        const browser = await puppeteer.launch({
          headless: true,
          args: ['--no-sandbox', '--disable-setuid-sandbox']
        });
        const page = await browser.newPage();
    
        const deviceName = DEVICE_ID_MAP[device];
        const deviceToEmulate = KnownDevices[deviceName as keyof typeof KnownDevices];
        await page.emulate(deviceToEmulate);
        
        await page.goto(url, { waitUntil: "networkidle2" });
        await page.screenshot({ path, type: format, fullPage });
        await browser.close();
    
        return {
          content: [
            {
              type: "text" as const,
              text: JSON.stringify({ success: true, outputPath: path }),
            },
          ],
        };
      } catch (error: any) {
        return {
          content: [
            {
              type: "text" as const,
              text: JSON.stringify({ success: false, error: error.message }),
            },
          ],
          isError: true,
        };
      }
    };
  • Zod schema defining input parameters for the screenshot tool: url (required), outputPath (required), optional format, fullPage, device.
    const screenshotSchema = z.object({
      url: z.string().url(),
      outputPath: z.string(),
      format: z.enum(["png", "jpeg"]).optional(),
      fullPage: z.boolean().optional(),
      device: z.enum(Object.keys(DEVICE_ID_MAP) as [DeviceId, ...DeviceId[]]).default('laptop-hidpi'),
    });
  • src/main.ts:24-31 (registration)
    Registration of the 'screenshot' tool using McpServer.registerTool, providing name, tool metadata (title, description, inputSchema), and handler function.
    server.registerTool(
      "screenshot",
      {
        ...screenshotTool,
        inputSchema: screenshotTool.inputSchema,
      },
      screenshotHandler
    );
  • Helper function to validate if a path is a valid screenshot path (ends with .png or .jpeg).
    function isScreenshotPath(path: string): path is ScreenshotPath {
      return path.endsWith(".png") || path.endsWith(".jpeg");
    }
  • Mapping of device IDs to Puppeteer known device names for emulation.
    const DEVICE_ID_MAP: Record<string, string> = {
      'ios-large': 'iPhone 14 Pro Max',
      'ios-small': 'iPhone SE',
      'android-large': 'Pixel 6 Pro',
      'android-medium': 'Galaxy S8',
      'tablet-large': 'iPad Pro 11',
      'tablet-small': 'iPad Mini',
      'laptop-hidpi': 'Laptop with HiDPI screen',
      'laptop-mdpi': 'Laptop with MDPI screen',
    };
Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/gourraguis/glasses-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server