mcp_imagen_generate
Generate high-quality images from English text prompts using the Google Imagen 3 model. Supports photorealistic, artistic, and specific style outputs, with SynthID watermarking included. Ideal for creating custom visuals with controlled aspects like ratios and person generation.
Instructions
Google Imagen 3 모델을 사용하여 텍스트 프롬프트에서 고품질 이미지를 생성합니다. Imagen 3은 포토리얼리즘, 예술적 디테일, 특정 예술 스타일(인상주의, 애니메이션 등)에 탁월합니다. 생성된 이미지에는 항상 SynthID 워터마크가 포함됩니다. 현재 영어 프롬프트만 지원됩니다.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| aspectRatio | No | 이미지 가로세로 비율 | 1:1 |
| fileName | No | 저장할 이미지 파일 이름 (확장자 제외) | |
| model | No | 사용할 Imagen 모델 ID (예: imagen-3.0-generate-002) | imagen-3.0-generate-002 |
| numberOfImages | No | 생성할 이미지 수 (1-4) | |
| personGeneration | No | 사람 이미지 생성 허용 여부 (DONT_ALLOW: 사람 이미지 생성 차단, ALLOW_ADULT: 성인 이미지만 생성 허용) | ALLOW_ADULT |
| prompt | Yes | 이미지 생성을 위한 텍스트 프롬프트. 영어로 작성하세요. | |
| saveDir | No | 이미지를 저장할 디렉토리 | ./temp |
Implementation Reference
- src/tools/index.ts:1395-1422 (handler)Handler function for the 'mcp_imagen_generate' tool. Validates that an Imagen model is used and delegates image generation to geminiService.generateImage, returning the result as JSON.async handler(args: any): Promise<ToolResponse> { try { // generateImage 메서드를 사용하지만, Imagen 모델로 고정 const modelName = args.model || 'imagen-3.0-generate-002'; if (!modelName.includes('imagen')) { throw new Error('이 도구는 Imagen 모델만 지원합니다. 모델 이름에 "imagen"이 포함되어야 합니다.'); } const result = await geminiService.generateImage({ ...args, model: modelName }); return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }; } catch (error) { return { content: [{ type: 'text', text: `Imagen 이미지 생성 오류: ${error instanceof Error ? error.message : String(error)}` }] }; } }
- src/tools/index.ts:1352-1393 (schema)Input schema for 'mcp_imagen_generate' defining parameters like prompt, model, numberOfImages, aspectRatio, etc.inputSchema: { type: 'object', properties: { model: { type: 'string', description: '사용할 Imagen 모델 ID (예: imagen-3.0-generate-002)', default: 'imagen-3.0-generate-002', }, prompt: { type: 'string', description: '이미지 생성을 위한 텍스트 프롬프트. 영어로 작성하세요.', }, numberOfImages: { type: 'number', description: '생성할 이미지 수 (1-4)', default: 1, minimum: 1, maximum: 4, }, aspectRatio: { type: 'string', description: '이미지 가로세로 비율', default: '1:1', enum: ['1:1', '3:4', '4:3', '9:16', '16:9'] }, personGeneration: { type: 'string', description: '사람 이미지 생성 허용 여부 (DONT_ALLOW: 사람 이미지 생성 차단, ALLOW_ADULT: 성인 이미지만 생성 허용)', default: 'ALLOW_ADULT', enum: ['DONT_ALLOW', 'ALLOW_ADULT'] }, saveDir: { type: 'string', description: '이미지를 저장할 디렉토리', default: './temp', }, fileName: { type: 'string', description: '저장할 이미지 파일 이름 (확장자 제외)', } }, required: ['prompt']
- src/index.ts:51-51 (registration)Tool capability registration in MCP server capabilities object (disabled with false).mcp_imagen_generate: false,
- Core helper function generateImageWithImagen that makes the actual API call to Google Imagen for image generation and saves the images to disk.private async generateImageWithImagen({ model, prompt, numberOfImages = 1, aspectRatio = '1:1', personGeneration = 'ALLOW_ADULT', saveDir = './temp', fileName = `imagen-${Date.now()}`, }: { model: string; prompt: string; numberOfImages?: number; aspectRatio?: string; personGeneration?: string; saveDir?: string; fileName?: string; }) { const config = this.getRequestConfig(); const url = `${this.baseUrl}/models/${model}:generateImages`; const response = await axios.post( url, { prompt, config: { numberOfImages, aspectRatio, personGeneration } }, config ); // 이미지 응답 처리 const generatedImages = response.data.generatedImages || []; const savedFiles = []; const fs = await import('fs'); const path = await import('path'); // 저장 디렉토리가 없으면 생성 if (!fs.existsSync(saveDir)) { fs.mkdirSync(saveDir, { recursive: true }); } // 이미지 저장 for (let i = 0; i < generatedImages.length; i++) { const imageData = generatedImages[i]?.image?.imageBytes; if (imageData) { const buffer = Buffer.from(imageData, 'base64'); const filePath = path.join(saveDir, `${fileName}-${i + 1}.png`); fs.writeFileSync(filePath, buffer); savedFiles.push(filePath); } } return { model: model, prompt: prompt, images: savedFiles, count: savedFiles.length, text: [], }; }
- src/tools/index.ts:1349-1423 (registration)Full tool registration object for 'mcp_imagen_generate' in the exported tools array.{ name: 'mcp_imagen_generate', description: 'Google Imagen 3 모델을 사용하여 텍스트 프롬프트에서 고품질 이미지를 생성합니다. Imagen 3은 포토리얼리즘, 예술적 디테일, 특정 예술 스타일(인상주의, 애니메이션 등)에 탁월합니다. 생성된 이미지에는 항상 SynthID 워터마크가 포함됩니다. 현재 영어 프롬프트만 지원됩니다.', inputSchema: { type: 'object', properties: { model: { type: 'string', description: '사용할 Imagen 모델 ID (예: imagen-3.0-generate-002)', default: 'imagen-3.0-generate-002', }, prompt: { type: 'string', description: '이미지 생성을 위한 텍스트 프롬프트. 영어로 작성하세요.', }, numberOfImages: { type: 'number', description: '생성할 이미지 수 (1-4)', default: 1, minimum: 1, maximum: 4, }, aspectRatio: { type: 'string', description: '이미지 가로세로 비율', default: '1:1', enum: ['1:1', '3:4', '4:3', '9:16', '16:9'] }, personGeneration: { type: 'string', description: '사람 이미지 생성 허용 여부 (DONT_ALLOW: 사람 이미지 생성 차단, ALLOW_ADULT: 성인 이미지만 생성 허용)', default: 'ALLOW_ADULT', enum: ['DONT_ALLOW', 'ALLOW_ADULT'] }, saveDir: { type: 'string', description: '이미지를 저장할 디렉토리', default: './temp', }, fileName: { type: 'string', description: '저장할 이미지 파일 이름 (확장자 제외)', } }, required: ['prompt'] }, async handler(args: any): Promise<ToolResponse> { try { // generateImage 메서드를 사용하지만, Imagen 모델로 고정 const modelName = args.model || 'imagen-3.0-generate-002'; if (!modelName.includes('imagen')) { throw new Error('이 도구는 Imagen 모델만 지원합니다. 모델 이름에 "imagen"이 포함되어야 합니다.'); } const result = await geminiService.generateImage({ ...args, model: modelName }); return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }; } catch (error) { return { content: [{ type: 'text', text: `Imagen 이미지 생성 오류: ${error instanceof Error ? error.message : String(error)}` }] }; } } },