【Python】MCP連携とGeminiで作る!自律型バナー生成AIエージェントの実践ガイド(AWS/GCPキーレス認証対応)

本記事では、MCP (Model Context Protocol) を利用したデータ分析基盤(Google Analytics / BigQuery)へのアクセスと、Vertex AI (Gemini) を活用したAIエージェント向けの自律型バナー作成ツールを実装するPythonのサンプルコードについて、丁寧に解説します。

近年、AIエージェントに「目的」を伝えるだけで、情報の収集から画像の生成までを完結させるアプローチが注目されています。実際のコードをもとに、認証からツールの実行、画像生成の流れを見ていきましょう。

1. AWSからGCPへのキーレス認証(Workload Identity連携)

AIエージェントがセキュアにGCPのリソース(Vertex AIやBigQuery)へアクセスするために、AWS IAMロールの権限を利用したWorkload Identity連携を行っています。

なお、このコードはAWS LambdaやFargateなど、IAMロールが割り当てられた環境での実行を前提としています。これにより、サービスアカウントのJSONキーを発行・管理する手間(キーレス認証)を省くことができます。

ローカルPCで試す場合は、AWS CLIでスイッチロール(AssumeRole)を行ってください。具体的には、~/.aws/config に対象のIAMロールへスイッチするためのプロファイル(role_arn など)を設定し、実行時にそのプロファイルを指定(例: export AWS_PROFILE=your_profile)することで、ローカル環境でも同様のキーレス認証を再現できます。

def create_gcp_workload_identity_config():
    # テンプレートファイルのパスを環境変数から取得
    template_path = os.getenv("GCP_WORKLOAD_IDENTITY_TEMPLATE")
    if not template_path:
        return ""
   
    with open(template_path, "r") as f:
        config = json.load(f)

    # credential_source から EC2 メタデータ用のフィールドを削除
    if "credential_source" in config:
        config["credential_source"].pop("region_url", None)
        config["credential_source"].pop("url", None)

    config_file = "gcp-workload-config.json"
    with open(config_file, "w") as f:
        json.dump(config, f, indent=2)
    
    return os.path.abspath(config_file)

ここでは、あらかじめGCPからダウンロードした構成テンプレートを読み込み、不要なメタデータURLを削除した上で、絶対パスとして保存しています。この設定ファイルが、後続のADC(Application Default Credentials)の起点となります。

2. 事前準備と実行手順

本システムを動作させるためには、各リソースへの権限付与と環境のセットアップが必要です。以下の手順に従って準備を行ってください。

  • GA4への権限付与: 利用するサービスアカウントのメールアドレスを、対象となるGA4プロパティの「アクセス管理」に追加してください。
  • BigQueryの権限付与: サービスアカウントに対して、「BigQueryジョブユーザー」および「BigQueryデータ閲覧者」の権限を追加してください。
  • テンプレート配置: GCPからダウンロードした構成テンプレート(JSONファイル)を任意のディレクトリに配置します。
  • ライブラリ追加: 実行に必要なパッケージをインストールします。
    uv add mcp boto3 strands-agents-tools
    
  • 環境変数の設定: 以下の環境変数を設定して、ファイルパスとプロジェクトIDを指定します。
    export GCP_WORKLOAD_IDENTITY_TEMPLATE=ダウンロードしたファイル名.json
    export GOOGLE_BIGQUERY_PROJECT=GCPのプロジェクトID
    

3. MCPツール連携(Google Analytics & BigQuery)

MCP(Model Context Protocol)を使うことで、外部コマンドを標準入出力(stdio)経由で手軽にツールとして統合できます。以下のコードでは、analytics-mcp と BigQuery のための toolbox をMCPクライアントとして起動しています。

async def test_ga_with_mcp():
    config_file = create_gcp_workload_identity_config()
    session = boto3.Session()
    creds = session.get_credentials().get_frozen_credentials()

    env = {
        "GOOGLE_APPLICATION_CREDENTIALS": config_file,
        "AWS_ACCESS_KEY_ID": creds.access_key,
        "AWS_SECRET_ACCESS_KEY": creds.secret_key,
        "AWS_SESSION_TOKEN": creds.token, 
        "AWS_REGION": session.region_name or "us-east-1",
    }
   
    ga_mcp = MCPClient(
        lambda: stdio_client(StdioServerParameters(command="uvx", args=["analytics-mcp"], env=env))
    )
    # BigQuery用ツールも同様に起動

AWSのクレデンシャル情報を明示的に環境変数として渡すことで、google-authライブラリがこれを検知し、キーレスでGCPリソースへの認証を突破しています。その後、ga_mcp.call_tool_async等を用いてデータの取得を行っています。

4. 【目玉機能】AIエージェント向けバナー作成ツール

今回のコードのハイライトは、テキストの「目的」を渡すだけでバナー画像を生成するツールです。レイアウトや素材画像を事前に用意する必要はなく、LLM自身がGoogle検索(Web/画像)を駆使して自律的に情報を集め、最適なデザインを生成します。

Vertex AI クライアントとモデル設定

採用しているモデルは最新の画像生成モデルである gemini-3.1-flash-image です。高速・低コストでありながらプロ級の品質を出力できます。

@tool
def create_banner(purpose: str) -> dict:
    print(f"\n[banner] 🟡 受付: 目的='{purpose}'", flush=True)
    _configure_gcp_keyless_env()

    client = genai.Client(vertexai=True, project=project, location=location)

    instruction = (
        "あなたはプロのバナーデザイナーです。次の目的に最適な販促バナー画像を1枚作成してください。\n"
        f"目的: {purpose}\n\n"
        "手順:\n"
        "1. 目的を達成するうえで必要な最新情報やビジュアル素材の参考を、"
        "Google検索(web検索・画像検索)で自律的に調べる。\n"
        "2. 集めた情報をもとに、訴求力の高いレイアウト・配色・キャッチコピーを設計する。\n"
        "3. 完成したバナー画像を出力する。"
    )

    search_tool = types.Tool(google_search=types.GoogleSearch())
    config = types.GenerateContentConfig(
        response_modalities=["TEXT", "IMAGE"],
        tools=[search_tool],
    )

tools=[search_tool] と設定することで、グラウンディング(検索連携)を有効にしています。ストリーミングで処理を受け取るため、LLMが「現在何を検索し、どう考えているか」という進捗をリアルタイムに把握できます。

5. エージェントによるバナー生成のデモと結果

以下のようにエージェントを構築し、目的を伝えて実行します。

def demo_with_agent(purpose: str):
    agent = Agent(
        tools=[create_banner],
        system_prompt=("あなたはマーケティング担当者を支援するアシスタントです。"...)
    )
    agent(f"次の目的のバナーを作成してください: {purpose}")

実際に「夏の新作スニーカー発売告知。爽やかで躍動感のあるデザイン。ダミー商品写真を2点入れて下さい。」というプロンプトを入力した結果、生成されたバナー画像がこちらです。

夏の新作スニーカー発売告知バナー

ご覧の通り、青空とエメラルドグリーンの海を背景に水しぶきが舞う、夏らしく爽快感あふれるデザインに仕上がっています。「夏を、駆け抜けろ。夏の新作スニーカー登場!」というダイナミックなキャッチコピーとともに、左右に「MODEL A: SKY RUNNER」「MODEL B: MINT BREEZE」という2種類のスニーカーが適切に配置されており、LLMが自律的に高度なデザインを構成したことがはっきりと分かります。

まとめ

本サンプルコードは、MCPを利用したツール連携と、Geminiを活用した自律型エージェントの強力さを実証するものです。AWS/GCPのキーレス認証を組み込むことで、セキュアかつスケーラブルな運用も視野に入れられています。ぜひ、ご自身の環境での動作テストや応用開発の参考にしてみてください。