From saleor-commerce
Works with Saleor GraphQL API: queries, mutations, subscriptions, cursor pagination, filters, JWT auth, errors, Playground, code gen. Use for Saleor e-commerce integrations.
npx claudepluginhub orcaqubits/agentic-commerce-skills-plugins --plugin saleor-commerceThis skill is limited to using the following tools:
**Fetch live docs**:
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Guides MCP server integration in Claude Code plugins via .mcp.json or plugin.json configs for stdio, SSE, HTTP types, enabling external services as tools.
Fetch live docs:
https://docs.saleor.io/docs/developer/api-reference for API reference overviewsite:docs.saleor.io GraphQL queries mutations examples for query patternssite:docs.saleor.io cursor pagination first after for pagination referencesite:docs.saleor.io authentication JWT token for auth token handlingsite:docs.saleor.io GraphQL error handling for mutation error patternshttps://docs.saleor.io/docs/developer/api-conventions for API conventionsSaleor exposes its entire functionality through a single GraphQL endpoint. There is no REST API -- all interactions (storefront, dashboard, apps, integrations) use GraphQL exclusively.
| Aspect | Detail |
|---|---|
| Endpoint | /graphql/ |
| Protocol | HTTP POST with JSON body |
| Introspection | Enabled by default (disable in production if needed) |
| Playground | Available at the API URL in browser |
| Schema | Single unified schema for all consumers |
| Method | Use Case | Header |
|---|---|---|
| JWT (Staff) | Dashboard operations, admin mutations | Authorization: Bearer <token> |
| JWT (Customer) | Storefront customer actions | Authorization: Bearer <token> |
| App Token | App-to-Saleor API calls | Authorization: Bearer <app-token> |
| No Auth | Public storefront queries (products, collections) | None required |
| Operation | Mutation |
|---|---|
| Staff login | tokenCreate(email, password) |
| Customer login | tokenCreate(email, password) |
| Refresh token | tokenRefresh(refreshToken) |
| Verify token | tokenVerify(token) |
Tokens are short-lived JWTs. Always use tokenRefresh to obtain new access tokens rather than re-authenticating.
| Query | Purpose |
|---|---|
products(first, after, filter, channel) | List products with pagination |
product(id, slug, channel) | Single product by ID or slug |
categories(first, after, filter) | List categories |
collections(first, after, filter, channel) | List collections |
| Query | Purpose |
|---|---|
orders(first, after, filter) | List orders (staff) |
order(id) | Single order detail |
me { orders } | Customer's own orders |
draftOrders(first, after) | List draft orders (staff) |
Most storefront queries require a channel argument to scope results:
query Products($channel: String!) {
products(first: 10, channel: $channel) {
edges { node { id name pricing { ... } } }
}
}
Queries without a channel argument return data across all channels (staff only).
Saleor uses Relay-style cursor pagination throughout its API:
| Parameter | Type | Purpose |
|---|---|---|
first | Int | Number of items from the start |
after | String | Cursor to paginate forward |
last | Int | Number of items from the end |
before | String | Cursor to paginate backward |
| Field | Purpose |
|---|---|
edges[].node | The actual data object |
edges[].cursor | Opaque cursor for this edge |
pageInfo.hasNextPage | Whether more items exist forward |
pageInfo.hasPreviousPage | Whether more items exist backward |
pageInfo.startCursor | Cursor of the first edge |
pageInfo.endCursor | Cursor of the last edge |
totalCount | Total number of matching items |
Saleor provides typed filter input objects for each queryable resource:
| Filter Input | Key Fields |
|---|---|
ProductFilterInput | search, price, categories, collections, productTypes, isPublished |
OrderFilterInput | created, status, customer, paymentStatus |
CustomerFilterInput | search, dateJoined, numberOfOrders |
Filters are passed as the filter argument on list queries.
Saleor mutations return the result alongside an errors array in the response:
| Field | Purpose |
|---|---|
<entity> | The created/updated object on success |
errors | Array of { field, message, code } on failure |
| Code | Meaning |
|---|---|
REQUIRED | A required field is missing |
INVALID | Field value is invalid |
NOT_FOUND | Referenced object does not exist |
UNIQUE | Value violates a uniqueness constraint |
GRAPHQL_ERROR | General GraphQL execution error |
Always check the errors array -- a mutation may return HTTP 200 with validation errors in the response body.
Saleor supports GraphQL subscriptions for real-time webhook payloads:
| Aspect | Detail |
|---|---|
| Transport | Webhook POST (not WebSocket) |
| Definition | Subscription query defines the payload shape |
| Registration | Via App manifest or webhookCreate mutation |
| Use Case | Custom webhook payloads with only the fields you need |
Subscription queries are attached to webhook configurations to define exactly which fields are delivered in the payload.
The built-in Playground is available at the API endpoint URL in a browser:
| Feature | Detail |
|---|---|
| Schema explorer | Browse all types, queries, mutations |
| Query editor | Write and execute queries with autocomplete |
| Auth header | Add Authorization: Bearer <token> in HTTP Headers panel |
| History | Previously executed queries are saved |
| Docs panel | Inline documentation for all fields |
| Tool | Purpose |
|---|---|
graphql-codegen | Generate TypeScript types from Saleor schema |
@graphql-codegen/typed-document-node | Typed document nodes for queries |
@graphql-codegen/introspection | Generate introspection JSON |
# codegen.yml — Fetch live docs for current config shape
schema: "https://your-saleor-instance.com/graphql/"
documents: "src/**/*.graphql"
generates:
src/generated/graphql.ts:
plugins:
- typescript
- typescript-operations
channel argumentfirst/after) -- never request unbounded listserrors array on every mutation response, even on HTTP 200tokenRefresh to renew JWTs instead of storing long-lived tokensFetch the Saleor GraphQL API documentation for exact query signatures, filter input types, and mutation patterns before implementing.