Skip to main content
Glama
pvinis
by pvinis

playwright_screenshot

Capture screenshots of web pages or specific elements using CSS selectors. Save as PNG files, store in base64 format, or download to custom directories with adjustable dimensions and full-page options.

Instructions

Take a screenshot of the current page or a specific element

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
downloadsDirNoCustom downloads directory path (default: user's Downloads folder)
fullPageNoStore screenshot of the entire page (default: false)
heightNoHeight in pixels (default: 600)
nameYesName for the screenshot
savePngNoSave screenshot as PNG file (default: false)
selectorNoCSS selector for element to screenshot
storeBase64NoStore screenshot in base64 format (default: true)
widthNoWidth in pixels (default: 800)

Implementation Reference

  • The main handler logic for taking screenshots of the page or specific elements using Playwright's page.screenshot() method. Handles saving to file, base64 storage, and notifications.
    async execute(args: any, context: ToolContext): Promise<ToolResponse> {
      return this.safeExecute(context, async (page) => {
        const screenshotOptions: any = {
          type: args.type || "png",
          fullPage: !!args.fullPage,
        };
    
        if (args.selector) {
          const element = await page.$(args.selector);
          if (!element) {
            return {
              content: [
                {
                  type: "text",
                  text: `Element not found: ${args.selector}`,
                },
              ],
              isError: true,
            };
          }
          screenshotOptions.element = element;
        }
    
        // Generate output path
        const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
        const filename = `${args.name || "screenshot"}-${timestamp}.png`;
        const downloadsDir = args.downloadsDir || defaultDownloadsPath;
    
        if (!fs.existsSync(downloadsDir)) {
          fs.mkdirSync(downloadsDir, { recursive: true });
        }
    
        const outputPath = path.join(downloadsDir, filename);
        screenshotOptions.path = outputPath;
    
        const screenshot = await page.screenshot(screenshotOptions);
        const base64Screenshot = screenshot.toString("base64");
    
        const messages = [
          `Screenshot saved to: ${path.relative(process.cwd(), outputPath)}`,
        ];
    
        // Handle base64 storage
        if (args.storeBase64 !== false) {
          this.screenshots.set(args.name || "screenshot", base64Screenshot);
          this.server.notification({
            method: "notifications/resources/list_changed",
          });
    
          messages.push(
            `Screenshot also stored in memory with name: '${
              args.name || "screenshot"
            }'`
          );
        }
    
        return createSuccessResponse(messages);
      });
    }
  • The tool definition including name, description, and input schema for validation.
    {
      name: "playwright_screenshot",
      description: "Take a screenshot of the current page or a specific element",
      inputSchema: {
        type: "object",
        properties: {
          name: { type: "string", description: "Name for the screenshot" },
          selector: { type: "string", description: "CSS selector for element to screenshot" },
          width: { type: "number", description: "Width in pixels (default: 800)" },
          height: { type: "number", description: "Height in pixels (default: 600)" },
          storeBase64: { type: "boolean", description: "Store screenshot in base64 format (default: true)" },
          fullPage: { type: "boolean", description: "Store screenshot of the entire page (default: false)" },
          savePng: { type: "boolean", description: "Save screenshot as PNG file (default: false)" },
          downloadsDir: { type: "string", description: "Custom downloads directory path (default: user's Downloads folder)" },
        },
        required: ["name"],
      },
    },
  • Registration in the main tool dispatcher switch statement, routing calls to the ScreenshotTool instance.
    case "playwright_screenshot":
      return await screenshotTool.execute(args, context);
  • Instantiation of the ScreenshotTool class in the initializeTools function.
    if (!screenshotTool) screenshotTool = new ScreenshotTool(server);
  • Full ScreenshotTool class definition, extending BrowserToolBase for shared browser handling.
    export class ScreenshotTool extends BrowserToolBase {
      private screenshots = new Map<string, string>();
    
      /**
       * Execute the screenshot tool
       */
      async execute(args: any, context: ToolContext): Promise<ToolResponse> {
        return this.safeExecute(context, async (page) => {
          const screenshotOptions: any = {
            type: args.type || "png",
            fullPage: !!args.fullPage,
          };
    
          if (args.selector) {
            const element = await page.$(args.selector);
            if (!element) {
              return {
                content: [
                  {
                    type: "text",
                    text: `Element not found: ${args.selector}`,
                  },
                ],
                isError: true,
              };
            }
            screenshotOptions.element = element;
          }
    
          // Generate output path
          const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
          const filename = `${args.name || "screenshot"}-${timestamp}.png`;
          const downloadsDir = args.downloadsDir || defaultDownloadsPath;
    
          if (!fs.existsSync(downloadsDir)) {
            fs.mkdirSync(downloadsDir, { recursive: true });
          }
    
          const outputPath = path.join(downloadsDir, filename);
          screenshotOptions.path = outputPath;
    
          const screenshot = await page.screenshot(screenshotOptions);
          const base64Screenshot = screenshot.toString("base64");
    
          const messages = [
            `Screenshot saved to: ${path.relative(process.cwd(), outputPath)}`,
          ];
    
          // Handle base64 storage
          if (args.storeBase64 !== false) {
            this.screenshots.set(args.name || "screenshot", base64Screenshot);
            this.server.notification({
              method: "notifications/resources/list_changed",
            });
    
            messages.push(
              `Screenshot also stored in memory with name: '${
                args.name || "screenshot"
              }'`
            );
          }
    
          return createSuccessResponse(messages);
        });
      }
    
      /**
       * Get all stored screenshots
       */
      getScreenshots(): Map<string, string> {
        return this.screenshots;
      }
    }

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/pvinis/mcp-playwright-stealth'

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