Skip to main content
Glama

viewpo_screenshot

Capture screenshots of webpages at multiple viewport widths to verify responsive design across different screen sizes.

Instructions

Capture screenshots of a URL at one or more viewport widths. Returns base64 JPEG images. Use this to SEE what a webpage looks like at different screen sizes.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to screenshot
viewportsNoViewports to capture. Defaults to desktop (1920px) if omitted. Common widths: 375 (phone), 820 (tablet), 1920 (desktop).

Implementation Reference

  • Tool registration and handler implementation for viewpo_screenshot. Defines the tool schema using zod, handles the request by calling client.screenshot(), processes the response into text and image content, and returns formatted results or error messages.
    // --- Tool: viewpo_screenshot --- server.tool( "viewpo_screenshot", "Capture screenshots of a URL at one or more viewport widths. Returns base64 JPEG images. Use this to SEE what a webpage looks like at different screen sizes.", { url: z.string().url().describe("The URL to screenshot"), viewports: z .array( z.object({ width: z .number() .int() .min(100) .max(3840) .describe("Viewport width in CSS pixels"), name: z .string() .optional() .describe('Label for this viewport (e.g. "phone", "desktop")'), }) ) .optional() .describe( "Viewports to capture. Defaults to desktop (1920px) if omitted. Common widths: 375 (phone), 820 (tablet), 1920 (desktop)." ), }, async ({ url, viewports }) => { try { const result = await client.screenshot({ url, viewports }); const content = result.viewports.flatMap((vp) => [ { type: "text" as const, text: `**${vp.viewport}** (${vp.width}\u00d7${vp.height})`, }, { type: "image" as const, data: vp.image_base64, mimeType: "image/jpeg" as const, }, ]); return { content }; } catch (error) { return { content: [ { type: "text" as const, text: `Screenshot failed: ${error instanceof Error ? error.message : String(error)}`, }, ], isError: true, }; } } );
  • Type definitions for the screenshot tool. Includes ViewportSpec (width and optional name), ScreenshotRequest (url and optional viewports array), ViewportResult (viewport dimensions and base64 image), and ScreenshotResponse (array of viewport results).
    // --- Screenshot --- export interface ViewportSpec { width: number; name?: string; } export interface ScreenshotRequest { url: string; viewports?: ViewportSpec[]; } export interface ViewportResult { viewport: string; width: number; height: number; image_base64: string; } export interface ScreenshotResponse { viewports: ViewportResult[]; }
  • HTTP client method that sends POST request to /screenshot endpoint. Takes ScreenshotRequest parameters and returns ScreenshotResponse, handling communication with the Viewpo macOS app's bridge API.
    async screenshot(request: ScreenshotRequest): Promise<ScreenshotResponse> { return this.post<ScreenshotResponse>("/screenshot", request); }
  • Zod schema validation for the viewpo_screenshot tool parameters. Defines url as a required URL string, and viewports as an optional array of objects with width (100-3840) and optional name fields.
    server.tool( "viewpo_screenshot", "Capture screenshots of a URL at one or more viewport widths. Returns base64 JPEG images. Use this to SEE what a webpage looks like at different screen sizes.", { url: z.string().url().describe("The URL to screenshot"), viewports: z .array( z.object({ width: z .number() .int() .min(100) .max(3840) .describe("Viewport width in CSS pixels"), name: z .string() .optional() .describe('Label for this viewport (e.g. "phone", "desktop")'), }) ) .optional() .describe( "Viewports to capture. Defaults to desktop (1920px) if omitted. Common widths: 375 (phone), 820 (tablet), 1920 (desktop)." ), },
  • Generic POST method implementation that handles HTTP requests with JSON body, including authentication headers and response processing via handleResponse method.
    private async post<T>(path: string, body: unknown): Promise<T> { const response = await fetch(`${this.baseURL}${path}`, { method: "POST", headers: this.headers(true), body: JSON.stringify(body), }); return this.handleResponse<T>(response); }

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/littlebearapps/viewpo-mcp'

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