使用说明
imagen
A Model Context Protocol (MCP) server for intelligent multi-provider image generation.
Quick Start
This project was renamed from
imagen-mcptoimagen(michaeljabbour/imagen-mcp->michaeljabbour/imagen; the old GitHub URL redirects). The MCP server executable (imagen-mcp) and itsimagen_mcpPython package name are unchanged -- only the project/distribution name and the smart-tool CLI (imagen-mcp-smart->imagen) changed.
Version 0.5.0 is released as the immutable v0.5.0 Git tag and is not
published on PyPI. Install it from that tag or a local checkout, then run the
canonical module or console script:
git clone https://github.com/michaeljabbour/imagen.git
cd imagen
python3 -m pip install .
python -m imagen_mcp
# equivalent after installation: imagen-mcp
For a reproducible VCS install, use the release tag:
python3 -m pip install \
"imagen @ git+https://github.com/michaeljabbour/imagen.git@v0.5.0"
The historical python -m src.server entry point remains available for
compatibility in 0.4.x.
See CHANGELOG.md for release details and migration notes.
1. Get an API key (at least one):
| Provider | Get a key at | Environment variable |
|---|---|---|
| OpenAI | platform.openai.com/api-keys | OPENAI_API_KEY |
| Google Gemini | aistudio.google.com/apikey | GEMINI_API_KEY |
Having both keys lets auto-selection use either provider. With only one key, soft preferences may fall back with a notice. An unavailable explicit provider pin fails closed; in auto mode, Gemini-only requirements such as reference images and Google Search grounding also fail closed rather than silently dropping the requested capability.
2. Add to your MCP client (pick one):
Claude Code
claude mcp add -s user imagen \
-e OPENAI_API_KEY=sk-... \
-e GEMINI_API_KEY=AI... \
-- imagen-mcp
Verify it's registered:
claude mcp list
Reference: Claude Code MCP docs
Claude Desktop
Edit the config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"imagen": {
"command": "imagen-mcp",
"args": [],
"env": {
"OPENAI_API_KEY": "sk-...",
"GEMINI_API_KEY": "AI..."
}
}
}
}
Restart Claude Desktop (Cmd+Q, then reopen) after editing.
Reference: Claude Desktop MCP docs
Codex CLI
Option A — CLI command:
codex mcp add imagen -- imagen-mcp
Option B — edit ~/.codex/config.toml directly:
[mcp_servers.imagen]
command = "imagen-mcp"
[mcp_servers.imagen.env]
OPENAI_API_KEY = "sk-..."
GEMINI_API_KEY = "AI..."
Reference: Codex MCP docs
Gemini CLI
Edit ~/.gemini/settings.json:
{
"mcpServers": {
"imagen": {
"command": "imagen-mcp",
"args": [],
"env": {
"OPENAI_API_KEY": "sk-...",
"GEMINI_API_KEY": "AI..."
}
}
}
}
Reference: Gemini CLI MCP docs
Any other MCP client
| Setting | Value |
|---|---|
| Command | imagen-mcp |
| Args | [] |
| Environment | OPENAI_API_KEY and/or GEMINI_API_KEY |
3. Generate an image — ask your AI assistant:
"Generate a professional headshot with studio lighting"
That's it. The server picks a provider automatically and uses Gemini 3.1 Flash Image when Gemini is selected unless you explicitly request another Gemini model.
Features
- Auto Provider Selection — analyzes prompts to choose the best provider
- Multi-Provider Support — OpenAI gpt-image-2 and Google Gemini 3 Image
- Reference Images — up to 14 images for character/style consistency (Gemini)
- Real-time Data — Google Search grounding for current info (Gemini)
- Conversational Refinement — iteratively refine images with context
- High Resolution — up to 4K output (Gemini)
- Fallback Notices — clear warnings when a prompt would benefit from a provider you haven't configured
How Auto-Selection Works
The server analyzes your prompt and routes it to the best provider:
"Create a menu card for an Italian restaurant" -> OpenAI (text rendering)
"Professional headshot with studio lighting" -> Gemini (photorealism)
"Infographic about climate change" -> OpenAI (diagram + text)
"Product shot of perfume on marble" -> Gemini (product photography)
What if the best provider isn't configured? The server falls back to whatever you have and tells you:
Provider Fallback: Gemini would be better for this prompt (Photorealistic content), but it's not configured. Using OpenAI instead. Set
GEMINI_API_KEYfor better results.
You can always override auto-selection with the provider parameter:
generate_image(prompt="...", provider="openai")
generate_image(prompt="...", provider="gemini")
Explicit provider pins never fall back. In auto mode, hard Gemini requirements (reference images, Google Search grounding, and recognized real-time-data requests) also fail if Gemini is unavailable. Soft quality preferences may fall back to the configured provider and include a notice.
Provider Comparison
| Feature | OpenAI gpt-image-2 | Gemini 3 Image |
|---|---|---|
| Text Rendering | Excellent | Good |
| Photorealism | Good | Excellent |
| Latency | Varies by size/quality | Varies by model/size |
| Max Resolution | 3840px edge / 8,294,400 pixels | 4K |
| Sizes | Constrained custom WIDTHxHEIGHT |
1K, 2K, 4K; Flash also 0.5K |
| Aspect Ratios | Up to 3:1 | 10 baseline presets; 14 on Gemini 3.1 Flash/Flash Lite |
| Reference Images | Via edit_image |
Yes (model-specific, up to 14) |
| Real-time Data | No | Yes (Google Search) |
Use OpenAI for: text-heavy images, menus, infographics, comics, diagrams
Use Gemini for: portraits, product photography, 4K output, reference images
For gpt-image-2, both edges must be multiples of 16 and no larger than
3840px, the long-to-short ratio must be at most 3:1, and total pixels must be
between 655,360 and 8,294,400. Outputs above 2560x1440 are experimental.
gpt-image-2 does not support transparent backgrounds; use an opaque output
and a downstream background-removal step.
MCP Tools
| Tool | Description |
|---|---|
generate_image |
Main tool with auto provider selection (reports progress) |
generate_image_batch |
Generate many prompts concurrently (bounded fan-out, per-item error isolation) |
conversational_image |
Multi-turn refinement; native MCP elicitation with dialogue fallback |
edit_image |
Edit/inpaint an existing image via OpenAI gpt-image-2 |
list_conversations |
List active conversations and their history |
list_providers |
Show available providers and capabilities |
list_gemini_models |
Query available Gemini image models |
estimate_cost |
Approximate generation cost without generating |
All tools advertise MCP tool annotations (read-only / open-world hints) so clients can reason about their side effects.
Output Location
Images are saved to ~/Downloads/images/{provider}/ by default (openai/ or gemini/ subdirectories).
Customize with:
# Save to a specific directory (auto-generated filename)
generate_image(prompt="...", output_path="~/Desktop/logos/")
# Save to a specific file
generate_image(prompt="...", output_path="~/Desktop/logos/my-logo.png")
Set OUTPUT_DIR to change the base directory globally. Logs go to {OUTPUT_DIR}/logs/.
Gemini-Specific Features
# High resolution
generate_image(prompt="...", size="4K")
# Specific model
generate_image(prompt="...", gemini_model="gemini-3.1-flash-image")
# Reference images for style/character consistency (base64 encoded)
generate_image(prompt="...", reference_images=["base64..."])
# Real-time data via Google Search
generate_image(prompt="Current weather in NYC", enable_google_search=True)
Search grounding requires Markdown output and a client that renders the returned Google Search Suggestions HTML plus associated source links. JSON output fails before calling Gemini because escaped HTML is not a compliant rendered surface.
Available Models
OpenAI
| Model ID | Description |
|---|---|
gpt-image-2 |
Default image generation and editing model |
gpt-image-1.5 |
Legacy compatibility model |
gpt-image-1 |
Legacy compatibility model |
Gemini
| Model ID | Description |
|---|---|
gemini-3.1-flash-image |
Nano Banana 2; default GA model, 0.5K/1K/2K/4K |
gemini-3-pro-image |
Nano Banana Pro; GA model, 1K/2K/4K |
gemini-3.1-flash-lite-image |
Nano Banana Lite; 1K only, no Search, up to 14 object references |
Retired *-preview IDs are rejected with an actionable GA migration message;
explicit model pins never silently change. Gemini 3.1 Flash Lite Image outputs include SynthID and C2PA
provenance metadata; downstream transforms should preserve that metadata when
the file format and processing pipeline allow it.
Architecture
flowchart TB
subgraph Clients["MCP Clients"]
CD[Claude Desktop]
CC[Claude Code CLI]
GC[Gemini CLI]
CX[Codex CLI]
end
subgraph Server["imagen MCP Server"]
MCP[MCP Protocol Layer]
subgraph Tools["MCP Tools"]
GI[generate_image]
CI[conversational_image]
LP[list_providers]
LM[list_gemini_models]
end
subgraph Core["Core Components"]
PS[Provider Selector]
PR[Provider Registry]
end
subgraph Providers["Image Providers"]
OAI[OpenAI Provider<br/>gpt-image-2]
GEM[Gemini Provider<br/>Gemini 3.1 Flash Image]
end
end
subgraph APIs["External APIs"]
OAPI[OpenAI API]
GAPI[Google Gemini API]
end
subgraph Storage["Local Storage"]
DL[~/Downloads/images/]
end
CD & CC & GC & CX --> MCP
MCP --> Tools
GI & CI --> PS
PS --> PR
PR --> OAI & GEM
OAI --> OAPI
GEM --> GAPI
OAI & GEM --> DL
Environment Variables
| Variable | Description | Required |
|---|---|---|
OPENAI_API_KEY |
OpenAI API key | At least one API key |
GEMINI_API_KEY |
Google Gemini API key | At least one API key |
GOOGLE_API_KEY |
Alias for GEMINI_API_KEY |
|
OUTPUT_DIR |
Base directory for saved images | No (default: ~/Downloads/images/) |
IMAGEN_MCP_ALLOWED_INPUT_ROOTS |
OS-path-separator list of roots that edit_image may read; defaults to OUTPUT_DIR only |
No |
IMAGEN_MCP_CONVERSATION_RETENTION_DAYS |
Delete persisted conversational history after this many inactive days; 0 disables cleanup |
No (default: 30) |
DEFAULT_PROVIDER |
Force a default provider | No (default: auto) |
DEFAULT_OPENAI_SIZE |
Default OpenAI image size | No (default: 1024x1024) |
DEFAULT_GEMINI_SIZE |
Default Gemini image size | No (default: 1K) |
ENABLE_PROMPT_ENHANCEMENT |
Opt in to prompt enhancement; adds an assistant-model API call, latency, and cost before generation | No (default: false) |
ENABLE_GOOGLE_SEARCH |
Enable Google Search grounding | No (default: false) |
REQUEST_TIMEOUT |
Read-timeout ceiling in seconds for provider calls (covers slow high-quality renders) | No (default: 600) |
OPENAI_RPM / OPENAI_MIN_INTERVAL_SECONDS / OPENAI_BURST_LIMIT |
OpenAI client-side rate limits | No (defaults: 10 / 0.5 / 5) |
GEMINI_RPM / GEMINI_MIN_INTERVAL_SECONDS / GEMINI_BURST_LIMIT |
Gemini client-side rate limits | No (defaults: 15 / 0.5 / 5) |
IMAGEN_MCP_LOG_DIR |
Log directory override | No |
IMAGEN_MCP_LOG_LEVEL |
Log level (DEBUG, INFO, etc.) | No |
IMAGEN_MCP_LOG_PROMPTS |
Log full prompts | No (default: false) |
IMAGEN_MCP_TRANSPORT |
stdio (default), streamable-http, or sse |
No |
IMAGEN_MCP_HOST / IMAGEN_MCP_PORT |
Bind address for HTTP transports | No (default: 127.0.0.1:8000) |
Troubleshooting
"No providers available"
You need at least one API key. Set OPENAI_API_KEY or GEMINI_API_KEY in your MCP client config (see Quick Start above).
Images generate but quality isn't great for portraits/products
You're probably missing GEMINI_API_KEY. The server fell back to OpenAI and showed a warning. Add a Gemini key for better photorealistic results.
Images generate but text looks bad
You're probably missing OPENAI_API_KEY. Add an OpenAI key for better text rendering.
"imagen-mcp: command not found"
Ensure the Python environment used by your MCP client has imagen-mcp
installed from a local checkout or pinned VCS revision and its scripts directory
is on PATH. As a fallback, configure the command as python with args -m,
imagen_mcp.
Where are my images saved?
Default: ~/Downloads/images/openai/ or ~/Downloads/images/gemini/. Check the tool output for the exact path. Set OUTPUT_DIR to change this.
How do I check which providers are active?
Use the list_providers tool, or run:
python3 -c "from imagen_mcp.providers import get_provider_registry; print(get_provider_registry().list_providers())"
Development
# Clone and install (runtime + dev tooling)
git clone https://github.com/michaeljabbour/imagen.git
cd imagen
pip install -e ".[dev]" # or: uv sync --extra dev
# Install pre-commit hooks (ruff + mypy)
pre-commit install
# Run the full quality gate (same as CI)
ruff format --check imagen_mcp/ src/ tests/
ruff check imagen_mcp/ src/ tests/
mypy imagen_mcp/ src/
pytest --cov=src --cov-fail-under=80
# Verify server loads
python3 -c "from imagen_mcp.server import mcp; print('Server loads')"
python3 -m imagen_mcp
# Run over HTTP instead of stdio
IMAGEN_MCP_TRANSPORT=streamable-http imagen-mcp
# Check Claude Desktop logs (macOS)
tail -f ~/Library/Logs/Claude/mcp-server-imagen.log
Project Structure
imagen/
├── imagen_mcp/ # Canonical package namespace + module runner
├── src/
│ ├── server.py # Implementation + legacy import path
│ ├── config/
│ │ ├── constants.py # Provider constants
│ │ └── settings.py # Environment configuration
│ ├── providers/
│ │ ├── base.py # Abstract provider interface
│ │ ├── openai_provider.py # OpenAI implementation
│ │ ├── gemini_provider.py # Gemini implementation
│ │ ├── selector.py # Auto-selection logic
│ │ └── registry.py # Provider factory
│ └── models/
│ └── input_models.py # Pydantic input models
├── tests/
│ ├── test_selector.py # Provider selection tests
│ ├── test_providers.py # Provider unit tests
│ └── test_server.py # Server integration tests
├── .github/
│ └── workflows/
│ └── ci.yml # GitHub Actions CI
├── run.sh # Wrapper script for MCP clients
├── requirements.txt
├── CLAUDE.md
└── README.md
Requirements
mcp>=1.26.0,<2
pydantic>=2.12.3
httpx>=0.28.0
google-genai>=2.8.0
pillow>=11.0.0