Python MCP server for AI-powered image generation using Google Gemini models - A complete port of nanobanana
Project description
nanobanana-py
Python MCP Server,使用 Google Gemini 模型進行 AI 圖片生成。
完整移植自 nanobanana(TypeScript 版)。
✨ 功能特色
- 🎨 文字轉圖片生成:依照描述式提示詞生成高品質圖片
- ✏️ 圖片編修:用自然語言指令修改既有圖片
- 🔧 圖片修復:修復並強化老舊或受損照片
- 🏷️ 圖示生成:生成多尺寸的 App 圖示、Favicon 與 UI 元件
- 🎯 圖樣生成:生成可無縫拼接的圖樣與背景材質
- 📖 故事序列:生成可呈現視覺故事或流程的連續圖片
- 📊 技術圖表:生成流程圖、架構圖與技術示意圖
- 🔄 自動 Fallback:主模型失敗時自動切換備用模型
- ⚡ 批次生成:支援平行生成多張圖片
📋 前置需求
- Python 3.10+
- API Key:設定下列任一環境變數:
NANOBANANA_GEMINI_API_KEY(建議)NANOBANANA_GOOGLE_API_KEYGEMINI_API_KEY(備援)GOOGLE_API_KEY(備援)
從 Google AI Studio 取得 API Key。
🚀 安裝
透過 uvx(推薦)
uvx nanobanana-py
透過 pip
pip install nanobanana-py
透過 pipx
pipx install nanobanana-py
⚙️ 設定
環境變數
# API Key(必要)
export NANOBANANA_GEMINI_API_KEY="your-api-key-here"
# 使用不同模型(預設:gemini-2.5-flash-image)
export NANOBANANA_MODEL="gemini-3-pro-image-preview"
# Fallback 模型(逗號分隔,主模型失敗時依序嘗試)
export NANOBANANA_FALLBACK_MODELS="gemini-2.5-flash-image,gemini-2.0-flash-exp-image-generation"
# API 超時秒數(預設:60)
export NANOBANANA_TIMEOUT="90"
# 自訂輸出目錄(預設:當前目錄)
export NANOBANANA_OUTPUT_DIR="/path/to/output"
# 啟用除錯日誌
export NANOBANANA_DEBUG="1"
🍌 模型選擇
此工具支援兩種模型:
| 模型 | 說明 | 特性 |
|---|---|---|
gemini-2.5-flash-image |
預設模型 | 快速、穩定 |
gemini-3-pro-image-preview |
Pro 模型 | 高品質、支援 2K/4K |
🔄 自動 Fallback 機制
當主模型失敗(超時、過載或錯誤)時,會自動切換到備用模型。回應中會包含 fallback 資訊:
{
"success": true,
"message": "Successfully generated 1 image (使用備用模型: gemini-2.5-flash-image,原本: gemini-3-pro-image-preview)",
"modelUsed": "gemini-2.5-flash-image",
"usedFallback": true,
"primaryModel": "gemini-3-pro-image-preview"
}
Claude Code 整合
在 .mcp.json 中加入:
{
"mcpServers": {
"nanobanana": {
"command": "uvx",
"args": ["nanobanana-py"],
"env": {
"NANOBANANA_GEMINI_API_KEY": "your-api-key-here"
}
}
}
}
💡 使用方式
🎨 generate_image - 生成圖片
從文字描述生成單張或多張圖片。
參數:
| 參數 | 類型 | 預設值 | 說明 |
|---|---|---|---|
prompt |
string | (必填) | 圖片描述 |
files |
array | - | 參考圖片路徑(1-13 張) |
filename |
string | - | 輸出檔名 |
output_count |
int | 1 | 生成數量(1-8) |
styles |
array | - | 藝術風格 |
variations |
array | - | 變化類型 |
format |
string | "separate" | 輸出格式(grid / separate) |
seed |
int | - | 隨機種子(用於重現結果) |
resolution |
string | "1K" | 解析度(1K / 2K / 4K) |
preview |
bool | false | 自動預覽 |
no_preview |
bool | false | 強制禁用預覽 |
parallel |
int | 2 | 平行生成數量(1-8) |
可用風格(styles):
photorealistic- 寫實攝影風格watercolor- 水彩畫風oil-painting- 油畫技法sketch- 手繪素描風pixel-art- 復古像素風anime- 動漫/漫畫風vintage- 復古/懷舊美學modern- 當代/現代風格abstract- 抽象藝術風minimalist- 乾淨、極簡設計
可用變化類型(variations):
lighting- 不同光線條件(戲劇化、柔和)angle- 不同視角(俯視、特寫)color-palette- 不同配色(暖色、冷色)composition- 不同構圖(置中、三分法)mood- 不同情緒氛圍(愉快、戲劇化)season- 不同季節(春、冬)time-of-day- 不同時段(日出、日落)
範例:
# 單張圖片
generate_image(prompt="一幅水彩畫:雪地森林裡的狐狸")
# 多張變體(含預覽)
generate_image(prompt="群山日落", output_count=3, preview=True)
# 指定輸出檔名
generate_image(prompt="群山日落", output_count=3, filename="sunset_mountains")
# 風格變體
generate_image(
prompt="山景風光",
styles=["watercolor", "oil-painting"],
output_count=4
)
# 指定變化類型
generate_image(
prompt="咖啡店室內",
variations=["lighting", "mood"],
preview=True
)
✏️ edit_image - 編修圖片
用自然語言指令修改既有圖片。
參數:
| 參數 | 類型 | 預設值 | 說明 |
|---|---|---|---|
prompt |
string | (必填) | 編輯描述 |
file |
string | (必填) | 輸入圖片路徑 |
filename |
string | - | 輸出檔名 |
resolution |
string | "1K" | 解析度(1K / 2K / 4K) |
preview |
bool | false | 自動預覽 |
no_preview |
bool | false | 強制禁用預覽 |
parallel |
int | 2 | 平行生成數量(1-8) |
範例:
# 基本編修
edit_image(file="my_photo.png", prompt="幫人物加上太陽眼鏡")
# 指定輸出檔名
edit_image(
file="my_photo.png",
prompt="幫人物加上太陽眼鏡",
filename="with_sunglasses"
)
# 編修並預覽
edit_image(
file="portrait.jpg",
prompt="把背景改成海灘",
preview=True
)
🔧 restore_image - 修復圖片
修復並強化老舊或受損照片。
參數:
| 參數 | 類型 | 預設值 | 說明 |
|---|---|---|---|
prompt |
string | (必填) | 修復描述 |
file |
string | (必填) | 輸入圖片路徑 |
filename |
string | - | 輸出檔名 |
resolution |
string | "1K" | 解析度(1K / 2K / 4K) |
preview |
bool | false | 自動預覽 |
no_preview |
bool | false | 強制禁用預覽 |
parallel |
int | 2 | 平行生成數量(1-8) |
範例:
# 移除刮痕
restore_image(
file="old_family_photo.jpg",
prompt="移除刮痕並提升清晰度"
)
# 增強色彩
restore_image(
file="damaged_photo.png",
prompt="增強色彩並修補撕裂",
preview=True
)
🎯 generate_icon - 生成圖示
生成多尺寸的 App 圖示、Favicon 與 UI 元件。
參數:
| 參數 | 類型 | 預設值 | 說明 |
|---|---|---|---|
prompt |
string | (必填) | 圖示描述 |
files |
array | - | 參考圖片路徑(1-14 張) |
filename |
string | - | 輸出檔名 |
sizes |
array | [1024] | 尺寸(16, 32, 64, 128, 256, 512, 1024) |
type |
string | "app-icon" | 類型(app-icon / favicon / ui-element) |
style |
string | "modern" | 風格(flat / skeuomorphic / minimal / modern) |
format |
string | "png" | 格式(png / jpeg) |
background |
string | "transparent" | 背景(transparent / white / black) |
corners |
string | "rounded" | 圓角(rounded / sharp) |
resolution |
string | "1K" | 解析度(1K / 2K / 4K) |
preview |
bool | false | 自動預覽 |
no_preview |
bool | false | 強制禁用預覽 |
parallel |
int | 2 | 平行生成數量(1-8) |
範例:
# 多尺寸 App 圖示
generate_icon(
prompt="咖啡杯 logo",
sizes=[64, 128, 256],
type="app-icon",
preview=True
)
# Favicon 組合
generate_icon(
prompt="公司 logo",
type="favicon",
sizes=[16, 32, 64]
)
# UI 元件
generate_icon(
prompt="設定齒輪圖示",
type="ui-element",
style="minimal"
)
🎨 generate_pattern - 生成圖樣
生成可無縫拼接的圖樣與背景材質。
參數:
| 參數 | 類型 | 預設值 | 說明 |
|---|---|---|---|
prompt |
string | (必填) | 圖樣描述 |
files |
array | - | 參考圖片路徑(1-14 張) |
filename |
string | - | 輸出檔名 |
size |
string | "256x256" | 尺寸(128x128, 256x256, 512x512) |
type |
string | "seamless" | 類型(seamless / texture / wallpaper) |
style |
string | "abstract" | 風格(geometric / organic / abstract / floral / tech) |
density |
string | "medium" | 密度(sparse / medium / dense) |
colors |
string | "colorful" | 配色(mono / duotone / colorful) |
repeat |
string | "tile" | 重複方式(tile / mirror) |
resolution |
string | "1K" | 解析度(1K / 2K / 4K) |
preview |
bool | false | 自動預覽 |
no_preview |
bool | false | 強制禁用預覽 |
parallel |
int | 2 | 平行生成數量(1-8) |
範例:
# 無縫拼接圖樣
generate_pattern(
prompt="幾何三角形",
type="seamless",
style="geometric",
preview=True
)
# 背景材質
generate_pattern(
prompt="木紋材質",
type="texture",
colors="mono"
)
# 桌布圖樣
generate_pattern(
prompt="花卉設計",
type="wallpaper",
density="sparse"
)
📖 generate_story - 生成故事序列
生成連續圖片,用於說故事或呈現逐步流程。
參數:
| 參數 | 類型 | 預設值 | 說明 |
|---|---|---|---|
prompt |
string | (必填) | 故事描述 |
files |
array | - | 參考圖片路徑(1-14 張) |
filename |
string | - | 輸出檔名 |
steps |
int | 4 | 步驟數(2-8) |
type |
string | "story" | 類型(story / process / tutorial / timeline) |
style |
string | "consistent" | 風格一致性(consistent / evolving) |
layout |
string | "separate" | 版面(separate / grid / comic) |
transition |
string | "smooth" | 過渡效果(smooth / dramatic / fade) |
format |
string | "individual" | 格式(storyboard / individual) |
resolution |
string | "1K" | 解析度(1K / 2K / 4K) |
preview |
bool | false | 自動預覽 |
no_preview |
bool | false | 強制禁用預覽 |
parallel |
int | 2 | 平行生成數量(1-8) |
範例:
# 視覺故事序列
generate_story(
prompt="一顆種子長成樹",
steps=4,
type="process",
preview=True
)
# 逐步教學
generate_story(
prompt="如何煮咖啡",
steps=6,
type="tutorial"
)
# 時間軸視覺化
generate_story(
prompt="智慧型手機的演進",
steps=5,
type="timeline"
)
📊 generate_diagram - 生成技術圖表
生成專業的技術圖表、流程圖與架構示意。
參數:
| 參數 | 類型 | 預設值 | 說明 |
|---|---|---|---|
prompt |
string | (必填) | 圖表描述 |
files |
array | - | 參考圖片路徑(1-14 張) |
filename |
string | - | 輸出檔名 |
type |
string | "flowchart" | 類型(見下方) |
style |
string | "professional" | 風格(professional / clean / hand-drawn / technical) |
layout |
string | "hierarchical" | 版面(horizontal / vertical / hierarchical / circular) |
complexity |
string | "detailed" | 複雜度(simple / detailed / comprehensive) |
colors |
string | "accent" | 配色(mono / accent / categorical) |
annotations |
string | "detailed" | 標註(minimal / detailed) |
resolution |
string | "1K" | 解析度(1K / 2K / 4K) |
preview |
bool | false | 自動預覽 |
no_preview |
bool | false | 強制禁用預覽 |
parallel |
int | 2 | 平行生成數量(1-8) |
圖表類型(type):
| 類型 | 說明 |
|---|---|
flowchart |
流程、決策樹、工作流程 |
architecture |
系統架構、微服務、基礎設施 |
network |
網路拓樸、伺服器配置 |
database |
資料庫結構、實體關係 |
wireframe |
UI/UX 線框稿、頁面配置 |
mindmap |
心智圖、概念層級 |
sequence |
時序圖、API 互動 |
範例:
# 系統流程圖
generate_diagram(
prompt="使用者登入流程",
type="flowchart",
style="professional",
preview=True
)
# 系統架構圖
generate_diagram(
prompt="微服務架構",
type="architecture",
complexity="detailed"
)
# 資料庫結構
generate_diagram(
prompt="電商資料庫設計",
type="database",
layout="hierarchical"
)
📁 檔案管理
智慧檔名生成
圖片會依據提示詞以友善檔名儲存:
"sunset over mountains"→sunset_over_mountains_20240101_123456_abc123.jpg"abstract art piece"→abstract_art_piece_20240101_123456_def456.jpg
自訂檔名
使用 filename 參數可指定輸出檔名:
- 單張:
filename="mountain_view"→mountain_view.jpg - 多張:
filename="mountain_view"+output_count=3→mountain_view_1.jpg,mountain_view_2.jpg,mountain_view_3.jpg
檔案搜尋位置
進行編修/修復時,會在以下位置搜尋輸入圖片:
- 目前工作目錄
- 輸出目錄(
NANOBANANA_OUTPUT_DIR) - 使用者家目錄
輸出目錄
生成圖片會儲存到:
NANOBANANA_OUTPUT_DIR環境變數指定的目錄(如有設定)- 目前工作目錄下的
nanobanana-output/子目錄(預設)
🛠️ 開發
# Clone 儲存庫
git clone https://github.com/aspect-apps/nanobanana-py.git
cd nanobanana-py
# 安裝依賴
uv sync
# 安裝開發依賴
uv sync --extra dev
# 執行測試
uv run pytest
# 格式化程式碼
uv run ruff format src/
uv run ruff check src/ --fix
🐛 疑難排解
常見問題
-
「No API key found」
請設定
NANOBANANA_GEMINI_API_KEY環境變數:export NANOBANANA_GEMINI_API_KEY="your-api-key-here"
-
「Model timeout」或「Model overloaded」
- 稍後再試,或
- 設定
NANOBANANA_MODEL使用其他模型 - 自動 fallback 機制會嘗試切換備用模型
-
「Image not found」
確認輸入檔案位於支援的搜尋目錄(見「檔案搜尋位置」)
-
圖片生成到錯誤目錄
設定
NANOBANANA_OUTPUT_DIR環境變數指定輸出目錄:export NANOBANANA_OUTPUT_DIR="/path/to/output"
除錯模式
啟用除錯日誌以診斷問題:
export NANOBANANA_DEBUG="1"
📄 授權
MIT
🤝 致謝
- 原版 nanobanana by Will 保哥
- 使用 FastMCP 框架
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nanobanana_py-0.2.2.tar.gz.
File metadata
- Download URL: nanobanana_py-0.2.2.tar.gz
- Upload date:
- Size: 146.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ce922bbee75028995e5ed9da691ff6dd9c3bdcf8cb21e3a9661ec3bdc995e68c
|
|
| MD5 |
b8c9c7574a4ef6edbc5847a1e04c0118
|
|
| BLAKE2b-256 |
db8c4e4fa1e748d83dbb41c7cd4bb410abfec6343f43b22dbb16861215e0f26a
|
Provenance
The following attestation bundles were made for nanobanana_py-0.2.2.tar.gz:
Publisher:
publish.yml on yazelin/nanobanana-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nanobanana_py-0.2.2.tar.gz -
Subject digest:
ce922bbee75028995e5ed9da691ff6dd9c3bdcf8cb21e3a9661ec3bdc995e68c - Sigstore transparency entry: 868173373
- Sigstore integration time:
-
Permalink:
yazelin/nanobanana-py@1c5ddeca4f8d5bfdf5a5f413f7b73d31010ab022 -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/yazelin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1c5ddeca4f8d5bfdf5a5f413f7b73d31010ab022 -
Trigger Event:
release
-
Statement type:
File details
Details for the file nanobanana_py-0.2.2-py3-none-any.whl.
File metadata
- Download URL: nanobanana_py-0.2.2-py3-none-any.whl
- Upload date:
- Size: 24.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87cbe79ee30a1e4fd4bebc574269c22dda9b7d5849b7fc9c65fcd124a38b1475
|
|
| MD5 |
01987fd0707418608b828f17858a6bf7
|
|
| BLAKE2b-256 |
b8753155472cc7b4f3fd17e11fe024709b5bb82c7079a37343b1aac6d42a0ad6
|
Provenance
The following attestation bundles were made for nanobanana_py-0.2.2-py3-none-any.whl:
Publisher:
publish.yml on yazelin/nanobanana-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nanobanana_py-0.2.2-py3-none-any.whl -
Subject digest:
87cbe79ee30a1e4fd4bebc574269c22dda9b7d5849b7fc9c65fcd124a38b1475 - Sigstore transparency entry: 868173377
- Sigstore integration time:
-
Permalink:
yazelin/nanobanana-py@1c5ddeca4f8d5bfdf5a5f413f7b73d31010ab022 -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/yazelin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1c5ddeca4f8d5bfdf5a5f413f7b73d31010ab022 -
Trigger Event:
release
-
Statement type: