Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion guides/development/testing/unit/php-unit.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ class Migration1611740369ExampleDescriptionTest extends TestCase

## Mocking services

In some cases, a service should behave differently in a test run. Such a case could be where a service deletes a file or makes a critical API call. To avoid this in a test run, you can create a `<plugin root>/Resources/config/services_test.{xml|yml}` file that overrides your `<plugin root>/Resources/config/services.{xml|yml}`. But only for the test environment.
In some cases, a service should behave differently in a test run. Such a case could be where a service deletes a file or makes a critical API call. To avoid this in a test run, you can create a `<plugin root>/Resources/config/services_test.php` file that overrides your `<plugin root>/Resources/config/services.php`. But only for the test environment.

In this test-only service config, you can override arguments, aliases, or parameters to change what the service container injects into services during a test run.

Expand Down
2 changes: 1 addition & 1 deletion guides/plugins/plugins/checkout/cart/add-cart-discounts.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,4 @@ Shopware comes with a called `LineItemRule`, which requires two parameters:

After adding the definition to the line item, we have to calculate the current price of the discount. Therefore we can use the `PercentagePriceCalculator` of the core. The last step is to add the discount to the new cart which is provided as `Cart $toCalculate`.

That's it for the main code of our custom `CartProcessor`. Now we only have to register it in our `services.php` using the tag `shopware.cart.processor` and priority `4500`, which is used to get access to the calculation after the [product processor](https://github.com/shopware/shopware/blob/v6.3.4.1/src/Core/Checkout/DependencyInjection/cart.xml#L223-L231) handled the products.
That's it for the main code of our custom `CartProcessor`. Now we only have to register it in our `services.php` using the tag `shopware.cart.processor` and priority `4500`, which is used to get access to the calculation after the [product processor](https://github.com/shopware/shopware/blob/v6.7.14.0/src/Core/Checkout/DependencyInjection/cart.php#L505-L516) handled the products.
21 changes: 11 additions & 10 deletions guides/plugins/plugins/framework/caching/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -297,16 +297,17 @@

:::code-group

```xml [PLUGIN_ROOT/src/Core/Framework/DependencyInjection/cache.xml]
<service id="Shopware\Core\Framework\Adapter\Cache\CacheInvalidationSubscriber">
<tag name="kernel.event_listener" event="Shopware\Core\Content\Category\Event\CategoryIndexerEvent" method="invalidateCategoryRouteByCategoryIds" priority="2000" />

<tag name="kernel.event_listener" event="Shopware\Core\Content\Category\Event\CategoryIndexerEvent" method="invalidateListingRouteByCategoryIds" priority="2001" />

<tag name="kernel.event_listener" event="Shopware\Core\Content\LandingPage\Event\LandingPageIndexerEvent" method="invalidateIndexedLandingPages" priority="2000" />

<!-- ... -->
</service>
```php [src/Core/Framework/DependencyInjection/cache.php]

Check warning on line 300 in guides/plugins/plugins/framework/caching/index.md

View workflow job for this annotation

GitHub Actions / LanguageTool

[LanguageTool] guides/plugins/plugins/framework/caching/index.md#L300

File types are normally capitalized. (FILE_EXTENSIONS_CASE[1]) Suggestions: `PHP` URL: https://languagetool.org/insights/post/spelling-capital-letters/ Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1 Category: CASING
Raw output
guides/plugins/plugins/framework/caching/index.md:300:3: File types are normally capitalized. (FILE_EXTENSIONS_CASE[1])
 Suggestions: `PHP`
 URL: https://languagetool.org/insights/post/spelling-capital-letters/ 
 Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1
 Category: CASING
$services->set(CacheInvalidationSubscriber::class)
->args([
service(CacheInvalidator::class),
service(Connection::class),
param('shopware.product_stream.indexing'),
])
->tag('kernel.event_listener', ['event' => CategoryIndexerEvent::class, 'method' => 'invalidateCategoryRouteByCategoryIds', 'priority' => 2000])
->tag('kernel.event_listener', ['event' => LandingPageIndexerEvent::class, 'method' => 'invalidateIndexedLandingPages', 'priority' => 2000])
// ...
;
```

:::
Expand Down
46 changes: 25 additions & 21 deletions guides/plugins/plugins/mcp-server.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
│ └── MyTool.php # MCP tool class
└── Resources/
└── config/
└── services.xml # Service registration
└── services.php # Service registration
```

## Step 1: Create the tool class
Expand Down Expand Up @@ -134,23 +134,27 @@

## Step 3: Register the service

In `src/Resources/config/services.xml`, tag the service with `shopware.mcp.tool`:

```xml
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services
http://symfony.com/schema/dic/services/services-1.0.xsd">

<services>
<service id="Swag\MyPlugin\Mcp\Tool\MyTool">
<argument type="service" id="order.repository"/>
<argument type="service" id="Shopware\Core\Framework\Mcp\Context\McpContextProvider"/>
<tag name="shopware.mcp.tool"/>
</service>
</services>
</container>
In `src/Resources/config/services.php`, tag the service with `shopware.mcp.tool`:

Check warning on line 137 in guides/plugins/plugins/mcp-server.md

View workflow job for this annotation

GitHub Actions / LanguageTool

[LanguageTool] guides/plugins/plugins/mcp-server.md#L137

File types are normally capitalized. (FILE_EXTENSIONS_CASE[1]) Suggestions: `PHP` URL: https://languagetool.org/insights/post/spelling-capital-letters/ Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1 Category: CASING
Raw output
guides/plugins/plugins/mcp-server.md:137:28: File types are normally capitalized. (FILE_EXTENSIONS_CASE[1])
 Suggestions: `PHP`
 URL: https://languagetool.org/insights/post/spelling-capital-letters/ 
 Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1
 Category: CASING

```php
<?php declare(strict_types=1);

use Shopware\Core\Framework\Mcp\Context\McpContextProvider;
use Swag\MyPlugin\Mcp\Tool\MyTool;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;

use function Symfony\Component\DependencyInjection\Loader\Configurator\service;

return static function (ContainerConfigurator $configurator): void {
$services = $configurator->services();

$services->set(MyTool::class)
->args([
service('order.repository'),
service(McpContextProvider::class),
])
->tag('shopware.mcp.tool');
};
```

Plugin tools use `shopware.mcp.tool` (not `mcp.tool`). The MCP compiler remaps this tag to `mcp.tool` at compile time and registers the tool with the MCP server builder. You do not need a `shopware.feature` flag tag; the MCP feature flag gates the server endpoint itself, and once it is enabled, all registered tools are available.
Expand Down Expand Up @@ -180,7 +184,7 @@
If the tool appears here, it is available in the live HTTP endpoint. If it does not appear, check:

- Plugin is installed and active
- Service has `<tag name="shopware.mcp.tool"/>`
- Service is tagged with `shopware.mcp.tool`
- `#[McpTool]` is on the class, not on `__invoke()`

## Adding prompts
Expand Down Expand Up @@ -234,8 +238,8 @@
```php
public function build(ContainerBuilder $container): void
{
$loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/Resources/config'));
$loader->load('services.xml');
$loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/Resources/config'));
$loader->load('services.php');
}
```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Refer to the [Plugin Base Guide](../../plugin-base-guide.md).
In the following sections, we will create and expand all necessary files for the Twig function to work. There are two such files:

* PHP file with the twig functions itself and
* Services.xml
* services.php

## Creating the Twig function

Expand Down Expand Up @@ -70,6 +70,8 @@ $services->set(SwagCreateMd5Hash::class)
->tag('twig.extension'); // Required
```

:::

Once done, you can access this `TwigFunction` within your plugin.

## Use Twig function in template
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@

Converters are registered in the service container:

```html
<service id="SwagMigrationAssistant\Profile\Shopware\Converter\ProductConverter"
parent="SwagMigrationAssistant\Profile\Shopware\Converter\ShopwareConverter" abstract="true">
<!-- ... -->
</service>
```php

Check warning on line 17 in products/extensions/migration-assistant/concept/convert-and-mapping.md

View workflow job for this annotation

GitHub Actions / LanguageTool

[LanguageTool] products/extensions/migration-assistant/concept/convert-and-mapping.md#L17

File types are normally capitalized. (FILE_EXTENSIONS_CASE[1]) Suggestions: `PHP` URL: https://languagetool.org/insights/post/spelling-capital-letters/ Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1 Category: CASING
Raw output
products/extensions/migration-assistant/concept/convert-and-mapping.md:17:3: File types are normally capitalized. (FILE_EXTENSIONS_CASE[1])
 Suggestions: `PHP`
 URL: https://languagetool.org/insights/post/spelling-capital-letters/ 
 Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1
 Category: CASING
$services->set(ProductConverter::class)
->abstract()
->parent(ShopwareConverter::class)
->args([
// ...
]);
```

The converters have to extend the `ShopwareConverter` class and implement the `convert` method. This method will receive one data entry at a time. It will have to be returned in the right format to be usable for the `writer`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,9 @@

The `DataSelections` are registered the following way:

```html
<service id="SwagMigrationAssistant\Profile\Shopware\DataSelection\ProductDataSelection">
<tag name="shopware.migration.data_selection"/>
</service>
```php

Check warning on line 104 in products/extensions/migration-assistant/concept/dataselection-and-dataset.md

View workflow job for this annotation

GitHub Actions / LanguageTool

[LanguageTool] products/extensions/migration-assistant/concept/dataselection-and-dataset.md#L104

File types are normally capitalized. (FILE_EXTENSIONS_CASE[1]) Suggestions: `PHP` URL: https://languagetool.org/insights/post/spelling-capital-letters/ Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1 Category: CASING
Raw output
products/extensions/migration-assistant/concept/dataselection-and-dataset.md:104:3: File types are normally capitalized. (FILE_EXTENSIONS_CASE[1])
 Suggestions: `PHP`
 URL: https://languagetool.org/insights/post/spelling-capital-letters/ 
 Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1
 Category: CASING
$services->set(ProductDataSelection::class)
->tag('shopware.migration.data_selection');
```

It is also possible to specify the same `DataSets` in multiple `DataSelections` \(this should only be done if no other options are available\). Have a look at the `ProductReviewDataSelection`:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,20 @@

## Gateway

The gateway defines how to communicate from Shopware 6 with your source system, like Shopware 5. Every profile needs to have at least one gateway. Gateways need to be defined in the corresponding service.xml using the `shopware.migration.gateway` tag:

```html
<service id="SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway">
<!-- ... -->
<tag name="shopware.migration.gateway" />
</service>

<service id="SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway">
<!-- ... -->
<tag name="shopware.migration.gateway"/>
</service>
The gateway defines how to communicate from Shopware 6 with your source system, like Shopware 5. Every profile needs to have at least one gateway. Gateways need to be defined in the corresponding service configuration file using the `shopware.migration.gateway` tag:

```php

Check warning on line 17 in products/extensions/migration-assistant/concept/gateway-and-reader.md

View workflow job for this annotation

GitHub Actions / LanguageTool

[LanguageTool] products/extensions/migration-assistant/concept/gateway-and-reader.md#L17

File types are normally capitalized. (FILE_EXTENSIONS_CASE[1]) Suggestions: `PHP` URL: https://languagetool.org/insights/post/spelling-capital-letters/ Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1 Category: CASING
Raw output
products/extensions/migration-assistant/concept/gateway-and-reader.md:17:3: File types are normally capitalized. (FILE_EXTENSIONS_CASE[1])
 Suggestions: `PHP`
 URL: https://languagetool.org/insights/post/spelling-capital-letters/ 
 Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1
 Category: CASING
$services->set(ShopwareLocalGateway::class)
->args([
// ...
])
->tag('shopware.migration.gateway');

$services->set(ShopwareApiGateway::class)
->args([
// ...
])
->tag('shopware.migration.gateway');
```

To use the `ShopwareApiGateway`, you must download the corresponding Shopware 5 plugin [Shopware Migration Connector](https://github.com/shopware/SwagMigrationConnector) first.
Expand Down
11 changes: 6 additions & 5 deletions products/extensions/migration-assistant/concept/premapping.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@

The premapping will use the normal [Mapping](convert-and-mapping#mapping) to store the old identifier with the equivalent new one. All premapping readers provide the information for the mapping choices and are registered like this:

```html
<service id="SwagMigrationAssistant\Profile\Shopware\Premapping\SalutationReader">
<!-- ... -->
<tag name="shopware.migration.pre_mapping_reader"/>
</service>
```php

Check warning on line 11 in products/extensions/migration-assistant/concept/premapping.md

View workflow job for this annotation

GitHub Actions / LanguageTool

[LanguageTool] products/extensions/migration-assistant/concept/premapping.md#L11

File types are normally capitalized. (FILE_EXTENSIONS_CASE[1]) Suggestions: `PHP` URL: https://languagetool.org/insights/post/spelling-capital-letters/ Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1 Category: CASING
Raw output
products/extensions/migration-assistant/concept/premapping.md:11:3: File types are normally capitalized. (FILE_EXTENSIONS_CASE[1])
 Suggestions: `PHP`
 URL: https://languagetool.org/insights/post/spelling-capital-letters/ 
 Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1
 Category: CASING
$services->set(SalutationReader::class)
->args([
// ...
])
->tag('shopware.migration.pre_mapping_reader');
```

The service will return a `PremappingStruct`, which consists of:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,12 @@

## Profile

The base of Shopware Migration Assistant is the profile, which enables you to migrate your shop system to Shopware 6. Shopware Migration Assistant comes with the default Shopware 5.5 profile and is located in the `shopware55.xml`:
The base of Shopware Migration Assistant is the profile, which enables you to migrate your shop system to Shopware 6. Shopware Migration Assistant comes with the default Shopware 5.5 profile and is located in the `shopware55.php`:

```html
<!-- Shopware 5.5 Profile -->
<service id="SwagMigrationAssistant\Profile\Shopware55\Shopware55Profile">
<tag name="shopware.migration.profile"/>
</service>
```php

Check warning on line 17 in products/extensions/migration-assistant/concept/profile-and-connection.md

View workflow job for this annotation

GitHub Actions / LanguageTool

[LanguageTool] products/extensions/migration-assistant/concept/profile-and-connection.md#L17

File types are normally capitalized. (FILE_EXTENSIONS_CASE[1]) Suggestions: `PHP` URL: https://languagetool.org/insights/post/spelling-capital-letters/ Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1 Category: CASING
Raw output
products/extensions/migration-assistant/concept/profile-and-connection.md:17:3: File types are normally capitalized. (FILE_EXTENSIONS_CASE[1])
 Suggestions: `PHP`
 URL: https://languagetool.org/insights/post/spelling-capital-letters/ 
 Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1
 Category: CASING
// Shopware 5.5 Profile
$services->set(Shopware55Profile::class)
->tag('shopware.migration.profile');
```

In order to identify itself, the profile has to implement getter functions like `getName()`, which returns the unique name of the profile. The profile is used together with the [Gateway](gateway-and-reader#gateway) to check and apply the right processing during a migration run.
Expand Down
13 changes: 7 additions & 6 deletions products/extensions/migration-assistant/concept/writer.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@

When creating a writer, register it like this:

```html
<service id="SwagMigrationAssistant\Migration\Writer\ProductWriter"
parent="SwagMigrationAssistant\Migration\Writer\AbstractWriter">
<!-- ... -->
<tag name="shopware.migration.writer"/>
</service>
```php

Check warning on line 13 in products/extensions/migration-assistant/concept/writer.md

View workflow job for this annotation

GitHub Actions / LanguageTool

[LanguageTool] products/extensions/migration-assistant/concept/writer.md#L13

File types are normally capitalized. (FILE_EXTENSIONS_CASE[1]) Suggestions: `PHP` URL: https://languagetool.org/insights/post/spelling-capital-letters/ Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1 Category: CASING
Raw output
products/extensions/migration-assistant/concept/writer.md:13:3: File types are normally capitalized. (FILE_EXTENSIONS_CASE[1])
 Suggestions: `PHP`
 URL: https://languagetool.org/insights/post/spelling-capital-letters/ 
 Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1
 Category: CASING
$services->set(ProductWriter::class)
->parent(AbstractWriter::class)
->args([
// ...
])
->tag('shopware.migration.writer');
```

In most cases, you should extend `AbstractWriter`, which provides most behavior. You only need to implement the `supports` method.
Expand Down
30 changes: 15 additions & 15 deletions products/extensions/subscriptions/guides/separate-checkout.md
Original file line number Diff line number Diff line change
Expand Up @@ -207,20 +207,20 @@

Below is an example of the context set on a subscription cart in the Storefront:

```xml
<route id="frontend.subscription.checkout.cart.page"
path="/subscription/checkout/cart/{subscriptionToken}"
methods="GET"
controller="subscription.storefront.controller.checkout::cartPage">
<default key="_noStore">true</default>
<default key="_routeScope"><list><string>storefront</string></list></default>
<default key="_subscriptionCart">true</default>
<default key="_subscriptionContext">true</default>
<default key="_controllerName">checkout</default>
<default key="_controllerAction">cartpage</default>
<default key="_templateScopes">subscription</default>
<option key="seo">false</option>
</route>
```php

Check warning on line 210 in products/extensions/subscriptions/guides/separate-checkout.md

View workflow job for this annotation

GitHub Actions / LanguageTool

[LanguageTool] products/extensions/subscriptions/guides/separate-checkout.md#L210

File types are normally capitalized. (FILE_EXTENSIONS_CASE[1]) Suggestions: `PHP` URL: https://languagetool.org/insights/post/spelling-capital-letters/ Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1 Category: CASING
Raw output
products/extensions/subscriptions/guides/separate-checkout.md:210:3: File types are normally capitalized. (FILE_EXTENSIONS_CASE[1])
 Suggestions: `PHP`
 URL: https://languagetool.org/insights/post/spelling-capital-letters/ 
 Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1
 Category: CASING
$routes->add('frontend.subscription.checkout.cart.page', '/subscription/checkout/cart/{subscriptionToken}')
->controller('subscription.storefront.controller.checkout::cartPage')
->methods(['GET'])
->defaults([
'_noStore' => 'true',
'_routeScope' => ['storefront'],
'_subscriptionCart' => 'true',
'_subscriptionContext' => 'true',
'_controllerName' => 'checkout',
'_controllerAction' => 'cartpage',
'_templateScopes' => 'subscription',
])
->options(['seo' => false]);
```

And, here is an example of the headers set on a subscription cart using headless:
Expand All @@ -239,7 +239,7 @@
}'
```

These context definitions can be found in `Subscription/Resources/app/config/routes/storefront.xml` or `Subscription/Resources/app/config/routes/store-api.xml`.
These context definitions can be found in `Subscription/Resources/config/routes/storefront.php` or `Subscription/Resources/config/routes/store-api.php`.

## Subscription carts in the Storefront

Expand Down
8 changes: 4 additions & 4 deletions products/tools/mcp-server/extending.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@

<Tab title="Plugin">

PHP class with `#[McpTool]` on the class, tagged `shopware.mcp.tool` in `services.xml`.
PHP class with `#[McpTool]` on the class, tagged `shopware.mcp.tool` in `services.php`.

```php
#[McpTool(name: 'swag-my-plugin-orders', title: 'Order List', description: 'List recent orders.')]
Expand All @@ -76,20 +76,20 @@

<Tab title="Bundle">

Identical PHP class and `services.xml` as a plugin. Load services unconditionally in the bundle's `build()` method — the MCP feature flag gates the HTTP endpoint, not the service registration:
Identical PHP class and `services.php` as a plugin. Load services unconditionally in the bundle's `build()` method — the MCP feature flag gates the HTTP endpoint, not the service registration:

Check warning on line 79 in products/tools/mcp-server/extending.md

View workflow job for this annotation

GitHub Actions / LanguageTool

[LanguageTool] products/tools/mcp-server/extending.md#L79

File types are normally capitalized. (FILE_EXTENSIONS_CASE[1]) Suggestions: `PHP` URL: https://languagetool.org/insights/post/spelling-capital-letters/ Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1 Category: CASING
Raw output
products/tools/mcp-server/extending.md:79:193: File types are normally capitalized. (FILE_EXTENSIONS_CASE[1])
 Suggestions: `PHP`
 URL: https://languagetool.org/insights/post/spelling-capital-letters/ 
 Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1
 Category: CASING

```php
public function build(ContainerBuilder $container): void
{
// load services.xml with shopware.mcp.tool tag
// load services.php with shopware.mcp.tool tag
}
```

To register the bundle itself only when the MCP feature is active, gate the entry in `config/bundles.php` — see [Optional bundles](../../../guides/plugins/plugins/bundle.md#optional-bundles).

Bundles have no install/activate lifecycle. They are always active when registered in `config/bundles.php`.

[Plugin guide](../../../guides/plugins/plugins/mcp-server.md): the PHP class and services.xml patterns are identical
[Plugin guide](../../../guides/plugins/plugins/mcp-server.md): the PHP class and services.php patterns are identical

</Tab>

Expand Down
2 changes: 1 addition & 1 deletion products/tools/mcp-server/troubleshooting.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ If a tool does not appear in the `debug:mcp` output, it will also be missing fro
**For plugin tools:**

- Confirm the plugin is installed and activated: `bin/console plugin:list`
- Confirm the service has `<tag name="shopware.mcp.tool"/>` in `services.xml`
- Confirm the service is tagged with `shopware.mcp.tool` in `services.php`
- Confirm `#[McpTool]` is on the **class**, not on `__invoke()`
- Run `bin/console cache:clear` after changes

Expand Down
Loading