MCP for PrestaShop
  • English
  • Français
  • Español
  • Italiano
  • English
  • Français
  • Español
  • Italiano
  • Per iniziare
    • Introduzione
    • Installazione
    • Configurazione
    • Sicurezza
    • Connettere la tua applicazione IA
  • Panoramica MCP
    • Cos'è MCP? Glossario
    • Come creare i miei elementi MCP?
  • Risoluzione dei problemi

Come creare i miei elementi MCP?

Gli sviluppatori di moduli possono creare i propri elementi MCP per esporre la funzionalità del loro modulo alle applicazioni IA, o per esporre funzionalità native di PrestaShop oltre a ciò che offrono gli strumenti predefiniti.

Per creare i tuoi elementi MCP per PrestaShop MCP Server, dichiara il tuo modulo come compatibile con MCP e definisci i tuoi elementi personalizzati usando attributi PHP.

Indici dei contenuti

1. Dichiarare il tuo modulo come compatibile con MCP

Per far sapere a PrestaShop MCP Server che il tuo modulo include elementi MCP, dichiaralo come compatibile con MCP aggiungendo il metodo isMcpCompliant() alla tua classe modulo principale:

<?php

class Ps_MySuperModule extends Module
{
    // Questo metodo permette a ps_mcp_server di scoprire i tuoi elementi MCP
    public function isMcpCompliant()
    {
        return true;
    }
}

?>

2. Implementare i tuoi strumenti MCP (Tools)

Warning

Gli elementi MCP devono essere creati esclusivamente nella directory src e nelle sue sottodirectory. Qualsiasi codice presente nelle altre directory verrà ignorato.

I Tools sono azioni che un agente IA può invocare per interagire con il tuo negozio (es. cercare prodotti, aggiornare ordini). Per creare strumenti MCP nel tuo modulo, utilizza gli attributi PHP del modulo 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 è esclusivo dei Tools. Fornisce indicazioni al client IA sul comportamento dello strumento:

ProprietàTipoDescrizione
titlestringTitolo leggibile dello strumento
readOnlyHintboolLo strumento non modifica l'ambiente
destructiveHintboolLo strumento può eseguire modifiche distruttive
idempotentHintboolLo strumento può essere chiamato ripetutamente senza effetti collaterali
openWorldHintboolLo strumento interagisce con sistemi esterni

PsMcpSchema definisce i parametri di input dello strumento tramite JSON Schema. Si applica esclusivamente ai Tools.

Consulta il progetto ps_mcp_boilerplate per un esempio di implementazione completa.

Nota di sicurezza: Solo per sviluppo, puoi disabilitare l'autenticazione aggiungendo questa costante alla tua configurazione di PrestaShop:

define('_PS_MCP_SERVER_ALLOW_INSECURE_MODE_', true);

Warning

Non abilitare mai la modalità non sicura negli ambienti di produzione.

3. Implementare le tue risorse MCP (Resources)

Le Resources espongono dati in sola lettura che un agente IA può consultare (es. configurazione del negozio, catalogo prodotti). Ogni risorsa è identificata da un URI fisso.

<?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());
        }
    }
}

?>

Tips

Le Resources non utilizzano PsMcpToolAnnotations né PsMcpSchema. Questi attributi sono riservati ai Tools.

4. Implementare i tuoi modelli di risorse MCP (Resource Templates)

I Resource Templates definiscono pattern URI (RFC 6570) che permettono a un agente IA di richiedere dinamicamente risorse riempiendo variabili (es. products://{id}). Sono utili quando l'insieme delle risorse possibili è grande o non noto in anticipo.

<?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());
        }
    }
}

?>

Tips

Come le Resources, i Resource Templates non utilizzano PsMcpToolAnnotations né PsMcpSchema.

5. Implementare i tuoi prompt MCP (Prompts)

I Prompts sono modelli di conversazione riutilizzabili che aiutano un agente IA a iniziare uno scambio con un contesto pre-compilato. Vengono esposti nell'interfaccia client in modo che gli utenti possano attivarli con un solo clic.

Un prompt restituisce un array di messaggi (ruolo + contenuto), che rappresenta uno scambio di conversazione:

<?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());
        }
    }
}

?>

Tips

I Prompts non utilizzano PsMcpToolAnnotations, PsMcpSchema né annotations. Solo name, title, description, icons e meta sono disponibili.

Riepilogo attributi per tipo di elemento

AttributoToolsResourcesResource TemplatesPrompts
PsMcpSchemasi---
PsMcpToolAnnotationssi---
PsMcpIconsisi-si
metasisisisi
titlesi--si
namesisisisi
descriptionsisisisi

Gestione degli errori

PrestaShop MCP Server fornisce classi di eccezione dedicate per gestire gli errori negli strumenti, nelle risorse e nei prompt. Ogni eccezione incapsula l'eccezione corrispondente dell'SDK MCP e garantisce che l'errore venga comunicato correttamente all'agente IA attraverso il protocollo MCP.

Classe di eccezioneIncapsula (SDK)Uso in
PsMcpToolCallExceptionToolCallExceptionTools
PsMcpResourceReadExceptionResourceReadExceptionResources / Resource Templates
PsMcpPromptGetExceptionPromptGetExceptionPrompts

Tutti i costruttori accettano gli stessi due parametri:

  • message (string): Una descrizione leggibile dell'errore che verrà inviata all'agente IA.
  • exitCode (int): Un codice di uscita numerico che indica il tipo di errore.

Gestione degli errori nei 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
            );
        }
    }
}

?>

Gestione degli errori nelle 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
            );
        }
    }
}

?>

Gestione degli errori nei 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
            );
        }
    }
}

?>

Linee guida per Tools efficaci

Queste linee guida ti aiuteranno a progettare strumenti che gli agenti possano comprendere e utilizzare per completare attività complesse.

1. Descrivi i tuoi strumenti in modo chiaro e conciso

Definisci chiaramente e in modo conciso lo scopo e il comportamento di ogni strumento. Questo aiuta i modelli IA a comprendere la funzionalità dello strumento e usarlo correttamente.

Esempio:

#[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']
)]

In questo esempio, il nome e la descrizione dello strumento non lasciano dubbi sull'uso dello strumento. Il campo searchTerms mostra anche come un agente può essere guidato per utilizzare appieno i tuoi strumenti.

2. Usa vocabolario coerente

Usa vocabolario coerente in tutto il tuo server MCP per aiutare gli agenti a connettere i tuoi strumenti e pianificare flussi di lavoro complessi usando più strumenti insieme. Questo include parametri, messaggi di errore e altri termini tecnici.

3. Valida i tuoi input

Valida gli input dei tuoi strumenti usando l'annotazione #[PsMcpSchema()] fornita, per assicurarti che siano corretti e coerenti.

4. Esegui controlli di coerenza

Dopo aver validato i parametri, assicurati che gli agenti facciano richieste ragionevoli ai tuoi strumenti. Questo include:

  • Limitare la dimensione dei risultati e la complessità delle richieste
  • Applicare i permessi
  • Verificare contenuti inappropriati quando l'IA genera testo o immagini
  • Rilevare comportamenti erratici, come un agente bloccato in un loop

Per più linee guida su come scrivere strumenti MCP efficaci, visita la Guida allo sviluppo MCP.

Linee guida per Resources efficaci

1. Scegli URI chiare e prevedibili

Usa uno schema URI coerente che rifletta la gerarchia dei tuoi dati. L'agente dovrebbe poter indovinare l'URI di una risorsa dal suo nome.

Esempi:

  • store://configuration per la configurazione globale
  • store://catalog/products per il catalogo prodotti
  • store://orders/stats per le statistiche degli ordini

2. Documenta il formato di ritorno

Indica chiaramente il mimeType e descrivi la struttura dei dati restituiti nella description. L'agente non può indovinare il formato senza indicazioni.

3. Usa size quando è rilevante

Il parametro size aiuta l'agente a stimare la dimensione della risposta prima di richiederla, il che è utile per risorse voluminose.

4. Preferisci i Resource Templates per dati parametrizzati

Se la tua risorsa accetta un identificatore o un filtro, usa un Resource Template (products://{id}) invece di un Tool. I template sono più leggeri ed espliciti per la lettura dei dati.

Linee guida per Prompts efficaci

1. Restituisci messaggi strutturati

Un prompt restituisce un array di messaggi role/content. Usa il ruolo assistant per fornire istruzioni di contesto e il ruolo user per formulare la richiesta iniziale.

2. Rendi i tuoi prompts parametrizzabili

Accetta argomenti per personalizzare il comportamento del prompt. Questo permette all'agente o all'utente di adattare il prompt senza crearne uno nuovo.

3. Mantieni i prompts focalizzati

Ogni prompt deve corrispondere a un compito o scenario specifico. Evita prompt troppo generici che cercano di coprire tutto.

4. Descrivi chiaramente il risultato atteso

La description del prompt deve indicare cosa l'agente produrrà come risultato. L'utente deve capire cosa otterrà prima di attivare il prompt.

Debug

PrestaShop MCP Server memorizza i registri, la cache e i file di configurazione nella cartella .mcp. I file .logs vengono creati quando il parametro del modulo MCP Abilita registri è impostato su true.

Per forzare una nuova scansione delle posizioni, elimina la directory .mcp/cache.

Usa l'ispettore MCP per verificare che il tuo server funzioni e validare che i tuoi elementi MCP funzionino correttamente.

Dipendenze

  • modelcontextprotocol/php-sdk - PHP MCP SDK

Documentazione

  • Specifica del protocollo MCP: modelcontextprotocol.io
Last Updated: 30/04/26, 09:18
Contributors: khanhmas, John.R, fox-john, cnavarro-prestashop, Cyril Navarro, Jonathan Renard, dependabot[bot], gericfo, Claude Opus 4.6
Prev
Cos'è MCP? Glossario