Shopifyの管理画面で商品を一つずつ登録し、スプレッドシートからCSVをエクスポートしてフォーマットを整え、インポートする。EC運用に携わったことがある方なら、こうしたルーチン作業の負担は実感されているのではないでしょうか。
今回、Gemini Enterpriseとshopifyを使って、Shopifyストアを自然言語で操作できるAIエージェントを構築しました。スプレッドシートからの一括登録もチャットだけで完結します。
この記事では、実際に動くエージェントを構築する過程で得た知見と、開発中に直面した課題をまとめています。
Before/After:工数の変化
| 操作 | 手動 | エージェント |
|---|---|---|
| 商品1件の登録 | 管理画面で2〜3分 | チャットで約10秒 |
| 50件の一括登録 | CSV整形+インポートで30分〜 | スプレッドシートURL指定で数分 |
| 商品情報の検索 | 管理画面でフィルタ操作 | 「〇〇の商品はありますか?」で即回答 |
| 注文・顧客データの確認 | 各画面を行き来 | チャットで横断的に質問可能 |
特にスプレッドシートからの一括登録は大きな改善です。CSVフォーマットへの変換が不要で、日本語のヘッダー(「商品名」「価格」「タグ」など)をそのまま認識してShopifyのフィールドにマッピングします。
技術スタック
全体のアーキテクチャは以下の構成です。
┌─────────────────────────────────────────────┐
│ Vertex AI Agent Engine │
│ ┌───────────────────────────────────────┐ │
│ │ root_agent (Gemini 2.5 Flash) │ │
│ │ │ │
│ │ Tools: │ │
│ │ ├─ shopify_tool (Integration Connector) │
│ │ │ └─ Orders / Customers / Variants │ │
│ │ ├─ Shopify REST API (カスタムツール) │
│ │ │ └─ Products CRUD │ │
│ │ ├─ Google Sheets API │ │
│ │ │ └─ read_sheet / list_sheets │ │
│ │ └─ import_products_from_sheet │ │
│ │ └─ スプシ → Shopify 一括登録 │ │
│ └───────────────────────────────────────┘ │
│ │
│ GCP: ky-gemini-enterprise │
│ Region: asia-northeast1 │
└──────────┬──────────────┬────────────────────┘
│ │
Shopify REST API Google Sheets API
│ │
┌──────┴──────┐ ┌───┴──────────┐
│ Shopify │ │ Google │
│ Store │ │ Spreadsheet │
└─────────────┘ └──────────────┘
主な技術要素は以下の通りです。
- Google ADK(Agent Development Kit):エージェントのフレームワーク。Pythonで記述できます
- Gemini 2.5 Flash:LLMモデル。高速かつコスト効率に優れています
- Vertex AI Agent Engine:エージェントのホスティング基盤。コマンド1つでデプロイ可能です
- Integration Connectors:GCPのコネクタ機能。Shopifyの注文・顧客データはこちらを経由しています
- Shopify REST Admin API:商品操作はREST APIを直接呼び出しています(理由は後述)
- Google Sheets API:スプレッドシートの読み取り。ADC認証を使用しています
- Secret Manager:Shopifyのアクセストークン管理に使用しています
エージェントの中身
ADKのエージェント定義はシンプルです。agent.pyにモデル・instruction・ツール一覧を記述します。
root_agent = Agent(
model="gemini-2.5-flash",
name="root_agent",
description="Shopifyストアの在庫・注文・顧客データを自然言語で操作するエージェント",
instruction=(
"あなたはShopifyストア管理アシスタントです。"
"ユーザーの自然言語による指示に基づき、Shopifyストアのデータを操作してください。\n"
"\n"
"## ツール使い分け\n"
"- 商品の操作: list_products, get_product, create_product, ...\n"
"- 注文・顧客: shopify ツールを使用\n"
"- スプシ→Shopify一括登録: import_products_from_sheet を使用\n"
"\n"
"## 重要: 作成・更新・削除の確認ルール\n"
"商品・注文・顧客の作成・更新・削除を実行する前に、\n"
"必ずユーザーに確認を求め、承認を得てから実行する\n"
),
tools=[
shopify_tool,
list_products, get_product, create_product,
update_product, delete_product,
import_products_from_sheet,
read_sheet, list_sheets,
],
)
ポイントはinstructionの設計です。「ツールの使い分けルール」と「確認フロー」をプロンプトに記述しておくと、LLMが自律的にツールを選択し、破壊的な操作の前にはユーザーへ確認を行います。
UIは一切作成していません。Agent Engineのチャットインターフェースをそのまま利用しています。
開発中に直面した3つの課題
「ADKでShopifyに繋ぐだけ」と思いがちですが、実際にはいくつかの課題がありました。同様の構成を検討される方の参考になれば幸いです。
1. Integration ConnectorのProducts問題
GCPのIntegration ConnectorsにはShopifyコネクタがあり、ADKからApplicationIntegrationToolsetで簡単に利用できます。注文や顧客はこれで問題なく動作します。
しかし、Productsエンティティだけはエラーになりました。コネクタが返すフィールドに「パブリケーション関連」の項目が含まれており、Shopifyのカスタムアプリではこの権限がないためです。Shopify Plus以外ではパブリケーションAPIにアクセスできないことが原因でした。
解決策として、商品操作のみREST APIを直接呼び出す構成にしています。
# tools.py - コネクタ側(注文・顧客はこちらで対応)
shopify_tool = ApplicationIntegrationToolset(
project="ky-gemini-enterprise",
location="asia-northeast1",
connection="shopifyagenttool",
entity_operations={
# Products はカスタムツールで対応(コネクタのパブリケーション問題回避)
"Orders": ["LIST", "GET", "CREATE", "UPDATE", "DELETE"],
"Customers": ["LIST", "GET", "CREATE", "UPDATE", "DELETE"],
"ProductVariant": ["LIST"],
},
)
# shopify_products_tool.py - REST API直接呼び出し側
def _shopify_request(method, path, body=None):
token = _get_shopify_token() # Secret Managerから取得
url = f"https://{_SHOP_DOMAIN}/admin/api/{_API_VERSION}/{path}"
req = urllib.request.Request(
url, data=json.dumps(body).encode("utf-8") if body else None,
method=method,
headers={
"X-Shopify-Access-Token": token,
"Content-Type": "application/json",
},
)
with urllib.request.urlopen(req) as resp:
return json.loads(resp.read().decode("utf-8"))
コネクタとREST直接呼び出しのハイブリッド構成です。やや泥臭い方法ではありますが、現時点では最も確実なアプローチでした。
2. Google Sheets APIのADCスコープ
ローカル環境でadk web(ADKの開発サーバー)を起動し、スプレッドシートの読み取りを試したところ、403 Forbiddenが発生しました。
原因は、ADC(Application Default Credentials)にGoogle Sheets APIのスコープが含まれていなかったことです。gcloud auth application-default loginのデフォルトスコープではSheets APIにアクセスできません。
# 以下のようにスコープを明示的に指定する必要があります
gcloud auth application-default login \
--scopes="https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/spreadsheets.readonly"
Agent Engine上ではサービスアカウントが使用されるためこの問題は発生しませんが、ローカル開発時にはスコープの指定を忘れないよう注意が必要です。
3. シート名「Sheet1」問題
スプレッドシートの読み取りでデフォルトシート名を"Sheet1"と指定していたところ、400 Bad Requestが返されました。
日本語環境で作成されたスプレッドシートでは、最初のシート名が「シート1」になります。「Sheet1」は英語環境でのデフォルト名です。
対処として、シート名が省略された場合はSpreadsheets APIで最初のシート名を動的に取得する仕組みを実装しました。
def _get_first_sheet_name(spreadsheet_id):
service = _get_sheets_service()
result = service.spreadsheets().get(spreadsheetId=spreadsheet_id).execute()
sheets = result.get("sheets", [])
if sheets:
return sheets[0]["properties"]["title"]
return "Sheet1"
def read_sheet(spreadsheet_id, range_name=""):
if not range_name:
range_name = _get_first_sheet_name(spreadsheet_id) # 自動検出
# ...
小さな問題ですが、こうした「実際に運用して初めて気づく落とし穴」は少なくありません。
スプレッドシートからShopifyへの一括登録
今回のエージェントで特に実用性が高い機能が、スプレッドシートからの一括商品登録です。スプレッドシートのURLを指定して「登録して」と伝えるだけで、商品がShopifyに一括で登録されます。
ポイントはヘッダー行の自動マッピングです。
_HEADER_MAP = {
"title": "title", "タイトル": "title", "商品名": "title",
"body_html": "body_html", "説明": "body_html", "description": "body_html",
"vendor": "vendor", "ベンダー": "vendor",
"product_type": "product_type", "商品タイプ": "product_type",
"tags": "tags", "タグ": "tags",
"price": "price", "価格": "price",
}
日本語・英語どちらのヘッダーにも対応しています。スプレッドシート側で「商品名」「価格」「タグ」と記載しておけば、そのままShopifyの対応フィールドにマッピングされます。
エージェントの動作としては、いきなり登録を実行するのではなく、まずread_sheetでスプレッドシートの内容をユーザーに提示し、確認を得てからimport_products_from_sheetを実行します。この手順はinstructionに記述してあるため、LLMが自動的にこのフローを踏みます。
Agent Engineを使ってみた所感
実際にAgent Engineを使用して感じた利点と制約をまとめます。
利点
- デプロイが1コマンド:
adk deploy agent_engineでVertex AI上にデプロイが完了します。Dockerfileやインフラ設定は不要です - GCPネイティブ:IAM、Secret Manager、Integration Connectorsとシームレスに統合されており、認証・認可を自前で実装する必要がありません
- ローカル開発が容易:
adk webコマンドでローカルにチャットUIが起動し、試行錯誤のサイクルを高速に回せます - Pythonだけで完結:フロントエンドやインフラの構築なしにエージェントを開発できます
制約・注意点
- チャットUIのみ:Agent Engine上ではチャットベースのインタラクションに限定されます。カスタムUIやダッシュボードが必要な場合は別途開発が必要です
- Shopify APIのレート制限:REST APIは2リクエスト/秒のため、一括登録は理論上600件程度/5分が上限です。大量データを扱う場合はバッチ処理の設計が必要になります
- google_searchとの共存制約:ADKの
google_searchツールは他のツールと同時に使用できません。利用する場合はサブエージェントへの分離が必要です - ローカル開発時のADC:前述の通り、スコープ指定を忘れると認証エラーが発生します
総合的に、GCP環境を利用しているプロジェクトであれば、エージェント開発の有力な選択肢になると感じました。特にIntegration Connectorsを通じて既存のSaaSと接続できる点は大きな強みです。
次の展開
今回のShopifyエージェントはEC運用の自動化が目的でしたが、同じADK + Agent Engineの構成でコンテンツ生成エージェントの開発も進めています。
こちらはマルチエージェント構成を採用しており、コンテキスト収集・トピック提案・本文生成・品質チェックをそれぞれ専門のサブエージェントが担当します。スプレッドシート上のブランドガイドラインやペルソナ情報を読み込み、ブランドのトーンに沿った記事を自律的に生成する仕組みです。
ADKのマルチエージェント機能(sub_agents)を使うと、エージェント間の役割分担を明確に定義できます。単一エージェントでは扱いにくい複雑なワークフローも、分割統治の考え方で対応可能になります。
まとめ
Google ADK + Agent Engineは、想定以上に実用的な組み合わせでした。
- Pythonだけでエージェントを構築できる
- GCPのサービスとネイティブに統合できる
- デプロイが容易
- instructionの設計次第で、確認フローやツール選択をLLMに委ねられる
EC運用に限らず、「SaaSの管理画面を繰り返し操作するタイプの業務」であれば、同様のアプローチで自動化が可能です。GCP環境をお使いであれば、まずはadk webで試してみることをおすすめします。