Anthropicが2026年9月2日に「Claude Commerce Agents」を公開しました。ニュースの見出しには「Claudeで買い物ができる」と読めるものもありますが、実際は違います。これは消費者向けの機能ではなく、ネットショップの運営者が、自分の店のサイトに「会話で接客するAI」を置くための設計図です。しかも公開されているエージェントは、決済を実行しません。
Shopifyが公式の実装例を出しているので、実際に動かしました。結論から書くと、実在のShopifyストアに対して商品を検索し、カートに入れるところまで動きました。かかった費用は1会話で約5.7円です。ただしREADMEどおりに始めると最初の1歩で止まります。
きっかけ:見出しが実態とずれていた
「Claudeで買い物できるようになった」という話を聞いて調べ始めたのですが、一次情報を読むと中身が違いました。公開されたのは2つのエージェントのリファレンス実装です。
- ショッピングエージェント:EC事業者が自社サイトやアプリに組み込む接客用。商品検索・比較・カート投入を会話でこなす
- マーチャントエージェント:店舗スタッフが在庫・価格・受注などバックオフィスを回すため
ライセンスはApache 2.0で、Anthropicのソースコードとして公開されています。さらにShopifyが、自社のお店につなぐための実装例を別に出しています。今回動かしたのはこちらです。ECサイトを作る側からすると、「自分の店にClaudeの接客担当を置ける」という話であって、消費者がClaudeで買い物をする話ではありません。
最初に、作業する場所を3つに分けて整理する
- ターミナル(Python):文字を打ち込んで操作する画面のこと。ここでAI本体を動かします
- ターミナル(Node):もう一枚の同じ画面。こちらでお店の見た目のほうを動かします
- つなぐ先のお店:自分の店ではなく、公開されているテスト用の店を指定します。ここが最初の関門でした
用語は3つだけ覚えれば足りる
- UCP:AIが店の商品を検索したりカートを操作したりするための、共通の窓口。店側がこれに対応していないと何も始まりません
- スキル:AIに読み込ませる指示書。「商品を探すとき」「接客するとき」など、場面ごとに分かれています
- プロンプトキャッシュ:毎回同じ指示書を送り直さずに済ませる仕組み。料金に大きく効きます
手順0:必要なものを確認する
READMEはPython 3.11以上とNode 22を求めています。手元はPython 3.14.7とNode 24でしたが、どちらもそのまま通りました。Pythonの依存は自前ビルドが数個走りますが、エラーは出ませんでした。
もうひとつ必要なのがAnthropicのAPIキーです。ただし後述のとおり、キーが要るのは会話部分だけで、商品検索やカート操作はキーなしで動きます。
手順1:READMEどおりに動かすと、1歩目で止まる【ターミナル】
配布されているファイル一式には、つながるかどうかだけを確かめる簡単なテスト(スモークテストと呼びます)が付いています。しかも「AIの利用キーは要らない」と明記されています。まずこれを実行しました。
python storefront/scripts/smoke.py
結果は例外終了でした。
httpx.HTTPStatusError: Client error '404 Not Found' for url
'https://(既定のデモストア)/.well-known/ucp'
READMEが既定として指定しているデモストアが、UCPの入口を返していません。手動で叩いても404でした。302で転送される先のドメインも同じく404です。ストア側がUCPに対応していないので、エージェント以前の問題として何もできません。
ここで詰まったら、UCPを実際に返しているストアを探すのが正解です。次の1行で判定できます。
curl -s -o /dev/null -w "%{http_code}\n" https://ストアのドメイン/.well-known/ucp
手順2:動くストアはテストコードの中にあった【ターミナル】
配布ファイルの中から店のアドレスらしき文字列を数えたところ、説明書に書かれていない別のアドレスが出てきました。テスト用に保存された通信記録の中に埋まっていたものです。アクセスしてみると正常に応答し、対応バージョンとして 2026-08-25 を名乗りました。
grep -rhoE "[a-z0-9.-]+\.(myshopify\.com|mock\.shop)" --exclude-dir=node_modules . \
| sort | uniq -c | sort -rn | head
このドメインを環境変数で指定してスモークテストを回すと、全項目が通りました。
discovery: ucp version 2026-08-25
search: 3 products, first "Women's T-shirt" 40.0 CAD
details: 10 variants, default "Women's T-shirt — Small / Green"
cart: added "Women's T-shirt - Small / Green", checkout_url present
cart: update and remove ok
policies: 0 matches
smoke ok
注目してほしいのはcheckout_url presentです。エージェントはカートを作るところまでで、決済はストア自身のチェックアウト画面に渡します。冒頭に書いた「決済を実行しない」は、この時点で実物として確認できます。
手順3:APIサーバーを起動する【ターミナル】
起動して状態を確認すると、何が動いているかが1行で分かります。
{"ok": true, "store": "…", "products": 24,
"skills": ["customer-care", "memory-personalization", "planning-goals",
"purchase-research", "search-discovery"],
"model": "claude-sonnet-5"}
商品24件をあらかじめ読み込み、5つのスキルを持ち、モデルはSonnetでした。APIキーを設定していない状態でも、ここまでは動きます。起動ログに「キーが見つからない。会話で認証エラーが出るなら設定せよ」という趣旨の警告が出るだけです。
商品一覧を取り出す機能も、キーなしで24件を返しました。料金が発生するのは会話のときだけという設計です。導入を検討する段階では、キーを用意する前に「商品データがちゃんとつながるか」まで無料で試せます。
手順4:会話が401で通らない【ターミナル】
キーを設定してチャットを叩いたところ、401が返り続けました。
{"detail":"Start a session first (POST /api/session)"}
会話の枠(セッション)は作成済みで、その番号も返ってきています。それでも「先に枠を作れ」と言われ続けました。中身のコードを読んで原因が分かりました。番号の渡し方が決まっていて、X-Session-Id という専用の欄に入れないと受け付けないのです。
SID=$(curl -s -X POST localhost:8004/api/session \
-H 'Content-Type: application/json' -d '{}' \
| python3 -c "import json,sys;print(json.load(sys.stdin)['session_id'])")
curl -N -X POST localhost:8004/api/chat \
-H 'Content-Type: application/json' -H "X-Session-Id: $SID" \
-d '{"message":"Show me a varied mix of items under 50 dollars."}'
ここで自分の検証ミスにも気づきました。最初は質問のたびに新しいセッションを作っていたため、エージェントが毎回文脈を失って逆質問を繰り返していたのです。「聞き返してばかりで使えない」と早合点しかけました。同じセッションIDを使い回すのが前提です。
手順5:実際に会話させる【ターミナル】
応答は一度に返らず、少しずつ流れてきます。「50ドル以下で色々見せて」と頼んだとき、AIが内部で何を順に呼び出したかがこれです。
[tool] load_skill {"skill_name": "search-discovery"}
[tool] search_products {"query": "snacks", "filters": {"max_price": 50}}
[tool] search_products {"query": "gift items", "filters": {"max_price": 50}}
[tool] search_products {"query": "food", "filters": {"max_price": 50}}
[tool] search_products {"query": "gift", "filters": {"max_price": 50}}
[tool] search_products {"query": "jewelry", "filters": {"max_price": 50}}
[tool] present_products {"title": "Varied picks under 50", "picks": [...]}
[tool] present_suggestions
1回の依頼で商品検索を5回投げています。語を変えて候補を集め、最後に選んで提示する動きです。そして返答が予想外でした。
この店のカタログにはスナックもギフト専用品もありません。フットウェアとアクセサリーの店です。実際に在庫のあるものから、50ドル以下で幅のある組み合わせを出します。
無いものを無いと言い、そのうえで代案を出しました。在庫に無い商品をそれらしく並べる動きはしません。接客として最低限ここが担保されているのは重要だと思います。
続けて「最初のものをカートに入れて」と頼むと、こう返ってきました。
Added the Slides to your cart — subtotal is now $25.00 CAD.
実在のストアの実際のカートに入り、小計が返っています。ここから先はcheckout_urlでストアの決済画面に渡すだけです。

費用は1会話で約5.7円だった
料金はトークンという単位で決まります。文章を細かく区切った数のことで、長く話すほど増えます。「検索して提案する」「カートに入れる」の2往復を1つの会話として計測しました。単価はClaude Sonnet 5の公式料金(入力 2ドル/出力 10ドル/キャッシュ読み 0.20ドル/キャッシュ書き 2.50ドル、いずれも100万トークンあたり)で計算しています。
| ターン | 入力 | 出力 | キャッシュ読 | 時間 | 費用 |
|---|---|---|---|---|---|
| 検索して提案 | 287 | 1,181 | 53,591 | 14.8秒 | 0.03025ドル |
| カートに追加 | 4 | 191 | 25,149 | 3.9秒 | 0.00762ドル |
| 合計 | 18.7秒 | 0.03788ドル |
1ドル150円で約5.7円です。注目すべきはキャッシュ読みの5万3千トークンで、入力の大半がキャッシュから読まれています。キャッシュ単価は通常入力の10分の1なので、これが無ければこの部分だけで10倍かかる計算になります。スキルとカタログを毎回送り直さない設計が効いています。
検索を伴うターンが14.8秒かかった点は、体験として無視できません。検索を5回投げるぶん待たされます。実店舗の接客に載せるなら、待っている間の表示をどうするかは別途考える必要があります。
日本語で聞くと、動くが2倍かかる
同じことを日本語で頼んでみました。ちゃんと動きます。ただし費用と時間は英語の倍近くかかりました。

興味深いのは裏側の振る舞いでした。ツールの呼び出しを見ると、こうなっています。
[tool] search_products {"query": "gift ideas", "filters": {"max_price": 35}}
[tool] search_products {"query": "jewelry", "filters": {"max_price": 35}}
[tool] search_products {"query": "bag", "filters": {"max_price": 35}}
[tool] search_products {"query": "hat", "filters": {"max_price": 35}}
…(計8回)
[tool] present_products {"title": "5,000円以下のギフト候補", ...}
- 通貨を自分で換算しました。「5000円以下」という指定に対し、「5000円は35カナダドルほど」と判断して
max_price: 35で検索しています。レートの出どころは示されません - 検索クエリは英語に翻訳して投げます。カタログが英語でも成立するのはこのためです
- 利用者に見える文字列は日本語で返します。カードのタイトル、選定理由、提案チップまで日本語でした
一方で気になる点もありました。日本語の文章に英語が混ざります。実際の応答がこれです。
5000円は35カナダドルほどなので、その範囲でギフト向けの商品を探します。This catalog seems focused on footwear and workout apparel. Under 5,000円ほど(約35カナダドル)で、贈り物になりそうな候補をお見せします。
そのまま接客に出せる状態ではありません。実運用ではプロンプト側で言語を固定する調整が要ります。
費用と時間の差は次のとおりです。同じ「候補を出す→カートに入れる」の2ターンで比べています。
| 英語 | 日本語 | |
|---|---|---|
| 商品検索の回数 | 5回 | 8回 |
| 1ターン目の所要時間 | 14.8秒 | 26.4秒 |
| 出力トークン(1ターン目) | 1,181 | 1,851 |
| 2ターン合計の費用 | 0.03788ドル | 0.08220ドル |
| 円換算 | 約5.7円 | 約12.3円 |
約2.2倍です。日本語は同じ内容でもトークンを多く使いますし、今回は検索回数も増えました。1件あたり数円の差ですが、月に何千件と接客するなら効いてきます。日本語で使う前提なら、想定質問で実測してから見積もるべきだと思います。
つまずき早見表
| 症状 | 原因 | 対処 |
|---|---|---|
| スモークテストが404で落ちる | 既定のデモストアがUCPを返していない | UCPを返すストアを探して環境変数で指定する |
/api/chat が401を返す | セッションIDをヘッダーで渡していない | X-Session-Id ヘッダーに入れる |
| 毎回聞き返してくる | リクエストごとに新しいセッションを作っている | 同じセッションIDを使い回す |
| 会話だけ認証エラー | APIキーが未設定 | カタログ・カートはキーなしで動く。会話のみキーが要る |
| 応答が遅い | 1ターンで商品検索を複数回投げている | 仕様。待ち時間の見せ方を設計する |
| 日本語の中に英語が混ざる | 言語が固定されていない | プロンプト側で応答言語を指定する |
確認方法
導入を検討するなら、順番に切り分けるのが早いです。
- ストアがUCPを返すか(
/.well-known/ucpが200か) - スモークテストが通るか(ここまでAPIキー不要・費用ゼロ)
- 会話が通るか(ここから課金)
- 応答の
usageで費用を実測する(推測しない)
正直に書いておくこと
これは製品ではなく設計図です。そのまま自社サイトに載せられる完成品ではなく、実装の土台として読むものです。認証やログ、エラー時の挙動、日本語での応答品質は、自分の店に合わせて作り込む前提になります。
テスト用ストアの商品名は英語です。日本語カタログでどう振る舞うかは別途確認が要ります。日本語での会話については次の節に実測を載せました。
費用は会話の内容で変わります。今回は2ターンで5.7円でしたが、検索を何度も投げる依頼なら増えます。逆に商品を絞り込んだ質問なら減ります。「1会話いくら」で見積もるより、実際の想定質問で測ってから判断するほうが確実です。
そしてコードを書かない選択肢もあります。リポジトリのREADME自身が冒頭で、管理型の接客エージェントなら既存アプリで設定だけで用意できると案内しています。自前で組む必要があるかは、先に検討する価値があります。
自分で試したい方へ
公開デモは用意されていないので、試すには自分で動かすことになります。必要なものは次の2つです。どちらも無料で入手できます。
- anthropics/commerce-agents:土台になる設計図。使い方の説明もここにあります
- Shopify/claude-for-commerce-examples:Shopifyのお店につなぐための実装例。今回動かしたのはこちらです
始めるときは、説明書どおりの店ではつながらないことだけ先に知っておいてください。この記事の手順1と手順2がそこの回避方法です。会話を試さなければ料金はかからないので、商品データがつながるところまでは無料で確認できます。
要点
- 消費者がClaudeで買い物する機能ではなく、EC事業者が自社サイトに接客エージェントを置くための設計図。エージェントは決済を実行しない
- READMEの既定ストアはUCPを返さず、そのまま始めると1歩目で落ちる。先に
/.well-known/ucpが200かを確認する - 検索してカートに入れるまでで約5.7円・18.7秒。カタログとカートはAPIキーなしで動くので、無料で試せる範囲が広い
- 日本語でも動くが費用は約2.2倍(12.3円)。通貨は自分で換算し、検索は英語に翻訳して投げる。ただし応答に英語が混ざるので言語の固定が要る