This documentation always describes the current state of the main branch.
Values come from the process environment or from the .env file (search order see Installation). A template ships as .env.example in the repository. Lines starting with # are comments, values may be wrapped in single or double quotes.
| Variable | Description |
|---|---|
SHOPWARE_URL |
Base URL of the shop without a trailing slash, for example https://shop.example.com. Must be a valid URL. |
SHOPWARE_CLIENT_ID |
Client ID of the Shopware integration. |
SHOPWARE_CLIENT_SECRET |
Client secret of the Shopware integration. |
SHOPWARE_DEFAULT_TAX_ID |
ID of the default tax rate (32 hex characters), used by product_create when no taxId is passed. |
SHOPWARE_DEFAULT_SALES_CHANNEL_ID |
ID of the default sales channel. New products become visible there, and test mails use it as their context. |
WIKIJS_BASE_URL |
Must be a valid URL, otherwise startup aborts. The address is not used anywhere, see the note below. |
| Variable | Default | Description |
|---|---|---|
SHOPWARE_DEFAULT_TAX_RATE |
0 |
Tax rate in percent as a whole number. The net price is calculated from it, 0 suits small-business owners. An invalid value falls back to 0. |
SHOPWARE_DEFAULT_CURRENCY_ID |
b7d2554b0ce847cd82f3ac9bd1c0dfca |
Currency ID used for prices. The default is the ID of the EUR currency in a standard installation. |
CONTENT_PROFILES_PATH |
not set | Path to the content profiles file, absolute or relative to the working directory. Without a value the search order applies: ~/.claude/mcp-servers/shopwareadmin/content-profiles.json if present, otherwise ./content-profiles.json. |
LOG_LEVEL |
info |
debug, info, warn or error. Any other value is treated like info. |
CACHE_TTL_CATEGORIES |
3600000 |
Has no effect, see the note below. |
CACHE_TTL_PROPERTIES |
3600000 |
Has no effect, see the note below. |
CACHE_TTL_SNIPPETS |
300000 |
Has no effect, see the note below. |
WIKIJS_BASE_URLand the threeCACHE_TTL_*variables are read and validated at startup (valid URL, value greater than 0) but no service uses them afterwards. Cache lifetimes are fixed in the code, see Technical details. The wiki hook always yieldswikiUrl: nullin content results.
At startup a missing HTTPS scheme in
SHOPWARE_URLis only reported as a warning on stderr. The server also runs withhttp://but then sends the credentials unencrypted. No warning is printed forlocalhostand127.0.0.1.
.env.The server signs in with the OAuth2 client credentials grant (POST /api/oauth/token). These are the entities it addresses per tool area:
| Area | Entities | Access |
|---|---|---|
| Products, content | product, product_media, tag |
read, write |
| Categories | category |
read, write |
| Properties, manufacturers | property_group, property_group_option, product_manufacturer |
read |
| Mail templates | mail_template, mail_template_type |
read, write, send test mail |
| Media | media, media_folder, media_thumbnail |
read, write, create, delete after a failed upload |
| Orders | order with customer, addresses, line items, payments, deliveries, states, currency, sales channel |
read only |
| Flows | flow, flow_sequence, rule |
read, change flow |
| Cross-selling | product_cross_selling, assigned products, product_stream |
read, write |
| SEO URLs | seo_url |
read, write |
| Snippets | mmd-product-snippet (plugin) |
read |
The
.env.examplefile names only part of these permissions. The repository contains no permission check: whatever the integration may do, the server may do. Grant only the permissions of the areas you need and use separate integrations for test and production.
The tools product_generate_content, product_generate_seo, variant_generate_content and category_generate_content produce instructions for Claude. Tone, form of address, structure and target audience come from content profiles that you define in a JSON file.
CONTENT_PROFILES_PATH, if set.~/.claude/mcp-servers/shopwareadmin/content-profiles.json, if present../content-profiles.json in the working directory.If the server finds no file at the resolved location it uses the built-in profiles and writes a note to the log. This also applies when CONTENT_PROFILES_PATH points to a missing file. An existing but invalid file prevents startup, with one error message per faulty field.
{
"language": "de",
"defaultProfile": "creative",
"profiles": {
"creative": {
"tonality": "Persoenlich, warm, emotional",
"addressing": "du",
"structure": ["Emotionaler Einstieg (Frage/Anekdote)", "Was ist es?", "Technische Details (Format, Groesse)", "Anwendungstipps"],
"targetAudience": "Hobbybastler, Kreative, DIY-Enthusiasten",
"exampleIntro": "Was waere denn Ostern ohne den Osterhasen?",
"includeSnippets": false
}
},
"categoryMapping": {
"Stickdateien": "creative"
}
}
| Field | Type | Description |
|---|---|---|
language |
text, 2 to 5 characters | Default de. Read but not evaluated by any tool. |
defaultProfile |
text | Required. Name of an existing profile, applies when no category matches. |
profiles |
object | Required, at least one profile. The key is the profile name and also the value for the style parameter. |
profiles.*.tonality |
text | Required, not empty. |
profiles.*.addressing |
du or Sie |
Required, exactly this spelling. |
profiles.*.structure |
list of texts | Required, at least one entry. |
profiles.*.targetAudience |
text | Required, not empty. |
profiles.*.exampleIntro |
text | Required, not empty. |
profiles.*.includeSnippets |
boolean | Default false. With true the server offers the active snippets. |
categoryMapping |
object | Required (may be empty). Category name to profile name, every value must be an existing profile. |
Without a file the profiles creative (address du, default) and software (address Sie, with snippets) apply. The category mapping is Software to software and Stickdateien, Genaehtes and 3D-Druck to creative. These are the values of the author's shop.
categoryMapping. The first hit counted from the root wins.defaultProfile applies.style parameter overrides detection. An unknown name leads to INVALID_INPUT with the list of available profiles.variant_generate_content has no style parameter and always detects the style automatically.With includeSnippets: true the server queries the mmd-product-snippet entity. It comes from a Shopware plugin for product text snippets that must be installed in the shop. Without that plugin the query fails with an API error, and so does the snippet_list tool.