Agent + human co-curate themed, budget-aware wishlist management for Sylius. Instead of clicking 30 filters, you tell your agent “birthday for my nephew” — it searches taxons, builds a wishlist, optimizes for budget with Sylius ChannelPricing, and moves the best fit to cart after your confirm.
- Demo:
https://wishlist-concierge.demo.bitexpert.de/en_US/ - Video:
https://youtu.be/TEZSOK3mSmQ
Before: 30 filter clicks, manual budget math $75.89 + $17.03+..., missed CatalogPromotion, abandoned cart. After: one conversation.
Story 1 — Themed gift
User: “birthday for my nephew” Agent:
product.search {theme:"gift"}→ returnsEthereal_Drift_T_Shirtetc. Human: “more books, less plastic” → agent swaps viawishlist.add_item.
Story 2 — Budget
Agent:
wishlist.optimize_for_budget {wishlistId:2, budgetCents:15000}→BudgetOptimizer.php:40cheapest-first knapsack withquantity * ChannelPricing→chosen:["Lunar_Echo_T_Shirt-variant-0"], total $17.03, $7 remaining+ explanation string. Human decides to increase budget.
Story 3 — Share & Checkout
wishlist.move_to_cart {wishlistId:2}→CartTransferController.php:50(theconfirmMessagein the#[ModelContextTool]annotation) triggerswindow.confirm("Move items from this wishlist to cart?")atregistry.js:71(spec Mitigation 6.3.2 — agent cannot finalize without human; the exact items/amount shown come from the preceding budget optimization).OrderFactory+OrderProcessor→cartToken+/en_US/cart. Anon allowed (FASHION_WEBgift registries are shareable viaWishlistAccessChecker.php:34— owned lists still403).
- Architecture overview
- WebMCP Tool reference (see
assets/shop/webmcp/registry.js:180, registering tools from the server-served manifest)
- Install the plugin via Composer
composer require bitexpert/sylius-wishlist-concierge-plugin:dev-master- Enable the plugin
<?php
# config/bundles.php
return [
// ...
Sylius\WishlistPlugin\SyliusWishlistPlugin::class => ['all' => true],
BitExpert\SyliusWishlistConciergePlugin\BitExpertSyliusWishlistConciergePlugin::class => ['all' => true],
];- Import config
# config/packages/bitexpert_wishlist_concierge.yaml
imports:
- { resource: "@BitExpertSyliusWishlistConciergePlugin/config/config.yaml" }- Import routing
# config/routes/bitexpert_wishlist_concierge.yaml
bitexpert_sylius_wishlist_concierge_plugin_shop:
resource: "@BitExpertSyliusWishlistConciergePlugin/config/routes/shop.yaml"
prefix: /{_locale}
requirements:
_locale: ^[A-Za-z]{2,4}(_([A-Za-z]{4}|[0-9]{3}))?(_([A-Za-z]{2}|[0-9]{3}))?$- Update your database schema
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate- Import the plugin's entrypoint in the host app's
assets/shop/entrypoint.js:
import '@vendor/bitexpert/sylius-wishlist-concierge-plugin/assets/shop/entrypoint';- Make the npm package resolvable from the host app (required for the stimulus-bridge to read the plugin's
package.json):
yarn add @bitexpert/wishlist-concierge-plugin@file:vendor/bitexpert/sylius-wishlist-concierge-plugin/assets/shop- Register the Stimulus controllers in the host app's
assets/shop/controllers.json:
{
"controllers": {
"@bitexpert/wishlist-concierge-plugin": {
"webmcp--toolbox": { "enabled": true, "fetch": "lazy" },
"webmcp--toast": { "enabled": true, "fetch": "lazy" }
}
}
}The bridge looks up main and the short controller identifier webmcp--toolbox (via the name field) from the plugin's package.json — no host-side main/name needed.
- Rebuild assets:
yarn run build:prod
bin/console assets:install
bin/console cache:clearFor local development, you need to install DDEV first.
Once you have DDEV installed, run the following commands to bootstrap the local development environment:
ddev start
ddev bootstrapTo stop the DDEV instance run ddev stop.
The Wishlist Concierge Plugin is released under the MIT License.
