
Shopify Customer
Work with Shopify Customer Admin API flows and dev-doc lookup while building storefront or app automations.
Overview
shopify-customer is an agent skill most often used in Build (also Grow) that connects Shopify customer Admin API work and dev documentation search through the shopify-ai-toolkit Node scripts.
Install
npx skills add https://github.com/shopify/shopify-ai-toolkit --skill shopify-customerWhat is this skill?
- Bundled Node entrypoint with Shopify dev base URL resolution (production and optional staging via env)
- Documents multiple Admin API version labels including unstable through dated release strings
- Staging path requires MINERVA_TOKEN when SHOPIFY_DEV_STAGING_SERVER_NUMBER is set
- Includes search_docs-style helpers for shopify.dev documentation discovery
- parseArgs-based CLI patterns suitable for agent-driven invocations
- 6 supported API version strings listed in bundle constant (unstable plus five dated labels)
Adoption & trust: 4.9k installs on skills.sh; 373 GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You are building a Shopify app or agent workflow and need customer API context, correct dev hosts, and doc lookup without copying boilerplate from scratch.
Who is it for?
Indie Shopify app developers and solo merchants automating customer records, segments, or support flows via Codex, Cursor, or Claude Code.
Skip if: Builders who only need theme Liquid edits or checkout UI with no Admin API customer access.
When should I use this skill?
You are implementing or debugging Shopify customer Admin API access and need the ai-toolkit’s host resolution, staging env rules, or doc search helpers.
What do I get? / Deliverables
You run toolkit scripts with resolved Shopify dev URLs and version awareness so customer integrations and doc-backed prompts stay aligned with Shopify’s supported API labels.
- Resolved Shopify dev or staging base URL for requests
- Doc search or customer API helper output for agent consumption
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Canonical shelf is build/integrations because the skill ships as executable toolkit code oriented at wiring Shopify customer operations into apps and agents. Integrations matches Admin API customer surfaces, versioned API bases, and companion doc-search utilities rather than one-off marketing copy.
Where it fits
Point your agent at the toolkit script to resolve the correct shopify.dev base URL before generating a customer GraphQL or REST call.
Prototype a post-purchase email or segment update that depends on normalized customer IDs from Admin API responses.
Cross-check supported API version strings in the bundle before tagging a release that depends on a dated Shopify API label.
How it compares
Skill package for Shopify Admin customer integration—not a hosted MCP server and not a generic REST client generator.
Common Questions / FAQ
Who is shopify-customer for?
Solo builders and small teams shipping Shopify apps or internal tools that read or manage customer data through Admin APIs and shopify.dev references.
When should I use shopify-customer?
During build/integrations while wiring customer endpoints and env-specific dev URLs, and during grow/support when extending lifecycle automations tied to customer records.
Is shopify-customer safe to install?
Treat Admin API access as high privilege; review the Security Audits panel on this page and never commit shop tokens or MINERVA_TOKEN into repos.
SKILL.md
READMESKILL.md - Shopify Customer
#!/usr/bin/env node // <define:__SUPPORTED_VERSIONS__> var define_SUPPORTED_VERSIONS_default = ["unstable", "2026-07", "2026-04", "2026-01", "2025-10", "2025-07"]; // src/agent-skills/scripts/search_docs.ts import { parseArgs } from "util"; // src/http/index.ts var PROD_BASE_URL = "https://shopify.dev/"; var SHOP_DEV_BASE_URL = "https://shopify-dev.shop.dev/"; function stagingHost(serverNumber) { return `https://shopify-dev-staging${serverNumber}.shopifycloud.com/`; } function resolveShopifyDevBaseUrl(options) { const env = options?.env ?? process.env; const stagingRaw = env.SHOPIFY_DEV_STAGING_SERVER_NUMBER?.trim(); if (stagingRaw) { if (!/^\d+$/.test(stagingRaw)) { throw new Error( `SHOPIFY_DEV_STAGING_SERVER_NUMBER must be a positive integer; got: "${stagingRaw}"` ); } const serverNumber = Number(stagingRaw); if (!Number.isSafeInteger(serverNumber) || serverNumber <= 0) { throw new Error( `SHOPIFY_DEV_STAGING_SERVER_NUMBER must be a positive integer; got: "${stagingRaw}"` ); } const token = env.MINERVA_TOKEN; if (!token) { const audience = stagingHost(serverNumber).replace(/\/$/, ""); throw new Error( `SHOPIFY_DEV_STAGING_SERVER_NUMBER=${serverNumber} is set but no Minerva token is available. Staging servers are behind Minerva. Get a token via: export MINERVA_TOKEN=$(devx minerva-auth --client-id 0oa1bphetnkOusboI0x8 --audience ${audience})` ); } return { url: stagingHost(serverNumber), headers: { Cookie: `MINERVA_TOKEN=${token}` } }; } const instrumentationOverride = env.SHOPIFY_DEV_INSTRUMENTATION_URL?.trim(); if (instrumentationOverride && options?.uri?.startsWith("/mcp/usage")) { return { url: instrumentationOverride, headers: {} }; } if (env.DEV && env.DEV !== "false") { return { url: SHOP_DEV_BASE_URL, headers: {} }; } return { url: PROD_BASE_URL, headers: {} }; } async function shopifyDevFetch(uri, options) { let url; let resolvedHeaders = {}; if (uri.startsWith("http://") || uri.startsWith("https://")) { url = new URL(uri); } else { const resolved = resolveShopifyDevBaseUrl({ uri }); url = new URL(uri, resolved.url); resolvedHeaders = resolved.headers; } if (options?.parameters) { Object.entries(options.parameters).forEach(([key, value]) => { url.searchParams.append(key, value); }); } const response = await fetch(url.toString(), { method: options?.method || "GET", headers: { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "mcp", "X-Shopify-MCP-Version": options?.instrumentation?.packageVersion || "", "X-Shopify-Timestamp": options?.instrumentation?.timestamp || "", ...resolvedHeaders, ...options?.headers }, ...options?.body && { body: options.body } }); if (!response.ok) { let errorBody; try { errorBody = await response.text(); } catch { } throw new Error( errorBody ? `HTTP ${response.status}: ${errorBody}` : `HTTP error! status: ${response.status}` ); } return await response.text(); } // src/data/supported-versions-schema.json var supported_versions_schema_default = { admin: [ { name: "unstable" }, { name: "2026-07", releaseCandidate: true }, { name: "2026-04", latestVersion: true }, { name: "2026-01" }, { name: "2025-10" }, { name: "2025-07" } ], "storefront-graphql": [ { name: "unstable" }, { name: "2026-07", releaseCandidate: true }, { name: "2026-04", latestVersion: true }, { name: "2026-01" }, { name: "2025-10" }, { name: "2025-07" } ], partner: [ { name: "unstable" }, { name: "2026-07", releaseCandidate: true }, { name: "2026-04", lates