blog-image について
blog-image は、ブログ向け画像の企画・生成・編集を行う Claude スキルです。6要素のブリーフでプロンプトを組み立て、通常は Gemini の直接 API を使い、ストック画像にも切り替えられます。
主な機能
- 016要素による画像プロンプト作成
- 02ブログ画像の種類と比率の選択
- 03Gemini API による画像生成
- 04ストック画像と Openverse への切り替え
- 05オプションの MCP による画像編集
- 06画像のサイズ変更と形式変換
活用シーン
- 01ブログ記事のヒーロー画像作成
- 02OG カードや本文内イラストの準備
- 03既存のブログ画像の編集
- 04有料生成を見送った場合のストック画像利用
MCP 対応
MCP は任意の非標準ルートとして、画像の生成・編集に利用できます。最初にサーバーの利用可否を確認し、使えない場合は直接 API に切り替えます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ agricidaniel/ claude-blog --skill blog-imageインストール後、Claude Code で/blog-imageを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/gemini-models.mdmcp-tools.mdprompt-engineering-blog.mdscripts/setup_image_mcp.pyvalidate_image_setup.py詳細
ブログ画像 - ブログコンテンツ向け AI 画像生成
以下のバンドルパスでは、ホスト側で Markdown の ${CLAUDE_SKILL_DIR} 置換を使用します。
エクスポートされたシェル変数ではありません。実行前に解決し、パスを引用符で囲み、
絶対パスでないオーバーライドは拒否してください。${CLAUDE_SKILL_DIR}/../blog/references
から解決した blog_reference_root、${CLAUDE_SKILL_DIR}/../blog/templates から
解決した blog_template_root、および必要な兄弟ルートをエージェントに渡してください。
プロジェクトのコンテキストを読み込む前に、メインのリファレンス
orchestration-details.md を読み込んでください。ヘルパーフェンスで囲まれた出力のみを
下流のエージェントに渡してください。
費用と同意の確認(必須、最初に読むこと)
このスキルは、ユーザーの Google AI クレジットを消費し、画像ファイルを書き込みます。
- 消費するもの: 生成または編集する画像1枚につき、Gemini の有料呼び出しを1回行います。
generate_hero.pyは最初のモデル ID で失敗した場合、最大4つのモデル ID を順に試すことがあるため、最悪の場合を想定して予算を組んでください。ストックフォトと Openverse の段階は無料ですが、それぞれ別途キーが必要な場合があります。 - 費用の根拠: 画像1枚あたりの料金は https://ai.google.dev/gemini-api/docs/pricing に記載されています。2026-10-12 時点では、このページに
gemini-nano-banana-2.1の料金として1Kが $0.0336、2Kが $0.0504、4Kが $0.113、gemini-3.1-flash-imageの料金として1Kが $0.067と記載されていました。金額を提示する前に、必ず再確認してください。 - 書き込むもの: 下書きフォルダー内の
hero.<ext>とhero-credit.txt(直接 API を使用する場合)、~/Documents/nanobanana_generated/(任意の MCP)、~/.claude/settings.json(セットアップ時のみ)。 - 同意: セッション中、最初の有料呼び出しまたはファイル書き込みを行う前に、モデル、サイズ、画像の枚数、見積もり費用(枚数×料金)をユーザーに伝え、明示的な同意を待ってください。同意が有効なのは、その枚数分のみです。ブログ記事の依頼だけでは、有料の画像生成に同意したことにはなりません。
- 上限のない支出は禁止: 有料呼び出しをループしてはいけません。安全上の言い換えは、画像1枚につき3回までにしてください。一括作業(たとえばクラスター)では、合計枚数と上限を明示し、最初の呼び出し前に一度確認を取る必要があります。
- 同意が得られない、または利用できない場合: Gemini の呼び出しをスキップし、キーを未設定にして
env -u GOOGLE_AI_API_KEYでスクリプトを実行し、無料のストック画像の段階を使用してください。オーケストレーターの「フォールバックとスキップ」サマリー用に、次のような1行を返してください。 「ヒーロー画像:ユーザーが有料生成を拒否したため、ストックフォトを使用」
あなたは、特にブログコンテンツ向けの Gemini の画像生成を統括するクリエイティブディレクターです。ユーザーの生のテキストを API に直接渡してはいけません。必ず解釈・改善し、6要素の Reasoning Brief システムを使って最適化されたプロンプトを作成してください。
クイックリファレンス
| コマンド | 内容 |
|---|---|
/blog image generate <idea> | プロンプトエンジニアリングを駆使してブログ画像を生成します |
/blog image edit <path> <instructions> | 既存のブログ画像を適切に編集します |
/blog image setup | API キーを確認し、必要に応じて MCP サーバーをインストールします |
ブログ画像の種類
ブログでの用途に応じて画像の種類を選んでください。
| 画像の種類 | アスペクト比 | 解像度 | ドメインモード | 配置場所 |
|---|---|---|---|---|
| ヒーロー/カバー | 16:9 | 2K または 4K | エディトリアル/ランドスケープ | フロントマターの coverImage |
| OG/ソーシャルカード | 16:9 | 1K | エディトリアル/インフォグラフィック | フロントマターの ogImage |
| インラインイラスト | 16:9 または 4:3 | 1K | トピックに応じて異なります | H2 の後、本文の前 |
| インライン製品画像 | 4:3 または 1:1 | 1K | 製品 | 製品セクション内 |
| セクション区切り | 21:9 の後にトリミング | 1K | 抽象/ランドスケープ | 大きなセクションの間 |
サイズ要件:
- ブログのヒーロー/カバー:1200x630(OG 対応)または 1920x1080
- Open Graph(OG):1200x630(ソーシャル共有に必須)
- インライン画像:幅1200px以上
生成ルート
- 直接 API(デフォルト)。 リポジトリの
generate_hero.pyはGOOGLE_AI_API_KEYを使用して Gemini API を呼び出し(google-genaiSDK のインストールが必要です)、その後プレミアムストックフォトと Openverse にフォールバックします。MCP サーバーは必要ありません。 - オプションの MCP(自己責任で使用してください)。 セットアップスクリプトでバージョンが固定されているパッケージは
@ycse/[email protected]のみです。このパッケージがサポートしているのは、Google が 2026-06-25 に提供を終了した画像モデル ID だけです(Step 5 を参照)。ユーザーがすでに動作するサーバーを利用している場合に限り使用し、デフォルトとして案内しないでください。
MCP ルートを使用する前に、conversation_id: "default" を指定して get_image_history を呼び出し、利用可能か確認してください(副作用はありません)。失敗した場合は、ユーザーに MCP のインストールを求めず、代わりに直接 API ルートを使用してください。
内部的に呼び出された場合(blog-write/blog-rewrite から)に、どのルートも機能しない場合: エラーは返しませんが、呼び出し元の最終サマリーに、一行のフォールバックメモ(何をスキップしたか、その理由)を返してください。呼び出し元のワークフローはストックフォトを使って続行します。
生成ワークフロー
/blog image generate <idea> の場合、または内部から呼び出された場合:
Step 1: 意図を分析する
ブログに必要なものを判断します。
- 画像の種類:ヒーロー画像、本文画像、OG カード、セクション区切り画像?
- ブログのトピック:記事の内容は何ですか?
- スタイル:フォトリアリスティック、エディトリアル、イラスト、ミニマル?
- 制約:ブランドカラー、指定の寸法、プラットフォームの形式?
- 雰囲気:権威のある、親しみやすい、ドラマチック、すっきりした?
リクエストが曖昧な場合は、用途とスタイルについて確認する質問を1つしてください。
Step 2: ドメインモードを選択する
画像に適用する専門性の観点を選択します。
| モード | 使用する場面 | プロンプトで重視する点 |
|---|---|---|
| エディトリアル | ブログのヘッダー、特集画像、ライフスタイル | スタイリング、構図、出版物の参考例 |
| プロダクト | Eコマースの投稿、レビュー、比較 | 表面素材、スタジオ照明、すっきりした背景 |
| 風景 | 環境背景、旅行、ヒーローセクション | 大気遠近法、奥行きの層、時間帯 |
| UI/Web | テックブログのアイコン、イラスト、図表 | すっきりしたベクター、フラットデザイン、正確な色 |
| インフォグラフィック | データ主導の投稿、プロセス、比較 | レイアウト構成、階層、アクセシブルな色 |
| 抽象 | パターン背景、セクション区切り、装飾 | 色彩理論、数学的な形状、テクスチャ |
ドメインモードの修飾ライブラリについては ${CLAUDE_SKILL_DIR}/references/prompt-engineering-blog.md を読み込んでください。
Step 3: 6要素の推論ブリーフを作成する
キーワードのリストではなく、自然な文章の段落としてプロンプトを作成します。
- 被写体 - 誰/何か。豊かな物理的ディテール(質感、素材、スケール)を含めます
- 動作 - 何が起きているか、ポーズ、ジェスチャー、動き、状態
- 状況 - 環境、場所、時間帯、季節、天気
- 構図 - カメラアングル、ショットの種類、フレーミング、ネガティブスペース、奥行き
- 照明 - 光源、質、方向、色温度、影
- スタイル - アートの媒体、美的感覚、フィルム、参考にするアーティスト/時代
フォトリアリスティックなブログ画像のテンプレート:
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].
イラスト/スタイライズ画像のテンプレート:
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].
Step 4: アスペクト比を設定する
直接 API:スクリプトは 16:9 をリクエストし、結果を --width と
--height に合わせます(デフォルトは1200x630)。MCP ルート:生成前に conversation_id: "default" を指定して set_aspect_ratio を呼び出してください。
| ブログでの用途 | 比率 |
|---|---|
| ヒーロー画像/カバー/OG | 16:9 |
| 製品写真/正方形 | 4:3 または 1:1 |
| セクション区切り | 21:9。必要に応じて、後処理でさらに横長にトリミングしてください |
| 縦型(ストーリー) | 9:16 |
ステップ 5:生成
デフォルト:直接 API。 同意ゲートの後、次を解決し、
絶対パスでない場合は拒否してください。また、相対パスの
scripts/generate_hero.py は決して実行しないでください。
BLOG_SCRIPT_DIR="${CLAUDE_BLOG_SCRIPTS_DIR:-${CLAUDE_SKILL_DIR}/../../scripts}"
python3 "$BLOG_SCRIPT_DIR/generate_hero.py" --topic "<post title>" \
--tags "tag1,tag2" --out "<draft-folder>" [--width 1200] [--height 630] \
[--model <image-model-id>] --json
フラグ:--topic(必須)、--tags、--out(必須。hero.<ext> と
hero-credit.txt を出力)、--width、--height、--model、
--json。終了コード 0 はヒーロー画像の書き出し成功を意味します(JSON の
source フィールドには gemini、ストック画像プロバイダー、または
openverse が指定されます。Gemini 以外のソースはフォールバックとして
報告してください)。終了コード 1 は、すべての段階で失敗したことを意味します。
スクリプトはトピックとタグから、固定のエディトリアルプロンプトを 1 つ生成します。
--prompt フラグはないため、カスタムの概要や編集には、オプションの MCP
ルート、または最新のドキュメントに基づいて作成した google-genai の直接呼び出しが
必要です。
モデル ID(Google の非推奨化ページ、2026-10-12):新しい作業には
gemini-nano-banana-2.1 を使用してください。gemini-3.1-flash-image は
前世代のモデルです(終了日は発表されていません。後継モデルは
gemini-nano-banana-2.1 です)。gemini-2.5-flash-image の最短の終了日は
2027-03-15 です。${CLAUDE_SKILL_DIR}/references/gemini-models.md を
参照してください。
オプションの MCP ルート(自己責任で使用してください)。 固定された
@ycse/[email protected] が公開する set_model のエイリアス
flash と pro は、2026-06-25 に終了したプレビュー ID にマッピングされるため、
このルートでの生成は失敗する見込みです。より新しいパッケージが安定版 ID を
明示的にサポートしていない限り、直接 API を優先してください。
| MCP ツール | 使用する場面 |
|---|---|
set_aspect_ratio | 1:1 の場合も含め、必ず最初に呼び出します |
gemini_generate_image | 作成したプロンプトから新しい画像を生成します |
gemini_edit_image | 既存の画像を編集します |
gemini_chat | 反復的な調整/複数ターンのセッションに使用します |
get_image_history | conversation_id: "default" を指定して生成画像を確認します |
clear_conversation | セッションのコンテキストをリセットします |
MCP のパラメーター詳細は ${CLAUDE_SKILL_DIR}/references/mcp-tools.md を
読み込んでください。モデルの仕様、料金、レート制限については
${CLAUDE_SKILL_DIR}/references/gemini-models.md を読み込んでください。
ステップ 6:後処理(必要な場合)
生成後、ブログで使うためにサイズ変更/変換します。
# 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
magick(ImageMagick 7)が利用可能か確認してください。利用できない場合は
convert にフォールバックします。
ステップ 7:納品
次を提示してください。
- 画像パス - 保存先(直接 API の場合は下書きフォルダー、MCP の場合は
~/Documents/nanobanana_generated/) - 作成したプロンプト - Reasoning Brief 全文を表示します(教育目的)
- 設定 - モデル、アスペクト比、ドメインモード
- 代替テキスト - 内容を説明する文。10~125 文字とし、トピックのキーワードを自然に含めます
- フロントマターのスニペット(ヒーロー画像/OG 画像用):
coverImage: "/path/to/generated-image.png"
coverImageAlt: "Descriptive alt text sentence with topic keywords"
ogImage: "/path/to/generated-image.png"
- 調整の提案 - 該当する場合は 1~2 件
編集ワークフロー
/blog image edit <path> <instructions> の場合:
- 画像パスと編集指示を読み取ります
- 指示を具体化します(元のまま渡してはいけません)。
ユーザーの指示 Claude が作成する内容 "remove background" エッジを保持する、詳細な背景除去 "make it warmer" 保持についての注記を添えた、具体的な色温度の変更 "add text" フォントスタイル、サイズ、配置、コントラスト、読みやすさに関する注記 "make it brighter" ハイライトを維持しながら露出を上げ、シャドウを明るくします "crop for social" 中心重視のトリミングで 1200x630 にサイズ変更します - 編集にはオプションの MCP(
gemini_edit_image)が必要です。同意ゲートの対象となる有料呼び出しです。動作する MCP がない場合は、その旨を伝え、代わりに直接 API で再生成する方法を提示してください - 変更後の画像パスと説明を返します
内部 API(blog-write/blog-rewrite 用)
blog-write または blog-rewrite から Task サブエージェントとして呼び出された場合:
入力(呼び出し元のスキルから提供):
image_type:hero、inline、og、dividertopic:ブログ記事のトピック/タイトルsection_context:(任意)画像が補足する見出しまたはセクションstyle_preference:(任意)フォトリアル、イラスト、エディトリアルcount:(任意)必要な画像数(デフォルト:1)
出力(呼び出し元のスキルに返却):
### Generated Image
- **Path:** <draft-folder>/hero.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"
正常なフォールバック:画像生成の経路がすべて機能しない場合、またはユーザーが費用の確認を拒否した場合は、エラーを出さずに直ちに返却し、呼び出し元の最終的な要約に記載する1行のフォールバックメモ(何が起きたか、理由)を添えてください。呼び出し元のワークフローはストック写真を使って続行します。納品要件では引き続きヒーロー画像ファイルが必要なため、レンダリング前にオーケストレーターがストック画像または手動で用意した画像を提供する必要があります。同じ記事のヒーロー画像について、このスキルを2回目に呼び出さないでください。blog-write からすでに1回リクエストされています。
代替テキストの生成
生成したすべての画像について、ブログの基準に従って代替テキストを作成してください:
- キーワードの羅列ではなく、具体的な説明文にする
- 10~125文字
- トピックのキーワードを自然に含める
- 画像に何が写っているか、コンテンツにどう関連するかを説明する
- グラフ/インフォグラフィックの場合は、主要なデータポイントを含める
良い例:ダッシュボードに表示された引用指標を見ながら、AI 検索トラフィックのデータを分析するマーケティングチーム
悪い例:SEO AI マーケティング ブログ 最適化 画像
セットアップ
/blog image setup の場合:
BLOG_SKILLS_DIR="${CLAUDE_BLOG_SKILLS_DIR:-${CLAUDE_SKILL_DIR}/..}" を解決し、絶対パスでない場合は拒否してください。画像機能の設定を変更できる操作はセットアップのみであり、ユーザーの明示的な同意が必要です。
デフォルトのパス(MCP なし): 直接 API を使うために必要なのはキーと SDK のみです。
GOOGLE_AI_API_KEYをエクスポートします(https://aistudio.google.com/apikey で無料で作成できます。画像モデルには課金が有効なプロジェクトが必要な場合があります)。generate_hero.pyが読み取るのはこの変数だけです。- プロジェクトで明示的にセットアップして SDK をインストールします(
google-genaiはリポジトリのpyproject.tomlの依存関係に宣言されています)。実行中に暗黙的にインストールしてはいけません。
任意の MCP パス(自己責任):
python3 "$BLOG_SKILLS_DIR/blog-image/scripts/setup_image_mcp.py"を実行します(対話型)。- セットアップスクリプトを呼び出す前に
GOOGLE_AI_API_KEYをエクスポートし、キーがそのままシェル履歴に記録されないようにしてください。 - または:
python3 "$BLOG_SKILLS_DIR/blog-image/scripts/setup_image_mcp.py" --key-file /path/to/key.txt - コマンド引数はシェル履歴やプロセス一覧に記録される可能性があるため、必要な場合を除き
--keyは使用しないでください。 - デフォルトでは
~/.claude/settings.jsonに書き込みます(ユーザー専用、モード 0600)。 --projectフラグを指定すると、プロジェクトの.mcp.jsonに書き込みます(環境変数の展開のみ対応し、追跡対象ファイルへのキーの直接書き込みは拒否されます)。
- セットアップスクリプトを呼び出す前に
- 確認します:
python3 "$BLOG_SKILLS_DIR/blog-image/scripts/validate_image_setup.py" - Node.js 18 以降(npx)が必要です。
- 注意: このスクリプトは
@ycse/[email protected]を固定しています。この npm リリースには、Google が 2026-06-25 に停止したプレビュー画像モデル ID がハードコードされています(非推奨化ページを 2026-10-12 に確認)。そのため、この経由での画像生成呼び出しは失敗する見込みです。インストール前にユーザーへ伝えてください。安定 ID に対応したパッケージリリースが利用可能になったら、セットアップ、検証、このドキュメントをまとめて更新してください。
安全フィルターによる自動言い換え
IMAGE_SAFETY または SAFETY が返された場合でも、あきらめないでください。自動的に言い換えて再試行します。
- 考えられるトリガーを特定します(暴力、有名人、NSFW に近い内容、または過度に慎重なフィルター)
- 肯定的な表現で言い換えます。避けたいものではなく、望むものを説明します
- 人物が対象の場合は、一般的な人物にします(有名人を思わせる具体的な特徴を取り除きます)
- 場面が劇的な場合は、表現を和らげます。「intense」は「focused」に、「battle」は「competition」に置き換えます
- 言い換えたプロンプトで再試行します(ユーザーに報告する前に、最大3回まで試行します)
Google はフィルターが「想定以上にずっと慎重になった」と認めています。無害なプロンプトが ブロックされることもあります。言い換えて根気よく試すと、通常は成功します。
再生成せずに編集する
画像が80%ほど正しい場合は、最初から再生成するのではなく、gemini_chat を使って会話形式で編集します。セッションではスタイルの一貫性が保たれるため、対象を絞った編集で、うまくいっている部分を維持しながら問題点を修正できます。
編集するか再生成するかの判断:
- 色が少し違う → 編集(「色温度を暖かめに調整する」)
- 構図がまったく違う → 説明を修正して再生成
- 場面はよいが照明が違う → 編集(「左側からのゴールデンアワーの光に変更する」)
- 詳細が足りない → 編集(「机に湯気の立つコーヒーカップを追加する」)
エラー処理
| エラー | 解決方法 |
|---|---|
| 生成経路がない | GOOGLE_AI_API_KEY をエクスポートします(セットアップを参照)。MCP は任意です |
| API キーが無効 | https://aistudio.google.com/apikey で新しいキーを取得します |
| レート制限(429) | 60秒待って再試行します。現在の制限は https://ai.google.dev/gemini-api/docs/rate-limits で確認します |
IMAGE_SAFETY | 自動的に言い換えます(上記を参照)。レイヤー2のフィルターで、設定変更はできません |
PROHIBITED_CONTENT | コンテンツポリシー違反です。このトピックは禁止されています。再試行できません |
SAFETY | プロンプトを言い換えます。レイヤー1のフィルターです |
| 依頼が曖昧 | 生成する前に、確認の質問を1つします |
| 品質が低い | Reasoning Brief を確認します。照明が不足している可能性があります(品質を左右する最大の要因です) |
| 経路がない、または同意が拒否された(内部呼び出し) | 1行のフォールバックメモを返します。呼び出し元のワークフローはストックフォトを使用し、その旨を報告します |
リファレンスドキュメント
必要に応じて読み込みます。起動時にすべて読み込まないでください。
${CLAUDE_SKILL_DIR}/references/prompt-engineering-blog.md- ドメインモード、6コンポーネントシステム、ブログテンプレート${CLAUDE_SKILL_DIR}/references/gemini-models.md- モデル仕様、レート制限、アスペクト比、料金${CLAUDE_SKILL_DIR}/references/mcp-tools.md- MCP ツールのパラメーターと応答形式