read-ihdr
Extract IHDR metadata from images to analyze dimensions, color depth, and compression details for image processing workflows.
Instructions
Read IHDR metadata from an image
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes |
Implementation Reference
- src/tools/index.ts:154-170 (handler)Shared handler function that implements the core logic for the 'read-ihdr' tool. Loads image buffer, configures exifr options for IHDR via buildSegmentOptions('IHDR'), parses metadata, extracts 'ihdr' field, and returns it or an error response.async (args, extra) => { try { const { image } = args; const buf = await loadImage(image); const opts = buildSegmentOptions(segment); const meta = await exifr.parse(buf, opts); const segmentKey = segment.toLowerCase(); if (!meta || !meta[segmentKey]) { return createErrorResponse(`No ${segment} metadata found in image`); } return createSuccessResponse(meta); } catch (error) { return createErrorResponse(`Error reading ${segment} data: ${error instanceof Error ? error.message : String(error)}`); } }
- src/tools/index.ts:54-60 (schema)Zod schema for ImageSource input parameter used by the 'read-ihdr' tool to validate image source (path, url, base64, or buffer).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() });
- src/tools/index.ts:141-173 (registration)Registration of the 'read-ihdr' tool via the segmentTools array and forEach loop using server.tool, including name, description, schema, and handler.const segmentTools = [ { name: 'read-icc', segment: 'ICC' }, { name: 'read-iptc', segment: 'IPTC' }, { name: 'read-jfif', segment: 'JFIF' }, { name: 'read-ihdr', segment: 'IHDR' } ] as const; segmentTools.forEach(({ name, segment }) => { const segmentTool = server.tool(name, `Read ${segment} metadata from an image`, { image: ImageSourceSchema }, async (args, extra) => { try { const { image } = args; const buf = await loadImage(image); const opts = buildSegmentOptions(segment); const meta = await exifr.parse(buf, opts); const segmentKey = segment.toLowerCase(); if (!meta || !meta[segmentKey]) { return createErrorResponse(`No ${segment} metadata found in image`); } return createSuccessResponse(meta); } catch (error) { return createErrorResponse(`Error reading ${segment} data: ${error instanceof Error ? error.message : String(error)}`); } } ); tools[name] = segmentTool; });
- src/tools/segments.ts:114-128 (helper)Helper function buildSegmentOptions that creates exifr options specifically for IHDR by setting options.ihdr = true when segment='IHDR', used in the read-ihdr handler.export function buildSegmentOptions(segment: 'ICC' | 'IPTC' | 'JFIF' | 'IHDR'): ExifrOptions { const options: ExifrOptions = { tiff: false, xmp: false, icc: false, iptc: false, jfif: false, ihdr: false, }; const key = segment.toLowerCase() as 'icc' | 'iptc' | 'jfif' | 'ihdr'; options[key] = true; return options; }
- src/tools/index.ts:18-27 (helper)Helper function to standardize successful MCP tool responses, used by read-ihdr handler.function createSuccessResponse(data: any) { return { content: [ { type: "text" as const, text: typeof data === 'string' ? data : JSON.stringify(data, null, 2) } ] }; }