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à | Tipo | Descrizione |
|---|---|---|
title | string | Titolo leggibile dello strumento |
readOnlyHint | bool | Lo strumento non modifica l'ambiente |
destructiveHint | bool | Lo strumento può eseguire modifiche distruttive |
idempotentHint | bool | Lo strumento può essere chiamato ripetutamente senza effetti collaterali |
openWorldHint | bool | Lo 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
| Attributo | Tools | Resources | Resource Templates | Prompts |
|---|---|---|---|---|
PsMcpSchema | si | - | - | - |
PsMcpToolAnnotations | si | - | - | - |
PsMcpIcon | si | si | - | si |
meta | si | si | si | si |
title | si | - | - | si |
name | si | si | si | si |
description | si | si | si | si |
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 eccezione | Incapsula (SDK) | Uso in |
|---|---|---|
PsMcpToolCallException | ToolCallException | Tools |
PsMcpResourceReadException | ResourceReadException | Resources / Resource Templates |
PsMcpPromptGetException | PromptGetException | Prompts |
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://configurationper la configurazione globalestore://catalog/productsper il catalogo prodottistore://orders/statsper 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