{"_id":"@cocrates/google-genai-mcp","_rev":"7-4c24f2956636a90e7a6dace9651e981d","name":"@cocrates/google-genai-mcp","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.0":{"name":"@cocrates/google-genai-mcp","version":"0.1.0","license":"Apache-2.0","_id":"@cocrates/google-genai-mcp@0.1.0","maintainers":[{"name":"drajin.cho","email":"drajin.cho@bosornd.com"}],"bin":{"gemini":"dist/cli/index.js","google-genai-mcp":"dist/mcp/index.js"},"dist":{"shasum":"8569af16b680832011347ccfce8de06e8efe246d","tarball":"https://registry.npmjs.org/@cocrates/google-genai-mcp/-/google-genai-mcp-0.1.0.tgz","fileCount":107,"integrity":"sha512-Yn+OiIeR9aSb3VUgT3PU89pFV/r8bTUIHPC5HwUtVisDDEe+85ytttnBRbhD3eQgULt70VRMYBiJ9ciKO7CWIw==","signatures":[{"sig":"MEUCIQCH2geVUCTSpBDg/J4iB4iKhwbuYVY0KbLSNISf57SVPgIgVTiA1iMRrRSt13disNGQVC8RTpNjLCMVGIfi/LnX7KM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":282665},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":"./dist/index.js"},"gitHead":"da0d274181b7a68735e93dd6a6f6db48cd0ee3c3","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","start:cli":"node dist/cli/index.js","start:mcp":"node dist/mcp/index.js"},"_npmUser":{"name":"drajin.cho","email":"drajin.cho@bosornd.com"},"_npmVersion":"11.16.0","description":"MCP server and CLI for Google Gemini Image/Video/Audio generation","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.24.0","glob":"^11.0.0","yaml":"^2.7.0","@google/genai":"^2.13.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/google-genai-mcp_0.1.0_1784842470766_0.6015562934115972","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@cocrates/google-genai-mcp","version":"0.1.1","license":"Apache-2.0","_id":"@cocrates/google-genai-mcp@0.1.1","maintainers":[{"name":"drajin.cho","email":"drajin.cho@bosornd.com"}],"bin":{"gemini":"dist/cli/index.js","google-genai-mcp":"dist/mcp/index.js"},"dist":{"shasum":"89f7439f748d2c35a3b2b0888549f1de62dee837","tarball":"https://registry.npmjs.org/@cocrates/google-genai-mcp/-/google-genai-mcp-0.1.1.tgz","fileCount":107,"integrity":"sha512-v6YAuYUkdNj/vCshoVi/eyPGQBiPKUFFfMh8rkFODRHswLfbJHW6EgSV1cmV9yscSVIL6XczpsK+LhxJndSalA==","signatures":[{"sig":"MEUCIQC3IdNOEGrrLXDFN/5Ip3gVpIqbAZdTheZDfJLtMj72agIgcH/Ku5ij1UQfiFX29GlUvPH+4rMa9Pr4X+t51HQu9AM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":285822},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":"./dist/index.js"},"gitHead":"92c27f572a9e6db98c6ffc582c20ad0710c20f1b","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","start:cli":"node dist/cli/index.js","start:mcp":"node dist/mcp/index.js"},"_npmUser":{"name":"drajin.cho","email":"drajin.cho@bosornd.com"},"_npmVersion":"11.16.0","description":"MCP server and CLI for Google Gemini Image/Video/Audio generation","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.24.0","glob":"^11.0.0","yaml":"^2.7.0","@google/genai":"^2.13.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/google-genai-mcp_0.1.1_1784845123797_0.9180131391739585","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@cocrates/google-genai-mcp","version":"0.1.2","license":"Apache-2.0","_id":"@cocrates/google-genai-mcp@0.1.2","maintainers":[{"name":"drajin.cho","email":"drajin.cho@bosornd.com"}],"bin":{"gemini":"dist/cli/index.js","google-genai-mcp":"dist/mcp/index.js"},"dist":{"shasum":"5780b7d5e905bc6e5d905e94d72c41888c6973a4","tarball":"https://registry.npmjs.org/@cocrates/google-genai-mcp/-/google-genai-mcp-0.1.2.tgz","fileCount":107,"integrity":"sha512-qS7EruBn20wkSCl8yF9zLxC1jUWg1SsVSVEeKbdescDdRQ4HoczQ8Zu8Yjjdg/m1mojjZg6Y6Y+3l7/8JL2WRQ==","signatures":[{"sig":"MEQCIEP3brAXBoM0gzL9/nR9loBNHpOFkJonrQKd7flRs746AiBOMehSW9Hj5N+rROJE4ekGt2C5fbSO2vA3DYMkmybtZw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":285715},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":"./dist/index.js"},"gitHead":"3ecce787021a3ad85b2ab7d45cd38e820cb7507f","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","start:cli":"node dist/cli/index.js","start:mcp":"node dist/mcp/index.js"},"_npmUser":{"name":"drajin.cho","email":"drajin.cho@bosornd.com"},"_npmVersion":"11.16.0","description":"MCP server and CLI for Google Gemini Image/Video/Audio generation","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.24.0","glob":"^11.0.0","yaml":"^2.7.0","@google/genai":"^2.13.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/google-genai-mcp_0.1.2_1784900222976_0.5995514721132467","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@cocrates/google-genai-mcp","version":"0.1.3","license":"Apache-2.0","_id":"@cocrates/google-genai-mcp@0.1.3","maintainers":[{"name":"drajin.cho","email":"drajin.cho@bosornd.com"}],"bin":{"gemini":"dist/cli/index.js","google-genai-mcp":"dist/mcp/index.js"},"dist":{"shasum":"d4b4c4a823254a070f18ca7461e5c96156d8b116","tarball":"https://registry.npmjs.org/@cocrates/google-genai-mcp/-/google-genai-mcp-0.1.3.tgz","fileCount":115,"integrity":"sha512-+LRgSDNLANBlZPV1vNJiVVYAojr64wqV1gYL1isPX1Hs2xJnAral1nUGUwlhRL9efEAFll540o1RnAx1wEi+gg==","signatures":[{"sig":"MEYCIQCYK2Ibp67xLYE4M0q8tAIB5FyHe/+EcPVWGYCry4FaDQIhAOIcorvl/mlhoMxrhja2CZ8sHkmTK8FVWzeHNWFnwAZ0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":322647},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":"./dist/index.js"},"gitHead":"a703cb61f21acb407e036530b321d918652e3365","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","start:cli":"node dist/cli/index.js","start:mcp":"node dist/mcp/index.js"},"_npmUser":{"name":"drajin.cho","email":"drajin.cho@bosornd.com"},"_npmVersion":"11.16.0","description":"MCP server and CLI for Google Gemini Image/Video/Audio generation","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.24.0","glob":"^11.0.0","yaml":"^2.7.0","@google/genai":"^2.13.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/google-genai-mcp_0.1.3_1785022075529_0.9444774267961855","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@cocrates/google-genai-mcp","version":"0.1.4","license":"Apache-2.0","_id":"@cocrates/google-genai-mcp@0.1.4","maintainers":[{"name":"drajin.cho","email":"drajin.cho@bosornd.com"}],"bin":{"gemini":"dist/cli/index.js","google-genai-mcp":"dist/mcp/index.js"},"dist":{"shasum":"9a5d70ad1954a2cc94326370040795ba564409d0","tarball":"https://registry.npmjs.org/@cocrates/google-genai-mcp/-/google-genai-mcp-0.1.4.tgz","fileCount":127,"integrity":"sha512-XBw5p1+WTWxzx27iJPSnKBYbJuII+473NgH/8ctD3tKz04tCKhxc5+DxUOrpPikD1ziZoKKXegiK2heclgWwUg==","signatures":[{"sig":"MEQCIEsYK7hmlcPZQNBMtIB1b4++BWyeDViUdcg7EhC3o/kRAiB0o9yPT2h/opBPgQvV78AylmiZyfGJWg9HZYaTzhVA2A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":375828},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":"./dist/index.js"},"gitHead":"c0beae820e80136eeb8c823ca09dd9862d265d81","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","start:cli":"node dist/cli/index.js","start:mcp":"node dist/mcp/index.js"},"_npmUser":{"name":"drajin.cho","email":"drajin.cho@bosornd.com"},"_npmVersion":"11.16.0","description":"MCP server and CLI for Google Gemini Image/Video/Audio generation","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.24.0","glob":"^11.0.0","yaml":"^2.7.0","@google/genai":"^2.13.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/google-genai-mcp_0.1.4_1785294205255_0.7648043882443747","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@cocrates/google-genai-mcp","version":"0.1.5","license":"Apache-2.0","_id":"@cocrates/google-genai-mcp@0.1.5","maintainers":[{"name":"drajin.cho","email":"drajin.cho@bosornd.com"}],"bin":{"gemini":"dist/cli/index.js","google-genai-mcp":"dist/mcp/index.js"},"dist":{"shasum":"d60be2d5cbabbf93d00da2ae2b3b3984da3f5b7a","tarball":"https://registry.npmjs.org/@cocrates/google-genai-mcp/-/google-genai-mcp-0.1.5.tgz","fileCount":127,"integrity":"sha512-iMy86xwSXXpIukw182Lm4tnrOKD/DQZyEzqWT0TIYHlKjQmTam+SqJOPRpKUhrbS3blV/Cu/bHq5mkm6E46YhQ==","signatures":[{"sig":"MEYCIQCnRHWAuHNUi+ckEOwnTAtBu3LvzFY1u12uQDFLoEQ0JQIhAO54b5uXUMmUeWURAOxQDPXXnfm/MP7jHVhBpRtStcNk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":377767},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":"./dist/index.js"},"gitHead":"4a45fa65c05195fb769a5120c6d06d0c77f2858e","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","start:cli":"node dist/cli/index.js","start:mcp":"node dist/mcp/index.js"},"_npmUser":{"name":"drajin.cho","email":"drajin.cho@bosornd.com"},"_npmVersion":"11.16.0","description":"MCP server and CLI for Google Gemini Image/Video/Audio generation","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.24.0","glob":"^11.0.0","yaml":"^2.7.0","@google/genai":"^2.13.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/google-genai-mcp_0.1.5_1785498815256_0.26192401192486003","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@cocrates/google-genai-mcp","version":"0.1.6","description":"MCP server and CLI for Google Gemini Image/Video/Audio generation","type":"module","engines":{"node":">=18"},"bin":{"google-genai-mcp":"dist/mcp/index.js","gemini":"dist/cli/index.js"},"main":"./dist/index.js","exports":{".":"./dist/index.js"},"scripts":{"build":"tsc","dev":"tsc --watch","test":"vitest run","start:mcp":"node dist/mcp/index.js","start:cli":"node dist/cli/index.js"},"dependencies":{"@google/genai":"^2.13.0","@modelcontextprotocol/sdk":"^1.29.0","glob":"^11.0.0","yaml":"^2.7.0","zod":"^3.24.0"},"devDependencies":{"@types/node":"^22.0.0","typescript":"^5.8.0","vitest":"^3.0.0"},"license":"Apache-2.0","gitHead":"30927e4b6da13d33c088bde0f0058eba0922609d","types":"./dist/index.d.ts","_id":"@cocrates/google-genai-mcp@0.1.6","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-yIGOXZL3CVN3U8y+y08ih2VhUdNCsIDLGELS2BmROXrTeIHX0/Ecqw6tx1VJ7zEcKZrQBjWhIuk7joi1Irxq3A==","shasum":"c7119806047703594961370295a3139efd4c0e38","tarball":"https://registry.npmjs.org/@cocrates/google-genai-mcp/-/google-genai-mcp-0.1.6.tgz","fileCount":131,"unpackedSize":407502,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHiblIBYF/yhVl940tTQu0FFFSxdebjGeGkm0Bl9rjtzAiAxeoeBRk7sIz+51huW/mpohwRGklEia43piBVq1AxNSQ=="}]},"_npmUser":{"name":"drajin.cho","email":"drajin.cho@bosornd.com"},"directories":{},"maintainers":[{"name":"drajin.cho","email":"drajin.cho@bosornd.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/google-genai-mcp_0.1.6_1785545932871_0.3501210171790643"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-23T21:34:30.587Z","modified":"2026-08-01T00:58:53.196Z","0.1.0":"2026-07-23T21:34:30.957Z","0.1.1":"2026-07-23T22:18:43.936Z","0.1.2":"2026-07-24T13:37:03.113Z","0.1.3":"2026-07-25T23:27:55.671Z","0.1.4":"2026-07-29T03:03:25.472Z","0.1.5":"2026-07-31T11:53:35.395Z","0.1.6":"2026-08-01T00:58:53.015Z"},"license":"Apache-2.0","description":"MCP server and CLI for Google Gemini Image/Video/Audio generation","maintainers":[{"name":"drajin.cho","email":"drajin.cho@bosornd.com"}],"readme":"# @cocrates/google-genai-mcp\n\nGoogle Gemini API의 **Image / Video / Speech(TTS) / Music 생성**과 **미디어 이해(analyze)** 를 [MCP](https://modelcontextprotocol.io) 서버와 CLI로 제공하는 TypeScript 패키지입니다.\n\n에이전트(OpenCode, Claude Desktop, Cursor 등)는 MCP 도구로, 개발자는 터미널에서 YAML/JSON 요청 파일로 동일한 생성·관리 흐름을 사용할 수 있습니다.\n\n| | |\n|---|---|\n| **패키지** | `@cocrates/google-genai-mcp` |\n| **바이너리** | `google-genai-mcp` (MCP), `gemini` (CLI) |\n| **런타임** | Node.js 18+ |\n| **인증** | `GEMINI_API_KEY` |\n| **전송** | MCP stdio (JSON-RPC) |\n\n상세 사양: [`spec/google-genai-mcp.md`](./spec/google-genai-mcp.md) · PRD: [`spec/PRD.md`](./spec/PRD.md)\n\n---\n\n## 기능 요약\n\n- **Image** — Nano Banana (`gemini-3.1-flash-image` 등)\n- **Video** — Gemini Omni Flash (`gemini-omni-flash-preview`), Interactions API, 기본 백그라운드 실행\n- **Speech** — Gemini TTS (단일·다중 화자, 음성 30종)\n- **Music** — Lyria 3 Clip / Pro (`lyria-3-clip-preview`, `lyria-3-pro-preview`)\n- **Analyze** — image/audio/video 이해 (`analyze` → `{ interactionId, text }`, 기본 `gemini-3.5-flash`)\n- Interactions API 기반 `interactionId` 관리, multi-turn 이어가기\n- 생성 요청은 YAML/JSON 파일로 선언 (상대 경로는 요청 파일 디렉터리 기준)\n\n---\n\n## MCP 서버\n\n진입점: `google-genai-mcp` (stdio)\n\n### 도구\n\n| Tool | 설명 |\n|------|------|\n| `generate` | YAML/JSON **파일 1개**로 생성 → `{ interactionId, files, background }` |\n| `analyze` | 미디어 이해 → `{ interactionId, text }` (`inputs`+`prompt?`+`model?`; `.yaml`/`.json`은 생성 스펙으로 인식) |\n| `download` | 완료된 interaction 산출물 저장 (미완료 시 즉시 에러) |\n| `get_interaction` | 상태 조회 (서버에 없으면 로컬 매핑 정리) |\n| `continue_interaction` | `previous_interaction_id`로 이어가기 (생성·분석 공통) |\n| `list_interactions` | 로컬 목록 + 서버 상태 |\n| `sync_interactions` | 서버에 없는 로컬 항목 제거 |\n| `cancel_interaction` / `delete_interaction` | 취소 / 삭제 |\n\n여러 파일을 생성하려면 클라이언트가 `generate`를 여러 번(또는 병렬로) 호출합니다.\n\n### 클라이언트 설정 예시 (Claude Desktop / Cursor)\n\n```json\n{\n  \"mcpServers\": {\n    \"google-genai\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@cocrates/google-genai-mcp\"],\n      \"env\": {\n        \"GEMINI_API_KEY\": \"your-api-key\"\n      }\n    }\n  }\n}\n```\n\n로컬 빌드본을 쓰려면 `command`를 `node`, `args`를 `[\"/path/to/google-genai-mcp/dist/mcp/index.js\"]`로 지정하면 됩니다.\n\n---\n\n## CLI\n\n진입점: `gemini` — 형태: `gemini <command> [args…] [--verbose] [--force]`\n\n```bash\n# 생성\ngemini generate ./images/*.yaml\ngemini generate a.yaml b.yaml --verbose --force\n\n# 분석 (prompt: -p 또는 stdin; 빈 prompt면 취소)\ngemini analyze ./out/clip.mp4 -p \"의도대로 나왔는지 평가해 줘\"\necho \"3문장으로 요약\" | gemini analyze ./photo.png\n# 생성 YAML 기준 분석 (확장자로 인식 → output + YAML/참조 YAML 체크리스트)\ngemini analyze ./images/page04.yaml\ngemini analyze ./images/page04.yaml -p \"인물 일관성을 더 자세히\"\n\n# 관리 (대상은 interactionId)\ngemini list\ngemini show <interactionId>\ngemini download <interactionId> [path]\ngemini help\n\n# 인터랙티브 모드 (명령 없음)\ngemini\n```\n\n### 인라인 명령\n\n| 명령 | 설명 |\n|------|------|\n| `generate <files…>` | YAML/JSON 생성 |\n| `analyze <files…>` | 미디어 분석 → text + interactionId (`.yaml`/`.json`은 생성 스펙) |\n| `download` / `list` / `show` / `status` / `sync` / `cancel` / `delete` | interaction 관리 |\n| `help [command]` | 도움말 (MCP tool 설명과 정합) |\n\n### 인터랙티브 명령\n\n| 명령 | 설명 |\n|------|------|\n| `/list` | interaction 목록 |\n| `/select N` | N번째 선택 |\n| `/show` | 원본 요청 YAML 표시 |\n| `/status` | 서버 상태 |\n| `/download [path]` | 산출물 저장 |\n| `/sync` | 로컬↔서버 동기화 |\n| `/cancel` / `/delete` | 취소 / 삭제 |\n| (일반 텍스트) | 선택된 interaction에 이어가기 |\n\nVideo 등 비동기 작업은 progress를 출력하며 대기합니다. **시간 상한은 없고**, `Ctrl-C`로 중단할 수 있습니다.\n\n### 요청 파일 예시\n\n```yaml\ntype: image\nmodel: gemini-3.1-flash-image\nparams:\n  prompt: |\n    A red circle on a white background\n  size: 1K\n  aspectRatio: \"1:1\"\noutput: \"./output/circle.png\"\n```\n\n`type`은 `image` | `video` | `speech` | `music`입니다. 스키마 전체는 스펙 문서를 참고하세요.\n\n---\n\n## 설치\n\n```bash\n# 전역\nnpm install -g @cocrates/google-genai-mcp\n\n# 또는 npx\nnpx @cocrates/google-genai-mcp   # MCP\nnpx -y --package=@cocrates/google-genai-mcp gemini generate ./request.yaml\n```\n\n```bash\nexport GEMINI_API_KEY=your-api-key\n```\n\n---\n\n## 로컬 개발 · 테스트\n\n### 준비\n\n```bash\ngit clone <repo-url>\ncd google-genai-mcp\nnpm install\nnpm run build\nexport GEMINI_API_KEY=your-api-key\n```\n\n### 스크립트\n\n| 명령 | 설명 |\n|------|------|\n| `npm run build` | TypeScript → `dist/` |\n| `npm run dev` | `tsc --watch` |\n| `npm test` | vitest |\n| `npm run start:mcp` | MCP 서버 (stdio) |\n| `npm run start:cli` | CLI 엔트리 |\n\n### 로컬에서 CLI / MCP 실행\n\n```bash\n# CLI\nnode dist/cli/index.js ./images/kwon-su-a.yaml --verbose\nnode dist/cli/index.js   # interactive\n\n# MCP (클라이언트가 stdin/stdout으로 붙는 용도)\nnode dist/mcp/index.js\n```\n\n개발 중 MCP 클라이언트에는 빌드된 절대 경로를 등록하세요.\n\n```json\n{\n  \"command\": \"node\",\n  \"args\": [\"/ABS/PATH/google-genai-mcp/dist/mcp/index.js\"],\n  \"env\": { \"GEMINI_API_KEY\": \"...\" }\n}\n```\n\n코드 수정 후 `npm run build`(또는 `npm run dev`)로 `dist/`를 갱신한 뒤 클라이언트를 재시작하면 됩니다.\n\n### 수동 스모크 체크리스트\n\n1. `gemini`로 image YAML 생성 → `interactionId` + 파일 경로 확인  \n2. video YAML → `generate` 완료 후 파일 경로 확인 (필요 시 `background: true` + `/status` · `/download`)  \n3. MCP `generate` → (async면) `get_interaction` → `download`  \n4. `/sync`, `/cancel`, `/delete` 동작 확인  \n\n단위·통합 테스트는 `npm test`로 실행합니다 (vitest).\n\n---\n\n## GitHub Release · npm 배포\n\n패키지 이름: **`@cocrates/google-genai-mcp`** (scoped). npm에 퍼블리시하려면 해당 scope 권한이 필요합니다.\n\n### 1. 버전 올리기\n\n```bash\nnpm version patch   # 0.1.0 → 0.1.1\n# 또는 minor / major\nnpm run build\n```\n\n### 2. npm 배포\n\n```bash\nnpm login\nnpm publish --access public\n```\n\n`files` 필드에 `dist`, `README.md`, `LICENSE`만 포함되므로 **publish 전에 반드시 `npm run build`** 하세요. (`dist/`는 gitignore일 수 있습니다.)\n\n### 3. GitHub Release\n\n```bash\ngit push origin main --follow-tags\n\ngh release create v0.1.1 \\\n  --title \"v0.1.1\" \\\n  --notes \"$(cat <<'EOF'\n## Changes\n- …\n\n## Install\nnpm install -g @cocrates/google-genai-mcp@0.1.1\nEOF\n)\"\n```\n\n태그/릴리스는 `npm version`이 만든 git tag와 버전을 맞추면 됩니다.\n\n### 권장 순서\n\n1. PR 머지 → `main`  \n2. `npm version` + `npm run build` + `npm publish`  \n3. `git push --follow-tags` + `gh release create`  \n\nCI에서 publish하려면 Node 18+, `NPM_TOKEN`, (선택) `GITHUB_TOKEN`을 시크릿으로 두면 됩니다.\n\n---\n\n## Examples\n\n`examples/` 디렉터리에는 실제 Gemini 모델을 사용한 생성 파이프라인 예시가 포함되어 있습니다. 각 YAML 파일은 하나의 생성 작업을 정의하며, `output/` 디렉터리에 결과물이 저장됩니다.\n\n### 개요\n\n| # | 파일 | 유형 | 출력 | 설명 |\n|---|------|------|------|------|\n| 1 | `kwon-su-a.yaml` | Image | `kwon-su-a.png` | 기본 캐릭터 레퍼런스 시트 생성 |\n| 2 | `kwon-su-a-cafe.yaml` | Image | `kwon-su-a-cafe.png` | 카페 장면 생성 + 변형 이미지들 |\n| 3 | `conversation.yaml` | Speech | `conversation.wav` | 수아와 친구의 전화 대화 TTS |\n| 4 | `cafe-bgm.yaml` | Music | `cafe-bgm.mp3` | 카페 배경 음악 |\n| 5 | `cafe-video.yaml` | Video | `cafe-video.mp4` | 카페 장면 생생한 영상 |\n\n### 상세 설명\n\n#### 1. 캐릭터 레퍼런스 시트 (`kwon-su-a.yaml`)\n\n> Image (`gemini-3.1-flash-image`) → `kwon-su-a.png`\n\n\"권수아\"라는 22세 한국 여성 캐릭터의 기본 레퍼런스 이미지를 생성합니다. 클린 스튜디오 배경에서 전신 포즈로, 의상·헤어·체형 등 캐릭터 일관성의 기준점이 됩니다.\n\n```bash\ngemini generate examples/kwon-su-a.yaml\n```\n\n#### 2. 카페 장면 + 변형 (`kwon-su-a-cafe.yaml`)\n\n> Image (`gemini-3.1-flash-image`) → `kwon-su-a-cafe.png` (기본) + 변형 이미지 3종\n\n기본 레퍼런스 이미지를 참조하여 카페 장면으로 변환합니다. 의상(오프화이트 크로켓 가디건 + 블랙 미니 스커트), 배경(카페 인테리어), 포즈(카페 테이블에 앉아 커피잔을 든 모습)를 변경합니다.\n\n**변형 이미지 (edit):**\n\n| 출력 | 변경 내용 |\n|------|-----------|\n| `kwon-su-a-cafe0.png` | 카페 장면 기본 |\n| `kwon-su-a-cafe1.png` | 가방 색상 변경 |\n| `kwon-su-a-cafe2.png` | 치마 색상 변경 |\n| `kwon-su-a-cafe3.png` | 액세서리(시계, 반지) 추가 |\n\n기본 장면을 생성한 뒤, edit 기능으로 세부 요소를 순차적으로 변형하는 예시입니다.\n\n```bash\n# 기본 카페 장면 생성\ngemini generate examples/kwon-su-a-cafe.yaml\n```\n\n#### 3. 친구와 전화하는 장면\n\n`kwon-su-a-cafe.yaml`의 프롬프트를 수정하여 카페에 앉아 전화로 친구와 수다 떠는 장면으로 변경합니다. 기존 커피잔 포즈 대신 스마트폰을 귀에 대고 대화하는 자연스러운 모습을 연출합니다.\n\n#### 4. 전화 대화 TTS (`conversation.yaml`)\n\n> Speech (`gemini-3.1-flash-tts-preview`) → `conversation.wav`\n\n수아가 여름 방학 유럽 여행을 자랑하고, 친구가 부러워하는 30초짜리 한국어 전화 대화를 생성합니다. 두 명의 화자(수아: `Laomedeia`, 친구: `Callirrhoe`)가 자연스러운 반말로 대화합니다.\n\n**대화 내용 요약:**\n- 수아: 유럽 여행(파리, 이탈리아) 계획 자랑\n- 친구: 부러워하는 반응, 알바 이야기\n- 분위기: 경쾌하고 장난스러운 친구 간 통화\n\n```bash\ngemini generate examples/conversation.yaml\n```\n\n#### 5. 카페 배경 음악 (`cafe-bgm.yaml`)\n\n> Music (`lyria-3-clip-preview`) → `cafe-bgm.mp3`\n\n카페에서 흘러나오는 듯한 Lo-fi 재즈/Bossa Nova 스타일의 30초 배경 음악을 생성합니다. 어쿠스틱 기타, Fender Rhodes 피아노, 브러시 드럼이 어우러진 따뜻하고 편안한 트랙입니다.\n\n```bash\ngemini generate examples/cafe-bgm.yaml\n```\n\n#### 6. 카페 영상 (`cafe-video.yaml`)\n\n> Video (`gemini-omni-flash-preview`) → `cafe-video.mp4`\n\n카페 장면 이미지(`kwon-su-a-cafe.png`)를 시작 프레임으로 사용하여, 수아가 전화로 친구와 수다 떠는 8초 영상을 생성합니다. 자연스러운 손동작과 표정 변화, 카페 배경의 미세한 움직임이 포함됩니다.\n\n- **작업 유형**: `image_to_video` (참조 이미지 1장 → 런타임 추론)\n- **연출**: 원 컨티뉴어스 샷, 헤ンド홀드 카메라 드리프트\n- **오디오**: Lo-fi 재즈 배경음악 + 카페 백색소음\n\n```bash\ngemini generate examples/cafe-video.yaml\n```\n\n### 전체 파이프라인 실행 순서\n\n```\n1. kwon-su-a.yaml           → kwon-su-a.png         (캐릭터 레퍼런스)\n2. kwon-su-a-cafe.yaml      → kwon-su-a-cafe.png    (카페 장면)\n3. (edit)                   → cafe0~3.png            (변형 이미지)\n4. conversation.yaml        → conversation.wav       (전화 대화)\n5. cafe-bgm.yaml            → cafe-bgm.mp3          (배경 음악)\n6. cafe-video.yaml          → cafe-video.mp4         (카페 영상)\n```\n\n---\n\n## Cocrates로 개발됨\n\n이 프로젝트는 **[Cocrates](https://cocrates.ai)** agent harness로 개발되었습니다.\n\n요구 명세 → 아키텍처 결정(ADR/ASR) → 사양 작성 → 구현까지의 대화·결정은 [`PROMPTS.md`](./PROMPTS.md)에 정리되어 있습니다.\n\n관련 산출물:\n\n- `spec/PRD.md`, `spec/ASR.md`, `spec/google-genai-mcp.md`\n- `adr/` — MCP 전송, 클라이언트 생명주기, CLI/MCP 엔트리포인트 등\n\n---\n\n## 라이선스\n\n[Apache-2.0](./LICENSE)\n","readmeFilename":"README.md"}