Skip to main content
Glama
MeiGen AI Design MCP

MeiGen AI Design MCP

generate_image

Destructive

Generate AI images from prompts via MeiGen or OpenAI-compatible APIs, including SVG, GIF, transparent PNG/WebP, reference-guided and mask/markup edits.

Instructions

Generate an image using AI. Supports MeiGen platform or OpenAI-compatible APIs. Tip: get prompts from get_inspiration() or enhance_prompt(). For MeiGen Midjourney, use referenceType for content/style images and niji7Options for stylize, chaos, raw, image/style weights, sref, profile and MJ quality. Inline --sref/--profile codes remain compatible; other prompt flags are cleaned by the backend. Use referenceImages for local files. On the MeiGen provider: For a vector illustration, scalable logo or SVG (矢量图), use generate_image with the SVG model ID from list_models and outputFormat=svg. Return the SVG original from vectorOutput.url; imageUrl or urls contains its PNG preview. For an animated image or looping GIF (动图), use the GIF model ID and outputFormat=gif, not generate_video. Optional gifOptions sets frameSize, frameCount and frameDurationMs; loop length is frameCount × frameDurationMs. Set GIF dimensions through frameSize; omit aspectRatio and resolution. Omit gifOptions for defaults. Keep explicit video requests on generate_video. For a new GIF or SVG, pass up to the live guide limit (at most two) via referenceImages. For saved characters, switch to the remote OAuth MCP and use list_characters and generate_image there. Each selected character uses one guide slot on that connection; do not substitute a new generation for editing an existing file. For a transparent still, choose PNG or WebP and imageBackground=transparent. For an annotated still-image edit, read list_models imageOutput.editing first. Use imageMask for transparent editable pixels or imageMarkup for visible colored annotations on a transparent PNG. Supply exactly one, with width/height matching the original source in referenceImages[0]; source and annotation must be public HTTPS URLs, at original dimensions, and the PNG must be at most 10 MiB. Local annotated source paths are rejected to prevent resizing. Markup requires the official OpenAI route and visible annotation pixels. Never flatten markup into the source, drop a selection, or use GIF/SVG or saved characters for these requests. Preserve the same annotation URL and dimensions on recovery.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "prompt": "<prompt>"
    },
    "name": "generate_image"
  }
}

Input Schema

NameRequiredDescriptionDefault
sizeNoImage size for OpenAI-compatible providers: "1024x1024", "1536x1024", "auto". MeiGen: use aspectRatio instead.
waitNoMeiGen only: false returns the accepted generation ID immediately; poll check_generation separately. Default true waits for completion. Submit-only requires requestId.
modelNoModel name. For OpenAI-compatible providers: any model ID your endpoint supports. For MeiGen: use model IDs from list_models (e.g. "gpt-image-2", "grok-image" = xAI Grok Imagine Quality, 1K/2K, supports image-to-image, "nanobanana-2", "seedream-4.5", "flux2-klein").
promptYesThe image generation prompt
modelIdNoAlias of model for portable workflow calls. If both are present they must match.
qualityNoImage quality. MeiGen gpt-image-2: "low" / "medium" / "high". OpenAI-compatible providers also accept "high".
downloadNoSave the completed result locally (default true). Set false for URL-only workflows. Ignored when wait=false. Other providers may return inline image content when local saving is disabled.
providerNoWhich provider to use. Auto-detected from configuration if not specified.
imageMaskNoPNG mask: transparent pixels are editable. Requires a public HTTPS original source in referenceImages[0]; cannot combine with imageMarkup. Read imageOutput.editing.
requestIdNoPersistent UUID for this workflow step. Required when wait=false. Reuse with identical inputs after interruption, including after MCP restart; use a new UUID for a new generation. Omit only for a new interactive generation.
gifOptionsNoGIF only. Use the frame range for this size and the frame delay range in list_models.
resolutionNoResolution tier. MeiGen: "1K" / "2K" / "3K" / "4K" — each model supports a subset (list_models reports resolutions when applicable). OpenAI: not used (use size instead).
aspectRatioNoAspect ratio for MeiGen provider. Use "auto" (recommended, default when omitted) to let MeiGen infer the best ratio from the prompt content. Explicit values: "1:1", "3:4", "4:3", "16:9", "9:16", "21:9", "2:3", "3:2", "4:5", "5:4", etc. (model-dependent).
imageMarkupNoTransparent PNG containing visible colored annotations. Requires a public HTTPS original source in referenceImages[0]; cannot combine with imageMask. Read imageOutput.editing.
modelVariantNoOptional model variant from live list_models, such as a supported GPT Image variant. Forwarded unchanged to MeiGen.
niji7OptionsNoMeiGen Midjourney advanced options, matching Web/App. Prefer these over prompt flags; V8.2 ignores weird and fixes sv=6. Preserve identical options on recovery.
outputFormatNoSelect the model ID for this format from list_models. GIF and SVG each have their own priced model.
referenceTypeNoMeiGen Midjourney uploaded-image role; default content. Style images override niji7Options.sref; saved characters remain content references.
negativePromptNoNegative prompt for OpenAI-compatible providers.
imageBackgroundNoTransparent is available on PNG and WebP; GIF/SVG accept only auto.
imageComplexityNoChoose a supported complexity from the model catalog.
referenceImagesNoImage references for style/content guidance. Accepts direct public HTTPS URLs without credentials/fragments or accessible absolute local paths. Relative paths are rejected. Local PNG/JPEG/WebP/GIF references up to 32 MiB and 64 million pixels are fully decoded, stripped of metadata and prepared up to 4096px, preserving transparency. Sources: gallery URLs from search_gallery/get_inspiration, URLs from previous generate_image results, or local file paths.

Output Schema

NameRequiredDescriptionDefault
urlsYes
errorNo
statusYes
dedupedNo
modelIdNo
successYes
imageUrlNo
providerNo
videoUrlNo
mediaTypeNo
requestIdNo
savedPathNo
nextActionNo
creditsUsedNo
generationIdNo
vectorOutputNo
creditsStatusNo
failureDetailNo
seedanceDraftNo
receiptWarningNo
downloadWarningNo
observationEndedNo
pollAfterSecondsNo
requestedMediaTypeNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changedv3.4.0
    • addedInput schema / properties / gifOptions
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "GIF only. Use the frame range for this size and the frame delay range in list_models.",
      +  "properties": {
      +    "frameCount": {
      +      "exclusiveMinimum": 0,
      +      "type": "integer"
      +    },
      +    "frameDurationMs": {
      +      "exclusiveMinimum": 0,
      +      "type": "integer"
      +    },
      +    "frameSize": {
      +      "description": "Exact widthxheight from the GIF model capability.",
      +      "maxLength": 20,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "frameSize",
      +    "frameCount",
      +    "frameDurationMs"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / imageBackground
      Added value: +{
      +  "description": "Transparent is available on PNG and WebP; GIF/SVG accept only auto.",
      +  "enum": [
      +    "auto",
      +    "opaque",
      +    "transparent"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / imageComplexity
      Added value: +{
      +  "description": "Choose a supported complexity from the model catalog.",
      +  "enum": [
      +    "low",
      +    "medium",
      +    "high"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / imageMarkup
      Added value: +{
      +  "$ref": "#/properties/imageMask",
      +  "description": "Transparent PNG containing visible colored annotations. Requires a public HTTPS original source in referenceImages[0]; cannot combine with imageMask. Read imageOutput.editing."
      +}
    • addedInput schema / properties / imageMask
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "PNG mask: transparent pixels are editable. Requires a public HTTPS original source in referenceImages[0]; cannot combine with imageMarkup. Read imageOutput.editing.",
      +  "properties": {
      +    "height": {
      +      "exclusiveMinimum": 0,
      +      "type": "integer"
      +    },
      +    "url": {
      +      "format": "uri",
      +      "maxLength": 4096,
      +      "type": "string"
      +    },
      +    "width": {
      +      "exclusiveMinimum": 0,
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "url",
      +    "width",
      +    "height"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / properties / modelVariant / description
      Previous value: -"Optional model variant from live list_models, such as a supported GPT Image 2.5 variant. Forwarded unchanged to MeiGen."New value: +"Optional model variant from live list_models, such as a supported GPT Image variant. Forwarded unchanged to MeiGen."
    • addedInput schema / properties / outputFormat
      Added value: +{
      +  "description": "Select the model ID for this format from list_models. GIF and SVG each have their own priced model.",
      +  "enum": [
      +    "png",
      +    "jpeg",
      +    "webp",
      +    "gif",
      +    "svg"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / failureDetail / enum
      Previous value: -[
      -  "video_edit_duration",
      -  "reference_video_frame_rate"
      -]New value: +[
      +  "video_edit_duration",
      +  "reference_video_frame_rate",
      +  "midjourney_profile_not_found",
      +  "midjourney_sref_invalid"
      +]
    • addedOutput schema / properties / vectorOutput
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "height": {
      +      "maximum": 4096,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "url": {
      +      "format": "uri",
      +      "pattern": "^https:\\/\\/images\\.meigen\\.(?:ai|art)\\/[A-Za-z0-9_./-]+\\.svg$",
      +      "type": "string"
      +    },
      +    "width": {
      +      "maximum": 4096,
      +      "minimum": 1,
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "url",
      +    "width",
      +    "height"
      +  ],
      +  "type": "object"
      +}
  2. Changed3 schema fields changedv3.3.0
    • addedInput schema / properties / niji7Options
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "MeiGen Midjourney advanced options, matching Web/App. Prefer these over prompt flags; V8.2 ignores weird and fixes sv=6. Preserve identical options on recovery.",
      +  "properties": {
      +    "chaos": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "iw": {
      +      "description": "Content image weight; Niji supports at most 2.",
      +      "maximum": 3,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "profile": {
      +      "maxLength": 4096,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "quality": {
      +      "description": "MJ V8.2 quality; separate from top-level image quality.",
      +      "enum": [
      +        "1",
      +        "4"
      +      ],
      +      "type": "string"
      +    },
      +    "raw": {
      +      "type": "boolean"
      +    },
      +    "sref": {
      +      "maxLength": 4096,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "stylize": {
      +      "maximum": 1000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "sv": {
      +      "description": "Legacy style version; V8.2 always uses 6.",
      +      "maximum": 6,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "sw": {
      +      "maximum": 1000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "weird": {
      +      "description": "V7/Niji only; ignored by V8.2.",
      +      "maximum": 3000,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / referenceType
      Added value: +{
      +  "description": "MeiGen Midjourney uploaded-image role; default content. Style images override niji7Options.sref; saved characters remain content references.",
      +  "enum": [
      +    "content",
      +    "style"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / failureDetail
      Added value: +{
      +  "enum": [
      +    "video_edit_duration",
      +    "reference_video_frame_rate"
      +  ],
      +  "type": "string"
      +}
  3. Changed1 schema field changedv3.2.0
    • addedOutput schema / properties / seedanceDraft
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "duration": {
      +      "type": "number"
      +    },
      +    "expiresAt": {
      +      "type": "string"
      +    },
      +    "finalCredits": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "finalGenerationId": {
      +      "type": "string"
      +    },
      +    "hasReferenceVideo": {
      +      "type": "boolean"
      +    },
      +    "referenceVideoSeconds": {
      +      "type": "number"
      +    },
      +    "sourceGenerationId": {
      +      "type": "string"
      +    },
      +    "stage": {
      +      "enum": [
      +        "draft",
      +        "final"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "stage",
      +    "duration",
      +    "referenceVideoSeconds",
      +    "hasReferenceVideo"
      +  ],
      +  "type": "object"
      +}
  4. Changed7 schema fields changedv3.1.0
    • changedInput schema / properties / aspectRatio / description
      Previous value: -"Aspect ratio for MeiGen provider. Use \"auto\" (recommended, default when omitted) to let MeiGen infer the best ratio from the prompt content. Explicit values: \"1:1\", \"3:4\", \"4:3\", \"16:9\", \"9:16\", \"21:9\", \"2:3\", \"3:2\", \"4:5\", \"5:4\", etc. (model-dependent). ComfyUI: use comfyui_workflow modify to adjust dimensions before generating."New value: +"Aspect ratio for MeiGen provider. Use \"auto\" (recommended, default when omitted) to let MeiGen infer the best ratio from the prompt content. Explicit values: \"1:1\", \"3:4\", \"4:3\", \"16:9\", \"9:16\", \"21:9\", \"2:3\", \"3:2\", \"4:5\", \"5:4\", etc. (model-dependent)."
    • changedInput schema / properties / negativePrompt / description
      Previous value: -"Negative prompt for OpenAI-compatible providers. ComfyUI: use comfyui_workflow modify to set negative prompt in the workflow before generating."New value: +"Negative prompt for OpenAI-compatible providers."
    • changedInput schema / properties / provider / enum
      Previous value: -[
      -  "openai",
      -  "meigen",
      -  "comfyui"
      -]New value: +[
      +  "openai",
      +  "meigen"
      +]
    • changedInput schema / properties / referenceImages / description
      Previous value: -"Image references for style/content guidance. Accepts direct public HTTPS URLs without credentials/fragments or accessible absolute local paths. Relative paths are rejected. Local PNG/JPEG/WebP/GIF references up to 32 MiB and 64 million pixels are fully decoded, stripped of metadata and prepared up to 4096px, preserving transparency. For ComfyUI: local files are passed directly to the workflow (requires LoadImage node). Sources: gallery URLs from search_gallery/get_inspiration, URLs from previous generate_image results, or local file paths."New value: +"Image references for style/content guidance. Accepts direct public HTTPS URLs without credentials/fragments or accessible absolute local paths. Relative paths are rejected. Local PNG/JPEG/WebP/GIF references up to 32 MiB and 64 million pixels are fully decoded, stripped of metadata and prepared up to 4096px, preserving transparency. Sources: gallery URLs from search_gallery/get_inspiration, URLs from previous generate_image results, or local file paths."
    • changedInput schema / properties / size / description
      Previous value: -"Image size for OpenAI-compatible providers: \"1024x1024\", \"1536x1024\", \"auto\". MeiGen/ComfyUI: use aspectRatio instead."New value: +"Image size for OpenAI-compatible providers: \"1024x1024\", \"1536x1024\", \"auto\". MeiGen: use aspectRatio instead."
    • removedInput schema / properties / workflow
      Removed value: -{
      -  "description": "ComfyUI workflow name to use (from comfyui_workflow list). Uses default workflow if not specified.",
      -  "type": "string"
      -}
    • changedOutput schema / properties / provider / enum
      Previous value: -[
      -  "meigen",
      -  "openai",
      -  "comfyui"
      -]New value: +[
      +  "meigen",
      +  "openai"
      +]
  5. Changed8 schema fields changedv2.0.1
    • addedInput schema / properties / download
      Added value: +{
      +  "default": true,
      +  "description": "Save the completed result locally (default true). Set false for URL-only workflows. Ignored when wait=false. Other providers may return inline image content when local saving is disabled.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / model / minLength
      Added value: +1
    • addedInput schema / properties / modelId
      Added value: +{
      +  "description": "Alias of model for portable workflow calls. If both are present they must match.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / modelVariant
      Added value: +{
      +  "description": "Optional model variant from live list_models, such as a supported GPT Image 2.5 variant. Forwarded unchanged to MeiGen.",
      +  "type": "string"
      +}
    • changedInput schema / properties / referenceImages / description
      Previous value: -"Image references for style/content guidance. Accepts both public URLs (http/https) and local file paths. Local files are automatically compressed and uploaded when needed. For ComfyUI: local files are passed directly to the workflow (requires LoadImage node). Sources: gallery URLs from search_gallery/get_inspiration, URLs from previous generate_image results, or local file paths."New value: +"Image references for style/content guidance. Accepts direct public HTTPS URLs without credentials/fragments or accessible absolute local paths. Relative paths are rejected. Local PNG/JPEG/WebP/GIF references up to 32 MiB and 64 million pixels are fully decoded, stripped of metadata and prepared up to 4096px, preserving transparency. For ComfyUI: local files are passed directly to the workflow (requires LoadImage node). Sources: gallery URLs from search_gallery/get_inspiration, URLs from previous generate_image results, or local file paths."
    • addedInput schema / properties / requestId
      Added value: +{
      +  "description": "Persistent UUID for this workflow step. Required when wait=false. Reuse with identical inputs after interruption, including after MCP restart; use a new UUID for a new generation. Omit only for a new interactive generation.",
      +  "format": "uuid",
      +  "type": "string"
      +}
    • addedInput schema / properties / wait
      Added value: +{
      +  "default": true,
      +  "description": "MeiGen only: false returns the accepted generation ID immediately; poll check_generation separately. Default true waits for completion. Submit-only requires requestId.",
      +  "type": "boolean"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "creditsStatus": {
      +      "type": "string"
      +    },
      +    "creditsUsed": {
      +      "type": "number"
      +    },
      +    "deduped": {
      +      "type": "boolean"
      +    },
      +    "downloadWarning": {
      +      "type": "string"
      +    },
      +    "error": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "available": {
      +          "type": "number"
      +        },
      +        "code": {
      +          "type": "string"
      +        },
      +        "httpStatus": {
      +          "type": "number"
      +        },
      +        "message": {
      +          "type": "string"
      +        },
      +        "required": {
      +          "type": "number"
      +        },
      +        "retryAfterSeconds": {
      +          "type": "number"
      +        },
      +        "retryable": {
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "code",
      +        "message",
      +        "retryable"
      +      ],
      +      "type": "object"
      +    },
      +    "generationId": {
      +      "type": "string"
      +    },
      +    "imageUrl": {
      +      "type": "string"
      +    },
      +    "mediaType": {
      +      "enum": [
      +        "image",
      +        "video"
      +      ],
      +      "type": "string"
      +    },
      +    "modelId": {
      +      "type": "string"
      +    },
      +    "nextAction": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "afterSeconds": {
      +          "type": "number"
      +        },
      +        "arguments": {
      +          "additionalProperties": {},
      +          "type": "object"
      +        },
      +        "message": {
      +          "type": "string"
      +        },
      +        "tool": {
      +          "type": "string"
      +        },
      +        "type": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "type"
      +      ],
      +      "type": "object"
      +    },
      +    "observationEnded": {
      +      "type": "boolean"
      +    },
      +    "pollAfterSeconds": {
      +      "type": "number"
      +    },
      +    "provider": {
      +      "enum": [
      +        "meigen",
      +        "openai",
      +        "comfyui"
      +      ],
      +      "type": "string"
      +    },
      +    "receiptWarning": {
      +      "type": "string"
      +    },
      +    "requestId": {
      +      "type": "string"
      +    },
      +    "requestedMediaType": {
      +      "enum": [
      +        "image",
      +        "video"
      +      ],
      +      "type": "string"
      +    },
      +    "savedPath": {
      +      "type": "string"
      +    },
      +    "status": {
      +      "enum": [
      +        "processing",
      +        "completed",
      +        "failed",
      +        "error",
      +        "unknown"
      +      ],
      +      "type": "string"
      +    },
      +    "success": {
      +      "type": "boolean"
      +    },
      +    "urls": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "videoUrl": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "success",
      +    "status",
      +    "urls"
      +  ],
      +  "type": "object"
      +}
  6. Changed1 schema field changedv1.3.3
    • changedInput schema / properties / model / description
      Previous value: -"Model name. For OpenAI-compatible providers: any model ID your endpoint supports. For MeiGen: use model IDs from list_models."New value: +"Model name. For OpenAI-compatible providers: any model ID your endpoint supports. For MeiGen: use model IDs from list_models (e.g. \"gpt-image-2\", \"grok-image\" = xAI Grok Imagine Quality, 1K/2K, supports image-to-image, \"nanobanana-2\", \"seedream-4.5\", \"flux2-klein\")."
  7. Addedv1.3.1

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag destructiveHint=true, and the description goes well beyond that: it names return locations (vectorOutput.url vs the PNG preview in imageUrl/urls), input constraints (public HTTPS, original dimensions, 10 MiB PNG cap, local paths rejected), recovery semantics, and the "priced model" implication of cost. What is missing is a plain statement of what the destructive flag means operationally — credit spend/reversibility — so it falls short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence is well front-loaded, but everything after it is a single undifferentiated wall of text mixing SVG, GIF, characters, transparency, and annotation editing with no headings or ordering. Several rules are repeated across the schema and the prose, and the annotation-editing paragraph alone runs eight sentences, making it hard for an agent to extract the relevant branch quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 22-parameter generation tool with an output schema and nested objects, the description covers providers, formats, reference handling, masking, and failure/recovery conventions thoroughly. Given the output schema exists, the omission of detailed return-value explanation is acceptable; only explicit cost/irreversibility disclosure is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 22 parameters are already documented; the description mostly restates those rules (referenceType, niji7Options, gifOptions, imageMask/imageMarkup mutual exclusion). It adds a little beyond the schema, such as PDF-style precedence hints and that style images override niji7Options.sref, but not enough to exceed the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Generate an image using AI" states a specific verb and resource, and the text immediately names the supported providers plus the sibling boundary ("Keep explicit video requests on generate_video"). An agent can distinguish this from generate_video and generate_marketing_poster from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There are explicit routing rules for nearly every alternative: SVG via outputFormat=svg with the SVG model ID, GIF via outputFormat=gif instead of generate_video, saved characters via the remote OAuth MCP, transparent stills via PNG/WebP plus imageBackground, and edited stills only after reading list_models imageOutput.editing. Exclusions are stated as well ("Never flatten markup into the source", "omit aspectRatio and resolution").

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.