@clawpify/skills 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +73 -0
- package/clawpify/SKILL.md +134 -0
- package/clawpify/references/blogs.md +385 -0
- package/clawpify/references/bulk-operations.md +386 -0
- package/clawpify/references/collections.md +71 -0
- package/clawpify/references/customers.md +141 -0
- package/clawpify/references/discounts.md +431 -0
- package/clawpify/references/draft-orders.md +495 -0
- package/clawpify/references/files.md +355 -0
- package/clawpify/references/fulfillments.md +437 -0
- package/clawpify/references/gift-cards.md +453 -0
- package/clawpify/references/inventory.md +107 -0
- package/clawpify/references/locations.md +349 -0
- package/clawpify/references/marketing.md +352 -0
- package/clawpify/references/markets.md +346 -0
- package/clawpify/references/menus.md +313 -0
- package/clawpify/references/metafields.md +461 -0
- package/clawpify/references/orders.md +164 -0
- package/clawpify/references/pages.md +308 -0
- package/clawpify/references/products.md +277 -0
- package/clawpify/references/refunds.md +401 -0
- package/clawpify/references/segments.md +319 -0
- package/clawpify/references/shipping.md +406 -0
- package/clawpify/references/shop.md +307 -0
- package/clawpify/references/subscriptions.md +429 -0
- package/clawpify/references/translations.md +270 -0
- package/clawpify/references/webhooks.md +400 -0
- package/dist/agent.d.ts +18 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +100 -0
- package/dist/auth.d.ts +34 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +58 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +236 -0
- package/dist/shopify.d.ts +29 -0
- package/dist/shopify.d.ts.map +1 -0
- package/dist/shopify.js +41 -0
- package/dist/skills.d.ts +8 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +36 -0
- package/package.json +100 -0
- package/src/agent.ts +133 -0
- package/src/auth.ts +109 -0
- package/src/index.ts +55 -0
- package/src/mcp-server.ts +190 -0
- package/src/shopify.ts +63 -0
- package/src/skills.ts +42 -0
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
# Shopify Fulfillments
|
|
2
|
+
|
|
3
|
+
Manage order fulfillment, tracking, and fulfillment orders via the GraphQL Admin API.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Fulfillment orders represent line items to be fulfilled from specific locations. Fulfillments are the actual shipments created to fulfill those orders.
|
|
8
|
+
|
|
9
|
+
## List Fulfillment Orders
|
|
10
|
+
|
|
11
|
+
```graphql
|
|
12
|
+
query ListFulfillmentOrders($first: Int!, $query: String) {
|
|
13
|
+
fulfillmentOrders(first: $first, query: $query) {
|
|
14
|
+
nodes {
|
|
15
|
+
id
|
|
16
|
+
status
|
|
17
|
+
requestStatus
|
|
18
|
+
assignedLocation {
|
|
19
|
+
name
|
|
20
|
+
address1
|
|
21
|
+
city
|
|
22
|
+
}
|
|
23
|
+
order {
|
|
24
|
+
id
|
|
25
|
+
name
|
|
26
|
+
}
|
|
27
|
+
lineItems(first: 10) {
|
|
28
|
+
nodes {
|
|
29
|
+
id
|
|
30
|
+
totalQuantity
|
|
31
|
+
remainingQuantity
|
|
32
|
+
lineItem {
|
|
33
|
+
title
|
|
34
|
+
sku
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
Variables: `{ "first": 10 }`
|
|
43
|
+
|
|
44
|
+
## Get Fulfillment Order
|
|
45
|
+
|
|
46
|
+
```graphql
|
|
47
|
+
query GetFulfillmentOrder($id: ID!) {
|
|
48
|
+
fulfillmentOrder(id: $id) {
|
|
49
|
+
id
|
|
50
|
+
status
|
|
51
|
+
requestStatus
|
|
52
|
+
createdAt
|
|
53
|
+
updatedAt
|
|
54
|
+
assignedLocation {
|
|
55
|
+
name
|
|
56
|
+
address1
|
|
57
|
+
city
|
|
58
|
+
countryCode
|
|
59
|
+
}
|
|
60
|
+
destination {
|
|
61
|
+
firstName
|
|
62
|
+
lastName
|
|
63
|
+
address1
|
|
64
|
+
city
|
|
65
|
+
provinceCode
|
|
66
|
+
countryCode
|
|
67
|
+
}
|
|
68
|
+
order {
|
|
69
|
+
id
|
|
70
|
+
name
|
|
71
|
+
customer {
|
|
72
|
+
displayName
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
lineItems(first: 20) {
|
|
76
|
+
nodes {
|
|
77
|
+
id
|
|
78
|
+
totalQuantity
|
|
79
|
+
remainingQuantity
|
|
80
|
+
lineItem {
|
|
81
|
+
title
|
|
82
|
+
sku
|
|
83
|
+
variant {
|
|
84
|
+
id
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
fulfillments(first: 5) {
|
|
90
|
+
nodes {
|
|
91
|
+
id
|
|
92
|
+
status
|
|
93
|
+
trackingInfo {
|
|
94
|
+
number
|
|
95
|
+
url
|
|
96
|
+
company
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
Variables: `{ "id": "gid://shopify/FulfillmentOrder/123" }`
|
|
104
|
+
|
|
105
|
+
## Create Fulfillment
|
|
106
|
+
|
|
107
|
+
> REQUIRES PERMISSION: Creating a fulfillment marks items as shipped and sends shipping notification emails to customers. This affects the customer experience and order status. Always ask the user for explicit confirmation, show the items being fulfilled and tracking info, and wait for approval before executing this operation.
|
|
108
|
+
|
|
109
|
+
```graphql
|
|
110
|
+
mutation CreateFulfillment($fulfillment: FulfillmentInput!) {
|
|
111
|
+
fulfillmentCreate(fulfillment: $fulfillment) {
|
|
112
|
+
fulfillment {
|
|
113
|
+
id
|
|
114
|
+
status
|
|
115
|
+
trackingInfo {
|
|
116
|
+
number
|
|
117
|
+
url
|
|
118
|
+
company
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
userErrors {
|
|
122
|
+
field
|
|
123
|
+
message
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
Variables:
|
|
129
|
+
```json
|
|
130
|
+
{
|
|
131
|
+
"fulfillment": {
|
|
132
|
+
"lineItemsByFulfillmentOrder": [
|
|
133
|
+
{
|
|
134
|
+
"fulfillmentOrderId": "gid://shopify/FulfillmentOrder/123",
|
|
135
|
+
"fulfillmentOrderLineItems": [
|
|
136
|
+
{
|
|
137
|
+
"id": "gid://shopify/FulfillmentOrderLineItem/456",
|
|
138
|
+
"quantity": 2
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
],
|
|
143
|
+
"trackingInfo": {
|
|
144
|
+
"number": "1Z999AA10123456784",
|
|
145
|
+
"url": "https://www.ups.com/track?tracknum=1Z999AA10123456784",
|
|
146
|
+
"company": "UPS"
|
|
147
|
+
},
|
|
148
|
+
"notifyCustomer": true
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Create Fulfillment (Full Order)
|
|
154
|
+
|
|
155
|
+
```graphql
|
|
156
|
+
mutation CreateFullFulfillment($fulfillment: FulfillmentInput!) {
|
|
157
|
+
fulfillmentCreate(fulfillment: $fulfillment) {
|
|
158
|
+
fulfillment {
|
|
159
|
+
id
|
|
160
|
+
status
|
|
161
|
+
}
|
|
162
|
+
userErrors {
|
|
163
|
+
field
|
|
164
|
+
message
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
Variables:
|
|
170
|
+
```json
|
|
171
|
+
{
|
|
172
|
+
"fulfillment": {
|
|
173
|
+
"lineItemsByFulfillmentOrder": [
|
|
174
|
+
{
|
|
175
|
+
"fulfillmentOrderId": "gid://shopify/FulfillmentOrder/123"
|
|
176
|
+
}
|
|
177
|
+
],
|
|
178
|
+
"trackingInfo": {
|
|
179
|
+
"number": "9400111899223033335301",
|
|
180
|
+
"company": "USPS"
|
|
181
|
+
},
|
|
182
|
+
"notifyCustomer": true
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Cancel Fulfillment
|
|
188
|
+
|
|
189
|
+
> REQUIRES PERMISSION: Cancelling a fulfillment reverses the shipment status and may confuse customers who already received shipping notifications. Always ask the user for explicit confirmation before executing this operation.
|
|
190
|
+
|
|
191
|
+
```graphql
|
|
192
|
+
mutation CancelFulfillment($id: ID!) {
|
|
193
|
+
fulfillmentCancel(id: $id) {
|
|
194
|
+
fulfillment {
|
|
195
|
+
id
|
|
196
|
+
status
|
|
197
|
+
}
|
|
198
|
+
userErrors {
|
|
199
|
+
field
|
|
200
|
+
message
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Add Tracking Information
|
|
207
|
+
|
|
208
|
+
```graphql
|
|
209
|
+
mutation CreateFulfillmentEvent($fulfillmentEvent: FulfillmentEventInput!) {
|
|
210
|
+
fulfillmentEventCreate(fulfillmentEvent: $fulfillmentEvent) {
|
|
211
|
+
fulfillmentEvent {
|
|
212
|
+
id
|
|
213
|
+
status
|
|
214
|
+
happenedAt
|
|
215
|
+
}
|
|
216
|
+
userErrors {
|
|
217
|
+
field
|
|
218
|
+
message
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
Variables:
|
|
224
|
+
```json
|
|
225
|
+
{
|
|
226
|
+
"fulfillmentEvent": {
|
|
227
|
+
"fulfillmentId": "gid://shopify/Fulfillment/123",
|
|
228
|
+
"status": "IN_TRANSIT",
|
|
229
|
+
"happenedAt": "2025-01-15T14:30:00Z"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Hold Fulfillment Order
|
|
235
|
+
|
|
236
|
+
> REQUIRES PERMISSION: Holding a fulfillment order pauses order processing and may delay shipments to customers. Always ask the user for explicit confirmation, show the reason for the hold, and wait for approval before executing this operation.
|
|
237
|
+
|
|
238
|
+
```graphql
|
|
239
|
+
mutation HoldFulfillmentOrder($id: ID!, $fulfillmentHold: FulfillmentOrderHoldInput!) {
|
|
240
|
+
fulfillmentOrderHold(id: $id, fulfillmentHold: $fulfillmentHold) {
|
|
241
|
+
fulfillmentOrder {
|
|
242
|
+
id
|
|
243
|
+
status
|
|
244
|
+
}
|
|
245
|
+
userErrors {
|
|
246
|
+
field
|
|
247
|
+
message
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
Variables:
|
|
253
|
+
```json
|
|
254
|
+
{
|
|
255
|
+
"id": "gid://shopify/FulfillmentOrder/123",
|
|
256
|
+
"fulfillmentHold": {
|
|
257
|
+
"reason": "INVENTORY_OUT_OF_STOCK",
|
|
258
|
+
"reasonNotes": "Waiting for restock shipment"
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Release Hold
|
|
264
|
+
|
|
265
|
+
```graphql
|
|
266
|
+
mutation ReleaseFulfillmentOrderHold($id: ID!) {
|
|
267
|
+
fulfillmentOrderReleaseHold(id: $id) {
|
|
268
|
+
fulfillmentOrder {
|
|
269
|
+
id
|
|
270
|
+
status
|
|
271
|
+
}
|
|
272
|
+
userErrors {
|
|
273
|
+
field
|
|
274
|
+
message
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Move Fulfillment Order to Different Location
|
|
281
|
+
|
|
282
|
+
```graphql
|
|
283
|
+
mutation MoveFulfillmentOrder($id: ID!, $newLocationId: ID!) {
|
|
284
|
+
fulfillmentOrderMove(id: $id, newLocationId: $newLocationId) {
|
|
285
|
+
movedFulfillmentOrder {
|
|
286
|
+
id
|
|
287
|
+
assignedLocation {
|
|
288
|
+
name
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
userErrors {
|
|
292
|
+
field
|
|
293
|
+
message
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
## Cancel Fulfillment Order
|
|
300
|
+
|
|
301
|
+
> REQUIRES PERMISSION: Cancelling a fulfillment order stops the order from being fulfilled and affects the entire fulfillment workflow. Always ask the user for explicit confirmation before executing this operation.
|
|
302
|
+
|
|
303
|
+
```graphql
|
|
304
|
+
mutation CancelFulfillmentOrder($id: ID!) {
|
|
305
|
+
fulfillmentOrderCancel(id: $id) {
|
|
306
|
+
fulfillmentOrder {
|
|
307
|
+
id
|
|
308
|
+
status
|
|
309
|
+
}
|
|
310
|
+
userErrors {
|
|
311
|
+
field
|
|
312
|
+
message
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## Split Fulfillment Order
|
|
319
|
+
|
|
320
|
+
```graphql
|
|
321
|
+
mutation SplitFulfillmentOrder($fulfillmentOrderSplits: [FulfillmentOrderSplitInput!]!) {
|
|
322
|
+
fulfillmentOrderSplit(fulfillmentOrderSplits: $fulfillmentOrderSplits) {
|
|
323
|
+
fulfillmentOrderSplits {
|
|
324
|
+
fulfillmentOrder {
|
|
325
|
+
id
|
|
326
|
+
}
|
|
327
|
+
remainingFulfillmentOrder {
|
|
328
|
+
id
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
userErrors {
|
|
332
|
+
field
|
|
333
|
+
message
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
Variables:
|
|
339
|
+
```json
|
|
340
|
+
{
|
|
341
|
+
"fulfillmentOrderSplits": [
|
|
342
|
+
{
|
|
343
|
+
"fulfillmentOrderId": "gid://shopify/FulfillmentOrder/123",
|
|
344
|
+
"fulfillmentOrderLineItems": [
|
|
345
|
+
{
|
|
346
|
+
"id": "gid://shopify/FulfillmentOrderLineItem/456",
|
|
347
|
+
"quantity": 1
|
|
348
|
+
}
|
|
349
|
+
]
|
|
350
|
+
}
|
|
351
|
+
]
|
|
352
|
+
}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
## Fulfillment Order Status
|
|
356
|
+
|
|
357
|
+
| Status | Description |
|
|
358
|
+
|--------|-------------|
|
|
359
|
+
| `OPEN` | Ready to fulfill |
|
|
360
|
+
| `IN_PROGRESS` | Being fulfilled |
|
|
361
|
+
| `CANCELLED` | Cancelled |
|
|
362
|
+
| `INCOMPLETE` | Partially fulfilled, remaining cancelled |
|
|
363
|
+
| `CLOSED` | Fully fulfilled |
|
|
364
|
+
| `SCHEDULED` | Scheduled for future date |
|
|
365
|
+
| `ON_HOLD` | On hold |
|
|
366
|
+
|
|
367
|
+
## Fulfillment Event Status
|
|
368
|
+
|
|
369
|
+
| Status | Description |
|
|
370
|
+
|--------|-------------|
|
|
371
|
+
| `CONFIRMED` | Shipment confirmed |
|
|
372
|
+
| `IN_TRANSIT` | Package in transit |
|
|
373
|
+
| `OUT_FOR_DELIVERY` | Out for delivery |
|
|
374
|
+
| `DELIVERED` | Delivered |
|
|
375
|
+
| `FAILURE` | Delivery failed |
|
|
376
|
+
| `ATTEMPTED_DELIVERY` | Delivery attempted |
|
|
377
|
+
|
|
378
|
+
## Hold Reasons
|
|
379
|
+
|
|
380
|
+
| Reason | Description |
|
|
381
|
+
|--------|-------------|
|
|
382
|
+
| `AWAITING_PAYMENT` | Waiting for payment |
|
|
383
|
+
| `HIGH_RISK_OF_FRAUD` | Fraud risk detected |
|
|
384
|
+
| `INCORRECT_ADDRESS` | Address needs verification |
|
|
385
|
+
| `INVENTORY_OUT_OF_STOCK` | Item out of stock |
|
|
386
|
+
| `OTHER` | Custom reason |
|
|
387
|
+
|
|
388
|
+
## Assigned Fulfillment Orders
|
|
389
|
+
|
|
390
|
+
For fulfillment service apps:
|
|
391
|
+
|
|
392
|
+
```graphql
|
|
393
|
+
query AssignedFulfillmentOrders($first: Int!) {
|
|
394
|
+
assignedFulfillmentOrders(first: $first, assignmentStatus: FULFILLMENT_REQUESTED) {
|
|
395
|
+
nodes {
|
|
396
|
+
id
|
|
397
|
+
status
|
|
398
|
+
requestStatus
|
|
399
|
+
order {
|
|
400
|
+
name
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
## API Scopes Required
|
|
408
|
+
|
|
409
|
+
- `read_orders` - Read fulfillment orders
|
|
410
|
+
- `write_orders` - Create fulfillments
|
|
411
|
+
- `read_assigned_fulfillment_orders` - For fulfillment service apps
|
|
412
|
+
- `write_assigned_fulfillment_orders` - For fulfillment service apps
|
|
413
|
+
|
|
414
|
+
## Notes
|
|
415
|
+
|
|
416
|
+
- Fulfillment orders are created automatically when orders are placed
|
|
417
|
+
- Multiple fulfillments can be created for one fulfillment order
|
|
418
|
+
- Use `notifyCustomer: true` to send shipping confirmation emails
|
|
419
|
+
- Tracking companies: UPS, USPS, FedEx, DHL, etc.
|
|
420
|
+
- Fulfillment orders can be moved between locations
|
|
421
|
+
|
|
422
|
+
## Dangerous Operations in This Skill
|
|
423
|
+
|
|
424
|
+
The following operations require explicit user permission before execution:
|
|
425
|
+
|
|
426
|
+
| Operation | Impact | Reversible |
|
|
427
|
+
|-----------|--------|------------|
|
|
428
|
+
| `fulfillmentCreate` | Marks items as shipped, sends customer notifications | Partial (can cancel) |
|
|
429
|
+
| `fulfillmentCancel` | Reverses shipment status, may confuse customers | Partial (can create new) |
|
|
430
|
+
| `fulfillmentOrderHold` | Pauses order processing, delays shipments | Yes (can release) |
|
|
431
|
+
| `fulfillmentOrderReleaseHold` | Resumes order processing | N/A |
|
|
432
|
+
| `fulfillmentOrderCancel` | Stops fulfillment workflow completely | No - Status change is permanent |
|
|
433
|
+
|
|
434
|
+
Permission Protocol:
|
|
435
|
+
- For fulfillment creation: Show order ID, items, quantities, tracking info, and whether customer will be notified
|
|
436
|
+
- For cancellations/holds: Show fulfillment/order ID, current status, and impact on customer experience
|
|
437
|
+
- Wait for explicit "yes", "confirm", or "proceed"
|