关于 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.jsontimezone— 正确显示所有时间戳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。这可以:
- 让 Agent 共享上下文,并在执行过程中相互协调
- 让你实时调整优先级
- 让 Agent 在完成任务时报告进度
团队设置(仅在启用标志时):
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")
如果未设置该标志,则使用标准的即发即弃子 Agent。
阶段 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. 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
──────────────────────────────────────────────────────