{
  "server": "shopify",
  "url": "https://setup.shopify.com/mcp",
  "date": "2026-10-03",
  "protocolVersion": "2025-11-25",
  "serverInfo": {
    "name": "shopify-mcp-server",
    "version": "1.0.0",
    "icons": [
      {
        "src": "https://setup.shopify.com/icons/shopify.png?v=f9f77672bd2b",
        "mimeType": "image/png",
        "sizes": [
          "192x192"
        ]
      },
      {
        "src": "https://setup.shopify.com/icons/shopify.svg?v=bcb5b56d2f50",
        "mimeType": "image/svg+xml",
        "sizes": [
          "any"
        ]
      }
    ]
  },
  "listChangedDeclared": true,
  "toolCount": 30,
  "outputSchemaCoveragePct": 70,
  "tools": [
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Add one or more products to a collection in the connected Shopify store. Use this when the user wants to organize products into a collection.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "collectionId": {
            "description": "The collection GID (e.g. gid://shopify/Collection/123). Always use the full GID format, not a bare numeric ID.",
            "type": "string"
          },
          "productIds": {
            "description": "The product GIDs to add to the collection (e.g. gid://shopify/Product/123). Always use the full GID format, not bare numeric IDs.",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "collectionId",
          "productIds"
        ],
        "type": "object"
      },
      "name": "add-to-collection",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "collectionId": {
            "type": "string"
          },
          "collectionTitle": {
            "type": "string"
          },
          "currencyCode": {
            "type": "string"
          },
          "products": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "currencyCode": {
                  "type": "string"
                },
                "imageUrl": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "price": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "variantTitle": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title",
                "variantTitle",
                "imageUrl",
                "price",
                "currencyCode",
                "status"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "productsAdded": {
            "type": "number"
          },
          "totalProducts": {
            "type": "number"
          }
        },
        "required": [
          "collectionId",
          "collectionTitle",
          "productsAdded",
          "totalProducts",
          "products",
          "currencyCode"
        ],
        "type": "object"
      },
      "title": "Add to Collection"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Update the status of multiple products at once. Accepts a list of product IDs or a collectionId and a target status (ACTIVE, DRAFT, or ARCHIVED). Each product is updated individually so partial failures are possible. When using collectionId, only the first 50 products in the collection will be updated.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "collectionId": {
            "description": "GID of a collection whose products should be updated (e.g. gid://shopify/Collection/123). When used, only the first 50 products in the collection will be updated.",
            "type": "string"
          },
          "productIds": {
            "description": "List of product GIDs to update. At least one of productIds or collectionId must be provided.",
            "items": {
              "type": "string"
            },
            "maxItems": 50,
            "type": "array"
          },
          "status": {
            "description": "Target status for all products",
            "enum": [
              "ACTIVE",
              "DRAFT",
              "ARCHIVED"
            ],
            "type": "string"
          }
        },
        "required": [
          "status"
        ],
        "type": "object"
      },
      "name": "bulk-update-product-status",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "failed": {
            "type": "number"
          },
          "results": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "error": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "id": {
                  "type": "string"
                },
                "imageUrl": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "success": {
                  "type": "boolean"
                },
                "title": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "id",
                "title",
                "imageUrl",
                "success",
                "error"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "succeeded": {
            "type": "number"
          },
          "targetStatus": {
            "type": "string"
          },
          "totalRequested": {
            "type": "number"
          }
        },
        "required": [
          "targetStatus",
          "totalRequested",
          "succeeded",
          "failed",
          "results"
        ],
        "type": "object"
      },
      "title": "Bulk Update Product Status"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          }
        ],
        "ui": {
          "visibility": [
            "app"
          ]
        }
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Signal that the user clicked a storefront preview's signup link. Revokes the current shop token (if any) so the next tool call prompts a fresh OAuth for the newly claimed store. Called only by the get-new-store-previews tool's widget — never invoke directly from the model.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "previewUUID": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "previewUUID"
        ],
        "type": "object"
      },
      "name": "claim-storefront-preview"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products",
              "write_publications"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Create a new collection in the connected Shopify store and publish it to the Online Store.\nUse this when the user wants to organize products into a new group.\n\nCOLLECTION TYPES:\n- Manual collection: pass `productIds` to add specific products.\n- Smart collection: pass `ruleSet` with conditions to auto-populate products.\n- `productIds` and `ruleSet` are mutually exclusive — provide one or neither.\n\nSMART COLLECTION RULES:\n- Common rule columns: TAG, VENDOR, TYPE, TITLE, VARIANT_PRICE.\n- Common relations: EQUALS, NOT_EQUALS, CONTAINS, NOT_CONTAINS, STARTS_WITH, ENDS_WITH, GREATER_THAN, LESS_THAN.\n- `appliedDisjunctively: true` means products matching ANY rule are included (OR logic).\n- `appliedDisjunctively: false` means products must match ALL rules (AND logic).\n\nIMAGE REQUIREMENTS:\n- Images must be publicly accessible HTTPS URLs (e.g. https://example.com/photo.jpg).\n- Local file paths (e.g. /mnt/data/..., file://...) are NOT supported and will fail.\n- If you only have a local file or a generated image, ask the user for a publicly accessible HTTPS URL; this host cannot upload one.\n- Avoid placeholder or non-deterministic image URLs (e.g. picsum.photos) for real collections.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "descriptionHtml": {
            "description": "HTML description of the collection",
            "type": "string"
          },
          "image": {
            "description": "Collection image. Must be a publicly accessible HTTPS URL.",
            "properties": {
              "altText": {
                "description": "Image alt text",
                "type": "string"
              },
              "url": {
                "description": "Publicly accessible HTTPS image URL for the collection",
                "type": "string"
              }
            },
            "required": [
              "url"
            ],
            "type": "object"
          },
          "productIds": {
            "description": "Product GIDs to add to a manual collection (e.g. gid://shopify/Product/123). Mutually exclusive with ruleSet.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "ruleSet": {
            "description": "Rules for a smart collection. Mutually exclusive with productIds.",
            "properties": {
              "appliedDisjunctively": {
                "description": "true = products match ANY rule (OR), false = products match ALL rules (AND)",
                "type": "boolean"
              },
              "rules": {
                "items": {
                  "properties": {
                    "column": {
                      "description": "Rule column: TAG, VENDOR, TYPE, TITLE, VARIANT_PRICE, etc.",
                      "type": "string"
                    },
                    "condition": {
                      "description": "The value to match against (e.g. \"sale\", \"Nike\", \"50\")",
                      "type": "string"
                    },
                    "relation": {
                      "description": "Rule relation: EQUALS, NOT_EQUALS, CONTAINS, NOT_CONTAINS, STARTS_WITH, ENDS_WITH, GREATER_THAN, LESS_THAN",
                      "type": "string"
                    }
                  },
                  "required": [
                    "column",
                    "relation",
                    "condition"
                  ],
                  "type": "object"
                },
                "type": "array"
              }
            },
            "required": [
              "appliedDisjunctively",
              "rules"
            ],
            "type": "object"
          },
          "sortOrder": {
            "description": "The order in which products are sorted in the collection",
            "enum": [
              "ALPHA_ASC",
              "ALPHA_DESC",
              "BEST_SELLING",
              "CREATED",
              "CREATED_DESC",
              "MANUAL",
              "PRICE_ASC",
              "PRICE_DESC"
            ],
            "type": "string"
          },
          "title": {
            "description": "The collection title",
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "name": "create-collection",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "collectionType": {
            "enum": [
              "manual",
              "smart"
            ],
            "type": "string"
          },
          "currencyCode": {
            "type": "string"
          },
          "descriptionHtml": {
            "type": "string"
          },
          "handle": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "imageAltText": {
            "type": [
              "string",
              "null"
            ]
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "products": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "currencyCode": {
                  "type": "string"
                },
                "imageUrl": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "price": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "variantTitle": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title",
                "variantTitle",
                "imageUrl",
                "price",
                "currencyCode",
                "status"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "productsCount": {
            "type": "number"
          },
          "rules": {
            "anyOf": [
              {
                "additionalProperties": false,
                "properties": {
                  "appliedDisjunctively": {
                    "type": "boolean"
                  },
                  "rules": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "column": {
                          "type": "string"
                        },
                        "condition": {
                          "type": "string"
                        },
                        "relation": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "column",
                        "relation",
                        "condition"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "appliedDisjunctively",
                  "rules"
                ],
                "type": "object"
              },
              {
                "type": "null"
              }
            ]
          },
          "sortOrder": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "updatedAt": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "handle",
          "descriptionHtml",
          "imageUrl",
          "imageAltText",
          "sortOrder",
          "collectionType",
          "productsCount",
          "products",
          "rules",
          "updatedAt",
          "currencyCode"
        ],
        "type": "object"
      },
      "title": "Create Collection"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_discounts",
              "write_products",
              "write_customers"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Create a percentage-based discount code for the connected Shopify store. Use this when the merchant wants to set up a new discount code with a specific percentage off — including one limited to particular products or to a collection — with optional minimum purchase or quantity requirements.\n\nSCOPE — what the discount applies to:\n- Call both search_products and search_collections on whatever the merchant named, even if the first one already matches — a product and a collection can share a name. If both match, ask the merchant which they meant rather than picking one.\n- Specific products (\"20% off the Snake Plant\", \"put these three items on sale\"): pass productIds with their product GIDs, up to 50 of them. Look the GIDs up with search_products or get-product first.\n- An existing collection (\"20% off everything in Summer Sale\"), or any set larger than 50 products: pass collectionId.\n- Every product in the store: omit both.\n- productIds and collectionId are mutually exclusive. Passing both is rejected before anything is created.\n\nDo NOT create a collection just to scope a discount to products. This tool discounts products directly in one call, so a collection made only as a stepping stone leaves the merchant with one they never asked for. This is not a restriction on create-collection itself: if the merchant asked for a collection, create it and then scope the discount to it with collectionId. What matters is why the collection exists — one the merchant wants is fine, one invented to work around productIds is not.\n\nTwo things must be confirmed with the merchant before this tool will create anything: when the discount starts, and who can use it. Both are ordinary parameters on this tool. If either is missing, the tool answers with a plain-language question to put to the merchant. Ask the merchant, then call create-discount again with the answer filled in.\n\nStart date: pass startsAt as an ISO 8601 timestamp. For a discount the merchant wants active right away, pass the current date and time; for a scheduled one, pass the date they chose. Omit it only if they have not said yet.\n\nCustomer eligibility: pass customerEligibility=\"all_customers\" once the merchant has confirmed it should be available to everyone, or pass customerSegments with the names of merchant-defined customer segments. If neither field is set, the tool returns a clarification prompt that lists the segments defined on this store — pick one of those names or \"all_customers\" based on what the merchant wants.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "code": {
            "description": "The discount code customers will enter",
            "type": "string"
          },
          "collectionId": {
            "description": "Scope the discount to every product in a collection the merchant already has (e.g. gid://shopify/Collection/123). If the merchant named individual products instead, pass productIds — do not create a collection to hold them if the merchant did not ask for a collection to be created. Mutually exclusive with productIds. Omit both to discount every product in the store.",
            "type": "string"
          },
          "customerEligibility": {
            "description": "Set to \"all_customers\" once the merchant has explicitly confirmed they want this discount available to every customer. Omit if the merchant has not specified an audience — the tool will return a clarification prompt instead of silently picking one. Mutually exclusive with customerSegments.",
            "enum": [
              "all_customers"
            ],
            "type": "string"
          },
          "customerSegments": {
            "description": "Customer segment names to scope the discount to (e.g. [\"VIP Customers\"]). Names must match (case-insensitive) segments that already exist on the connected store. Segments are merchant-defined — there are no built-in names like \"new_customers\" or \"returning_customers\". If you do not know what segments exist, omit both this field and customerEligibility and the tool will return a clarification prompt listing them. Mutually exclusive with customerEligibility.",
            "items": {
              "type": "string"
            },
            "maxItems": 25,
            "minItems": 1,
            "type": "array"
          },
          "endsAt": {
            "description": "ISO 8601 end date (defaults to no end date)",
            "type": "string"
          },
          "minimumPurchaseAmount": {
            "description": "Minimum order subtotal required to use the discount (must be greater than 0). Mutually exclusive with minimumQuantity.",
            "exclusiveMinimum": 0,
            "type": "number"
          },
          "minimumQuantity": {
            "description": "Minimum number of items required to use the discount. Mutually exclusive with minimumPurchaseAmount.",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "percentage": {
            "description": "The discount percentage (1-100)",
            "maximum": 100,
            "minimum": 1,
            "type": "number"
          },
          "productIds": {
            "description": "Scope the discount to specific products. Use this whenever the merchant names the products the discount applies to. Pass full product GIDs (e.g. [\"gid://shopify/Product/123\"]), never bare numeric IDs or product titles; look them up with search_products or get-product first. At most 50 products — for a larger set, use a collection and pass collectionId. Mutually exclusive with collectionId. Omit both to discount every product in the store.",
            "items": {
              "type": "string"
            },
            "maxItems": 50,
            "minItems": 1,
            "type": "array"
          },
          "startsAt": {
            "description": "ISO 8601 start date. For a discount the merchant wants active right away, pass the current date and time; for a scheduled one, pass the date they chose. Omit this field only if the merchant has not said yet — the tool then returns a clarification question to put to them rather than picking a date itself. Omitting it does not make the discount start immediately.",
            "type": "string"
          },
          "title": {
            "description": "The title of the discount",
            "type": "string"
          }
        },
        "required": [
          "title",
          "code",
          "percentage"
        ],
        "type": "object"
      },
      "name": "create-discount",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "appliesTo": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "collectionProducts": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "currencyCode": {
                  "type": "string"
                },
                "imageUrl": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "price": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "variantTitle": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title",
                "variantTitle",
                "imageUrl",
                "price",
                "currencyCode",
                "status"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "customerEligibility": {
            "enum": [
              "all_customers",
              "specific_segments"
            ],
            "type": "string"
          },
          "customerSegments": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "name"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "endsAt": {
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "type": "string"
          },
          "minimumRequirement": {
            "type": "string"
          },
          "percentage": {
            "type": "number"
          },
          "startsAt": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "totalProductCount": {
            "type": "number"
          },
          "validationErrors": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "field": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "message": {
                  "type": "string"
                }
              },
              "required": [
                "field",
                "message"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "title",
          "code",
          "percentage",
          "startsAt",
          "endsAt",
          "appliesTo",
          "minimumRequirement",
          "collectionProducts",
          "totalProductCount",
          "customerEligibility"
        ],
        "type": "object"
      },
      "title": "Create Discount"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products",
              "write_publications"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Create a new product in the connected Shopify store.\nIf create-product-interactive is available, prefer it over create-product.\nUse this when the user wants to add a product with a title, description, variants, images, or other product details.\n\nVARIANTS \u0026 OPTIONS:\n- When providing `variants`, you MUST also provide the `options` field as a string array of option names.\n- Example: for a single default variant use `options: ['Title']`, for Size/Color variants use `options: ['Size', 'Color']`.\n- The `options` field must be an array of strings (e.g. `['Size', 'Color']`), NOT an array of objects.\n- Each variant's `optionValues` must reference option names declared in the `options` array.\n\nINVENTORY TRACKING:\n- To enable inventory tracking on variants, set `inventoryItem: { tracked: true }` on each variant.\n- If omitted, inventory defaults to untracked and set-inventory will not work as expected.\n\nIMAGE REQUIREMENTS:\n- Images must be publicly accessible HTTPS URLs (e.g. https://example.com/photo.jpg).\n- Local file paths (e.g. /mnt/data/..., file://...) are NOT supported and will fail.\n- If you only have a local file or a generated image, ask the user for a publicly accessible HTTPS URL; this host cannot upload one.\n- Avoid placeholder or non-deterministic image URLs (e.g. picsum.photos) for real products.\n- The first image provided becomes the product's featured image.\n\nCOLLECTION:\n- Optionally pass `collectionId` to add the product to a collection after creation.\n- To add to multiple collections, use add-to-collection afterward.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "collectionId": {
            "description": "GID of a collection to add this product to after creation (e.g. gid://shopify/Collection/123). To add to multiple collections, use add-to-collection afterward.",
            "type": "string"
          },
          "descriptionHtml": {
            "description": "HTML description of the product",
            "type": "string"
          },
          "images": {
            "description": "Product images. Each image must have a publicly accessible HTTPS URL. The first image becomes the featured image.",
            "items": {
              "properties": {
                "altText": {
                  "description": "Image alt text",
                  "type": "string"
                },
                "url": {
                  "description": "Publicly accessible HTTPS image URL (e.g. https://cdn.example.com/photo.jpg). Local file paths are not supported.",
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "options": {
            "description": "Product option names as a string array (e.g. ['Size', 'Color']). REQUIRED when providing variants. Must be plain strings, not objects.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "productType": {
            "description": "The product type",
            "type": "string"
          },
          "status": {
            "default": "DRAFT",
            "description": "The product status (defaults to DRAFT)",
            "enum": [
              "ACTIVE",
              "DRAFT",
              "ARCHIVED"
            ],
            "type": "string"
          },
          "tags": {
            "description": "Tags for the product",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "description": "The product title",
            "type": "string"
          },
          "variants": {
            "description": "Product variants",
            "items": {
              "properties": {
                "inventoryItem": {
                  "description": "Inventory item settings for this variant. Use this to enable inventory tracking when creating a product.",
                  "properties": {
                    "tracked": {
                      "description": "Whether inventory is tracked for this variant. Set to true to enable inventory management. Defaults to false if omitted.",
                      "type": "boolean"
                    }
                  },
                  "type": "object"
                },
                "optionValues": {
                  "description": "Option values for this variant",
                  "items": {
                    "properties": {
                      "name": {
                        "description": "Option value",
                        "type": "string"
                      },
                      "optionName": {
                        "description": "Option name",
                        "type": "string"
                      }
                    },
                    "required": [
                      "optionName",
                      "name"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "price": {
                  "description": "Variant price",
                  "type": "string"
                },
                "sku": {
                  "description": "Variant SKU",
                  "type": "string"
                },
                "title": {
                  "description": "Variant title",
                  "type": "string"
                }
              },
              "required": [
                "price"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "vendor": {
            "description": "The product vendor",
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "name": "create-product",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "currencyCode": {
            "type": "string"
          },
          "descriptionHtml": {
            "type": "string"
          },
          "featuredImageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "type": "string"
          },
          "images": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "altText": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "mediaId": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "url",
                "altText"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "productType": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "type": "string"
          },
          "totalInventory": {
            "type": "number"
          },
          "totalVariants": {
            "type": "number"
          },
          "variants": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "inventoryQuantity": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "price": {
                  "type": "string"
                },
                "sku": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "title": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "title",
                "sku",
                "price",
                "inventoryQuantity"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "vendor": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "vendor",
          "status",
          "productType",
          "descriptionHtml",
          "tags",
          "totalInventory",
          "featuredImageUrl",
          "images",
          "totalVariants",
          "variants",
          "currencyCode"
        ],
        "type": "object"
      },
      "title": "Create Product"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Find ready-made sample catalogs (from mock.shop) that fit the merchant's business, so they can pick one to seed their store with realistic products and collections instead of starting empty.\n\nWHEN TO USE:\n  - The merchant has a new or empty store and wants sample products, a starter catalog, demo data, or \"something to look at\" before adding their own products.\n  - The merchant describes what they sell (or plan to sell) and wants a store populated quickly.\n\nWHEN NOT TO USE:\n  - The merchant wants one-off placeholder products rather than a whole catalog — use find-sample-product.\n  - The merchant wants real products to source or resell — this returns sample data, not supplier inventory.\n  - The merchant wants to browse products already in their store — use search-products.\n\nINPUT: a short description of the business or what it sells (e.g. \"handmade soy candles\", \"supplies for a new puppy\", \"streetwear for teens\"). Take it from what the merchant said. If they gave no hint at all, ask one question — what do they plan to sell? — then call.\n\nOUTPUT: up to `limit` catalogs (default 3), best match first. Each has a name, short description, categories, collection titles, product and collection counts, currency, and a `storefrontUrl` the merchant can open to browse it as a live storefront. Present them as a short list with the storefront links and ask the merchant which one they want. Pass the chosen catalog's `subdomain` to import-mock-shop-catalog to copy it into their store. An empty list means nothing matched well — suggest the merchant describe their business differently.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "limit": {
            "description": "How many catalogs to return. Defaults to 3; leave unset unless the merchant asks for more options.",
            "maximum": 10,
            "minimum": 1,
            "type": "integer"
          },
          "query": {
            "description": "What the merchant sells or plans to sell, in a few words (e.g. 'handmade soy candles', 'supplies for a new puppy'). Plain language; no need to singularize or reformat.",
            "maxLength": 500,
            "minLength": 1,
            "pattern": ".+",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "find-mock-shop-catalogs",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "catalogs": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "categories": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "collectionCount": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "collectionTitles": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "currencyCode": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "productCount": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "shortDescription": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "storefrontUrl": {
                  "type": "string"
                },
                "subdomain": {
                  "type": "string"
                }
              },
              "required": [
                "subdomain",
                "name",
                "shortDescription",
                "categories",
                "collectionTitles",
                "productCount",
                "collectionCount",
                "currencyCode",
                "storefrontUrl"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "query": {
            "type": "string"
          }
        },
        "required": [
          "query",
          "catalogs"
        ],
        "type": "object"
      },
      "title": "Find Mock Shop Catalogs"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Generate business name ideas for someone starting a Shopify store.\n\nWHEN TO USE:\n  - The user wants name ideas for a new business or store.\n  - The user has described a business but has not named it yet.\n  - The user has a name and wants alternatives in the same vein.\n\nWHEN NOT TO USE:\n  - The user already knows the name they want and only needs to set it — that is done in the Shopify admin, not here.\n  - The user wants a product name, a slogan, or a tagline rather than a business name.\n\nINPUT: a short description of the business in the user's own words — what they sell, who it is for, or the feeling they want ('hand-poured soy candles for dark, woody scents'). Max 255 characters. Pass what the user actually said; do NOT invent a business they have not described.\n\nEvery name comes back with a `signupUrl`, the link that acts on it, so present it rather than describing it. Where it goes depends on the user: with no Shopify store connected it opens store signup with the name already filled in; with a store connected it opens the store name setting in that store's Shopify admin, where they save the new name themselves. Either way the tool only hands back a link — it creates and renames nothing.\n\nA store name is not exclusive, so the user can take any of these for their store. Nothing here is verified, though — no trademark search, no business registry, no check of whether someone else is already trading under the name — so tell them to check that before building a brand on it.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "description": {
            "description": "REQUIRED — always send this field. A short description of the business in the user's own words: what they sell ('hand-poured soy candles'), who it is for ('running gear for trail runners'), or the feeling the name should have ('something calm and coastal'). Max 255 characters — a longer value is refused and the user gets nothing. Use what the user actually said rather than inventing a business for them, and send the description itself, not a name you have already thought of.",
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "description"
        ],
        "type": "object"
      },
      "name": "generate-business-names",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "description": {
            "type": "string"
          },
          "suggestions": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "name": {
                  "type": "string"
                },
                "signupUrl": {
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "description",
          "suggestions"
        ],
        "type": "object"
      },
      "title": "Generate Business Names"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Suggest available domain names for a Shopify store. Every domain returned has been checked against the domain registry and was available at the time of the call.\n\nWHEN TO USE:\n  - The user wants a domain for a business or store name.\n  - The user's preferred domain is taken and they want alternatives.\n  - The user asks whether a domain idea is available.\n  - The user wants to know what a domain costs.\n  - The user wants to buy or register a particular domain.\n\nWHEN NOT TO USE:\n  - The user wants to connect or troubleshoot a domain they already own — that is done in the Shopify admin, not here.\n  - The user only wants store-name ideas and does not care whether a domain is available or what it costs.\n\nINPUT: a store name, a domain the user has in mind, or a short description of the business. All three work.\nIf the user named a domain, the tool checks that exact domain, checks the same name at other common TLDs, and also returns 3 alternatives. An unusual TLD is fine — keep the one the user said. Pass the domain on its own as the query, or — when it sits inside a sentence — put it in exactDomain.\nIf the user named no domain, put the words the domain should be built from in storeName: a name the user proposed ('volcanic balloon', 'Ember \u0026 Oak'), or the subject of what they described ('a domain about hippos, giraffes, and iguanas' → 'hippos giraffes iguanas'). Four words at most, lead-in and connecting words dropped, in the user's own words rather than converted to a domain yourself. The tool compresses them into a domain and checks that the same way; without storeName there is no availability check for a query like that, only suggestions.\nOnly the exact domain checked can come back unavailable. Every other domain returned is available to buy, so do not describe any of them as taken, and do not say which TLDs were checked — an unlisted TLD may have been taken or may not have been quoted, and you cannot tell which.\n\nEvery domain on offer carries a `signupUrl`, the one link that buys it, so present it rather than describing it. Where it leads depends on whether a Shopify store is connected to the call, not on whether the user owns one. With a store connected, it opens that domain's purchase page in that store's Shopify admin, so buying it attaches the domain to the store rather than starting a second one; the response says when this applies. Without one, it opens store signup with the domain already selected, even for a user who says they already have a store.\n\nAvailability is a point-in-time check, not a hold. Tell the user to register a domain they want promptly, and never promise a domain is still available later in the conversation.\n\nPrices, where present, are the registry's quote for the first registration term in the stated currency. Renewal is priced separately and is often higher, so present a price as what registering costs today, not as an ongoing rate. A domain can come back without a price; say nothing about its cost rather than guessing, and in particular do not read a missing price as a domain that costs nothing. Every domain here has to be bought. Say a domain is \"available\" or \"unavailable\" — never that it is \"free\", which states a price rather than an availability and states it wrongly.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "exactDomain": {
            "description": "Optional. A full domain the USER named, TLD included, when the query is a sentence rather than the domain on its own: 'is fern.com available?' → 'fern.com'; 'can I get emberandoak.shop' → 'emberandoak.shop'. An unusual TLD is fine. This is the domain the tool reports a verdict on, so it must be one the user actually said — do NOT compose one from a name or a description, and do NOT guess a TLD they did not give. Use storeName for that instead; storeName and exactDomain are alternatives to each other, not a pair. Neither replaces query, which is always sent.",
            "maxLength": 253,
            "minLength": 1,
            "type": "string"
          },
          "query": {
            "description": "REQUIRED — always send this field, in every call. A store name ('Ember \u0026 Oak'), a domain the user has in mind ('emberandoak.com'), or a short description of the business ('hand-poured soy candles for dark, woody scents') — max 255 characters. Use what the user actually said; do NOT invent a business description they have not given you. When the whole query is a domain ('fern.com') it is checked as one; when the domain sits inside a sentence ('is fern.com available?'), name it in exactDomain as well. storeName and exactDomain are extras that go ALONGSIDE this field, never instead of it: a call without query is rejected and the user gets nothing.",
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          },
          "storeName": {
            "description": "Optional. The words the domain should be built from — at most 4 words, max 60 characters. Set it whenever the user gave you something to build on, whether they named it or described it: 'what would be a good domain name for volcanic balloon' → 'volcanic balloon'; 'i want something like Ember \u0026 Oak' → 'Ember \u0026 Oak'; 'i want a domain about hippos, giraffes, and iguanas' → 'hippos giraffes iguanas'; 'hand-poured soy candles for dark, woody scents' → 'soy candles'. Drop the lead-in and the connecting words, and keep it to 4 words or fewer — a longer value is refused and the user loses the availability check. Omit it when the user already named a domain; exactDomain is where that belongs. Send it in addition to query, never instead of it. Do NOT invent words the user has not said, and do NOT convert it to a domain: this tool compresses these words itself and needs the user's own words to tell them what it derived from.",
            "maxLength": 60,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "generate-domain-names",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "availableVariants": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "currency": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "domain": {
                  "type": "string"
                },
                "price": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "signupUrl": {
                  "type": "string"
                }
              },
              "required": [
                "domain",
                "price",
                "currency",
                "signupUrl"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "checkedDomain": {
            "additionalProperties": false,
            "properties": {
              "available": {
                "type": "boolean"
              },
              "currency": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "domain": {
                "type": "string"
              },
              "price": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "signupUrl": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "domain",
              "available",
              "price",
              "currency",
              "signupUrl"
            ],
            "type": "object"
          },
          "query": {
            "type": "string"
          },
          "suggestions": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "currency": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "domain": {
                  "type": "string"
                },
                "price": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "signupUrl": {
                  "type": "string"
                }
              },
              "required": [
                "domain",
                "price",
                "currency",
                "signupUrl"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "query",
          "suggestions",
          "availableVariants"
        ],
        "type": "object"
      },
      "title": "Generate Domain Names"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve detailed information about a specific Shopify collection by its GID, including title, description, image, products, and rules (for smart collections). MUST be called whenever the user refers to a collection they own or previously created — regardless of phrasing. Trigger phrases include: \"my collection\", \"that collection\", \"the collection\", \"show me my collection\", \"get my collection\", or any reference to a previously created or known collection. \"Show\" and \"get\" mean the same thing here: always fetch live data from Shopify. Do NOT rely on memory or prior responses — always call this tool for the source of truth.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "id": {
            "description": "The collection GID (e.g. gid://shopify/Collection/123)",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get-collection",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "collectionType": {
            "enum": [
              "manual",
              "smart"
            ],
            "type": "string"
          },
          "currencyCode": {
            "type": "string"
          },
          "descriptionHtml": {
            "type": "string"
          },
          "handle": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "imageAltText": {
            "type": [
              "string",
              "null"
            ]
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "products": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "currencyCode": {
                  "type": "string"
                },
                "imageUrl": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "price": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "variantTitle": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title",
                "variantTitle",
                "imageUrl",
                "price",
                "currencyCode",
                "status"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "productsCount": {
            "type": "number"
          },
          "rules": {
            "anyOf": [
              {
                "additionalProperties": false,
                "properties": {
                  "appliedDisjunctively": {
                    "type": "boolean"
                  },
                  "rules": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "column": {
                          "type": "string"
                        },
                        "condition": {
                          "type": "string"
                        },
                        "relation": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "column",
                        "relation",
                        "condition"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "appliedDisjunctively",
                  "rules"
                ],
                "type": "object"
              },
              {
                "type": "null"
              }
            ]
          },
          "sortOrder": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "updatedAt": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "handle",
          "descriptionHtml",
          "imageUrl",
          "imageAltText",
          "sortOrder",
          "collectionType",
          "productsCount",
          "products",
          "rules",
          "updatedAt",
          "currencyCode"
        ],
        "type": "object"
      },
      "title": "Get Collection"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_inventory",
              "write_locations"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve inventory levels for all variants of a product across locations. Use this when the user asks about stock quantities, inventory availability, or wants to see how much inventory is at each location for a given product.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "productId": {
            "description": "The product GID (e.g. gid://shopify/Product/123)",
            "type": "string"
          }
        },
        "required": [
          "productId"
        ],
        "type": "object"
      },
      "name": "get-inventory-levels",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "inventoryItems": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "available": {
                  "type": "number"
                },
                "committed": {
                  "type": "number"
                },
                "inventoryItemId": {
                  "type": "string"
                },
                "locationId": {
                  "type": "string"
                },
                "locationName": {
                  "type": "string"
                },
                "onHand": {
                  "type": "number"
                },
                "sku": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "variantTitle": {
                  "type": "string"
                }
              },
              "required": [
                "inventoryItemId",
                "locationId",
                "variantTitle",
                "sku",
                "locationName",
                "available",
                "committed",
                "onHand"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "productTitle": {
            "type": "string"
          }
        },
        "required": [
          "productTitle",
          "inventoryItems"
        ],
        "type": "object"
      },
      "title": "Get Inventory Levels"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_orders",
              "read_all_orders",
              "write_customers",
              "write_fulfillments",
              "write_locations",
              "write_merchant_managed_fulfillment_orders"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve detailed information about a specific Shopify order including line items, fulfillment status, shipping address, and tracking. Use this when the user asks about a particular order's details or status.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "id": {
            "description": "The order GID (e.g. gid://shopify/Order/12345) or the order name exactly as it appears in Shopify admin. Order names often carry a shop-configured prefix or suffix, so letters and dashes are expected (e.g. 1022, #1022, EB-1022, 22420FP). Pass the name through as-is instead of stripping it down to digits.",
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get-order",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "createdAt": {
            "type": "string"
          },
          "currencyCode": {
            "type": "string"
          },
          "customerEmail": {
            "type": [
              "string",
              "null"
            ]
          },
          "customerName": {
            "type": [
              "string",
              "null"
            ]
          },
          "financialStatus": {
            "type": [
              "string",
              "null"
            ]
          },
          "fulfillmentStatus": {
            "type": "string"
          },
          "fulfillments": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "createdAt": {
                  "type": "string"
                },
                "locationName": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                },
                "trackingCompany": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "trackingNumber": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "trackingUrl": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "status",
                "locationName",
                "trackingCompany",
                "trackingNumber",
                "trackingUrl",
                "createdAt"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "id": {
            "type": "string"
          },
          "lineItems": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "imageUrl": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "quantity": {
                  "type": "number"
                },
                "sku": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "title": {
                  "type": "string"
                },
                "unitPrice": {
                  "type": "string"
                },
                "variantTitle": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title",
                "quantity",
                "unitPrice",
                "sku",
                "imageUrl",
                "variantTitle"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "name": {
            "type": "string"
          },
          "shippingAddress": {
            "anyOf": [
              {
                "additionalProperties": false,
                "properties": {
                  "address1": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "address2": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "city": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "country": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "province": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "zip": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "address1",
                  "address2",
                  "city",
                  "province",
                  "country",
                  "zip"
                ],
                "type": "object"
              },
              {
                "type": "null"
              }
            ]
          },
          "subtotalPrice": {
            "type": "string"
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "totalPrice": {
            "type": "string"
          },
          "totalTax": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "createdAt",
          "customerName",
          "customerEmail",
          "totalPrice",
          "subtotalPrice",
          "totalTax",
          "currencyCode",
          "financialStatus",
          "fulfillmentStatus",
          "tags",
          "lineItems",
          "shippingAddress",
          "fulfillments"
        ],
        "type": "object"
      },
      "title": "Get Order"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve detailed information about a specific Shopify product by its GID, including title, status, vendor, variants, images, tags, and inventory. MUST be called whenever the user refers to a product they own or previously created — regardless of phrasing. Trigger phrases include: \"my product\", \"that product\", \"the product\", \"show me my product\", \"get my product\", \"pull up the product\", \"open my product\", or any reference to a previously created or known product. \"Show\" and \"get\" mean the same thing here: always fetch live data from Shopify. Do NOT rely on memory or prior responses — always call this tool for the source of truth.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "id": {
            "description": "The full product GID in the form gid://shopify/Product/\u003cnumeric_id\u003e (e.g. gid://shopify/Product/123). Bare numeric IDs are NOT accepted — if you only have a product number, title, or SKU, call search-products first to look up the GID.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get-product",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "currencyCode": {
            "type": "string"
          },
          "descriptionHtml": {
            "type": "string"
          },
          "featuredImageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "type": "string"
          },
          "images": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "altText": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "mediaId": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "url",
                "altText"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "productType": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "type": "string"
          },
          "totalInventory": {
            "type": "number"
          },
          "totalVariants": {
            "type": "number"
          },
          "variants": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "inventoryQuantity": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "price": {
                  "type": "string"
                },
                "sku": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "title": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "title",
                "sku",
                "price",
                "inventoryQuantity"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "vendor": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "vendor",
          "status",
          "productType",
          "descriptionHtml",
          "tags",
          "totalInventory",
          "featuredImageUrl",
          "images",
          "totalVariants",
          "variants",
          "currencyCode"
        ],
        "type": "object"
      },
      "title": "Get Product"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve basic information about the connected Shopify store including name, domain, email, plan, currency, timezone, and country. Use this when you need store context to tailor advice (e.g. plan limitations, currency for pricing, timezone for scheduling), when the user asks about their store details, or to verify which store is connected.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {},
        "type": "object"
      },
      "name": "get-shop-info",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "country": {
            "type": "string"
          },
          "criticalUserMessage": {
            "type": "string"
          },
          "currencyCode": {
            "type": "string"
          },
          "domain": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "planName": {
            "type": "string"
          },
          "timezone": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "domain",
          "email",
          "planName",
          "currencyCode",
          "timezone",
          "country",
          "criticalUserMessage"
        ],
        "type": "object"
      },
      "title": "Get Shop Info"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          }
        ],
        "ui": {
          "visibility": [
            "app"
          ]
        }
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Get the current state of a storefront generation. Used by the widget to poll for preview completion.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "generationUUID": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "metadata": {
            "properties": {
              "storeIntents": {
                "items": {
                  "enum": [
                    "digital_products"
                  ],
                  "type": "string"
                },
                "type": "array"
              }
            },
            "type": "object"
          }
        },
        "required": [
          "generationUUID"
        ],
        "type": "object"
      },
      "name": "get-storefront-generation",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "generationUUID": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "metadata": {
            "additionalProperties": false,
            "properties": {
              "storeIntents": {
                "items": {
                  "enum": [
                    "digital_products"
                  ],
                  "type": "string"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "pendingCount": {
            "type": "number"
          },
          "status": {
            "enum": [
              "pending",
              "complete"
            ],
            "type": "string"
          },
          "storefrontPreviews": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "signupUrl": {
                  "format": "uri",
                  "type": "string"
                },
                "storefrontGenerationUUID": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                  "type": "string"
                },
                "storefrontPreviewImageUrl": {
                  "format": "uri",
                  "type": "string"
                },
                "storefrontPreviewUrl": {
                  "anyOf": [
                    {
                      "format": "uri",
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "storefrontGenerationUUID",
                "storefrontPreviewImageUrl",
                "storefrontPreviewUrl",
                "signupUrl"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "totalPreviews": {
            "type": "number"
          }
        },
        "required": [
          "generationUUID",
          "status",
          "totalPreviews",
          "pendingCount",
          "storefrontPreviews"
        ],
        "type": "object"
      }
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "read_all_orders",
              "read_analytics",
              "read_apps",
              "write_checkout_branding_settings",
              "write_checkouts",
              "read_companies",
              "write_content",
              "write_customers",
              "write_discounts",
              "write_draft_orders",
              "write_files",
              "write_fulfillments",
              "write_inventory",
              "read_legal_policies",
              "write_locales",
              "write_locations",
              "write_marketing_events",
              "write_markets",
              "write_merchant_managed_fulfillment_orders",
              "write_metaobject_definitions",
              "write_metaobjects",
              "write_online_store_navigation",
              "write_order_edits",
              "write_orders",
              "write_price_rules",
              "write_products",
              "write_publications",
              "read_reports",
              "write_returns",
              "write_shipping",
              "write_themes",
              "write_translations",
              "write_validations",
              "write_collective.access",
              "write_digital_products_product"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Execute a GraphQL mutation against the Shopify Admin API.\nThe Shopify Admin API supports hundreds of mutations. Built-in tools cover common write operations, but when the user asks to modify a resource that has no dedicated tool (e.g. metafields, metaobjects, pages, blogs, translations, publications, etc.), use this tool.\nNote: Some dangerous mutations are blocked for safety (e.g. refunds, gift card writes, staff management, theme deletion, theme publishing). Theme file writes (themeFilesCopy, themeFilesUpsert) are allowed on unpublished themes only — writes that target the live/MAIN theme are blocked. If a mutation is blocked, inform the user and suggest they perform the action in Shopify admin.\nThe host app will prompt the user for confirmation before executing.\n\nBefore calling this tool, follow the GraphQL Workflow:\n1. Call graphql_schema FIRST to look up the exact mutation name (type_name='Mutation') and input type fields — do NOT guess, and do NOT skip this step.\n2. Optionally supplement with search_docs_chunks for mutation examples in Shopify documentation; it never replaces graphql_schema.\n3. Construct the operation.\n4. Call validate_graphql_codeblocks to verify the operation — do NOT skip validation.\n5. Only then call this tool to execute the mutation.\n\nIMPORTANT: After executing, present the results clearly to the user. Do NOT dump raw JSON — summarize what changed in a helpful, readable way.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "query": {
            "description": "GraphQL mutation string",
            "minLength": 1,
            "type": "string"
          },
          "variables": {
            "additionalProperties": {},
            "description": "GraphQL variables object",
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "graphql_mutation",
      "title": "GraphQL Mutation (Advanced)"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "read_all_orders",
              "read_analytics",
              "read_apps",
              "write_checkout_branding_settings",
              "write_checkouts",
              "read_companies",
              "write_content",
              "write_customers",
              "write_discounts",
              "write_draft_orders",
              "write_files",
              "write_fulfillments",
              "write_inventory",
              "read_legal_policies",
              "write_locales",
              "write_locations",
              "write_marketing_events",
              "write_markets",
              "write_merchant_managed_fulfillment_orders",
              "write_metaobject_definitions",
              "write_metaobjects",
              "write_online_store_navigation",
              "write_order_edits",
              "write_orders",
              "write_price_rules",
              "write_products",
              "write_publications",
              "read_reports",
              "write_returns",
              "write_shipping",
              "write_themes",
              "write_translations",
              "write_validations"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Execute a read-only GraphQL query against the Shopify Admin API.\nThe Shopify Admin API exposes hundreds of resources. Built-in tools cover common operations, but when the user asks about a resource that has no dedicated tool (e.g. gift cards, metafields, metaobjects, pages, blogs, markets, translations, publications, etc.), use this tool to fetch the data.\nRaw schema introspection (__schema / __type) is not allowed through this tool; use graphql_schema for schema discovery.\n\nBefore calling this tool, follow the GraphQL Workflow:\n1. Call graphql_schema FIRST to discover the correct types and fields — do NOT guess field names, and do NOT skip this step.\n2. Construct the operation. search_docs_chunks is optional here for worked examples; it supplements graphql_schema and never replaces it.\n3. Call validate_graphql_codeblocks to verify the operation — do NOT skip validation.\n4. Only then call this tool to execute the query.\n\nPagination: include `pageInfo { hasNextPage endCursor }` in your query.\nPass the endCursor value as the `after` variable for the next page.\n\nIMPORTANT: After calling this tool, present the results clearly to the user. Do NOT dump raw JSON — summarize the key information in a helpful, readable way.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "after": {
            "description": "Pagination cursor from a previous response's endCursor",
            "type": "string"
          },
          "first": {
            "default": 10,
            "description": "Number of items to return (1-50, default 10)",
            "maximum": 50,
            "minimum": 1,
            "type": "integer"
          },
          "query": {
            "description": "GraphQL query string",
            "minLength": 1,
            "type": "string"
          },
          "variables": {
            "additionalProperties": {},
            "description": "GraphQL variables object",
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "graphql_query",
      "title": "GraphQL Query (Advanced)"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "read_all_orders",
              "read_analytics",
              "read_apps",
              "write_checkout_branding_settings",
              "write_checkouts",
              "read_companies",
              "write_content",
              "write_customers",
              "write_discounts",
              "write_draft_orders",
              "write_files",
              "write_fulfillments",
              "write_inventory",
              "read_legal_policies",
              "write_locales",
              "write_locations",
              "write_marketing_events",
              "write_markets",
              "write_merchant_managed_fulfillment_orders",
              "write_metaobject_definitions",
              "write_metaobjects",
              "write_online_store_navigation",
              "write_order_edits",
              "write_orders",
              "write_price_rules",
              "write_products",
              "write_publications",
              "read_reports",
              "write_returns",
              "write_shipping",
              "write_themes",
              "write_translations",
              "write_validations"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Explore the Shopify Admin GraphQL schema to discover types, fields, and arguments.\nYou MUST call this tool before building ANY GraphQL operation — every graphql_query and every graphql_mutation starts here, not just mutations. It is step 1 of the GraphQL Workflow and the only source of truth for exact type, field, argument, and input-type names — never guess them.\n\nFor INPUT_OBJECT types (e.g. 'ProductInput', 'DiscountCodeBasicInput') the response includes 'isOneOf' plus the full transitive closure of every nested input type — you do NOT need to call again per nested type. Each inputFields[] entry whose type unwraps to an INPUT_OBJECT carries an 'expanded' key with that type's name, kind, isOneOf, and inputFields recursively. Cycles are emitted as { \"$ref\": \"TypeName\" }. ENUM-typed fields have their values inlined under 'enumValues'.\n\nPass a type name to inspect. Common starting points:\n  - 'Mutation' — list all available mutations (search here first for mutations)\n  - 'QueryRoot' — list all available queries\n  - 'Product', 'Order', 'Customer' — inspect entity fields for queries\n  - 'ProductInput', 'ProductVariantInput' — inspect mutation input types (returned with full nested closure)\n\nWorkflow for mutations: graphql_schema('Mutation') → find the mutation → graphql_schema('InputTypeName') → construct the mutation → validate_graphql_codeblocks → graphql_mutation.\nWorkflow for queries: graphql_schema('QueryRoot') → find the query → graphql_schema('TypeName') → construct the query → validate_graphql_codeblocks → graphql_query.\nWhile building an operation, search_docs_chunks supplements this tool with worked examples from shopify.dev; it does NOT replace it and is not where the workflow starts. A standalone documentation question, with no operation to build, goes straight to search_docs_chunks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "type_name": {
            "description": "GraphQL type name to inspect (e.g. 'Product', 'QueryRoot', 'Mutation', 'ProductInput')",
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "type_name"
        ],
        "type": "object"
      },
      "name": "graphql_schema",
      "title": "Explore GraphQL Schema"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products",
              "write_publications"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Copy a mock.shop sample catalog's starter set — its first 2 collections and up to 8 products from each (with variants, prices, images), so at most 16 products — into the merchant's connected store, publishing everything to the Online Store. Use it after the merchant picks a catalog from find-mock-shop-catalogs. One call does the whole import.\n\nRE-RUNNING IS SAFE AND NEVER OVERWRITES: calling again (after a timeout or `partial: true`) adds only what is missing — products not yet imported, memberships and publications not yet made. A product already imported from this catalog is left exactly as it is — including any edits the merchant has made since, and including whether it is published — and counted under `unchanged`; if it is not published, it is listed under `unpublished` for the merchant to publish or delete in Admin. A product the merchant already has at the same handle from elsewhere is left untouched and reported under `skipped`. A collection the merchant already has at the same handle is reused when its title matches the catalog's (missing imported products are added to it) and skipped when it does not. Collections are created only with their imported products, so none is ever left empty.\n\nINPUT: `subdomain` from the chosen catalog (e.g. \"pets\"). Nothing else.\n\nOUTPUT: counts of products created/unchanged/skipped and collections created/reused/skipped, and `currency`. If `partial` is true Shopify rate-limited the call: wait a few seconds, then call again with the same `subdomain`. Prices are copied as plain amounts; when `currency.mismatch` is true tell the merchant prices came from a ${currency.source} catalog and were not converted, so they should review them.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "subdomain": {
            "description": "The catalog's subdomain from find-mock-shop-catalogs (e.g. 'pets'). Not a URL.",
            "maxLength": 63,
            "minLength": 1,
            "pattern": "^[a-z0-9][a-z0-9-]*$",
            "type": "string"
          }
        },
        "required": [
          "subdomain"
        ],
        "type": "object"
      },
      "name": "import-mock-shop-catalog",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "catalogName": {
            "type": "string"
          },
          "collections": {
            "additionalProperties": false,
            "properties": {
              "created": {
                "maximum": 9007199254740991,
                "minimum": -9007199254740991,
                "type": "integer"
              },
              "reused": {
                "maximum": 9007199254740991,
                "minimum": -9007199254740991,
                "type": "integer"
              },
              "skipped": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "handle": {
                      "type": "string"
                    },
                    "reason": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "handle",
                    "reason"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "unpublished": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "handle": {
                      "type": "string"
                    },
                    "reason": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "handle",
                    "reason"
                  ],
                  "type": "object"
                },
                "type": "array"
              }
            },
            "required": [
              "created",
              "reused",
              "skipped",
              "unpublished"
            ],
            "type": "object"
          },
          "currency": {
            "additionalProperties": false,
            "properties": {
              "destination": {
                "type": "string"
              },
              "mismatch": {
                "type": "boolean"
              },
              "source": {
                "type": "string"
              }
            },
            "required": [
              "source",
              "destination",
              "mismatch"
            ],
            "type": "object"
          },
          "partial": {
            "type": "boolean"
          },
          "products": {
            "additionalProperties": false,
            "properties": {
              "created": {
                "maximum": 9007199254740991,
                "minimum": -9007199254740991,
                "type": "integer"
              },
              "processed": {
                "maximum": 9007199254740991,
                "minimum": -9007199254740991,
                "type": "integer"
              },
              "skipped": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "handle": {
                      "type": "string"
                    },
                    "reason": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "handle",
                    "reason"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "unchanged": {
                "maximum": 9007199254740991,
                "minimum": -9007199254740991,
                "type": "integer"
              },
              "unpublished": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "handle": {
                      "type": "string"
                    },
                    "reason": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "handle",
                    "reason"
                  ],
                  "type": "object"
                },
                "type": "array"
              }
            },
            "required": [
              "processed",
              "created",
              "unchanged",
              "skipped",
              "unpublished"
            ],
            "type": "object"
          },
          "subdomain": {
            "type": "string"
          }
        },
        "required": [
          "subdomain",
          "catalogName",
          "products",
          "collections",
          "partial",
          "currency"
        ],
        "type": "object"
      },
      "title": "Import Mock Shop Catalog"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_customers"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve a list of customers from the connected Shopify store, including name, email, phone, order count, and total spent. Use this when the user asks about their customers, wants to look up a specific customer, or needs customer data for analysis.\n\nSEARCH SYNTAX:\nWhen the user is looking for a specific customer (by name, email, tag, etc.), ALWAYS pass a structured `query` using Shopify's customer search syntax. Do NOT pass a bare free-text term like `Smith` for a name search — Shopify's default fields match addresses, tags, company names, and notes, which returns unrelated customers.\n\nField filters use `field:value`. Combine with `AND` / `OR` / `NOT`; parenthesize subqueries. Ranges use `:\u003c`, `:\u003c=`, `:\u003e`, `:\u003e=` on numeric / date fields.\n\nName lookups should query BOTH first and last name, e.g. for \"customers named Smith\" use `first_name:Smith OR last_name:Smith`.\n\nSupported filter fields:\n- Name: `first_name`, `last_name`\n- Contact: `email`, `phone`\n- Location: `country` (full name or code, e.g. `Canada` / `CA`)\n- Account state: `state` (`enabled` | `invited` | `disabled` | `declined`)\n- Marketing: `accepts_marketing` (boolean), `email_marketing_state` (`subscribed` | `not_subscribed` | `pending` | `invalid` | `redacted`)\n- Tags: `tag`, `tag_not`\n- Numeric (support ranges): `orders_count`, `total_spent`, `id`\n- Date (support ranges): `created_at`, `updated_at`, `order_date`, `last_abandoned_order_date` — use ISO 8601 in quotes, e.g. `created_at:\u003e'2024-01-01'`\n\nRECENCY OF ORDERS:\nTo filter by when a customer placed an order, use `order_date` — NOT `updated_at`. `order_date` matches customers who have at least one order within the given date range. `updated_at` is bumped by profile edits too, so it's a leaky proxy. For abandoned-checkout recency, use `last_abandoned_order_date`. Compose either with the same date syntax shown for `created_at` / `updated_at` above; for relative windows (\"last N days\"), compute the cutoff from the current date in your context.\n\nExamples:\n- `Find customers named Smith` → `first_name:Smith OR last_name:Smith`\n- `Customers with gmail addresses` → `email:*@gmail.com`\n- `Customers with more than 5 orders` → `orders_count:\u003e5`\n- `Customers from Canada` → `country:Canada`\n- `VIP customers` → `tag:vip`\n- `Subscribed to email` → `email_marketing_state:subscribed`\n\nIMPORTANT — invalid field names are silently ignored and return everything. Only use the fields listed above. Do NOT invent fields like `name:`, `full_name:`, `customer_name:`, or `city:`.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "first": {
            "default": 10,
            "description": "Number of customers to return (1-50, default 10).",
            "maximum": 50,
            "minimum": 1,
            "type": "integer"
          },
          "query": {
            "description": "Shopify customer search query. Use field filters like `first_name:Smith`, `last_name:Smith`, `email:*@gmail.com`, `tag:vip`, `country:Canada`, `orders_count:\u003e5`. For order recency use `order_date` — do NOT use `updated_at` as a proxy, since it's also bumped by profile edits. For abandoned-checkout recency use `last_abandoned_order_date`. Combine with AND/OR/NOT. For name lookups, search BOTH first_name and last_name (e.g. `first_name:Smith OR last_name:Smith`) — do NOT pass a bare name, which matches addresses, notes, tags, and company names and returns unrelated customers. Leave unset to list all customers.",
            "maxLength": 500,
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list-customers",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "customers": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "createdAt": {
                  "type": "string"
                },
                "currencyCode": {
                  "type": "string"
                },
                "email": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "firstName": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "id": {
                  "type": "string"
                },
                "lastName": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "ordersCount": {
                  "type": "number"
                },
                "phone": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "totalSpent": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "firstName",
                "lastName",
                "email",
                "phone",
                "ordersCount",
                "totalSpent",
                "currencyCode",
                "createdAt"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "customers"
        ],
        "type": "object"
      },
      "title": "List Customers"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_orders",
              "read_all_orders"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve recent orders from the connected Shopify store. Returns order name, customer, totals, financial and fulfillment status. Use this when the user asks about their orders, wants an overview of recent sales, or needs to find a specific order.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "first": {
            "description": "Number of orders to return (1-50, default 10)",
            "maximum": 50,
            "minimum": 1,
            "type": "integer"
          },
          "query": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list-orders",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "orders": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "createdAt": {
                  "type": "string"
                },
                "currencyCode": {
                  "type": "string"
                },
                "customerName": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "financialStatus": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "fulfillmentStatus": {
                  "type": "string"
                },
                "id": {
                  "type": "string"
                },
                "lineItemCount": {
                  "type": "number"
                },
                "name": {
                  "type": "string"
                },
                "totalPrice": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "name",
                "createdAt",
                "customerName",
                "totalPrice",
                "currencyCode",
                "financialStatus",
                "fulfillmentStatus",
                "lineItemCount"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "requestedCount": {
            "type": [
              "number",
              "null"
            ]
          },
          "totalCount": {
            "type": "number"
          }
        },
        "required": [
          "orders",
          "totalCount",
          "requestedCount"
        ],
        "type": "object"
      },
      "title": "List Orders"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "read_reports"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Run a ShopifyQL analytics query. Returns tabular results with automatic chart visualization.\n\nIMPORTANT: Always use FROM...SHOW syntax. Use TIMESERIES for time charts, GROUP BY for categories.\n\n## Sales \u0026 Revenue\n- FROM sales SHOW gross_sales TIMESERIES day SINCE -30d UNTIL today\n- FROM sales SHOW orders, gross_sales, discounts, sales_reversals, net_sales, shipping_charges, taxes, total_sales TIMESERIES day SINCE -30d UNTIL today\n- FROM sales SHOW total_sales TIMESERIES day SINCE -30d UNTIL today COMPARE TO previous_period\n- FROM sales SHOW gross_sales, discounts, sales_reversals, net_sales, shipping_charges, taxes, total_sales\n- FROM sales SHOW average_order_value TIMESERIES day SINCE -30d UNTIL today\n\n## Orders\n- FROM sales SHOW orders TIMESERIES day SINCE -7d UNTIL today\n- FROM fulfillments SHOW orders_fulfilled, orders_shipped, orders_delivered TIMESERIES day SINCE -30d UNTIL today\n\n## Products\n- FROM sales SHOW gross_sales, net_sales, orders GROUP BY product_title ORDER BY gross_sales DESC LIMIT 10\n- FROM inventory SHOW starting_inventory_units, ending_inventory_units, inventory_units_sold, sell_through_rate GROUP BY product_title, product_variant_title\n\n## Customers\n- FROM sales SHOW returning_customers, customers, returning_customer_rate TIMESERIES day SINCE -30d UNTIL today\n- FROM sales SHOW new_customers, returning_customers TIMESERIES day SINCE -30d UNTIL today\n\n## Sessions \u0026 Conversion\n- FROM sessions SHOW sessions, online_store_visitors TIMESERIES day SINCE -30d UNTIL today\n- FROM sessions SHOW sessions, sessions_with_cart_additions, sessions_that_reached_checkout, sessions_that_completed_checkout, conversion_rate TIMESERIES day SINCE -30d UNTIL today\n- FROM sessions SHOW sessions GROUP BY session_device_type SINCE -30d UNTIL today\n- FROM sessions SHOW sessions GROUP BY session_country SINCE -30d UNTIL today\n\n## Marketing \u0026 Referrals\n- FROM sales SHOW orders, total_sales GROUP BY order_referrer_source, order_referrer_name SINCE -30d UNTIL today\n- FROM sessions SHOW sessions WHERE referrer_source = 'social' GROUP BY referrer_name SINCE -30d UNTIL today\n\n## Tables: sales, orders, sessions, customers, fulfillments, inventory, payments\n## Time grouping: TIMESERIES day/week/month. Category grouping: GROUP BY column\n## Comparison: COMPARE TO previous_period. Aggregates: WITH TOTALS, PERCENT_CHANGE",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "query": {
            "description": "The ShopifyQL query to execute",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "run-analytics-query",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "chartHint": {
            "additionalProperties": false,
            "properties": {
              "comparisonColumnIndex": {
                "type": "number"
              },
              "currencyCode": {
                "type": "string"
              },
              "type": {
                "enum": [
                  "line",
                  "bar"
                ],
                "type": "string"
              },
              "xAxisColumnIndex": {
                "type": "number"
              },
              "yAxisColumnIndices": {
                "items": {
                  "type": "number"
                },
                "type": "array"
              },
              "yAxisFormat": {
                "enum": [
                  "money",
                  "number",
                  "percent"
                ],
                "type": "string"
              }
            },
            "required": [
              "type",
              "xAxisColumnIndex",
              "yAxisColumnIndices",
              "yAxisFormat"
            ],
            "type": "object"
          },
          "columns": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "dataType": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              },
              "required": [
                "name",
                "dataType"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "query": {
            "type": "string"
          },
          "rowCount": {
            "type": "number"
          },
          "rows": {
            "items": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "type": "array"
          },
          "shopDomain": {
            "type": "string"
          },
          "summaryMetric": {
            "additionalProperties": false,
            "properties": {
              "changePercent": {
                "type": "number"
              },
              "label": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            },
            "required": [
              "label",
              "value"
            ],
            "type": "object"
          }
        },
        "required": [
          "query",
          "columns",
          "rows",
          "rowCount"
        ],
        "type": "object"
      },
      "title": "Run Analytics Query"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Search and browse collections on a Shopify store. Use this whenever the user wants to see, find, or look at collections in their store.\nTrigger phrases include: 'show me my collections', 'what collections do I have', 'list my collections', 'find a collection', 'search collections', or any reference to viewing multiple collections.\n'Show' and 'get' mean the same thing: always fetch live data from Shopify. Do NOT summarize from memory.\n\nUse this when the user wants to:\n    - list or search collections\n    - find a collection by name\n    - check what collections exist in their store\n    - find a collection GID to use with add-to-collection or create-product\n\nReturns collection data from the connected store via the Shopify Admin API.\n\nResults are capped at 50 per call. When `pageInfo.hasNextPage` is true, more matches exist than were returned. Tell the user you are showing the first N results and offer two paths: (a) load more via `after: pageInfo.endCursor`, or (b) refine the search with a stricter query. Only act on one of those paths when the user asks; do not auto-paginate.\n\nSEARCH SYNTAX:\nFree text matches across default fields (e.g. `summer`, `\"new arrivals\"`). Field filters use `field:value`. Combine with `AND` / `OR` / `NOT`; parenthesize subqueries. Ranges use `:\u003c`, `:\u003c=`, `:\u003e`, `:\u003e=` on numeric/date fields. Example: `collection_type:smart AND title:sale*`.\n\nIMPORTANT — invalid field names are silently ignored and return everything. Only use the fields listed below, as flat names. Do NOT invent dotted paths like `collection.title` or `rules.column`.\n\nSupported filter fields:\n- Text / exact: `title`, `handle`, `collection_type` (custom|smart)\n- Numeric (support ranges): `id`\n- Date (support ranges): `updated_at`, `published_at` — use ISO 8601 in quotes, e.g. `updated_at:\u003e'2024-01-01'`\n- ID: `product_id` (collections containing the given product)\n- Publication: `published_status` (e.g. `published`, `unpublished`, `online_store_channel`)\n\nNote: there is no server-side filter for product count, rules, or sort order. For those, filter by `collection_type` and inspect the returned `productsCount` / `sortOrder` fields client-side, or narrow with `title:` / `handle:`.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "after": {
            "description": "Cursor for pagination. Use the endCursor from a previous response to fetch the next page.",
            "type": "string"
          },
          "first": {
            "default": 10,
            "description": "Number of collections to return (1-50, default 10)",
            "maximum": 50,
            "minimum": 1,
            "type": "integer"
          },
          "reverse": {
            "description": "Reverse the sort order (e.g. most recently updated first with UPDATED_AT + reverse)",
            "type": "boolean"
          },
          "search_query": {
            "description": "Search query to filter collections. Uses Shopify search syntax: free text, field filters (`title:Sale`, `collection_type:smart`, `updated_at:\u003e'2024-01-01'`), and AND/OR/NOT. See the tool description for the full list of valid filter fields. Invalid fields are silently ignored and return all collections.",
            "maxLength": 500,
            "type": "string"
          },
          "sort_key": {
            "description": "Sort key for results. Use RELEVANCE only when search_query is provided.",
            "enum": [
              "TITLE",
              "UPDATED_AT",
              "ID",
              "RELEVANCE"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "search_collections",
      "title": "Search Collections"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "This tool will take in the user prompt, search shopify.dev, and return relevant documentation and code examples that will help answer the user's question.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "api_name": {
            "description": "The API name to filter search results by. Pass the same API name you used with learn_shopify_api (e.g., 'polaris-admin-extensions', 'pos-ui', 'admin'). This filters results to only return documentation for that specific API surface.",
            "type": "string"
          },
          "max_num_results": {
            "description": "Maximum number of results to return from the search. Do not pass this when calling the tool for the first time, only use this when you want to limit the number of results deal with small context window issues.",
            "type": "number"
          },
          "prompt": {
            "description": "The search query for Shopify documentation",
            "type": "string"
          }
        },
        "required": [
          "prompt"
        ],
        "type": "object"
      },
      "name": "search_docs_chunks",
      "title": "search_docs_chunks"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Search and browse products on a Shopify store. MUST be called whenever the user wants to see, find, or look at products in their store.\nTrigger phrases include: 'show me my products', 'what products do I have', 'list my products', 'browse my catalog', 'find a product', 'search for', or any reference to viewing multiple products.\n'Show' and 'get' mean the same thing: always fetch live data from Shopify. Do NOT summarize from memory.\n\nUse this when the user wants to:\n    - list or search products\n    - look up a specific product by ID or handle\n    - check product status or details\n    - browse what's in their catalog\n\nReturns product data from the connected store via the Shopify Admin API.\n\nResults are capped at 50 per call. When `pageInfo.hasNextPage` is true, more matches exist than were returned. Tell the user you are showing the first N results and offer two paths: (a) load more via `after: pageInfo.endCursor`, or (b) refine the search with a stricter query. Only act on one of those paths when the user asks; do not auto-paginate.\n\nSEARCH SYNTAX:\nFree text matches across default fields (e.g. `shoes`, `\"green hoodie\"`). Field filters use `field:value`. Combine with `AND` / `OR` / `NOT`; parenthesize subqueries. Ranges use `:\u003c`, `:\u003c=`, `:\u003e`, `:\u003e=` on numeric/date fields. Example: `price:\u003c=25 AND status:active`.\n\nIMPORTANT — invalid field names are silently ignored and return everything. Only use the fields listed below, as flat names. Do NOT invent dotted paths like `variants.price`, `product.tag`, or `variant.sku`.\n\nSupported filter fields:\n- Text / exact: `title`, `vendor`, `product_type`, `handle`, `sku`, `barcode`, `variant_title`, `tag`, `tag_not`, `status` (active|archived|draft)\n- Numeric (support ranges): `price` (matches products with ANY variant whose price satisfies the condition), `inventory_total`, `id`, `variant_id`\n- Date (support ranges): `created_at`, `updated_at`, `published_at` — use ISO 8601 in quotes, e.g. `created_at:\u003e'2024-01-01'`\n- Boolean: `gift_card`, `bundles`, `is_price_reduced`, `out_of_stock_somewhere`, `tracks_inventory`, `has_only_default_variant`\n- ID: `collection_id`, `category_id`\n\nPrice examples (cross-variant semantics):\n- `price:\u003c=25` — products with at least one variant priced $25 or less\n- `price:\u003e100 price:\u003c=500` — products with at least one variant in $100–$500\n- `price:25` — products with at least one variant priced exactly $25\n\nSHOULD populate `search_summary` with a concise but descriptive plain-text heading in the user's language. Use a noun phrase that identifies the results as products instead of repeating only the search term—for example, \"Your sneaker products\", not \"Your sneakers\". The widget displays this text verbatim, so do not use Markdown.\n\nFor a min/max of every variant or a product-wide price band, this tool cannot express it server-side; tell the user and suggest narrowing with `price:` plus another filter (e.g. `product_type:`, `vendor:`, `tag:`).",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "after": {
            "description": "Cursor for pagination. Use the endCursor from a previous response to fetch the next page.",
            "type": "string"
          },
          "first": {
            "default": 10,
            "description": "Number of products to return (1-50, default 10)",
            "maximum": 50,
            "minimum": 1,
            "type": "integer"
          },
          "reverse": {
            "description": "Reverse the sort order (e.g. newest first with CREATED_AT + reverse)",
            "type": "boolean"
          },
          "search_query": {
            "description": "Search query to filter products. Uses Shopify search syntax: free text, field filters (`status:active`, `vendor:Nike`, `price:\u003c=25`, `tag:sale`), and AND/OR/NOT. See the tool description for the full list of valid filter fields. Invalid fields are silently ignored and return all products.",
            "maxLength": 500,
            "type": "string"
          },
          "search_summary": {
            "description": "Concise but descriptive plain-text heading for these product results, written in the user's language. Identify the result type instead of repeating only the search term (for example, \"Your sneaker products\", not \"Your sneakers\"). The widget displays this text verbatim.",
            "maxLength": 160,
            "minLength": 1,
            "type": "string"
          },
          "sort_key": {
            "description": "Sort key for results. Use RELEVANCE only when search_query is provided.",
            "enum": [
              "TITLE",
              "PRODUCT_TYPE",
              "VENDOR",
              "INVENTORY_TOTAL",
              "UPDATED_AT",
              "CREATED_AT",
              "PUBLISHED_AT",
              "ID",
              "RELEVANCE"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "search_products",
      "title": "Search Products"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_inventory",
              "write_locations",
              "write_products"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Set the available inventory quantity for a specific inventory item at a given location. Always call get-inventory-levels first to get the inventoryItemId, locationId, and current available quantity. Pass the current quantity as compareQuantity so the update fails safely if stock changed since you read it.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "compareQuantity": {
            "description": "The current available quantity from get-inventory-levels. The update will fail if stock has changed since the read, preventing accidental overwrites.",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "inventoryItemId": {
            "description": "The inventory item GID (e.g. gid://shopify/InventoryItem/123)",
            "type": "string"
          },
          "locationId": {
            "description": "The location GID (e.g. gid://shopify/Location/456)",
            "type": "string"
          },
          "quantity": {
            "description": "The new quantity to set as available",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "reason": {
            "default": "correction",
            "description": "Why the inventory is being changed. Defaults to 'correction'. Use 'received' for new shipments, 'restock' for returns, 'shrinkage' for lost/stolen/damaged, 'damaged' for damaged goods, 'cycle_count_available' for cycle counts, or 'other' if none apply.",
            "enum": [
              "correction",
              "cycle_count_available",
              "damaged",
              "movement_created",
              "movement_updated",
              "movement_received",
              "movement_canceled",
              "other",
              "promotion",
              "quality_control",
              "received",
              "reservation_created",
              "reservation_deleted",
              "reservation_updated",
              "restock",
              "safety_stock",
              "shrinkage"
            ],
            "type": "string"
          }
        },
        "required": [
          "inventoryItemId",
          "locationId",
          "quantity",
          "compareQuantity"
        ],
        "type": "object"
      },
      "name": "set-inventory",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "imageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "inventoryItemId": {
            "type": "string"
          },
          "locationId": {
            "type": "string"
          },
          "locationName": {
            "type": "string"
          },
          "productDescription": {
            "type": [
              "string",
              "null"
            ]
          },
          "productTitle": {
            "type": "string"
          },
          "quantityAfterChange": {
            "type": "number"
          },
          "quantitySet": {
            "type": "number"
          },
          "variantTitle": {
            "type": "string"
          }
        },
        "required": [
          "inventoryItemId",
          "locationId",
          "locationName",
          "quantitySet",
          "quantityAfterChange",
          "productTitle",
          "productDescription",
          "variantTitle",
          "imageUrl"
        ],
        "type": "object"
      },
      "title": "Set Inventory"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Switch to a different Shopify store. Call this tool whenever the user wants to work with a different store — including when they ask to fetch data, manage products, or perform any action on another shop. Revokes the current store's access token so the next tool call will prompt authorization for a new store. IMPORTANT: You must always make a follow-up tool call after this tool returns. If the user requested a specific action (e.g. fetch products), call that tool next. Otherwise, you MUST call get-shop-info to complete the shop switch.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {},
        "type": "object"
      },
      "name": "switch-shop",
      "title": "Switch Shop"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Update an existing collection's title, description, image, sort order, or rules.\nUse this when the user wants to modify, change, or edit collection details.\nTrigger phrases include: \"update my collection\", \"change the collection\", \"edit the collection\", \"rename the collection\".\n\nIMAGE REQUIREMENTS:\n- Images must be publicly accessible HTTPS URLs (e.g. https://example.com/photo.jpg).\n- Local file paths (e.g. /mnt/data/..., file://...) are NOT supported and will fail.\n- If you only have a local file or a generated image, ask the user for a publicly accessible HTTPS URL; this host cannot upload one.\n- Avoid placeholder or non-deterministic image URLs (e.g. picsum.photos) for real collections.\n\nSMART COLLECTION RULES:\n- Pass `ruleSet` to update the rules for a smart collection.\n- Common rule columns: TAG, VENDOR, TYPE, TITLE, VARIANT_PRICE.\n- Common relations: EQUALS, NOT_EQUALS, CONTAINS, NOT_CONTAINS, STARTS_WITH, ENDS_WITH, GREATER_THAN, LESS_THAN.\n- Passing `ruleSet` replaces all existing rules. Omitting it leaves rules unchanged.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "descriptionHtml": {
            "description": "New HTML description of the collection",
            "type": "string"
          },
          "id": {
            "description": "The collection GID (e.g. gid://shopify/Collection/123)",
            "type": "string"
          },
          "image": {
            "description": "New collection image. Must be a publicly accessible HTTPS URL.",
            "properties": {
              "altText": {
                "description": "Image alt text",
                "type": "string"
              },
              "url": {
                "description": "Publicly accessible HTTPS image URL for the collection",
                "type": "string"
              }
            },
            "required": [
              "url"
            ],
            "type": "object"
          },
          "ruleSet": {
            "description": "Updated rules for a smart collection. Replaces all existing rules.",
            "properties": {
              "appliedDisjunctively": {
                "description": "true = products match ANY rule (OR), false = products match ALL rules (AND)",
                "type": "boolean"
              },
              "rules": {
                "items": {
                  "properties": {
                    "column": {
                      "description": "Rule column: TAG, VENDOR, TYPE, TITLE, VARIANT_PRICE, etc.",
                      "type": "string"
                    },
                    "condition": {
                      "description": "The value to match against (e.g. \"sale\", \"Nike\", \"50\")",
                      "type": "string"
                    },
                    "relation": {
                      "description": "Rule relation: EQUALS, NOT_EQUALS, CONTAINS, NOT_CONTAINS, STARTS_WITH, ENDS_WITH, GREATER_THAN, LESS_THAN",
                      "type": "string"
                    }
                  },
                  "required": [
                    "column",
                    "relation",
                    "condition"
                  ],
                  "type": "object"
                },
                "type": "array"
              }
            },
            "required": [
              "appliedDisjunctively",
              "rules"
            ],
            "type": "object"
          },
          "sortOrder": {
            "description": "New sort order for products in the collection",
            "enum": [
              "ALPHA_ASC",
              "ALPHA_DESC",
              "BEST_SELLING",
              "CREATED",
              "CREATED_DESC",
              "MANUAL",
              "PRICE_ASC",
              "PRICE_DESC"
            ],
            "type": "string"
          },
          "title": {
            "description": "New collection title",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "update-collection",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "collectionType": {
            "enum": [
              "manual",
              "smart"
            ],
            "type": "string"
          },
          "currencyCode": {
            "type": "string"
          },
          "descriptionHtml": {
            "type": "string"
          },
          "handle": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "imageAltText": {
            "type": [
              "string",
              "null"
            ]
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "products": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "currencyCode": {
                  "type": "string"
                },
                "imageUrl": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "price": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "variantTitle": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title",
                "variantTitle",
                "imageUrl",
                "price",
                "currencyCode",
                "status"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "productsCount": {
            "type": "number"
          },
          "rules": {
            "anyOf": [
              {
                "additionalProperties": false,
                "properties": {
                  "appliedDisjunctively": {
                    "type": "boolean"
                  },
                  "rules": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "column": {
                          "type": "string"
                        },
                        "condition": {
                          "type": "string"
                        },
                        "relation": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "column",
                        "relation",
                        "condition"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "appliedDisjunctively",
                  "rules"
                ],
                "type": "object"
              },
              {
                "type": "null"
              }
            ]
          },
          "sortOrder": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "updatedAt": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "handle",
          "descriptionHtml",
          "imageUrl",
          "imageAltText",
          "sortOrder",
          "collectionType",
          "productsCount",
          "products",
          "rules",
          "updatedAt",
          "currencyCode"
        ],
        "type": "object"
      },
      "title": "Update Collection"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          },
          {
            "scopes": [
              "write_products"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Update an existing product's title, description, status, images, variant pricing, or variant option values (e.g. color, size names).\nUse this when the user wants to modify, change, or edit product details — including status, variant prices, option values, or images.\nTrigger phrases include: 'update my product', 'change the price', 'edit the product', 'modify my product', 'rename the variant', 'change the color name'.\n\nIMAGE REQUIREMENTS:\n- Images must be publicly accessible HTTPS URLs (e.g. https://example.com/photo.jpg).\n- Local file paths (e.g. /mnt/data/..., file://...) are NOT supported and will fail.\n- If you only have a local file or a generated image, ask the user for a publicly accessible HTTPS URL; this host cannot upload one.\n- Avoid placeholder or non-deterministic image URLs (e.g. picsum.photos) for real products.\n\nREPLACING IMAGES:\n- To replace specific images, first use get-product to find the mediaId of the image(s) to remove.\n- Pass those mediaId values in removeMediaIds, and provide the new images in the images array.\n- To remove images without adding new ones, pass removeMediaIds without images.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "descriptionHtml": {
            "description": "New product description in HTML",
            "type": "string"
          },
          "id": {
            "description": "The product GID (e.g. gid://shopify/Product/123)",
            "type": "string"
          },
          "images": {
            "description": "Images to add to (or replace on) the product. Each image must have a publicly accessible HTTPS URL.",
            "items": {
              "properties": {
                "altText": {
                  "type": "string"
                },
                "url": {
                  "description": "Publicly accessible HTTPS image URL (e.g. https://cdn.example.com/photo.jpg). Local file paths are not supported.",
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "removeMediaIds": {
            "description": "Media IDs to remove from the product before adding new images (e.g. ['gid://shopify/MediaImage/123']). Use get-product to find media IDs for existing images.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "status": {
            "description": "New product status",
            "enum": [
              "ACTIVE",
              "ARCHIVED",
              "DRAFT"
            ],
            "type": "string"
          },
          "title": {
            "description": "New product title",
            "type": "string"
          },
          "variants": {
            "description": "Variant updates (id required, plus price/sku/compareAtPrice/optionValues)",
            "items": {
              "properties": {
                "compareAtPrice": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "id": {
                  "type": "string"
                },
                "optionValues": {
                  "description": "Option values to update on this variant (e.g. [{optionName: 'Color', name: 'Red'}])",
                  "items": {
                    "properties": {
                      "name": {
                        "description": "The new value for this option (e.g. 'Red', 'Large')",
                        "type": "string"
                      },
                      "optionName": {
                        "description": "The name of the product option (e.g. 'Color', 'Size')",
                        "type": "string"
                      }
                    },
                    "required": [
                      "optionName",
                      "name"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "price": {
                  "type": "string"
                },
                "sku": {
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "update-product",
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "currencyCode": {
            "type": "string"
          },
          "descriptionHtml": {
            "type": "string"
          },
          "featuredImageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "type": "string"
          },
          "images": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "altText": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "mediaId": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "url",
                "altText"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "productType": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "type": "string"
          },
          "totalInventory": {
            "type": "number"
          },
          "totalVariants": {
            "type": "number"
          },
          "variants": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "inventoryQuantity": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "price": {
                  "type": "string"
                },
                "sku": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "title": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "title",
                "sku",
                "price",
                "inventoryQuantity"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "vendor": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "vendor",
          "status",
          "productType",
          "descriptionHtml",
          "tags",
          "totalInventory",
          "featuredImageUrl",
          "images",
          "totalVariants",
          "variants",
          "currencyCode"
        ],
        "type": "object"
      },
      "title": "Update Product"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "type": "noauth"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Validates GraphQL operations against the Shopify schema to catch hallucinated fields, incorrect types, or invalid syntax BEFORE executing them.\nSupports the Shopify Admin GraphQL API.\n\nPass each GraphQL operation as a codeblock with raw GraphQL content (NOT markdown-formatted).\n\nAfter validation succeeds, execute the operation with graphql_query (for queries) or graphql_mutation (for mutations).\nIf validation fails, fix the errors and re-validate before executing.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "api": {
            "default": "admin",
            "description": "The GraphQL API to use. Valid options are:\n- 'admin': Write or explain Admin GraphQL queries and mutations for apps and integrations that extend the Shopify admin. Use this when the user wants to understand, design, or generate the operation itself. Prefer `admin-execution` instead when the user explicitly wants to run the operation against 'my store', 'this store', a store domain, or a warehouse/location, including simple store-result reads and multi-step store workflows that first look up IDs from handles, SKUs, or location names.\n- 'storefront-graphql': Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like \u003cshopify-store\u003e, \u003cshopify-cart\u003e, use storefront-web-components instead.\n- 'partner': The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.\n- 'customer': The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.\n- 'payments-apps': The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.\n- 'functions_cart_checkout_validation': GraphQL schema for Cart and Checkout Validation Function input queries\n- 'functions_cart_transform': GraphQL schema for Cart Transform Function input queries\n- 'functions_delivery_customization': GraphQL schema for Delivery Customization Function input queries\n- 'functions_discount': GraphQL schema for Discount Function input queries\n- 'functions_discounts_allocator': GraphQL schema for Discounts Allocator Function input queries\n- 'functions_fulfillment_constraints': GraphQL schema for Fulfillment Constraints Function input queries\n- 'functions_local_pickup_delivery_option_generator': GraphQL schema for Local Pickup Delivery Option Generator Function input queries\n- 'functions_order_discounts': GraphQL schema for Order Discounts Function input queries\n- 'functions_order_routing_location_rule': GraphQL schema for Order Routing Location Rule Function input queries\n- 'functions_payment_customization': GraphQL schema for Payment Customization Function input queries\n- 'functions_pickup_point_delivery_option_generator': GraphQL schema for Pickup Point Delivery Option Generator Function input queries\n- 'functions_product_discounts': GraphQL schema for Product Discounts Function input queries\n- 'functions_shipping_discounts': GraphQL schema for Shipping Discounts Function input queries\nDefault is 'admin'.",
            "enum": [
              "admin",
              "storefront-graphql",
              "partner",
              "customer",
              "payments-apps",
              "functions_cart_checkout_validation",
              "functions_cart_transform",
              "functions_delivery_customization",
              "functions_discount",
              "functions_discounts_allocator",
              "functions_fulfillment_constraints",
              "functions_local_pickup_delivery_option_generator",
              "functions_order_discounts",
              "functions_order_routing_location_rule",
              "functions_payment_customization",
              "functions_pickup_point_delivery_option_generator",
              "functions_product_discounts",
              "functions_shipping_discounts"
            ],
            "type": "string"
          },
          "codeblocks": {
            "description": "Array of GraphQL code blocks with content and optional artifact metadata",
            "items": {
              "properties": {
                "artifactId": {
                  "description": "Stable id assigned to the generated code artifact. Use the same artifactId when retrying validation on modified code to track iterations.",
                  "type": "string"
                },
                "content": {
                  "description": "The GraphQL code block content which should contain raw GraphQL code (e.g., 'query { shop { name } }'), NOT markdown-formatted code blocks with backticks",
                  "type": "string"
                },
                "revision": {
                  "description": "Monotonic revision number for the artifact. Start with 1 for new code, increment for each retry/iteration on the same artifactId. This helps track validation retries vs new validations.",
                  "exclusiveMinimum": 0,
                  "maximum": 9007199254740991,
                  "type": "integer"
                }
              },
              "required": [
                "content"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "codeblocks"
        ],
        "type": "object"
      },
      "name": "validate_graphql_codeblocks",
      "title": "validate_graphql_codeblocks"
    }
  ]
}
