An MCP server for generating, editing, and processing images using the Foundry image model (gpt-image) and SkiaSharp image processing library.
Strong schema definitions with comprehensive parameter documentation across all 10 tools. Tool names follow verb_noun convention (generate_image, edit_image, list_images, etc.). Descriptions are detailed and actionable (avg ~180 chars), explaining WHAT the tool does, WHEN to use it, and key constraints. All parameters have type definitions and descriptions. However, output schemas are not explicitly documented in the visible code, responses are inferred from model classes. Error handling guidance is minimal. No enum constraints visible for string parameters like 'size', 'quality', 'fit', 'background' despite having known valid values. Tool annotations (destructive/readonly hints) are present in some tools but inconsistently applied.
Converts an image file to a different format and saves the result without resizing.
Crops an image file either by a rectangle (x, y, width, height) or by an aspect ratio with an anchor (the largest region of that ratio), and saves the result without resizing.
Generates an image from one or more reference images and a text prompt with the Foundry image model (images/edits), e.g. redraw a character in another style, keep a character identity, or apply a composition. Refer to the references in the prompt as 'image 1', 'image 2' in order. Same sizing, output and post-processing options as generate_image.
Exports an image in multiple sizes for different use cases (e.g., favicon, app icons, responsive images). Supports presets (favicon, scales) or custom size lists.
Generates an image asset from a text prompt with the Foundry image model (gpt-image) and saves it to disk. The model renders 1024x1024, 1024x1536 or 1536x1024; pass width/height to get the final asset size (the server crops to the aspect ratio and resizes with SkiaSharp). Takes 30 seconds to several minutes per image. Returns the saved file path(s), image size and token usage.
Returns the width, height, format, alpha channel presence and file size of an image file (png, jpg or webp) on the server machine.
String parameters with constrained values lack enum declarations. 'size' accepts only '1024x1024', '1024x1536', '1536x1024' but is defined as free-form string. Same for 'quality' (low/medium/high), 'fit' (cover/contain/pad), 'background' (auto/transparent/opaque). LLMs will hallucinate invalid values.
Output schemas are not explicitly documented in tool definitions. Response types exist (GenerateImageResponse, ProcessImageResponse, etc.) but are not visible in the tool registration code. LLMs cannot plan downstream operations without knowing what fields to expect.
Error handling lacks recovery guidance. No visible error responses that tell LLMs what to do next (e.g., 'File not found. Check the path or call list_images() to see available files'). Errors appear to be generic exceptions without actionable context.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | <=2025-11-25 | v2 |
Lists image files (png, jpg, webp) in a directory with their size and dimensions, newest first. Default: the server output directory where generated files are kept.
Makes a color in an image transparent and saves the result. Useful for removing backgrounds or converting solid colors to transparency.
Resizes an image file to a target size or scale factor and saves the result. Use fit to control how the aspect ratio is handled.
Removes transparent or solid-color margins from an image and saves the result without resizing.
Tool annotations inconsistently applied. generate_image and edit_image marked Destructive=false despite writing files to disk. Should be Destructive=true. Other write tools (resize_image, crop_image, etc.) lack explicit destructive/readonly hints in visible code.
Numeric parameter ranges not documented. 'outputCompression' (0-100), 'count' (1+), 'limit' (1-1000), 'tolerance' (0-255) lack min/max constraints in descriptions. LLMs may pass invalid values like count=0 or compression=500.