generate_image
Create images from text prompts with customizable styles and variations.
Instructions
Generate single or multiple images from text prompts with style and variation options
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | The text prompt describing the image to generate | |
| outputCount | No | Number of variations to generate (1-8, default: 1) | |
| styles | No | Array of artistic styles: photorealistic, watercolor, oil-painting, sketch, pixel-art, anime, vintage, modern, abstract, minimalist | |
| variations | No | Array of variation types: lighting, angle, color-palette, composition, mood, season, time-of-day | |
| format | No | Output format: separate files or single grid image | separate |
| seed | No | Seed for reproducible variations | |
| preview | No | Automatically open generated images in default viewer |
Implementation Reference
- mcp-server/src/server.ts:122-172 (registration)Tool registration in ListToolsRequestSchema handler - defines the 'generate_image' tool name, description, and its JSON Schema input validation.
name: "generate_image", description: "Generate single or multiple images from text prompts with style and variation options", inputSchema: { type: "object", properties: { prompt: { type: "string", description: "The text prompt describing the image to generate", }, outputCount: { type: "number", description: "Number of variations to generate (1-8, default: 1)", minimum: 1, maximum: 8, default: 1, }, styles: { type: "array", items: { type: "string" }, description: "Array of artistic styles: photorealistic, watercolor, oil-painting, sketch, pixel-art, anime, vintage, modern, abstract, minimalist", }, variations: { type: "array", items: { type: "string" }, description: "Array of variation types: lighting, angle, color-palette, composition, mood, season, time-of-day", }, format: { type: "string", enum: ["grid", "separate"], description: "Output format: separate files or single grid image", default: "separate", }, seed: { type: "number", description: "Seed for reproducible variations", }, preview: { type: "boolean", description: "Automatically open generated images in default viewer", default: false, }, }, required: ["prompt"], }, }, - mcp-server/src/server.ts:494-511 (handler)Handler in CallToolRequestSchema - extracts args into ImageGenerationRequest and delegates to ImageGenerator.generateTextToImage().
case "generate_image": { const imageRequest: ImageGenerationRequest = { prompt: args?.prompt as string, outputCount: (args?.outputCount as number) || 1, mode: "generate", styles: args?.styles as string[], variations: args?.variations as string[], format: (args?.format as "grid" | "separate") || "separate", seed: args?.seed as number, preview: args?.preview as boolean, fileFormat: (args?.fileFormat as "png" | "jpeg") || "png", noPreview: (args?.noPreview as boolean) || (args?.["no-preview"] as boolean), }; response = await this.imageGenerator.generateTextToImage(imageRequest); break; - mcp-server/src/types.ts:7-21 (schema)TypeScript interface for ImageGenerationRequest used as input to the image generation pipeline.
export interface ImageGenerationRequest { prompt: string; inputImage?: string; outputCount?: number; mode: "generate" | "edit" | "restore"; // Batch generation options styles?: string[]; variations?: string[]; format?: "grid" | "separate"; fileFormat?: "png" | "jpeg"; seed?: number; // Preview options preview?: boolean; noPreview?: boolean; } - Core implementation of text-to-image generation - builds prompts, calls OpenRouter API, parses image from response, saves files, and handles preview.
async generateTextToImage( request: ImageGenerationRequest ): Promise<ImageGenerationResponse> { try { const outputPath = FileHandler.ensureOutputDirectory(); const generatedFiles: string[] = []; const prompts = this.buildBatchPrompts(request); let firstError: string | null = null; const fileFormat = this.resolveFileFormat(request); logger.debug(`Generating ${prompts.length} image variation(s)`); for (let i = 0; i < prompts.length; i++) { const currentPrompt = prompts[i]; logger.debug( `Generating variation ${i + 1}/${prompts.length}:`, currentPrompt ); try { const payload: Record<string, unknown> = { model: this.modelName, input: [ { role: "user", content: [ { type: "input_text", text: currentPrompt, }, ], }, ], }; if (request.seed !== undefined) { payload.seed = request.seed; } const response = await this.postJson<OpenRouterImageResponse>( this.generationPath, payload ); const imageBase64 = this.parseImageFromResponse(response); if (imageBase64) { const filename = FileHandler.generateFilename( request.styles || request.variations ? currentPrompt : request.prompt, fileFormat, i ); const fullPath = await FileHandler.saveImageFromBase64( imageBase64, outputPath, filename ); generatedFiles.push(fullPath); logger.debug("Image saved to:", fullPath); } else { logger.warn("No valid image data found in OpenRouter response"); } } catch (error: unknown) { const errorMessage = this.handleApiError(error); if (!firstError) { firstError = errorMessage; } logger.warn(`Error generating variation ${i + 1}:`, errorMessage); if (errorMessage.toLowerCase().includes("authentication failed")) { return { success: false, message: "Image generation failed", error: errorMessage, }; } } } if (generatedFiles.length === 0) { return { success: false, message: "Failed to generate any images", error: firstError || "No image data returned from OpenRouter. Try adjusting your prompt.", }; } await this.handlePreview(generatedFiles, request); return { success: true, message: `Successfully generated ${generatedFiles.length} image variation(s)`, generatedFiles, }; } catch (error: unknown) { logger.error("Error in generateTextToImage:", error); return { success: false, message: "Failed to generate image", error: this.handleApiError(error), }; } }