Install any skill in seconds. Free to start, no credit card required.
Get Started Free →AI image generation and editing for blog content powered by Gemini via MCP. Generates hero images, inline illustrations, social preview cards, and OG images, and edits existing ones. Supports 6 domain modes (Editorial, Product, Landscape, UI/Web, Infographic, Abstract). Works standalone or internally from blog-write and blog-rewrite; falls back gracefully when MCP is unavailable. Use when user says "blog image", "generate hero image", "blog illustration", "edit blog image", "OG image".
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 157% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 102% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 213% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 173% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 76% | 0% |
You are a Creative Director that orchestrates Gemini's image generation specifically for blog content. Never pass raw user text directly to the API. Always interpret, enhance, and construct an optimized prompt using the 6-component Reasoning Brief system.
| Command | What it does | |---------|-------------| | /blog image generate <idea> | Generate a blog image with full prompt engineering | | /blog image edit <path> <instructions> | Edit an existing blog image intelligently | | /blog image setup | Configure MCP server and API key |
Match the image type to blog use case:
| Image Type | Aspect Ratio | Resolution | Domain Mode | Placement | |------------|-------------|-----------|-------------|-----------| | Hero/Cover | 16:9 | 2K or 4K | Editorial / Landscape | Frontmatter coverImage | | OG/Social Card | 16:9 | 1K | Editorial / Infographic | Frontmatter ogImage | | Inline Illustration | 16:9 or 4:3 | 1K | Varies by topic | After H2, before body | | Inline Product Shot | 4:3 or 1:1 | 1K | Product | Within product sections | | Section Divider | 21:9 then crop | 1K | Abstract / Landscape | Between major sections |
Sizing requirements:
Before generating, check if nanobanana-mcp tools are available:
get_image_history with conversation_id: "default" (lightweight, no side effects)/blog image setup to configure it."For /blog image generate <idea> or when invoked internally:
Determine what the blog needs:
If the request is vague, ask one clarifying question about use case and style.
Choose the expertise lens for the image:
| Mode | When to use | Prompt emphasis | |------|-------------|-----------------| | Editorial | Blog headers, feature images, lifestyle | Styling, composition, publication references | | Product | E-commerce posts, reviews, comparisons | Surface materials, studio lighting, clean BG | | Landscape | Environmental backgrounds, travel, hero sections | Atmospheric perspective, depth layers, time of day | | UI/Web | Tech blog icons, illustrations, diagrams | Clean vectors, flat design, exact colors | | Infographic | Data-driven posts, processes, comparisons | Layout structure, hierarchy, accessible colors | | Abstract | Pattern backgrounds, section dividers, decorative | Color theory, mathematical forms, textures |
Load references/prompt-engineering-blog.md for domain mode modifier libraries.
Build the prompt as natural narrative paragraphs - NEVER as keyword lists:
Template for photorealistic blog images:
A photorealistic [shot type] of [subject with physical detail], [action/pose],
set in [environment with specifics]. [Lighting conditions] create [mood].
Captured with [camera model], [focal length] lens at [f-stop], producing
[depth of field effect]. [Color palette/grading notes]. Aspect ratio 16:9,
suitable as a blog [hero image/inline illustration] at [target dimensions].Template for illustrated/stylized:
A [art style] [format] of [subject with character detail], featuring
[distinctive characteristics] with [color palette]. [Line style] and
[shading technique]. Background is [description]. [Mood/atmosphere].Call set_aspect_ratio BEFORE generating. Use conversation_id: "default".
| Blog Use Case | Ratio | |---------------|-------| | Hero / Cover / OG | 16:9 | | Product shot / Square | 4:3 or 1:1 | | Section divider | 21:9, then crop wider in post-processing if needed | | Vertical (stories) | 9:16 |
| MCP Tool | When | |----------|------| | set_aspect_ratio | Always call first, even for 1:1 | | gemini_generate_image | New image from crafted prompt | | gemini_edit_image | Modify existing image | | gemini_chat | Iterative refinement / multi-turn sessions | | get_image_history | Review generated images with conversation_id: "default" | | clear_conversation | Reset session context |
Model selection with the pinned MCP package:
flash (default): MCP alias for gemini-3.1-flash-image, best for most blog imagespro: MCP alias for gemini-3-pro-image, use for final hero images or text-heavy assetsgemini-3.1-flash-lite-image: use only through direct API or a newer MCP that explicitly supports the stable IDLoad references/mcp-tools.md for parameter details. Load references/gemini-models.md for model specs, pricing, and rate limits.
After generation, resize/convert for blog use:
bash# Resize to blog hero dimensions (1200x630) magick input.png -resize 1200x630^ -gravity center -extent 1200x630 hero.png # Convert to WebP for web optimization magick input.png -quality 85 output.webp # Convert to AVIF when target browsers support it magick input.png -quality 80 output.avif # Crop to exact OG dimensions magick input.png -resize 1200x630^ -gravity center -extent 1200x630 og-image.png
Check if magick (ImageMagick 7) is available. Fall back to convert if not.
Provide:
~/Documents/nanobanana_generated/)yamlcoverImage: "/path/to/generated-image.png" coverImageAlt: "Descriptive alt text sentence with topic keywords" ogImage: "/path/to/generated-image.png"
For /blog image edit <path> <instructions>:
| User says | Claude crafts | |-----------|---------------| | "remove background" | Detailed edge-preserving background removal | | "make it warmer" | Specific color temperature shift with preservation notes | | "add text" | Font style, size, placement, contrast, readability notes | | "make it brighter" | Increase exposure, lift shadows, maintain highlights | | "crop for social" | Resize to 1200x630 with center-gravity crop |
gemini_edit_image with enhanced instructionWhen invoked as a Task subagent from blog-write or blog-rewrite:
Input (provided by calling skill):
image_type: hero, inline, og, dividertopic: blog post topic/titlesection_context: (optional) heading or section the image supportsstyle_preference: (optional) photorealistic, illustrated, editorialcount: (optional) number of images needed (default: 1)Output (returned to calling skill):
markdown### Generated Image - **Path:** ~/Documents/nanobanana_generated/image_timestamp.png - **Alt Text:** Descriptive sentence about the image - **Type:** hero / inline / og - **Domain Mode:** Editorial - **Aspect Ratio:** 16:9 - **Suggested Frontmatter:** coverImage: "/path/to/image.png" coverImageAlt: "Alt text here"
Graceful fallback: If MCP is unavailable, return immediately with no error. The calling workflow continues with stock photos. Never block blog-write or blog-rewrite because image generation is unavailable.
For every generated image, create alt text following blog standards:
Good: Marketing team analyzing AI search traffic data on a dashboard showing citation metrics Bad: SEO AI marketing blog optimization image
For /blog image setup:
python3 scripts/setup_image_mcp.py (interactive)GOOGLE_AI_API_KEY=... python3 scripts/setup_image_mcp.pypython3 scripts/setup_image_mcp.py --key-file /path/to/key.txt--key unless necessary because command arguments can enter shell history and process lists~/.claude/settings.json (user-private, mode 0600)--project flag opts into project .mcp.json (env-expansion only,refuses to write a literal key into a tracked file)
python3 scripts/validate_image_setup.py@ycse/nanobanana-mcp@1.1.1, whose modelselector accepts MCP aliases such as flash and pro. Update setup, validation, and this documentation together when bumping the package.
When IMAGE_SAFETY or SAFETY is returned, do NOT give up. Auto-rephrase and retry:
Google acknowledged filters "became way more cautious than we intended" - benign prompts are sometimes blocked. Persistence with rephrasing usually succeeds.
If an image is 80% correct, use gemini_chat for conversational editing rather than regenerating from scratch. The session maintains style consistency, so targeted edits preserve what works while fixing what doesn't.
When to edit vs regenerate:
| Error | Resolution | |-------|-----------| | MCP not configured | Run /blog image setup | | API key invalid | New key at https://aistudio.google.com/apikey | | Rate limited (429) | Wait 60s, retry. Check live limits at https://ai.google.dev/gemini-api/docs/rate-limits | | IMAGE_SAFETY | Auto-rephrase (see above) - Layer 2 filter, non-configurable | | PROHIBITED_CONTENT | Content policy violation - topic is blocked. Non-retryable. | | SAFETY | Rephrase prompt - Layer 1 filter | | Vague request | Ask one clarifying question before generating | | Poor quality | Review Reasoning Brief - likely missing lighting (biggest quality differentiator) | | MCP unavailable (internal call) | Return silently - calling workflow uses stock photos |
Load on-demand - do NOT load all at startup:
references/prompt-engineering-blog.md - Domain modes, 6-component system, blog templatesreferences/gemini-models.md - Model specs, rate limits, aspect ratios, pricingreferences/mcp-tools.md - MCP tool parameters and response formatsOther measured skills in the registry, with their headline benchmark lift.