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