10月14日、startuphub.aiが「Build an AI Shopping Agent: SerpApi Search, Stripe Link Pay」と題した記事を公開した。AIエージェントに決済を委ねるとき、最大のリスクはカード番号の漏洩だ。このチュートリアルはその問題を、エージェントがカード番号に一切触れない設計で解決する。Stripe Linkが発行するワンタイム仮想カードをユーザーが明示的に承認するまでカードは存在せず、承認後も12時間・1回限りという制約が付く。Claudeのチャット画面から商品を頼むと、エージェントが検索・購入リクエストまでを担い、最終承認だけを人間に委ねるという流れだ。
ただし、重要な制約を先に述べておく。Amazonには商品を購入できる公開APIが存在しない。そのためこのエージェントは「商品を探してカードを用意するところまで」を自律的に行うが、最終的なチェックアウト操作はブラウザ自動化ツールが担う設計になっている。完全自律での購入を期待して読む場合は、その前提を念頭に置いてほしい。
Stripe Linkによるワンタイムカード発行がユニーク
従来のAI決済連携では、エージェントがカード情報をそのまま扱うか、プリペイドAPIを使うケースが多かった。このチュートリアルのアプローチは異なる。
エージェントは購入金額・店名・購入理由を含む「支出リクエスト(spend request)」を作るだけだ。実際のカード番号はエージェントも加盟店も見ない。ユーザーがLinkアプリ上でリクエストを確認し「承認」をタップして初めて、その購入専用のワンタイム仮想カードが発行される。カードは12時間有効・1回限り使用可能という制約付きだ。
この仕組みを操作するのがlink-cliと呼ばれるStripe LinkのCLIツールだ。なお、執筆時点でこのCLIが一般公開(GA)・ベータ・招待制のいずれの段階にあるかは元記事に明記されていない。実際に試す前にStripe Linkの公式ドキュメントで提供状況を確認することを推奨する。
npm install -g @stripe/link-cli
link-cli auth login --client-name "Shopping agent"
link-cli auth status
支出リクエストの作成はCLI一発で行う。
link-cli spend-request create \
--test \
--amount 3499 \
--merchant-name "Amazon" \
--merchant-url "https://www.amazon.com/dp/B0EXAMPLE/" \
--context "Buying the Anker 737 power bank on amazon.com for $34.99. The customer asked the shopping agent to find the best-reviewed 24,000 mAh power bank under $40 and picked this one." \
--line-item "name:Anker 737 power bank,unit_amount:3499,quantity:1" \
--total "type:total,display_text:Total,amount:3499" \
--format json
いくつか注意点がある。
--amountは最小通貨単位(セント)なので3499は$34.99--contextは100文字以上必須で、承認画面にそのまま表示されるためユーザーが判断できる内容を書く--testフラグを付けると4000009990001984のようなテスト用カード番号が返り、実際には課金されない- 承認待ちのタイムアウトは30分。ステータスは
created → pending_approval → approved → succeededなどを遷移する
カードの取得は--output-fileオプションを使うことが推奨されている。--include cardと--output-fileを組み合わせると、PAN・CVC・請求先住所はパーミッション0600のファイルに書かれ、標準出力にはブランド・下4桁・有効期限だけが出る。ログにカード番号が残るリスクを避ける設計だ。
link-cli spend-request retrieve lsrq_abc123 \
--include card --output-file /tmp/link-card.json --format json
構成の全体像
このチュートリアルで作るのは、次の4層から成るAIショッピングエージェントだ。
- SerpApiでAmazonの商品検索を実行
- Stripe Linkで支払い承認リクエストを発行(ユーザーが承認)
- MCPサーバー(Node.js)として3ツールをまとめてリモート公開
- Claudeのカスタムコネクタとして接続し、チャット上から操作
商品検索を担うSerpApiは、GoogleやAmazonなどの検索結果をAPIとして取得できるサービスだ。Amazonには商品一覧を取得できる公開APIが存在しないため、このエージェントではSerpApiがその代替として機能する。利用にはSerpApiのAPIキーが必要で、無料プランでも一定回数の検索が可能だ。
MCPサーバーとして3ツールをまとめる
検索・決済リクエスト・ステータス確認の3機能をModel Context Protocol(MCP)サーバーとして公開する。トランスポートはStreamable HTTP(/mcpエンドポイント)で、MCP_BEARER_TOKEN環境変数のBearerトークンで保護する。
// src/server.ts(抜粋)
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
import { z } from 'zod';
import { searchAmazon } from './serpapi.js';
import { createSpendRequest, pollSpendRequest } from './link.js';
const server = new McpServer({ name: 'shopping-agent', version: '1.0.0' });
server.tool('search_products', { query: z.string(), domain: z.string().optional() },
async ({ query, domain }) => ({ content: [{ type: 'text', text: JSON.stringify(await searchAmazon(query, domain)) }] }));
server.tool('request_payment', {
amount_cents: z.number().int().max(50000),
merchant_url: z.string().url(),
item_name: z.string(),
context: z.string().min(100),
}, async (args) => ({ content: [{ type: 'text', text: JSON.stringify(await createSpendRequest(args)) }] }));
server.tool('check_payment', { id: z.string() },
async ({ id }) => ({ content: [{ type: 'text', text: JSON.stringify(await pollSpendRequest(id)) }] }));
request_paymentはlink-cliをシェル呼び出しし、返すのはリクエストIDと承認URLのみで、カード情報は一切返さない。check_paymentでポーリングしてステータスを確認する設計だ。
Claudeへのコネクタ登録
MCPサーバーをhttps URLで公開した後、Claudeへの登録手順は次のとおりだ。
- Claude.aiの「Customize」→「Connectors」を開く
- 「+ Add」→「Add custom connector」をクリック
- サーバーURL(
/mcp終わり)を入力 - 認証は「No sign in」を選択
- リクエストヘッダーに
Authorization: Bearer <MCP_BEARER_TOKEN>を追加 - チャット画面の「+」からコネクタをオンにする
接続元はAnthropicのクラウドになるため、同じコネクタがclaude.ai・Claude Desktop・モバイルアプリで共通して使える。Freeプランでもカスタムコネクタ1件は利用可能だ。
実際の購入ステップはブラウザが担う
冒頭でも触れたとおり、Amazonにはカードを受け取る公開APIが存在しない。そのため最終的なチェックアウト操作(カード番号・CVC・有効期限・請求先住所の入力)は、ChromeのClaudeやPlaywrightなどのブラウザ自動化ツールがカードファイルを読んで行う形になる。エージェントが自律的に担えるのは「商品を探し、ユーザーの承認を得てカードを用意するところまで」と理解しておくとよい。
Stripeが発行するPay Tokenを使えばフォーム入力自体をスキップできるが、これはStripe製チェックアウトでLinkが有効になっているサイト限定だ。
詳細はBuild an AI Shopping Agent: SerpApi Search, Stripe Link Payを参照していただきたい。