Skip to main content
Glama

generateImage

Create custom images from text descriptions using AI. Specify prompts, dimensions, and parameters to generate visual content.

Instructions

Generate an image based on a prompt

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
promptNo
negative_promptNo
widthNo
heightNo
stepsNo
seedNo
guidance_scaleNo
random_stringNo

Implementation Reference

  • Core handler function that validates input parameters, merges with defaults, calls Draw Things API for txt2img generation, saves the image to disk, and returns formatted result or error.
    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:155-233 (registration)
    MCP server.tool registration for 'generateImage', defines Zod input schema, handles MCP params, delegates to service handler, and returns standardized MCP content response.
    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;
        }
      }
    );
  • TypeScript interface defining the input parameters for image generation, used for type safety in the handler.
    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;
    }
  • Zod schema for input validation in the MCP 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(),
    };
  • Default parameters used by the handler when user params are incomplete.
    export const defaultParams: ImageGenerationParams = {
      speed_up_with_guidance_embed: true,
      motion_scale: 127,
      image_guidance: 1.5,
      tiled_decoding: false,
      decoding_tile_height: 640,
      negative_prompt_for_image_prior: true,
      batch_size: 1,
      decoding_tile_overlap: 128,
      separate_open_clip_g: false,
      hires_fix_height: 960,
      decoding_tile_width: 640,
      diffusion_tile_height: 1024,
      num_frames: 14,
      stage_2_guidance: 1,
      t5_text_encoder_decoding: true,
      mask_blur_outset: 0,
      resolution_dependent_shift: true,
      model: "flux_1_schnell_q5p.ckpt",
      hires_fix: false,
      strength: 1,
      loras: [],
      diffusion_tile_width: 1024,
      diffusion_tile_overlap: 128,
      original_width: 512,
      seed: -1,
      zero_negative_prompt: false,
      upscaler_scale: 0,
      steps: 8,
      upscaler: null,
      mask_blur: 1.5,
      sampler: "DPM++ 2M AYS",
      width: 320,
      negative_original_width: 512,
      batch_count: 1,
      refiner_model: null,
      shift: 1,
      stage_2_shift: 1,
      open_clip_g_text: null,
      crop_left: 0,
      controls: [],
      start_frame_guidance: 1,
      original_height: 512,
      image_prior_steps: 5,
      guiding_frame_noise: 0.019999999552965164,
      clip_weight: 1,
      clip_skip: 1,
      crop_top: 0,
      negative_original_height: 512,
      preserve_original_after_inpaint: true,
      separate_clip_l: false,
      guidance_embed: 3.5,
      negative_aesthetic_score: 2.5,
      aesthetic_score: 6,
      clip_l_text: null,
      hires_fix_strength: 0.699999988079071,
      guidance_scale: 7.5,
      stochastic_sampling_gamma: 0.3,
      seed_mode: "Scale Alike",
      target_width: 512,
      hires_fix_width: 960,
      tiled_diffusion: false,
      fps: 5,
      refiner_start: 0.8500000238418579,
      height: 512,
      prompt: "A cute koala sitting on a eucalyptus tree, watercolor style, beautiful lighting, detailed",
      negative_prompt: "deformed, distorted, unnatural pose, extra limbs, blurry, low quality, ugly, bad anatomy, poor details, mutated, text, watermark"
    }; 
Install Server

Other 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