Saleor MCP Server

A Model Context Protocol implementation for interacting with Saleor e-commerce platform

Welcome to Saleor MCP

Transform how you interact with your Saleor store data

The Model Context Protocol (MCP) is a way to plug Saleor's API into an LLM, letting you ask questions about your store data in the context of the LLM itself. This lets you take an agent that you already use, like Cursor, and pull in additional information from Saleor to help with tasks like business analysis, inventory management, and customer insights.

Connecting Saleor to LLMs allows you to easily get answers to questions like:

  • "Which products are running low on stock?"
  • "Customer insights from this month"
  • "Show recent orders that need attention"

This provides an easy interface to learn insights about your Saleor store without needing to navigate through different dashboards or write complex queries.

Getting Started

Quick setup guide to get you up and running

To get started with the Saleor MCP server, visit our GitHub repository which contains detailed installation instructions, configuration guides, and examples.

Note: The repository includes setup instructions for various MCP clients, authentication configuration, and example usage scenarios.

Available Tools

Pre-configured functions for common Saleor operations

Tools are pre-configured functions that can be used to help with common tasks. Each tool provides specific functionality for interacting with your Saleor store data.

Add a channel, and optionally countries, to a shipping zone.Attaching the channel alone is NOT enough to make stock visible. Saleor resolves availability through warehouses "operating in shipping zones that contain this country", so the zone must ALSO list the country the channel sells to. Attaching a GBP/GB channel to a zone whose countries are ``[US]`` leaves every product showing as out of stock while every other call still reports success.

Arguments:

  • shipping_zone_id (required) str:
  • channel_id (required) str:
  • add_countries list[str] | None:

Attach a real image to a product from any public image URL.This is the tool to use for product photos. ``add_product_media`` takes a ``media_url``, but Saleor's ``mediaUrl`` input is for embedding external VIDEO (YouTube/Vimeo) and rejects image URLs -- use this instead.

Arguments:

  • product_id (required) str:
  • source_url (required) str:
  • alt str | None:

Embed EXTERNAL VIDEO (YouTube/Vimeo) on a product. Not for images.This maps to Saleor's ``mediaUrl`` input, which only accepts recognised oEmbed video providers. Passing an image URL fails with UNSUPPORTED_MEDIA_PROVIDER, however valid and public the URL is.

Arguments:

  • product_id (required) str:
  • media_url (required) str:
  • alt str | None:

Attach real images to many products in one call.The tool to use when cataloguing a store: one image per product means one call per product otherwise, turning a 50 product import into 50 round-trips.

Arguments:

  • items (required) list[dict[str, str]]:

Attach an image you uploaded via ``create_presigned_upload_urls``.Completes the local-bytes flow: presign, PUT the bytes yourself, then call this with the returned ``key`` or ``public_url``.

Arguments:

  • product_id (required) str:
  • key_or_public_url (required) str:
  • alt str | None:

Arguments:

  • collection_id (required) str:
  • product_id (required) str:

Attach warehouses to a channel so its products can be sold.Saleor resolves ``quantityAvailable`` in channel context from the channel's own warehouse relation. A channel with no warehouses shows every product as out of stock regardless of warehouse stock levels, and this link is separate from the shipping-zone linkage -- attaching the zone to the channel does not create it. ``create_channel(warehouse_ids=[...])`` sets this at creation; use this tool to repair a channel that was created without it.

Arguments:

  • channel_id (required) str:
  • warehouse_ids (required) list[str]:

Fetch the list of channels from Saleor.This tools retrieves the list of channels. For each channel it returns information such as: ID, name, slug, currency code, default country, whether the channel is active, and the list of warehouses.

No additional arguments required

Diagnose why products in a channel are not buyable or show as out of stock.Verifies the whole availability chain and reports which link is broken:

Arguments:

  • channel (required) str:

Create a catalogue promotion that reduces product prices visibly.This is the modern way to create sales in Saleor 3.x. The discount will be visible on the ProductVariant.pricing.onSale field.

Arguments:

  • name (required) str:
  • reward_value (required) float:
  • reward_value_type str:
  • product_ids list[str] | None:
  • variant_ids list[str] | None:
  • channel_ids list[str] | None:
  • start_date str | None:
  • end_date str | None:

Create a new category in Saleor.Args: ctx: MCP context for logging and request metadata name: Category name slug: URL-friendly slug (auto-generated from name if not provided)

Arguments:

  • name (required) str:
  • slug str | None:

Create a new channel in Saleor.Pass ``warehouse_ids``. A channel with no warehouses sells nothing: Saleor resolves ``quantityAvailable`` in channel context from the channel's own warehouse relation, so every product shows as out of stock no matter how much stock the warehouse holds. Nothing else reports an error, and the warehouse being in a shipping zone attached to the channel is NOT enough -- the channel-warehouse link is separate.

Arguments:

  • name (required) str:
  • slug (required) str:
  • currency_code str:
  • default_country str:
  • is_active bool:
  • warehouse_ids list[str] | None:
  • shipping_zone_ids list[str] | None:

Create presigned URLs for uploading image bytes you hold locally.Only needed when you have raw bytes. If the image is ALREADY at a public URL, skip this entirely and call ``add_product_media`` (or ``add_product_media_bulk``) with that URL -- Saleor fetches it directly.

Arguments:

  • file_names (required) list[str]:
  • expires_in int:
  • max_bytes int:
  • upload_method str:

Create a new product in Saleor.Args: ctx: MCP context for logging and request metadata name: Name of the product (e.g., "OCR Credits - 2,000 Pages") product_type_id: ID of the product type slug: URL-friendly slug (optional) description: Product description in JSON format (optional)

Arguments:

  • name (required) str:
  • product_type_id (required) str:
  • slug str | None:
  • description str | None:

Create a new product type in Saleor.Args: ctx: MCP context for logging and request metadata name: Name of the product type (e.g., "Digital Credits") slug: URL-friendly slug (optional, auto-generated if not provided) is_digital: Whether products are digital (default: True for credits) is_shipping_required: Whether shipping is required (default: False) has_variants: Whether products have multiple variants (default: False)

Arguments:

  • name (required) str:
  • slug str | None:
  • is_digital bool:
  • is_shipping_required bool:
  • has_variants bool:

Create a product variant in Saleor.Args: ctx: MCP context for logging and request metadata product_id: ID of the parent product sku: Stock Keeping Unit (e.g., "ocr-credits-2000") name: Variant name (optional)

Arguments:

  • product_id (required) str:
  • sku (required) str:
  • name str | None:

Create a new sale/discount in Saleor.Args: ctx: MCP context for logging and request metadata name: Name of the sale (e.g., "New Year Sale - 30% Off") sale_type: Type of discount - "PERCENTAGE" or "FIXED" variants: List of variant IDs to include in the sale products: List of product IDs to include in the sale start_date: Optional ISO date string for when sale starts end_date: Optional ISO date string for when sale ends

Arguments:

  • name (required) str:
  • sale_type str:
  • variants list[str] | None:
  • products list[str] | None:
  • start_date str | None:
  • end_date str | None:

Create a delivery option and price it in one or more channels.Without a shipping rate priced in the buyer's channel, checkout fails with "No shipping methods available for " no matter how correct the stock and zone setup is. This tool always sets the channel listings, so a rate cannot be created that is invisible to the channel it was meant for.

Arguments:

  • name (required) str:
  • shipping_zone_id (required) str:
  • channel_prices (required) list[dict[str, Any]]:
  • description str | None:
  • minimum_delivery_days int | None:
  • maximum_delivery_days int | None:

Return the current domain of the connected Saleor instance.

No additional arguments required

Fetch list of customers from Saleor GraphQL API.This tool retrieves customer information such as: ID, active status, language code, last login, date joined, and default shipping/billing address country.

Arguments:

  • first int | None: Number of customers to fetch (max 100 per request)
  • after str | None: Cursor for pagination - fetch customers after this cursor
  • sort_by saleor_mcp.saleor_client.input_types.UserSortingInput | None: Sort customers by specific field
  • filter saleor_mcp.tools.customers.CustomerFilterInput | None: Filter customers by specific criteria

Delete product images by media ID.Makes image mistakes recoverable: without this, a wrong or placeholder image attached during an import can only be removed from the dashboard. Find IDs with ``list_product_media``.

Arguments:

  • media_ids (required) list[str]:

Delete a promotion from Saleor.Args: ctx: MCP context for logging and request metadata promotion_id: ID of the promotion to delete

Arguments:

  • promotion_id (required) str:

Delete a sale/discount from Saleor.Args: ctx: MCP context for logging and request metadata sale_id: ID of the sale to delete

Arguments:

  • sale_id (required) str:

No additional arguments required

Get product pricing including discounts for a channel.Returns both the regular price and discounted price (if a sale applies) for all product variants in a channel.

Arguments:

  • channel str:
  • first int:

List all categories in Saleor.

No additional arguments required

List the images attached to a product, with their IDs.Use before ``delete_product_media`` to find the IDs to remove, or to check whether a product still needs an image.

Arguments:

  • product_id (required) str:

List all promotions in Saleor.

No additional arguments required

List all sales/discounts in Saleor.Args: ctx: MCP context for logging and request metadata channel: Optional channel slug to filter sales by channel

Arguments:

  • channel str | None:

List shipping rates and, crucially, which channels each is priced in.A rate only offers delivery in a channel it has a channel listing for. A zone can hold rates that are invisible to a given channel, which surfaces on the storefront as "No shipping methods available for " even though the zone, warehouse and stock are all correct.

Arguments:

  • shipping_zone_id str | None:

List all shipping zones in Saleor.The ``countries`` field matters: Saleor resolves stock availability through warehouses operating in a shipping zone that *contains the buyer's country*. A zone whose countries do not include the country a channel sells to will make every product in that channel show as out of stock, even when the warehouse holds stock.

No additional arguments required

List all warehouses in Saleor.

No additional arguments required

Fetch total count of orders from Saleor GraphQL API.This tool retrieves the total count of orders based on the provided filter criteria.

Arguments:

  • filter saleor_mcp.tools.orders.OrderFilterInput | None: Filter and search orders by specific criteria

Fetch list of orders from Saleor GraphQL API.This tool retrieves the list of orders. For each order it returns information such as: ID, number, status, creation date, last update date, payment status, total amount, shipping and billing address country, order lines which include: quantity, product SKU, variant name, product ID, product name, unit price.

Arguments:

  • first int | None: Number of orders to fetch (max 100 per request)
  • after str | None: Cursor for pagination - fetch orders after this cursor
  • sort_by saleor_mcp.saleor_client.input_types.OrderSortingInput | None: Sort orders by specific field
  • filter saleor_mcp.tools.orders.OrderFilterInput | None: Filter and search orders by specific criteria

Fetch list of products from Saleor GraphQL API.This tool retrieves product information such as: ID, name, slug, external reference, product type, category, date of creation, date of last update, and pricing.

Arguments:

  • first int | None: Number of products to fetch (max 100 per request)
  • after str | None: Cursor for pagination - fetch products after this cursor
  • channel str | None: Slug of a channel for which the data should be returned. If not provided, general product data is returned.
  • sort_by saleor_mcp.saleor_client.input_types.ProductOrder | None: Sort products by specific field
  • search str | None: Search products with full-text search

Publish a product to a specific channel.Args: ctx: MCP context for logging and request metadata product_id: ID of the product to publish channel_id: ID of the channel to publish to is_published: Whether the product is published (default: True) is_available_for_purchase: Whether available for purchase (default: True) visible_in_listings: Whether visible in listings (default: True)

Arguments:

  • product_id (required) str:
  • channel_id (required) str:
  • is_published bool:
  • is_available_for_purchase bool:
  • visible_in_listings bool:

Price an existing shipping rate in one or more channels.Use to make an existing rate available in a channel it was not priced in -- the usual cause of "No shipping methods available for " when a zone already has rates. Find rate IDs with ``list_shipping_rates``.

Arguments:

  • shipping_rate_id (required) str:
  • channel_prices (required) list[dict[str, Any]]:

Set the price of a product variant in a specific channel.The currency is determined by the channel's configured currency.

Arguments:

  • variant_id (required) str:
  • channel_id (required) str:
  • price (required) float:

Set stock quantity for a variant in a warehouse.Setting stock is not sufficient for the storefront to show the variant as in stock. Saleor resolves availability through warehouses operating in a shipping zone that contains the buyer's country, so this warehouse must belong to a shipping zone that is assigned to the channel AND lists that channel's selling country. See ``add_channel_to_shipping_zone`` for the full chain, and ``check_channel_readiness`` to verify it.

Arguments:

  • variant_id (required) str:
  • warehouse_id (required) str:
  • quantity int:

Fetch list of stocks from Saleor GraphQL API.This tool retrieves stock information such as: ID, quantity, allocated quantity, warehouse information, and associated product variant details.

Arguments:

  • first int | None: Number of stocks to fetch (max 100 per request)
  • after str | None: Cursor for pagination - fetch stocks after this cursor
  • filter saleor_mcp.saleor_client.input_types.StockFilterInput | None: Filter stocks by specific criteria

Assign a category to a product.Args: ctx: MCP context for logging and request metadata product_id: ID of the product to update category_id: ID of the category to assign

Arguments:

  • product_id (required) str:
  • category_id (required) str:

Update the discount value for a sale in a specific channel.Args: ctx: MCP context for logging and request metadata sale_id: ID of the sale to update channel_id: ID of the channel discount_value: Discount value (percentage or fixed amount depending on sale type)

Arguments:

  • sale_id (required) str:
  • channel_id (required) str:
  • discount_value (required) float:

Fetch warehouse details from Saleor GraphQL API.This tool retrieves detailed warehouse information including: ID, name, slug, address details, click and collect options, associated shipping zones with their channels and countries, and metadata.

Arguments:

  • id str | None: ID of the warehouse to fetch details for