This documentation always describes the current state of the main branch.
The server provides 42 tools. The limits below come from the input validation (Zod), which validates every call before it runs.
| Area | Count | Tools |
|---|---|---|
| Products | 6 | product_create, product_get, product_list, product_update, product_set_active, search_products |
| Content | 4 | product_generate_content, product_generate_seo, variant_generate_content, content_update |
| Categories | 4 | category_list, category_get, category_generate_content, category_update |
| Helpers | 3 | get_properties, get_manufacturers, snippet_list |
| Mail templates | 4 | mail_template_list, mail_template_get, mail_template_update, mail_template_send_test |
| Flows | 3 | flow_list, flow_get, flow_toggle |
| Media | 6 | media_list, media_get, media_update, media_search, media_audit_alt, media_upload_url |
| Orders | 3 | order_list, order_get, order_stats |
| Cross-selling | 5 | cross_selling_list, cross_selling_get, cross_selling_create, cross_selling_update, cross_selling_suggest |
| SEO URLs | 4 | seo_url_list, seo_url_audit, seo_url_update, seo_url_generate |
limit and offset. The server derives the page as offset / limit + 1, an offset that is not a multiple of limit is rounded down.isError. The format is described under Technical details.product_create always creates an inactive product. Only what you pass is changed.| Tool | Parameters | Behaviour |
|---|---|---|
product_create |
Required: name (1 to 255), productNumber (1 to 64), price (gross, greater than 0), categoryId. Optional: description (HTML, up to 65535), ean (up to 50), manufacturerId, taxId, stock (integer, from 0, default 0), salesChannelId, tags, searchKeywords |
Creates the product always inactive, with visibility "everywhere" in the sales channel. The price is stored as gross in the default currency, the net price is calculated from SHOPWARE_DEFAULT_TAX_RATE. Tags are created when needed. A duplicate product number yields PRODUCT_NUMBER_EXISTS. Returns id, productNumber, name, active. |
product_get |
id or productNumber (one of them) |
Returns the product with categories, manufacturer, variants including options, properties and media. Cached for 5 minutes. |
product_list |
categoryId, active, search (up to 255, searches name and product number), limit (1 to 100, default 25), offset |
Returns products and total. |
product_update |
Required: id. Optional: name, price, description, ean, stock, manufacturerId, customFields (up to 50 fields, values text up to 5000, number, boolean or null), metaTitle, metaDescription, keywords (each up to 255), tags, searchKeywords |
Writes through the sync API (upsert with the product's version ID). The price is gross, the net price comes from SHOPWARE_DEFAULT_TAX_RATE. |
product_set_active |
id, active |
Activates or deactivates the product. |
search_products |
query (2 to 255), limit (1 to 50, default 20) |
Full-text search. Returns id, productNumber, name, active. |
These tools do not produce text. They provide context and instructions, Claude writes the text. It is saved with content_update.
| Tool | Parameters | Behaviour |
|---|---|---|
product_generate_content |
Required: productId. Optional: style, maxLength (200 to 5000, default 1000), includeSnippets (default true), snippetIds |
Returns style, profile, context, wikiUrl (always null), availableSnippets, maxLength and prompt. The prompt text is in German and contains product data, properties, profile instructions and the first 500 characters of the existing description without HTML. Snippets are only offered for a profile with includeSnippets: true. |
product_generate_seo |
Required: productId. Optional: style, maxTitleLength (30 to 70, default 60), maxDescriptionLength (100 to 160, default 155) |
Returns style, profile, productName, categoryPath, existingDescription, constraints and prompt. |
variant_generate_content |
Required: variantId. Optional: inheritFromParent (default true), focusOnOptions (default true) |
Prompt for the variant description, fixed length 500. inheritFromParent has no effect: the server does not load a parent product, the prompt is based on the variant itself. Style detection also runs automatically on the variant's own categories, there is no style parameter. |
content_update |
Required: productId. Optional: description (up to 65535), metaTitle, metaDescription, keywords (each up to 255) |
Saves through the same update as product_update. Returns productId and the list of changed fields. |
| Tool | Parameters | Behaviour |
|---|---|---|
category_list |
parentId, depth (1 to 10, default 3), includeInactive (default false) |
Flat list of up to 500 categories. With parentId only direct children. children is always empty, depth does not change the result. productCount is the number of subcategories. Cached for 10 minutes. |
category_get |
Required: id. Optional: includeProducts (default false), productLimit (1 to 100, default 25) |
Category with breadcrumb and SEO data, optionally with a product list. |
category_generate_content |
Required: id. Optional: style, maxLength (100 to 2000, default 500) |
Returns the category (id, name, breadcrumb), style, maxLength and a short English instruction with the profile's form of address, tone and target audience. |
category_update |
Required: id. Optional: description (up to 65535), metaTitle, metaDescription, keywords (each up to 255) |
Updates the fields and then clears the server's entire cache. |
| Tool | Parameters | Behaviour |
|---|---|---|
get_properties |
groupId |
Property groups with options, up to 100 groups, sorted by position. |
get_manufacturers |
search (up to 100), limit (1 to 100, default 50) |
Manufacturers with link, description and logo. The list without a search is cached for 10 minutes. |
snippet_list |
activeOnly (default true) |
Snippets of the plugin with the mmd-product-snippet entity, up to 100, with identifier, name and active. |
Templates can neither be created nor deleted.
| Tool | Parameters | Behaviour |
|---|---|---|
mail_template_list |
search (type name or subject), limit (1 to 100, default 50), offset |
Returns templates with technicalName, typeName, subject, systemDefault, updatedAt as well as count and total. |
mail_template_get |
id or technicalName |
Details with subject, HTML and plain content and the mail type including the entities available for Twig. Cached for 10 minutes. |
mail_template_update |
Required: id. Optional: subject (1 to 998), contentHtml, contentPlain (each up to 16777215), senderName (up to 255), description (up to 65535) |
Changes only the fields you pass. Twig syntax stays untouched in the content. |
mail_template_send_test |
Required: mailTemplateId, recipient. Optional: salesChannelId |
Sends the template in test mode (Shopware fills Twig variables with sample data). The recipient must be a valid email address up to 254 characters and must neither contain localhost nor use an IP address as domain. Limited to 5 calls per template and 10 in total per minute (RATE_LIMITED). |
| Tool | Parameters | Behaviour |
|---|---|---|
flow_list |
active, eventName (exact), search (name or description), hasMailAction, limit (1 to 100, default 50), offset |
List with actionCount and hasMailAction. action.mail.send and action.mail.send.create.document count as mail actions. The hasMailAction filter applies after the page was fetched, so total then counts only the filtered page. |
flow_get |
id or name (exact) |
Flow with sequences as a tree ordered by position, including the rule. Cached for 5 minutes. |
flow_toggle |
id, active |
Switches the flow on or off and returns the updated flow. |
| Tool | Parameters | Behaviour |
|---|---|---|
media_list |
mediaFolderId, mimeTypePrefix (format type/, such as image/), hasAlt, limit (1 to 100, default 25), offset |
Newest first. hasAlt: false returns media without alt text (NULL). Returns count, total, media. |
media_get |
id |
Details with thumbnails, folder and the products that use the medium. Cached for 5 minutes. |
media_update |
Required: id. Optional: alt, title (each up to 255) |
At least one of the two is required. |
media_search |
query (2 to 255), limit (1 to 50, default 20) |
Full-text search across file name, alt text and title. |
media_audit_alt |
onlyActive (default true), limit (1 to 200, default 100) |
Finds images (image/) without alt text through the product-media assignment and groups them per medium with the affected products. The limit applies to the queried assignments. If that query fails, the route through the media entity is used. Returns totalMediaChecked, missingAltCount, affectedProductCount, items, recommendation. |
media_upload_url |
Required: url (http or https, up to 2048). Optional: alt, title, mediaFolderId |
Creates a medium and has Shopware download the file from the URL. File name and extension come from the URL, extensions not on the list become jpg. Allowed: jpg, jpeg, png, gif, webp, svg, bmp, tiff, tif, pdf, ico. If the download fails the created medium is deleted again. Internal and private addresses are rejected, see Security. |
| Tool | Parameters | Behaviour |
|---|---|---|
order_list |
orderStatus (open, in_progress, completed, cancelled), paymentStatus (open, authorized, paid, paid_partially, refunded, refunded_partially, failed, cancelled, unconfirmed, reminded, chargeback), deliveryStatus (open, shipped, shipped_partially, returned, returned_partially, cancelled), customerEmail (substring), dateFrom, dateTo (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS), limit (1 to 100, default 25), offset |
Newest first. Returns count, total, orders including customerName and customerEmail. dateFrom and dateTo are passed unchanged to Shopware as lower and upper bound. Whether the end day is still included for a plain date depends on how Shopware interprets the date. |
order_get |
id or orderNumber |
Order with customer (including company), billing and shipping address (with phone number), line items, payments, deliveries and customer comment. Cached for 2 minutes. |
order_stats |
dateFrom, dateTo |
Count, revenue (sum of the order totals), average order value (average of the order total per order, including shipping and tax, rounded to two decimals), breakdown by order and payment status, period and currency symbol. The same date caveat as for order_list applies. |
The order tools bring personal data (name, email, addresses, phone number) into the conversation with Claude. See Security and privacy.
| Tool | Parameters | Behaviour |
|---|---|---|
cross_selling_list |
productId |
Up to 50 groups with id, name, type, active, position, assignedProductCount. |
cross_selling_get |
id |
Group with assigned products and, where applicable, the product stream. Cached for 5 minutes. |
cross_selling_create |
Required: productId, name (1 to 255). Optional: type (productList or productStream, default productList), active (default true), position (from 0, default 1), sortBy (name, cheapestPrice, releaseDate, productNumber), sortDirection (ASC, DESC), limit (1 to 100, default 24), assignedProductIds, productStreamId |
Creates the group. The order of assignedProductIds determines the position. |
cross_selling_update |
Required: id. Optional: name, active, position, sortBy, sortDirection, limit, assignedProductIds |
Changes only the fields you pass. |
cross_selling_suggest |
Required: productId. Optional: limit (5 to 50, default 20) |
Provides context for recommendations: the source product with properties, candidates (active products from the same categories, main products only, no variant child products) and the names of existing groups. Claude makes the selection. |
Allowed values for routeName: frontend.detail.page (product), frontend.navigation.page (category), frontend.landing.page (landing page).
| Tool | Parameters | Behaviour |
|---|---|---|
seo_url_list |
routeName, salesChannelId, foreignKey, isCanonical, isDeleted, search (2 to 255), limit (1 to 100, default 25), offset |
Sorted by path. Returns urls and total. |
seo_url_audit |
routeName, salesChannelId, limit (10 to 500, default 200) |
Checks the first URLs (sorted by entity) for three problems: deleted_url (warning), duplicate_path (error, several canonical URLs with the same path in the same sales channel) and no_canonical (error, entity without a canonical URL). When limit truncates the data, findings can be incomplete. |
seo_url_update |
Required: id. Optional: seoPathInfo (1 to 2048), isCanonical, isDeleted |
At least one field is required. A new seoPathInfo automatically sets isModified to true. |
seo_url_generate |
routeName, salesChannelId (both required) |
Calls the Shopware action /api/_action/seo-url/create-custom-url and falls back to /api/_action/seo-url/canonical on error. |