ops-ecom について
ops-ecom は、ダッシュボードや管理フローを通じて Shopify ストアを運用する Claude スキルです。注文、在庫、フルフィルメント、商品、顧客、分析、ストアの状態を扱い、ShipBob の出荷状況も任意で確認できます。
主な機能
- 01注文と売上の確認
- 02在庫とフルフィルメントの監視
- 03商品とバリアント価格の管理
- 04顧客情報と売上分析の表示
- 05ストアの状態と設定の確認
活用シーン
- 01最近の注文と売上額の確認
- 02在庫僅少または在庫切れのバリアントを特定
- 03未発送注文と ShipBob の出荷状況を確認
- 04商品バリアントの価格を更新
MCP 対応
README には Shopify Admin REST API と任意の ShipBob API の利用が記載されていますが、MCP 連携についての説明はありません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ davepoon/ buildwithclaude --skill ops-ecomインストール後、Claude Code で/ops-ecomを入力して読み込まれたか確認します。
詳細
OPS ► ECOM — Shopify ストアコマンドセンター
ランタイムコンテキスト
実行前に、利用可能なコンテキストを読み込みます。
-
設定:
${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.jsonを読み込みますtimezone— すべてのタイムスタンプを正しく表示しますshopify_store_url、shopify_admin_token— 環境変数より先に userConfig のキーを確認します
-
デーモンの健全性:
${CLAUDE_PLUGIN_DATA_DIR}/daemon-health.jsonを読み込みますaction_neededが null でない場合 → ストアの操作を実行する前に、その内容を提示します
-
シークレット:userConfig → 環境変数 → Doppler の順に Shopify の認証情報を解決します(以下のフェーズ 1 を参照)
CLI/API リファレンス
Shopify Admin REST API
| エンドポイント | メソッド | 説明 |
|---|---|---|
/admin/api/2024-10/shop.json | GET | ストア情報とプラン |
/admin/api/2024-10/orders.json?status=any&limit=50 | GET | 最近の注文 |
/admin/api/2024-10/products.json?limit=250 | GET | 商品カタログ |
/admin/api/2024-10/customers.json?limit=50 | GET | 顧客一覧 |
/admin/api/2024-10/themes.json | GET | テーマ一覧 |
/admin/api/2024-10/variants/${ID}.json | PUT | バリアントの価格を更新 |
認証ヘッダー:X-Shopify-Access-Token: ${SHOPIFY_TOKEN}
ShipBob API(任意)
| エンドポイント | メソッド | 説明 |
|---|---|---|
https://api.shipbob.com/1.0/shipment?Status=Processing&PageSize=20 | GET | 保留中の出荷 |
認証ヘッダー:Authorization: Bearer ${SHIPBOB_TOKEN}
Agent Teams のサポート
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 が設定されている場合、ストアデータを並行して調査するときは Agent Teams を使用します。これにより、次のことが可能になります。
- エージェント間でコンテキストを共有し、処理中に連携できます
- 優先順位をリアルタイムで調整できます
- エージェントは作業の完了に応じて進捗を報告します
チームのセットアップ(フラグが有効な場合のみ):
TeamCreate("ecom-team")
Agent(team_name="ecom-team", name="orders-scanner", prompt="Fetch recent orders, compute revenue for today/7d/30d")
Agent(team_name="ecom-team", name="inventory-scanner", prompt="Fetch all products, flag low stock and out-of-stock items")
Agent(team_name="ecom-team", name="fulfillment-scanner", prompt="Fetch unfulfilled orders and ShipBob shipment status")
Agent(team_name="ecom-team", name="analytics-scanner", prompt="Compute revenue analytics, AOV, and top products for 30d")
フラグが設定されていない場合は、標準の fire-and-forget サブエージェントを使用します。
フェーズ 1 — 認証情報の解決
次の順序で Shopify の認証情報を解決します。
# 1. Plugin userConfig
SHOPIFY_STORE="${user_config.shopify_store_url}"
SHOPIFY_TOKEN="${user_config.shopify_admin_token}"
SHIPBOB_TOKEN="${user_config.shipbob_access_token}"
# 2. Environment variables (override userConfig if set)
[ -n "$SHOPIFY_STORE_URL" ] && SHOPIFY_STORE="$SHOPIFY_STORE_URL"
[ -n "$SHOPIFY_ACCESS_TOKEN" ] && SHOPIFY_TOKEN="$SHOPIFY_ACCESS_TOKEN"
[ -n "$SHIPBOB_ACCESS_TOKEN" ] && SHIPBOB_TOKEN="$SHIPBOB_ACCESS_TOKEN"
# 3. Doppler fallback
if [ -z "$SHOPIFY_TOKEN" ] && command -v doppler &>/dev/null; then
SHOPIFY_TOKEN=$(doppler secrets get SHOPIFY_ACCESS_TOKEN --plain 2>/dev/null)
fi
if [ -z "$SHOPIFY_STORE" ] && command -v doppler &>/dev/null; then
SHOPIFY_STORE=$(doppler secrets get SHOPIFY_STORE_URL --plain 2>/dev/null)
fi
if [ -z "$SHIPBOB_TOKEN" ] && command -v doppler &>/dev/null; then
SHIPBOB_TOKEN=$(doppler secrets get SHIPBOB_ACCESS_TOKEN --plain 2>/dev/null)
fi
すべての解決手順の後も $SHOPIFY_STORE または $SHOPIFY_TOKEN が空の場合は、以下のセットアップフローに進みます。
ベース URL を設定します。
SHOPIFY_BASE="https://${SHOPIFY_STORE}/admin/api/2024-10"
SHOPIFY_GQL="https://${SHOPIFY_STORE}/admin/api/2024-10/graphql.json"
SHOPIFY_AUTH="X-Shopify-Access-Token: ${SHOPIFY_TOKEN}"
フェーズ 2 — $ARGUMENTS に応じた振り分け
| 入力 | アクション |
|---|---|
| (空) | ストアの概要を表示 |
| orders, order | 注文ダッシュボード |
| inventory, stock, inv | 在庫レベル |
| fulfillment, fulfill, shipbob, shipping | フルフィルメントの状況 |
| health, check, status | ストアの健全性チェック |
| products, product, catalog | 商品管理 |
| customers, customer, crm | 顧客統計 |
| analytics, revenue, stats, metrics | 分析ダッシュボード |
| setup, configure, init, token | セットアップフロー |
注文
最近の注文を取得し、売上を計算します。
TODAY=$(date -u +"%Y-%m-%dT00:00:00Z")
WEEK_AGO=$(date -u -v-7d +"%Y-%m-%dT00:00:00Z" 2>/dev/null || date -u -d "7 days ago" +"%Y-%m-%dT00:00:00Z")
MONTH_AGO=$(date -u -v-30d +"%Y-%m-%dT00:00:00Z" 2>/dev/null || date -u -d "30 days ago" +"%Y-%m-%dT00:00:00Z")
# Recent orders (last 50)
curl -s -H "$SHOPIFY_AUTH" \
"${SHOPIFY_BASE}/orders.json?status=any&limit=50&order=created_at+desc" | \
jq '{
total: .orders | length,
today: [.orders[] | select(.created_at >= "'"$TODAY"'")],
orders: [.orders[:10] | .[] | {
id: .order_number,
name: .name,
status: .financial_status,
fulfillment: .fulfillment_status,
total: .total_price,
currency: .currency,
customer: (.customer.first_name + " " + .customer.last_name),
created: .created_at
}]
}'
次のように表示します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► ECOM ► ORDERS — [store] — [timestamp]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
REVENUE
Today [N orders] $[amount]
7 days [N orders] $[amount]
30 days [N orders] $[amount]
RECENT ORDERS
#[id] [customer] $[total] [status] / [fulfillment] [age]
...
──────────────────────────────────────────────────────
Actions:
a) View order details for #[id]
b) Mark order as fulfilled
c) Export orders CSV
d) Filter by status (unfulfilled/refunded/paid)
──────────────────────────────────────────────────────
アクションの選択には AskUserQuestion を使用します。
在庫
すべての商品とバリアントの在庫を取得します。
# Get all products with variants
curl -s -H "$SHOPIFY_AUTH" \
"${SHOPIFY_BASE}/products.json?limit=250&fields=id,title,status,variants" | \
jq '[.products[] | {
id: .id,
title: .title,
status: .status,
variants: [.variants[] | {
id: .id,
title: .title,
sku: .sku,
inventory_quantity: .inventory_quantity,
inventory_policy: .inventory_policy
}]
}]'
在庫が少ない商品(inventory_quantity < 10)と在庫切れの商品(inventory_quantity <= 0)を示します。
次のように表示します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► ECOM ► INVENTORY — [store] — [timestamp]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OUT OF STOCK
[product] — [variant] — SKU: [sku]
LOW STOCK (< 10 units)
[product] — [variant] — [N] units — SKU: [sku]
ALL PRODUCTS
[product]
[variant] [N] units SKU: [sku]
...
──────────────────────────────────────────────────────
Actions:
a) Update inventory for [product]
b) Export inventory CSV
c) Set reorder alerts
──────────────────────────────────────────────────────
アクションの選択には AskUserQuestion を使用します。
フルフィルメント
未発送の注文と ShipBob の状況(トークンが利用可能な場合)を取得します。
# Unfulfilled orders
curl -s -H "$SHOPIFY_AUTH" \
"${SHOPIFY_BASE}/orders.json?fulfillment_status=unfulfilled&status=open&limit=50" | \
jq '[.orders[] | {
id: .order_number,
name: .name,
customer: (.customer.first_name + " " + .customer.last_name),
total: .total_price,
created: .created_at,
items: [.line_items[] | {title: .title, qty: .quantity}]
}]'
# Shipments with tracking (fulfilled)
curl -s -H "$SHOPIFY_AUTH" \
"${SHOPIFY_BASE}/orders.json?fulfillment_status=fulfilled&status=any&limit=20&order=updated_at+desc" | \
jq '[.orders[] | .fulfillments[] | {
order: .order_id,
tracking_number: .tracking_number,
tracking_url: .tracking_url,
shipment_status: .shipment_status,
carrier: .tracking_company,
updated: .updated_at
}]'
$SHIPBOB_TOKEN が設定されている場合は、ShipBob にも問い合わせます。
# ShipBob pending shipments
curl -s -H "Authorization: Bearer ${SHIPBOB_TOKEN}" \
"https://api.shipbob.com/1.0/shipment?Status=Processing&PageSize=20" | \
jq '[.[] | {
id: .id,
status: .status,
order_id: .reference_id,
tracking: .tracking_number,
created: .created_date
}]'
保留中/輸送中/配達済みの件数を含むフルフィルメントダッシュボードを表示します。
アクションの選択(発送済みにする、追跡情報を更新するなど)には AskUserQuestion を使用します。
健全性
健全性チェックのスクリプトを実行してから、API チェックで情報を補足します。
${CLAUDE_PLUGIN_ROOT}/bin/ops-ecom-health 2>/dev/null || echo '{"error":"health script unavailable"}'
さらに、次の項目も確認します。
# Active theme
curl -s -H "$SHOPIFY_AUTH" \
"${SHOPIFY_BASE}/themes.json" | \
jq '[.themes[] | select(.role == "main") | {id: .id, name: .name, updated: .updated_at}]'
# Store info
curl -s -H "$SHOPIFY_AUTH" \
"${SHOPIFY_BASE}/shop.json" | \
jq '.shop | {name: .name, domain: .domain, country: .country_name, plan: .plan_display_name, currency: .currency, timezone: .timezone}'
次のように表示します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► ECOM ► HEALTH — [store] — [timestamp]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STORE
Name: [name]
Plan: [plan]
Currency: [currency]
Timezone: [tz]
API CONNECTIVITY [OK / FAIL]
ACTIVE THEME [theme name]
PRODUCT COUNT [N] active
ORDERS (24h) [N] orders
ISSUES
[any warnings from health check]
──────────────────────────────────────────────────────
Actions:
a) Check theme assets for errors
b) Run full SEO audit
c) View API rate limit status
──────────────────────────────────────────────────────
アクションの選択には AskUserQuestion を使用します。
製品
製品の一覧表示、検索、管理を行います:
# All products
curl -s -H "$SHOPIFY_AUTH" \
"${SHOPIFY_BASE}/products.json?limit=250&order=updated_at+desc" | \
jq '[.products[] | {
id: .id,
title: .title,
status: .status,
handle: .handle,
price: (.variants[0].price // "N/A"),
inventory: ([.variants[].inventory_quantity] | add // 0),
variants: (.variants | length),
updated: .updated_at
}]'
$ARGUMENTS に検索語(例:products shoes)が含まれている場合は、タイトルで絞り込みます。
価格を更新する場合は、次を使用します:
# Update variant price
curl -s -X PUT -H "$SHOPIFY_AUTH" -H "Content-Type: application/json" \
"${SHOPIFY_BASE}/variants/${VARIANT_ID}.json" \
-d '{"variant":{"id":'${VARIANT_ID}',"price":"'${NEW_PRICE}'"}}'
製品を更新する前に、AskUserQuestion を使用してください。変更前と変更後の価格を表示します。
顧客
顧客統計を取得します:
# Customer count and recent
curl -s -H "$SHOPIFY_AUTH" \
"${SHOPIFY_BASE}/customers.json?limit=50&order=created_at+desc" | \
jq '{
total_shown: (.customers | length),
recent: [.customers[:10] | .[] | {
id: .id,
name: (.first_name + " " + .last_name),
email: .email,
orders: .orders_count,
total_spent: .total_spent,
currency: .currency,
created: .created_at
}]
}'
# Top customers by spend
curl -s -H "$SHOPIFY_AUTH" \
"${SHOPIFY_BASE}/customers.json?limit=10&order=total_spent+desc" | \
jq '[.customers[] | {name: (.first_name + " " + .last_name), orders: .orders_count, spent: .total_spent}]'
LTV 統計と購入額上位の顧客を含む顧客の概要を表示します。
分析
ダッシュボード用の売上データと注文データを取得します:
TODAY=$(date -u +"%Y-%m-%dT00:00:00Z")
WEEK_AGO=$(date -u -v-7d +"%Y-%m-%dT00:00:00Z" 2>/dev/null || date -u -d "7 days ago" +"%Y-%m-%dT00:00:00Z")
MONTH_AGO=$(date -u -v-30d +"%Y-%m-%dT00:00:00Z" 2>/dev/null || date -u -d "30 days ago" +"%Y-%m-%dT00:00:00Z")
# Orders for revenue calculation
curl -s -H "$SHOPIFY_AUTH" \
"${SHOPIFY_BASE}/orders.json?status=any&financial_status=paid&created_at_min=${MONTH_AGO}&limit=250" | \
jq '{
month_orders: (.orders | length),
month_revenue: ([.orders[].total_price | tonumber] | add // 0),
week_orders: ([.orders[] | select(.created_at >= "'"$WEEK_AGO"'")] | length),
week_revenue: ([.orders[] | select(.created_at >= "'"$WEEK_AGO"'") | .total_price | tonumber] | add // 0),
today_orders: ([.orders[] | select(.created_at >= "'"$TODAY"'")] | length),
today_revenue: ([.orders[] | select(.created_at >= "'"$TODAY"'") | .total_price | tonumber] | add // 0),
avg_order_value: ([.orders[].total_price | tonumber] | (add // 0) / (length // 1)),
top_products: ([.orders[].line_items[] | {title: .title, qty: .quantity}] | group_by(.title) | map({title: .[0].title, total_qty: map(.qty) | add}) | sort_by(-.total_qty)[:5])
}'
次を表示します:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► ECOM ► ANALYTICS — [store] — [timestamp]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
REVENUE
Today $[amount] ([N] orders)
7 days $[amount] ([N] orders)
30 days $[amount] ([N] orders)
AVERAGES
AOV (30d) $[amount]
TOP PRODUCTS (30d)
1. [product] [N] sold
2. [product] [N] sold
...
──────────────────────────────────────────────────────
Actions:
a) Export revenue report (CSV)
b) View by product breakdown
c) Compare to previous period
──────────────────────────────────────────────────────
アクションを選択する際は、AskUserQuestion を使用します。
セットアップ手順
ユーザーに何かを尋ねる前に、ストア URL とトークンを自動検出します。次のスキャンをすべて、1 回のバッチで実行します:
# 1. Env vars
printenv SHOPIFY_ACCESS_TOKEN SHOPIFY_ADMIN_TOKEN SHOPIFY_STORE_URL SHOPIFY_ADMIN_API_ACCESS_TOKEN 2>/dev/null
# 2. Shell profiles
grep -h 'SHOPIFY\|myshopify' ~/.zshrc ~/.bashrc ~/.zprofile ~/.envrc 2>/dev/null | grep -v '^#'
# 3. Doppler — ALL projects, not just default
for proj in $(doppler projects --json 2>/dev/null | jq -r '.[].slug'); do
doppler secrets --project "$proj" --config prd --json 2>/dev/null | \
jq -r --arg proj "$proj" 'to_entries[] | select(.key | test("SHOPIFY|STORE"; "i")) | "\(.key)=\(.value.computed) (doppler:\($proj)/prd)"'
done
# 4. Dashlane — URLs reveal store identity
dcli password shopify --output json 2>/dev/null | jq -r '.[].url // empty' | grep -oE '[a-z0-9-]+\.myshopify\.com' | sort -u
# 5. Keychain
security find-generic-password -s "shopify-admin-token" -w 2>/dev/null
security find-generic-password -s "shopify-access-token" -w 2>/dev/null
# 6. Chrome history — reveals store URLs from admin sessions
sqlite3 ~/Library/Application\ Support/Google/Chrome/Default/History \
"SELECT DISTINCT url FROM urls WHERE url LIKE '%myshopify.com/admin%' OR url LIKE '%admin.shopify.com/store/%' ORDER BY last_visit_time DESC LIMIT 10" 2>/dev/null | \
grep -oE '[a-z0-9-]+\.myshopify\.com|admin\.shopify\.com/store/[a-z0-9-]+' | sort -u
# 7. Project .env files
grep -rhE 'myshopify\.com|SHOPIFY_STORE|SHOPIFY.*TOKEN' ~/Projects/*/.env* 2>/dev/null | grep -v '^#' | head -5
# 8. Existing prefs + userConfig
jq -r '.ecom.shopify // empty' "$PREFS_PATH" 2>/dev/null
トークンの取得 — 質問する前に自動化します。 ストア URL が見つかり、トークンがない場合:
- Doppler の詳細スキャン — すべてのプロジェクト/設定(dev、staging、prd)を確認します
- Shopify CLI —
command -v shopifyが成功する場合:shopify auth login --store <store>.myshopify.comを実行します(ブラウザーで OAuth が開きます)。その後、トークンを生成します - ブラウザー自動化 — Kapture/Playwright が利用可能な場合は、
admin.shopify.com/store/<slug>/settings/apps/developmentに移動し、次のスコープを指定してアプリ作成を自動化します:read_orders,write_orders,read_products,write_products,read_customers,read_inventory,write_inventory,read_fulfillments,write_fulfillments,read_analytics - 手動での代替手段 — すべての自動化手段が失敗した場合に限ります:
No automated path for <store>.myshopify.com.
1. Go to https://admin.shopify.com/store/<slug>/settings/apps/development
2. Create an app → Configure → grant scopes → Install → copy token
Token starts with "shpat_"
複数ストア:複数のストアが検出された場合は、それぞれ個別に処理します。入力を求める前に、検出されたすべてのストアとトークンの状態を提示します。
ストアの認証情報は、userConfig(優先)→ Doppler → 環境変数の順に保存します。ShipBob は任意です。同じスキャンで SHIPBOB_ACCESS_TOKEN を確認します。
取得後、接続を確認します:
curl -s -H "X-Shopify-Access-Token: ${PROVIDED_TOKEN}" \
"https://${PROVIDED_STORE}/admin/api/2024-10/shop.json" | \
jq '.shop | {name, domain, plan: .plan_display_name}'
接続確認で有効なショップデータが返された場合は、成功を確認します。401/403 で失敗した場合は、トークンが無効であることを説明し、再度入力を求めます。
ストアの概要($ARGUMENTS が空の場合)
引数なしで呼び出された場合は、簡潔なストア概要を表示します:
注文、在庫、ヘルスチェックを並列で実行し(個別の Bash 呼び出し)、次を表示します:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► ECOM — [store] — [timestamp]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STORE [name] ([plan])
CURRENCY [currency]
TODAY $[revenue] [N] orders
7 DAYS $[revenue] [N] orders
30 DAYS $[revenue] [N] orders
INVENTORY [N] products | [N] low stock | [N] out of stock
FULFILLMENT [N] unfulfilled orders pending
──────────────────────────────────────────────────────
/ops:ops-ecom orders — order management
/ops:ops-ecom inventory — stock levels
/ops:ops-ecom products — product catalog
/ops:ops-ecom customers — customer stats
/ops:ops-ecom analytics — revenue dashboard
/ops:ops-ecom health — store health check
/ops:ops-ecom setup — configure credentials
──────────────────────────────────────────────────────