MCP for PrestaShop
  • English
  • Français
  • Español
  • Italiano
  • English
  • Français
  • Español
  • Italiano
  • Guide de démarrage
    • Introduction
    • Installation
    • Configuration
    • Sécurité
    • Connecter votre application IA
  • Qu'est-ce que MCP ?
    • Qu'est-ce que MCP ? Glossaire
    • Comment créer mes propres éléments MCP ?
  • Dépannage

Comment créer mes propres éléments MCP ?

Les développeurs de modules peuvent créer leurs propres éléments MCP pour exposer la fonctionnalité de leur module aux applications IA, ou pour exposer des fonctionnalités natives de PrestaShop au-delà de ce que les outils par défaut offrent.

Pour créer vos propres éléments MCP pour PrestaShop MCP Server, déclarez votre module comme compatible MCP et définissez vos éléments personnalisés en utilisant des attributs PHP.

Tables des matières

1. Déclarer votre module comme compatible MCP

Pour faire savoir à PrestaShop MCP Server que votre module inclut des éléments MCP, déclarez-le comme compatible MCP en ajoutant la méthode isMcpCompliant() à votre classe de module principale :

<?php

class Ps_MySuperModule extends Module
{
    // Cette méthode permet à ps_mcp_server de découvrir vos éléments MCP
    public function isMcpCompliant()
    {
        return true;
    }
}

?>

2. Implémenter vos outils MCP (Tools)

Avertissement

Les éléments MCP doivent être créés exclusivement dans le dossier src et ses sous-dossiers. Tout code situé dans les autres dossiers sera ignoré.

Les Tools sont des actions qu'un agent IA peut invoquer pour interagir avec votre boutique (ex. rechercher des produits, mettre à jour des commandes). Pour créer des outils MCP dans votre module, utilisez les attributs PHP du module PrestaShop MCP Server :

<?php

use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpTool;
use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpSchema;
use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpIcon;
use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpToolAnnotations;

class MySuperTool
{
    #[PsMcpTool(
        name: 'say_hello',
        title: 'Hello User',
        description: 'Say hello to a user',
        annotations: new PsMcpToolAnnotations(
            title: 'Hello User',
            readOnlyHint: true,
            destructiveHint: false,
            idempotentHint: true,
            openWorldHint: false,
        ),
        icons: [
            new PsMcpIcon(
                src: 'https://picsum.photos/100/100',
                mimeType: 'image/png',
                sizes: ['100x100']
            )
        ],
        meta: ['category' => 'greeting']
    )]
    #[PsMcpSchema(
        properties: [
            'username' => ['type' => 'string', 'description' => 'Username'],
        ],
        required: ['username']
    )]
    public function sayHello(string $username): string
    {
        try {
            return "Hello, $username! Welcome to your PrestaShop store.";
        } catch (\Exception $e) {
            throw new PsMcpToolCallException($e->getMessage(), $e->getCode());
        }
    }
}

?>

PsMcpToolAnnotations est exclusif aux Tools. Il fournit des indications au client IA sur le comportement de l'outil :

PropriétéTypeDescription
titlestringTitre lisible de l'outil
readOnlyHintboolL'outil ne modifie pas l'environnement
destructiveHintboolL'outil peut effectuer des modifications destructives
idempotentHintboolL'outil peut être appelé plusieurs fois sans effet secondaire
openWorldHintboolL'outil interagit avec des systèmes externes

PsMcpSchema définit les paramètres d'entrée de l'outil via un JSON Schema. Il s'applique uniquement aux Tools.

Consultez le projet ps_mcp_boilerplate pour un exemple d'implémentation complète.

Note de sécurité : Pour le développement uniquement, vous pouvez désactiver l'authentification en ajoutant cette constante à votre configuration PrestaShop :

define('_PS_MCP_SERVER_ALLOW_INSECURE_MODE_', true);

Avertissement

Ne jamais activer le mode non sécurisé dans les environnements de production.

3. Implémenter vos ressources MCP (Resources)

Les Resources exposent des données en lecture seule qu'un agent IA peut consulter (ex. configuration de la boutique, catalogue produits). Chaque ressource est identifiée par une URI fixe.

<?php

use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpResource;
use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpIcon;

class MyStoreResources
{
    #[PsMcpResource(
        uri: 'store://configuration',
        name: 'store_configuration',
        description: 'Returns the current store configuration (currency, language, timezone...)',
        mimeType: 'application/json',
        size: 18,
        icons: [
            new PsMcpIcon(
                src: 'https://picsum.photos/100/100',
                mimeType: 'image/png',
                sizes: ['100x100']
            )
        ],
        meta: ['category' => 'store_management']
    )]
    public function getStoreConfiguration(): array
    {
        try {
            return [
                'currency' => Configuration::get('PS_CURRENCY_DEFAULT'),
                'language' => Configuration::get('PS_LANG_DEFAULT'),
            ];
        } catch (\Exception $e) {
            throw new PsMcpResourceReadException($e->getMessage(), $e->getCode());
        }
    }
}

?>

Conseil

Les Resources n'utilisent pas PsMcpToolAnnotations ni PsMcpSchema. Ces attributs sont réservés aux Tools.

4. Implémenter vos modèles de ressources MCP (Resource Templates)

Les Resource Templates définissent des patterns d'URI (RFC 6570) qui permettent à un agent IA de demander dynamiquement des ressources en remplissant des variables (ex. products://{id}). Ils sont utiles lorsque l'ensemble des ressources possibles est grand ou inconnu à l'avance.

<?php

use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpResourceTemplate;

class MyResourceTemplates
{
    #[PsMcpResourceTemplate(
        uriTemplate: 'products://{id}',
        name: 'product_by_id',
        description: 'Returns the full details of a product identified by its numeric ID',
        mimeType: 'application/json',
        meta: ['category' => 'product_management']
    )]
    public function getProductById(int $id): array
    {
        try {
            $product = new Product($id, true);
            return $product->getFields();
        } catch (\Exception $e) {
            throw new PsMcpResourceReadException($e->getMessage(), $e->getCode());
        }
    }
}

?>

Conseil

Comme les Resources, les Resource Templates n'utilisent pas PsMcpToolAnnotations ni PsMcpSchema.

5. Implémenter vos prompts MCP (Prompts)

Les Prompts sont des modèles de conversation réutilisables qui aident un agent IA à démarrer un échange avec un contexte pré-rempli. Ils sont exposés dans l'interface client pour que les utilisateurs puissent les déclencher en un clic.

Un prompt retourne un tableau de messages (rôle + contenu), représentant un échange de conversation :

<?php

use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpPrompt;
use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpIcon;

class MyStorePrompts
{
    #[PsMcpPrompt(
        name: 'image_generation',
        title: 'Image Generation',
        description: 'Generate images for products',
        icons: [
            new PsMcpIcon(
                src: 'https://picsum.photos/100/100',
                mimeType: 'image/png',
                sizes: ['100x100']
            )
        ],
        meta: ['category' => 'image_generation']
    )]
    public function generateImage(string $color, string $size): array
    {
        try {
            return [
                ['role' => 'assistant', 'content' => 'You are an image generation tool for a PrestaShop store.'],
                ['role' => 'user', 'content' => "Generate an image with color: $color, size: $size."],
                ['role' => 'assistant', 'content' => 'Here is your generated image: https://example.com/image?color=' . urlencode($color) . '&size=' . urlencode($size)],
            ];
        } catch (\Exception $e) {
            throw new PsMcpPromptGetException($e->getMessage(), $e->getCode());
        }
    }
}

?>

Conseil

Les Prompts n'utilisent pas PsMcpToolAnnotations, PsMcpSchema, ni annotations. Seuls name, title, description, icons et meta sont disponibles.

Récapitulatif des attributs par type d'élément

AttributToolsResourcesResource TemplatesPrompts
PsMcpSchemaoui---
PsMcpToolAnnotationsoui---
PsMcpIconouioui-oui
metaouiouiouioui
titleoui--oui
nameouiouiouioui
descriptionouiouiouioui

Gestion des erreurs

PrestaShop MCP Server fournit des classes d'exceptions dédiées pour gérer les erreurs dans les outils, les ressources et les prompts. Chaque exception encapsule l'exception correspondante du SDK MCP et garantit que l'erreur est correctement communiquée à l'agent IA via le protocole MCP.

Classe d'exceptionEncapsule (SDK)Utilisation
PsMcpToolCallExceptionToolCallExceptionTools
PsMcpResourceReadExceptionResourceReadExceptionResources / Resource Templates
PsMcpPromptGetExceptionPromptGetExceptionPrompts

Tous les constructeurs prennent les deux mêmes paramètres :

  • message (string) : Une description lisible de l'erreur qui sera envoyée à l'agent IA.
  • exitCode (int) : Un code de sortie numérique indiquant le type d'erreur.

Gestion des erreurs dans les Tools

<?php

use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpTool;
use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpSchema;
use PrestaShop\Module\PsMcpServer\Server\Exceptions\PsMcpToolCallException;

class MySuperTool
{
    #[PsMcpTool(
        name: 'get_order_by_id',
        description: 'Retrieve an order by its ID'
    )]
    #[PsMcpSchema(
        properties: [
            'orderId' => ['type' => 'integer', 'description' => 'The order ID'],
        ],
        required: ['orderId']
    )]
    public function getOrderById(int $orderId): array
    {
        try {
            $order = new Order($orderId);

            if (!Validate::isLoadedObject($order)) {
                throw new \Exception('Order not found');
            }

            return $order->getFields();
        } catch (\Exception $e) {
            throw new PsMcpToolCallException(
                'Failed to retrieve order: ' . $e->getMessage(),
                1
            );
        }
    }
}

?>

Gestion des erreurs dans les Resources

<?php

use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpResource;
use PrestaShop\Module\PsMcpServer\Server\Exceptions\PsMcpResourceReadException;

class MyStoreResources
{
    #[PsMcpResource(
        uri: 'store://configuration',
        name: 'store_configuration',
        description: 'Returns the current store configuration',
        mimeType: 'application/json',
    )]
    public function getStoreConfiguration(): array
    {
        try {
            $currency = Configuration::get('PS_CURRENCY_DEFAULT');

            if (!$currency) {
                throw new \Exception('Currency configuration not found');
            }

            return ['currency' => $currency];
        } catch (\Exception $e) {
            throw new PsMcpResourceReadException(
                'Failed to read store configuration: ' . $e->getMessage(),
                1
            );
        }
    }
}

?>

Gestion des erreurs dans les Prompts

<?php

use PrestaShop\Module\PsMcpServer\Server\Attributes\PsMcpPrompt;
use PrestaShop\Module\PsMcpServer\Server\Exceptions\PsMcpPromptGetException;

class MyStorePrompts
{
    #[PsMcpPrompt(
        name: 'low_stock_analysis',
        description: 'Analyze products with low stock and suggest restocking actions',
    )]
    public function lowStockAnalysis(): array
    {
        try {
            $threshold = Configuration::get('PS_LOW_STOCK_THRESHOLD');

            if ($threshold === false) {
                throw new \Exception('Low stock threshold not configured');
            }

            return [
                ['role' => 'user', 'content' => 'List all products with stock below ' . $threshold],
            ];
        } catch (\Exception $e) {
            throw new PsMcpPromptGetException(
                'Failed to generate prompt: ' . $e->getMessage(),
                1
            );
        }
    }
}

?>

Lignes directrices pour des Tools efficaces

Ces lignes directrices vous aideront à concevoir des outils que les agents peuvent comprendre et utiliser pour accomplir des tâches complexes.

1. Décrivez vos outils clairement et de manière concise

Définissez clairement et de manière concise le but et le comportement de chaque outil. Cela aide les modèles IA à comprendre la fonctionnalité de l'outil et à l'utiliser correctement.

Exemple :

#[PsMcpTool(
    name: 'search_product_by_name',
    description: 'Search a product in the store by name only. This search uses fuzzy matching. Results are sorted by relevance.'
)]
#[PsMcpSchema(
    properties: [
        'searchTerms' => ['type' => 'string', 'description' => 'Search terms to look up in product names. Several terms can be provided as a semicolon separated list.'],
        'language' => ['type' => 'integer', 'description' => 'Language to run the search in. Defaults to preferred language.']
    ],
    required: ['searchTerms']
)]

Dans cet exemple, le nom et la description de l'outil ne laissent aucun doute sur l'utilisation de l'outil. Le champ searchTerms montre également comment un agent peut être guidé pour utiliser pleinement vos outils.

2. Utilisez un vocabulaire cohérent

Utilisez un vocabulaire cohérent dans tout votre serveur MCP pour aider les agents à connecter vos outils et planifier des flux de travail complexes utilisant plusieurs outils ensemble. Cela inclut les paramètres, les messages d'erreur et autres termes techniques.

3. Validez vos entrées

Validez les entrées de vos outils en utilisant l'annotation #[PsMcpSchema()] fournie, pour vous assurer qu'elles sont correctes et cohérentes.

4. Effectuez des vérifications de cohérence

Après avoir validé les paramètres, assurez-vous que les agents font des demandes raisonnables à vos outils. Cela inclut :

  • Limiter la taille des résultats et la complexité des demandes
  • Appliquer les permissions
  • Vérifier le contenu inapproprié lorsque l'IA génère du texte ou des images
  • Détecter les comportements erratiques, comme un agent bloqué dans une boucle

Pour plus de lignes directrices sur l'écriture d'outils MCP efficaces, visitez le Guide de développement MCP.

Lignes directrices pour des Resources efficaces

1. Choisissez des URI claires et prévisibles

Utilisez un schéma d'URI cohérent qui reflète la hiérarchie de vos données. L'agent doit pouvoir deviner l'URI d'une ressource à partir de son nom.

Exemples :

  • store://configuration pour la configuration globale
  • store://catalog/products pour le catalogue produits
  • store://orders/stats pour les statistiques de commandes

2. Documentez le format de retour

Indiquez clairement le mimeType et décrivez la structure des données retournées dans la description. L'agent ne peut pas deviner le format sans indication.

3. Utilisez size quand c'est pertinent

Le paramètre size aide l'agent à estimer la taille de la réponse avant de la demander, ce qui est utile pour les ressources volumineuses.

4. Préférez les Resource Templates pour les données paramétrées

Si votre ressource accepte un identifiant ou un filtre, utilisez un Resource Template (products://{id}) plutôt qu'un Tool. Les templates sont plus légers et explicites pour la lecture de données.

Lignes directrices pour des Prompts efficaces

1. Retournez des messages structurés

Un prompt retourne un tableau de messages role/content. Utilisez le rôle assistant pour donner des instructions de contexte et le rôle user pour formuler la requête initiale.

2. Rendez vos prompts paramétrables

Acceptez des arguments pour personnaliser le comportement du prompt. Cela permet à l'agent ou à l'utilisateur d'adapter le prompt sans en créer un nouveau.

3. Gardez les prompts focalisés

Chaque prompt doit correspondre à une tâche ou un scénario précis. Évitez les prompts trop génériques qui essaient de tout couvrir.

4. Décrivez clairement le résultat attendu

La description du prompt doit indiquer ce que l'agent produira comme résultat. L'utilisateur doit comprendre ce qu'il obtiendra avant de déclencher le prompt.

Débogage

PrestaShop MCP Server stocke les journaux, le cache et les fichiers de configuration dans le dossier .mcp. Les fichiers .logs sont créés lorsque le paramètre du module MCP Activer les journaux est défini sur true.

Pour forcer une nouvelle analyse des emplacements, supprimez le dossier .mcp/cache.

Utilisez l'inspecteur MCP pour vérifier que votre serveur fonctionne et valider que vos éléments MCP fonctionnent correctement.

Dépendances

  • modelcontextprotocol/php-sdk - PHP MCP SDK

Documentation

  • Spécification du protocole MCP : modelcontextprotocol.io
Dernière mise à jour: 30/04/2026 09:18
Contributors: khanhmas, John.R, fox-john, cnavarro-prestashop, Cyril Navarro, Jonathan Renard, dependabot[bot], gericfo, Claude Opus 4.6
Prev
Qu'est-ce que MCP ? Glossaire