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é | Type | Description |
|---|---|---|
title | string | Titre lisible de l'outil |
readOnlyHint | bool | L'outil ne modifie pas l'environnement |
destructiveHint | bool | L'outil peut effectuer des modifications destructives |
idempotentHint | bool | L'outil peut être appelé plusieurs fois sans effet secondaire |
openWorldHint | bool | L'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
| Attribut | Tools | Resources | Resource Templates | Prompts |
|---|---|---|---|---|
PsMcpSchema | oui | - | - | - |
PsMcpToolAnnotations | oui | - | - | - |
PsMcpIcon | oui | oui | - | oui |
meta | oui | oui | oui | oui |
title | oui | - | - | oui |
name | oui | oui | oui | oui |
description | oui | oui | oui | oui |
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'exception | Encapsule (SDK) | Utilisation |
|---|---|---|
PsMcpToolCallException | ToolCallException | Tools |
PsMcpResourceReadException | ResourceReadException | Resources / Resource Templates |
PsMcpPromptGetException | PromptGetException | Prompts |
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://configurationpour la configuration globalestore://catalog/productspour le catalogue produitsstore://orders/statspour 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