Skip to main content
Glama

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
NameRequiredDescriptionDefault
guidance_scaleNo
heightNo
negative_promptNo
promptNo
random_stringNo
seedNo
stepsNo
widthNo

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, }; } }
  • 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; } } );
  • 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(), };
  • 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; }

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jaokuohsuan/draw-things-mcp-cursor'

If you have feedback or need assistance with the MCP directory API, please join our Discord server