generateImage
Create custom images using natural language prompts with this image generation tool. Define dimensions, adjust settings, and specify details to produce unique visuals through the Draw Things API.
Instructions
Generate an image based on a prompt
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| guidance_scale | No | ||
| height | No | ||
| negative_prompt | No | ||
| prompt | No | ||
| random_string | No | ||
| seed | No | ||
| steps | No | ||
| width | No |
Implementation Reference
- Core handler function that executes the image generation logic by calling the Draw Things API, validating params, saving the generated image, and returning formatted result.async generateImage( inputParams: Partial<ImageGenerationParams> = {} ): Promise<DrawThingsGenerationResult> { try { // handle input params let params: Partial<ImageGenerationParams> = {}; // validate params try { const validationResult = validateImageGenerationParams(inputParams); if (validationResult.valid) { params = inputParams; } else { console.error("parameter validation failed, use default params"); } } catch (error) { console.error("parameter validation error:", error); } // handle random_string special case if ( params.random_string && (!params.prompt || Object.keys(params).length === 1) ) { params.prompt = params.random_string; delete params.random_string; } // ensure prompt if (!params.prompt) { params.prompt = inputParams.prompt || defaultParams.prompt; } // merge params const requestParams = { ...defaultParams, ...params, seed: params.seed ?? Math.floor(Math.random() * 2147483647), }; console.error(`use prompt: "${requestParams.prompt}"`); // send request to Draw Things API console.error("send request to Draw Things API..."); const response = await this.axios.post( "/sdapi/v1/txt2img", requestParams ); // handle response if ( !response.data || !response.data.images || response.data.images.length === 0 ) { throw new Error("API did not return image data"); } // handle image data const imageData = response.data.images[0]; // format image data const formattedImageData = imageData.startsWith("data:image/") ? imageData : `data:image/png;base64,${imageData}`; console.error("image generation success"); // record the start time of image generation const startTime = Date.now() - 2000; // assume the image generation took 2 seconds const endTime = Date.now(); // automatically save the generated image const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); const defaultFileName = `generated-image-${timestamp}.png`; // save the generated image const imagePath = await this.saveImage({ base64Data: formattedImageData, fileName: defaultFileName }); return { isError: false, imageData: formattedImageData, imagePath: imagePath, metadata: { alt: `Image generated from prompt: ${requestParams.prompt}`, inference_time_ms: endTime - startTime, } }; } catch (error) { console.error("image generation error:", error); // error message let errorMessage = "unknown error"; if (error instanceof Error) { errorMessage = error.message; } // handle axios error const axiosError = error as any; if (axiosError.response) { errorMessage = `API error: ${axiosError.response.status} - ${ axiosError.response.data?.error || axiosError.message }`; } else if (axiosError.code === "ECONNREFUSED") { errorMessage = "cannot connect to Draw Things API. please ensure Draw Things is running and API is enabled."; } else if (axiosError.code === "ETIMEDOUT") { errorMessage = "connection to Draw Things API timeout. image generation may take longer, or API not responding."; } return { isError: true, errorMessage, }; } }
- src/index.ts:159-232 (handler)MCP protocol tool handler wrapper that processes incoming MCP requests for generateImage, delegates to DrawThingsService, and formats response for MCP.async (mcpParams: any) => { try { log("Received image generation request"); log(`mcpParams====== ${JSON.stringify(mcpParams)}`); // handle ai prompts const parameters = mcpParams?.params?.arguments || mcpParams?.arguments || mcpParams || {}; if (parameters.prompt) { log(`Using provided prompt: ${parameters.prompt}`); } else { log("No prompt provided, using default"); parameters.prompt = "A cute dog"; } // Generate image const result: ImageGenerationResult = await drawThingsService.generateImage(parameters); // Handle generation result if (result.isError) { log(`Error generating image: ${result.errorMessage}`); throw new Error(result.errorMessage || "Unknown error"); } if (!result.imageData && (!result.images || result.images.length === 0)) { log("No image data returned from generation"); throw new Error("No image data returned from generation"); } const imageData = result.imageData || (result.images && result.images.length > 0 ? result.images[0] : undefined); if (!imageData) { log("No valid image data available"); throw new Error("No valid image data available"); } log("Successfully generated image, returning directly via MCP"); // calculate the difference between the start and end time (example value) const startTime = Date.now() - 2000; // assume the image generation took 2 seconds const endTime = Date.now(); // build the response format const responseData = { image_paths: result.imagePath ? [result.imagePath] : [], metadata: { alt: `Image generated from prompt: ${parameters.prompt}`, inference_time_ms: result.metadata?.inference_time_ms || endTime - startTime, }, }; return { content: [ { type: "text", text: JSON.stringify(responseData, null, 2), }, ], }; } catch (error) { log( `Error handling image generation: ${ error instanceof Error ? error.message : String(error) }` ); await logError(error); throw error; } }
- src/index.ts:155-233 (registration)Registration of the generateImage tool with the MCP server using server.tool() method.server.tool( "generateImage", "Generate an image based on a prompt", paramsSchema, async (mcpParams: any) => { try { log("Received image generation request"); log(`mcpParams====== ${JSON.stringify(mcpParams)}`); // handle ai prompts const parameters = mcpParams?.params?.arguments || mcpParams?.arguments || mcpParams || {}; if (parameters.prompt) { log(`Using provided prompt: ${parameters.prompt}`); } else { log("No prompt provided, using default"); parameters.prompt = "A cute dog"; } // Generate image const result: ImageGenerationResult = await drawThingsService.generateImage(parameters); // Handle generation result if (result.isError) { log(`Error generating image: ${result.errorMessage}`); throw new Error(result.errorMessage || "Unknown error"); } if (!result.imageData && (!result.images || result.images.length === 0)) { log("No image data returned from generation"); throw new Error("No image data returned from generation"); } const imageData = result.imageData || (result.images && result.images.length > 0 ? result.images[0] : undefined); if (!imageData) { log("No valid image data available"); throw new Error("No valid image data available"); } log("Successfully generated image, returning directly via MCP"); // calculate the difference between the start and end time (example value) const startTime = Date.now() - 2000; // assume the image generation took 2 seconds const endTime = Date.now(); // build the response format const responseData = { image_paths: result.imagePath ? [result.imagePath] : [], metadata: { alt: `Image generated from prompt: ${parameters.prompt}`, inference_time_ms: result.metadata?.inference_time_ms || endTime - startTime, }, }; return { content: [ { type: "text", text: JSON.stringify(responseData, null, 2), }, ], }; } catch (error) { log( `Error handling image generation: ${ error instanceof Error ? error.message : String(error) }` ); await logError(error); throw error; } } );
- src/index.ts:144-153 (schema)Zod schema defining input parameters for the generateImage tool registration.const paramsSchema = { prompt: z.string().optional(), negative_prompt: z.string().optional(), width: z.number().optional(), height: z.number().optional(), steps: z.number().optional(), seed: z.number().optional(), guidance_scale: z.number().optional(), random_string: z.string().optional(), };
- src/services/schemas.ts:6-29 (schema)TypeScript interface defining ImageGenerationParams used by the service.export interface ImageGenerationParams { // basic params prompt?: string; negative_prompt?: string; // size params width?: number; height?: number; // generate control params steps?: number; seed?: number; guidance_scale?: number; // model params model?: string; sampler?: string; // MCP special params random_string?: string; // allow other params [key: string]: any; }