Point d'accès
POST https://boutique.example/module/websourcemcp/server
POST https://boutique.example/index.php?fc=module&module=websourcemcp&controller=server
Contrôleur controllers/front/server.php. Il répond aussi quand la boutique est en maintenance. Aucun cookie de client ou d'employé n'est pris en compte : seule la clé du connecteur fait foi.
Authentification
La clé (wsmcp_…) est générée dans Modules > Websource MCP, affichée une seule fois ; seule son empreinte SHA-256 est enregistrée (Auth\AccessKey). Deux façons de la transmettre :
Authorization: Bearer wsmcp_…
ou paramètre d'adresse key=wsmcp_… (adresse de connexion à coller dans Claude). En en-tête, la clé n'apparaît pas dans les journaux du serveur.
Clé absente ou invalide : 401
{"error": "unauthorized", "error_description": "Clé du connecteur absente ou invalide. Générez une adresse de connexion dans le back-office : Modules > Websource MCP."}
Transport
« Streamable HTTP » sans état : POST d'un message JSON-RPC 2.0 ou d'un lot, réponse JSON. 202 pour une notification. 405 sur GET (pas de flux SSE). En-têtes CORS acceptés : Authorization, Content-Type, Accept, Mcp-Protocol-Version, Mcp-Session-Id.
Méthodes : initialize, ping, tools/list, tools/call (Protocol\McpServer).
initialize
{"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {"protocolVersion": "2025-03-26", "capabilities": {}, "clientInfo": {"name": "client", "version": "1.0"}}}
{"jsonrpc": "2.0", "id": 1, "result": {"protocolVersion": "2025-03-26", "capabilities": {"tools": {"listChanged": false}}, "serverInfo": {"name": "websource-prestashop-theme", "title": "Websource — Maison Lumen", "version": "1.0.0"}, "instructions": "Connecteur de la boutique PrestaShop « Maison Lumen » (thème Websource). …"}}
tools/list
Ne renvoie que les outils permis par le niveau d'accès et par les modules présents. Au niveau « Brouillons », avec Websource Theme Config et Websource Builder : theme_lire_reglages, builder_lister_blocs, builder_lister_emplacements, builder_lister_contenus, builder_lire_contenu, builder_creer_contenu, builder_enregistrer_brouillon.
tools/call
{"jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": {"name": "theme_lire_reglages", "arguments": {}}}
{"jsonrpc": "2.0", "id": 3, "result": {"isError": false, "content": [{"type": "text", "text": "{\n \"couleurs\": {\n \"primary\": {\"valeur\": \"#0369a1\", \"role\": \"couleur principale (boutons, liens)\"}, …"}]}}
Outil refusé par le niveau d'accès : réponse 200 avec isError: true
{"content": [{"type": "text", "text": "Cette action n'est pas permise par le niveau d'accès choisi pour ce connecteur. Le marchand peut le relever dans le back-office : Modules > Websource MCP."}], "isError": true}
Niveaux d'accès
Tool\AccessLevel : read (1), draft (2, défaut), publish (3). Réglage WSMCP_LEVEL.
Outils
| Outil | Arguments | Niveau | Module requis |
|---|---|---|---|
theme_lire_reglages | aucun | lecture | websourcethemeconfig |
theme_modifier_reglages | au moins un parmi couleurs (primary, secondary, accent, ink, line, page_bg, surface, footer_bg), palette, font_body, font_head, borders, shadow_when_no_border, desktop_header, mobile_header et autres réglages d'agencement | publication | websourcethemeconfig |
builder_lister_blocs | types[] (facultatif : types dont on veut le détail des champs) | lecture | websourcebuilder |
builder_lister_emplacements | aucun | lecture | websourcebuilder |
builder_lister_contenus | aucun | lecture | websourcebuilder |
builder_lire_contenu | contenu_id (obligatoire), version (brouillon par défaut, ou en_ligne) | lecture | websourcebuilder |
builder_creer_contenu | nom, page, position, blocs[] (obligatoires), cms_id, langue ; créé hors ligne | brouillon | websourcebuilder |
builder_enregistrer_brouillon | contenu_id, blocs[] (obligatoires), nom | brouillon | websourcebuilder |
builder_publier | contenu_id | publication | websourcebuilder |
builder_mettre_hors_ligne | contenu_id | publication | websourcebuilder |
Un bloc est un objet {type, …champs} ; appeler builder_lister_blocs avant d'écrire des blocs pour connaître les types et leurs champs.
Garde-fous :
- Toutes les valeurs passent par les validations des modules (
ThemeSettings,BlockSanitizer,PlacementCatalog) : mêmes règles que les écrans du back-office. - Non exposés : code libre du
<head>, polices envoyées, hooks personnalisés, contenu des pages CMS. - Aucun outil ne supprime un contenu ni ne touche au catalogue, aux commandes ou aux clients.
- Chaque appel d'outil qui crée, modifie ou publie est tracé par
PrestaShopLogger(« Websource MCP : appel de l'outil … », objetWebsourceMcp).
Connexion des clients
- Claude (web, ordinateur, mobile) : Paramètres > Connecteurs > Ajouter un connecteur personnalisé, coller l'adresse de connexion.
- Claude Code :
claude mcp add --transport http ma-boutique "https://boutique.example/module/websourcemcp/server" --header "Authorization: Bearer wsmcp_…"
Réglages
| Clé | Contenu |
|---|---|
WSMCP_KEY_HASH | Empreinte SHA-256 de la clé (vide = connecteur fermé). |
WSMCP_LEVEL | read, draft ou publish. |
WSMCP_LAST_USED | Horodatage du dernier appel authentifié. |
Formulaire de configuration (POST sur index.php?controller=AdminModules&configure=websourcemcp&token=…) : submitWsmcpGenerate, submitWsmcpRevoke, submitWsmcpLevel + wsmcp_level.
Architecture
Websource\Mcp\… : Protocol\McpServer, Auth\AccessKey, Tool\ToolProviderInterface, Tool\ThemeTools, Tool\BuilderTools, Tool\AccessLevel, Tool\ToolException, Gateway\ThemeGatewayInterface / PrestaShopThemeGateway, Gateway\BuilderGatewayInterface / PrestaShopBuilderGateway. Ajouter des outils : implémenter ToolProviderInterface et l'enregistrer auprès du serveur.
Tests
php tests/run.php (sans PrestaShop) : protocole, clé, niveaux d'accès, outils thème et builder avec les règles de validation réelles des deux modules.