2025-08-25 23:50:31 +09:00
|
|
|
# CLAUDE.md - Imagen4 MCP 서버 개발 가이드
|
2025-08-24 23:15:52 +09:00
|
|
|
|
2025-08-25 23:50:31 +09:00
|
|
|
## 프로젝트 개요
|
|
|
|
|
|
|
|
|
|
Google Imagen4 API를 활용한 MCP(Model Context Protocol) 서버 구현체입니다. 모듈화된 아키텍처로 설계되어 있으며 한글 프롬프트와 UTF-8 인코딩을 완벽 지원합니다.
|
|
|
|
|
|
|
|
|
|
### 주요 특징
|
|
|
|
|
- Google Imagen4 API 연동을 통한 고품질 이미지 생성 (2048x2048 PNG)
|
|
|
|
|
- MCP 프로토콜 완전 지원으로 Claude Desktop과 원활한 연동
|
|
|
|
|
- 512x512 JPEG 미리보기 이미지를 base64로 제공하여 빠른 확인 가능
|
|
|
|
|
- Windows 환경에서 한글 프롬프트 완벽 지원 (UTF-8 강제 설정)
|
|
|
|
|
- 비동기 태스크 처리 및 백그라운드 워커 풀 지원
|
|
|
|
|
- 향상된 에러 처리 및 재시도 로직
|
|
|
|
|
- 메타데이터 JSON 저장으로 이미지 재생성 지원
|
|
|
|
|
|
|
|
|
|
## 프로젝트 구조
|
2025-08-24 23:15:52 +09:00
|
|
|
|
2025-08-25 23:50:31 +09:00
|
|
|
```
|
|
|
|
|
imagen4/
|
|
|
|
|
├── main.py # 통합 실행 파일 (서버 진입점)
|
|
|
|
|
├── requirements.txt # 의존성 패키지
|
|
|
|
|
├── .env # 환경변수 설정 (사용자 생성 필요)
|
|
|
|
|
├── run_utf8.bat # UTF-8 환경 서버 실행 스크립트
|
|
|
|
|
├── test_main.py # 기본 기능 테스트
|
|
|
|
|
├── claude_desktop_config.json # Claude Desktop MCP 설정
|
|
|
|
|
├── generated_images/ # 이미지 생성 결과 저장소
|
|
|
|
|
│ ├── *.png # 원본 이미지 (2048x2048)
|
|
|
|
|
│ └── *.json # 생성 메타데이터
|
|
|
|
|
└── src/
|
|
|
|
|
├── connector/ # Google Imagen4 API 연결
|
|
|
|
|
│ ├── config.py # 환경변수 및 설정 관리
|
|
|
|
|
│ ├── imagen4_client.py # API 클라이언트 (412라인)
|
|
|
|
|
│ └── utils.py # 유틸리티 함수
|
|
|
|
|
├── server/ # MCP 서버 구현
|
|
|
|
|
│ ├── models.py # 데이터 모델 및 도구 정의 (132라인)
|
|
|
|
|
│ ├── mcp_server.py # MCP 서버 메인 클래스
|
|
|
|
|
│ ├── handlers.py # 도구 핸들러 로직 (308라인)
|
|
|
|
|
│ └── enhanced_handlers.py # 향상된 핸들러 (344라인)
|
|
|
|
|
├── async_task/ # 비동기 작업 관리
|
|
|
|
|
│ ├── models.py # 태스크 모델
|
|
|
|
|
│ ├── task_manager.py # 태스크 매니저 (324라인)
|
|
|
|
|
│ └── worker_pool.py # 워커 풀 (258라인)
|
|
|
|
|
└── utils/ # 유틸리티 모듈
|
|
|
|
|
├── error_recovery.py # 에러 복구 및 재시도 (237라인)
|
|
|
|
|
├── image_utils.py # 이미지 처리 (107라인)
|
|
|
|
|
└── token_utils.py # 토큰 관리 (200라인)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 설치 및 실행
|
|
|
|
|
|
|
|
|
|
### 1. 의존성 설치
|
|
|
|
|
```bash
|
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**필수 패키지:**
|
|
|
|
|
- `google-genai>=0.2.0` - Google Imagen4 API
|
|
|
|
|
- `mcp>=1.0.0` - MCP 프로토콜
|
|
|
|
|
- `python-dotenv>=1.0.0` - 환경변수 관리
|
|
|
|
|
- `Pillow>=10.0.0` - 이미지 처리
|
|
|
|
|
- `pytest>=7.0.0` - 테스트 프레임워크
|
|
|
|
|
|
|
|
|
|
### 2. 환경 설정
|
|
|
|
|
|
|
|
|
|
`.env` 파일 생성:
|
|
|
|
|
```env
|
|
|
|
|
GOOGLE_APPLICATION_CREDENTIALS=path/to/your/service-account-key.json
|
|
|
|
|
PROJECT_ID=your-gcp-project-id
|
|
|
|
|
LOCATION=us-central1
|
|
|
|
|
OUTPUT_PATH=./generated_images
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3. 서버 실행
|
|
|
|
|
|
|
|
|
|
**Windows (권장):**
|
|
|
|
|
```bash
|
|
|
|
|
run_utf8.bat
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**수동 실행:**
|
|
|
|
|
```bash
|
|
|
|
|
# Windows
|
|
|
|
|
chcp 65001
|
|
|
|
|
set PYTHONIOENCODING=utf-8
|
|
|
|
|
set PYTHONUTF8=1
|
|
|
|
|
python main.py
|
|
|
|
|
|
|
|
|
|
# Linux/Mac
|
|
|
|
|
export PYTHONIOENCODING=utf-8
|
|
|
|
|
python main.py
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 4. Claude Desktop 연동
|
|
|
|
|
|
|
|
|
|
`claude_desktop_config.json` 내용을 Claude Desktop 설정에 추가:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"mcpServers": {
|
|
|
|
|
"imagen4": {
|
|
|
|
|
"command": "python",
|
|
|
|
|
"args": ["main.py"],
|
|
|
|
|
"cwd": "D:\\Project\\imagen4",
|
|
|
|
|
"env": {
|
|
|
|
|
"PYTHONPATH": "D:\\Project\\imagen4"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 핵심 기능
|
|
|
|
|
|
|
|
|
|
### 1. 이미지 생성 (generate_image)
|
|
|
|
|
- **입력**: 한글/영어 프롬프트, 시드값, 설정 옵션
|
|
|
|
|
- **출력**: 2048x2048 PNG + 512x512 JPEG 미리보기 (base64)
|
|
|
|
|
- **지원 비율**: 1:1, 9:16, 16:9, 3:4, 4:3
|
|
|
|
|
- **최대 생성**: 2개 이미지 동시 생성
|
|
|
|
|
|
|
|
|
|
### 2. 랜덤 시드 생성 (generate_random_seed)
|
|
|
|
|
- 재현 가능한 이미지 생성을 위한 시드값 제공
|
|
|
|
|
|
|
|
|
|
### 3. JSON 기반 재생성 (regenerate_from_json)
|
|
|
|
|
- 저장된 메타데이터로 동일한 설정의 이미지 재생성
|
|
|
|
|
|
|
|
|
|
## UTF-8 인코딩 지원
|
|
|
|
|
|
|
|
|
|
### Windows cp949 오류 방지
|
|
|
|
|
|
|
|
|
|
**증상:**
|
2025-08-24 23:15:52 +09:00
|
|
|
```
|
|
|
|
|
'cp949' codec can't encode character '\U0001f4ad' in position 0: illegal multibyte sequence
|
|
|
|
|
```
|
|
|
|
|
|
2025-08-25 23:50:31 +09:00
|
|
|
**해결책:**
|
2025-08-24 23:15:52 +09:00
|
|
|
|
2025-08-25 23:50:31 +09:00
|
|
|
**1. 자동 UTF-8 설정 (main.py 상단)**
|
2025-08-24 23:15:52 +09:00
|
|
|
```python
|
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
# UTF-8 강제 설정
|
|
|
|
|
os.environ['PYTHONIOENCODING'] = 'utf-8'
|
|
|
|
|
os.environ['PYTHONUTF8'] = '1'
|
2025-08-25 23:50:31 +09:00
|
|
|
os.environ['LC_ALL'] = 'C.UTF-8'
|
2025-08-24 23:15:52 +09:00
|
|
|
|
2025-08-25 23:50:31 +09:00
|
|
|
# Windows UTF-8 콘솔 설정
|
2025-08-24 23:15:52 +09:00
|
|
|
if sys.platform.startswith('win'):
|
2025-08-25 23:50:31 +09:00
|
|
|
os.system('chcp 65001 >nul 2>&1')
|
2025-08-24 23:15:52 +09:00
|
|
|
if hasattr(sys.stdout, 'reconfigure'):
|
|
|
|
|
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
|
|
|
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**2. 실행 스크립트 (run_utf8.bat)**
|
|
|
|
|
```batch
|
|
|
|
|
@echo off
|
|
|
|
|
chcp 65001 >nul 2>&1
|
|
|
|
|
set PYTHONIOENCODING=utf-8
|
|
|
|
|
set PYTHONUTF8=1
|
2025-08-25 23:50:31 +09:00
|
|
|
set LC_ALL=C.UTF-8
|
|
|
|
|
python main.py
|
2025-08-24 23:15:52 +09:00
|
|
|
pause
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**3. 코딩 규칙**
|
2025-08-25 23:50:31 +09:00
|
|
|
- 텍스트 라벨 사용: `[SUCCESS]`, `[ERROR]`, `[WARNING]`
|
2025-08-24 23:15:52 +09:00
|
|
|
- 파일 I/O 시 `encoding='utf-8'` 필수 명시
|
2025-08-25 23:50:31 +09:00
|
|
|
- 모든 문자열 처리에 `ensure_unicode_string()` 함수 활용
|
|
|
|
|
|
|
|
|
|
## 테스트
|
|
|
|
|
|
|
|
|
|
### 기본 테스트 실행
|
|
|
|
|
```bash
|
|
|
|
|
python test_main.py
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 단위 테스트
|
|
|
|
|
```bash
|
|
|
|
|
# 커넥터 테스트
|
|
|
|
|
pytest tests/test_connector.py
|
|
|
|
|
|
|
|
|
|
# 서버 테스트
|
|
|
|
|
pytest tests/test_server.py
|
2025-08-24 23:15:52 +09:00
|
|
|
|
2025-08-25 23:50:31 +09:00
|
|
|
# 전체 테스트
|
|
|
|
|
pytest tests/
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 개발 가이드
|
|
|
|
|
|
|
|
|
|
### 1. 새로운 도구 추가
|
|
|
|
|
|
|
|
|
|
**models.py에 도구 정의 추가:**
|
|
|
|
|
```python
|
|
|
|
|
@staticmethod
|
|
|
|
|
def get_new_tool() -> Tool:
|
|
|
|
|
return Tool(
|
|
|
|
|
name="new_tool",
|
|
|
|
|
description="새로운 도구 설명",
|
|
|
|
|
inputSchema={
|
|
|
|
|
"type": "object",
|
|
|
|
|
"properties": {
|
|
|
|
|
"param": {"type": "string", "description": "매개변수"}
|
|
|
|
|
},
|
|
|
|
|
"required": ["param"]
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**handlers.py에 핸들러 구현:**
|
|
|
|
|
```python
|
|
|
|
|
async def handle_new_tool(self, args: Dict[str, Any]) -> List[TextContent]:
|
|
|
|
|
param = args.get("param")
|
|
|
|
|
# 도구 로직 구현
|
|
|
|
|
return [TextContent(type="text", text="결과")]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2. 에러 처리 패턴
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
from src.utils.error_recovery import with_retry, RetryConfig
|
|
|
|
|
from src.connector.imagen4_client import classify_api_error
|
|
|
|
|
|
|
|
|
|
@with_retry(RetryConfig(max_attempts=3))
|
|
|
|
|
async def api_call():
|
|
|
|
|
try:
|
|
|
|
|
result = await some_api_call()
|
|
|
|
|
return result
|
|
|
|
|
except Exception as e:
|
|
|
|
|
error_type, message = classify_api_error(e)
|
|
|
|
|
logger.error(f"API Error [{error_type.value}]: {message}")
|
|
|
|
|
raise
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3. 로깅 설정
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
import logging
|
|
|
|
|
from src.connector.imagen4_client import ensure_unicode_string
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
# 안전한 유니코드 로깅
|
|
|
|
|
prompt = ensure_unicode_string(user_input)
|
|
|
|
|
logger.info(f"Processing prompt: {prompt}")
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 주요 클래스 및 함수
|
|
|
|
|
|
|
|
|
|
### src.connector.imagen4_client
|
|
|
|
|
- `Imagen4Client`: Google API 클라이언트 메인 클래스
|
|
|
|
|
- `classify_api_error()`: API 오류 분류 및 처리
|
|
|
|
|
- `ensure_unicode_string()`: UTF-8 문자열 안전 변환
|
|
|
|
|
|
|
|
|
|
### src.server.handlers
|
|
|
|
|
- `ToolHandlers`: MCP 도구 핸들러 컬렉션
|
|
|
|
|
- `sanitize_args_for_logging()`: 로깅용 인수 정리
|
|
|
|
|
|
|
|
|
|
### src.async_task.task_manager
|
|
|
|
|
- `TaskManager`: 비동기 작업 관리 (최대 10분 타임아웃)
|
|
|
|
|
- `WorkerPool`: 멀티 워커 지원
|
|
|
|
|
|
|
|
|
|
### src.utils.image_utils
|
|
|
|
|
- `create_preview_image_b64()`: JPEG 미리보기 생성
|
|
|
|
|
- `get_image_info()`: 이미지 메타데이터 추출
|
|
|
|
|
|
|
|
|
|
## 문제 해결
|
|
|
|
|
|
|
|
|
|
### 일반적인 오류
|
|
|
|
|
|
|
|
|
|
**1. Google Cloud 인증 오류**
|
|
|
|
|
```bash
|
|
|
|
|
# 서비스 계정 키 경로 확인
|
|
|
|
|
echo $GOOGLE_APPLICATION_CREDENTIALS
|
|
|
|
|
# 프로젝트 ID 확인
|
|
|
|
|
echo $PROJECT_ID
|
|
|
|
|
# Imagen API 활성화 확인
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**2. 메모리 부족**
|
|
|
|
|
- 이미지 생성 개수를 1개로 제한
|
|
|
|
|
- 시스템 메모리 8GB 이상 권장
|
|
|
|
|
|
|
|
|
|
**3. 한글 로깅 깨짐**
|
2025-08-24 23:15:52 +09:00
|
|
|
```bash
|
2025-08-25 23:50:31 +09:00
|
|
|
# run_utf8.bat 사용 또는
|
2025-08-24 23:15:52 +09:00
|
|
|
chcp 65001
|
|
|
|
|
set PYTHONIOENCODING=utf-8
|
2025-08-25 23:50:31 +09:00
|
|
|
python main.py
|
2025-08-24 23:15:52 +09:00
|
|
|
```
|
|
|
|
|
|
2025-08-25 23:50:31 +09:00
|
|
|
**4. MCP 연결 실패**
|
|
|
|
|
- Claude Desktop 재시작
|
|
|
|
|
- `claude_desktop_config.json` 경로 확인
|
|
|
|
|
- 서버 로그에서 오류 메시지 확인
|
2025-08-24 23:15:52 +09:00
|
|
|
|
2025-08-25 23:50:31 +09:00
|
|
|
### 로그 모니터링
|
|
|
|
|
|
|
|
|
|
서버 실행 시 상세 로그가 출력됩니다:
|
|
|
|
|
```
|
|
|
|
|
[UTF8-TEST] Test UTF-8: 한글 테스트 ✓
|
|
|
|
|
INFO - Imagen4 MCP Server starting...
|
|
|
|
|
INFO - Starting image generation: '아름다운 풍경...', Seed: 123456
|
|
|
|
|
INFO - Image generated successfully
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 성능 및 제한사항
|
|
|
|
|
|
|
|
|
|
### API 제한
|
|
|
|
|
- Google Imagen4 API 할당량 준수
|
|
|
|
|
- 동시 요청 수 제한 (워커 풀 관리)
|
|
|
|
|
- 이미지 크기: 최대 2048x2048
|
2025-08-24 23:15:52 +09:00
|
|
|
|
2025-08-25 23:50:31 +09:00
|
|
|
### 메모리 사용
|
|
|
|
|
- PNG 원본: 8-15MB per image
|
|
|
|
|
- JPEG 미리보기: 50-200KB per image
|
|
|
|
|
- 메타데이터: <1KB per image
|
|
|
|
|
|
|
|
|
|
### 타임아웃
|
|
|
|
|
- 이미지 생성: 360초 (6분)
|
|
|
|
|
- 백그라운드 작업: 600초 (10분)
|
2025-08-24 23:15:52 +09:00
|
|
|
|
|
|
|
|
---
|
2025-08-25 23:50:31 +09:00
|
|
|
|
|
|
|
|
**마지막 업데이트:** 2025년 8월 25일
|
|
|
|
|
**프로젝트 버전:** 현재 안정 버전 사용 중
|
|
|
|
|
**지원:** 한글 프롬프트 완벽 지원, Windows/Linux/Mac 크로스 플랫폼
|