Skip to main content
Glama

thumbnail

Extract embedded thumbnail images from photos as base64 data or URLs using the exif-mcp server's metadata analysis capabilities.

Instructions

Extract embedded thumbnail from image as base64 data or URL

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
imageYes
urlNo

Implementation Reference

  • Executes the thumbnail extraction logic: loads image buffer, extracts thumbnail using exifr, converts to base64 data URL or base64, handles errors with standardized responses.
    async (args, extra) => {
      try {
        const { image, url } = args;
        const buf = await loadImage(image);
        const thumbnail = await exifr.thumbnail(buf);
        
        if (!thumbnail) {
          return createErrorResponse('No thumbnail found in image');
        }
        
        // Convert to base64 data URL by default
        if (!url) {
          const base64 = Buffer.from(thumbnail).toString('base64');
          const mimeType = 'image/jpeg'; // Thumbnails are typically JPEG
          const dataUrl = `data:${mimeType};base64,${base64}`;
          return createSuccessResponse({ dataUrl });
        }
        
        // For browsers, object URLs would be created, but we can't do that in Node
        // So we'll just return the base64 data
        const base64 = Buffer.from(thumbnail).toString('base64');
        return createSuccessResponse({ base64 });
      } catch (error) {
        return createErrorResponse(`Error extracting thumbnail: ${error instanceof Error ? error.message : String(error)}`);
      }
    }
  • Registers the 'thumbnail' tool with the MCP server instance, defining its description, input schema, and handler function. Stores reference in tools object.
    // Tool 11: thumbnail - extracts embedded thumbnail
    const thumbnailTool = server.tool('thumbnail',
      "Extract embedded thumbnail from image as base64 data or URL",
      {
        image: ImageSourceSchema,
        url: z.boolean().optional()
      },
      async (args, extra) => {
        try {
          const { image, url } = args;
          const buf = await loadImage(image);
          const thumbnail = await exifr.thumbnail(buf);
          
          if (!thumbnail) {
            return createErrorResponse('No thumbnail found in image');
          }
          
          // Convert to base64 data URL by default
          if (!url) {
            const base64 = Buffer.from(thumbnail).toString('base64');
            const mimeType = 'image/jpeg'; // Thumbnails are typically JPEG
            const dataUrl = `data:${mimeType};base64,${base64}`;
            return createSuccessResponse({ dataUrl });
          }
          
          // For browsers, object URLs would be created, but we can't do that in Node
          // So we'll just return the base64 data
          const base64 = Buffer.from(thumbnail).toString('base64');
          return createSuccessResponse({ base64 });
        } catch (error) {
          return createErrorResponse(`Error extracting thumbnail: ${error instanceof Error ? error.message : String(error)}`);
        }
      }
    );
    tools['thumbnail'] = thumbnailTool;
  • Zod schema for ImageSource used in thumbnail (and other) tool input parameters.
    const ImageSourceSchema = z.object({
      kind: z.enum(['path', 'url', 'base64', 'buffer']),
      path: z.string().optional(),
      url: z.string().optional(),
      data: z.string().optional(),
      buffer: z.string().optional()
    });
  • Dedicated Zod schema for thumbnail tool input (matches inline schema, though unused).
    export const ThumbnailSchema = z.object({
      image: z.object({
        kind: z.enum(['path', 'url', 'base64', 'buffer']),
        path: z.string().optional(),
        url: z.string().optional(),
        data: z.string().optional(),
        buffer: z.string().optional()
      }),
      url: z.boolean().optional()
    });

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/stass/exif-mcp'

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