MCP for PrestaShop
  • English
  • Français
  • Español
  • Italiano
  • English
  • Français
  • Español
  • Italiano
  • Primeros pasos
    • Introducción
    • Instalación
    • Configuración
    • Seguridad
    • Conectar tu aplicación de IA
  • Resumen de MCP
    • ¿Qué es MCP? Glosario
    • ¿Cómo crear mis propios elementos MCP?
  • Resolución de problemas

¿Cómo crear mis propios elementos MCP?

Los desarrolladores de módulos pueden crear sus propios elementos MCP para exponer la funcionalidad de su módulo a las aplicaciones de IA, o para exponer funcionalidades nativas de PrestaShop más allá de lo que ofrecen las herramientas por defecto.

Para crear tus propios elementos MCP para PrestaShop MCP Server, declara tu módulo como compatible con MCP y define tus elementos personalizados usando atributos PHP.

Tablas de contenidos

1. Declarar tu módulo como compatible con MCP

Para hacer saber a PrestaShop MCP Server que tu módulo incluye elementos MCP, decláralo como compatible con MCP agregando el método isMcpCompliant() a tu clase de módulo principal:

<?php

class Ps_MySuperModule extends Module
{
    // Este método permite a ps_mcp_server descubrir tus elementos MCP
    public function isMcpCompliant()
    {
        return true;
    }
}

?>

2. Implementar tus herramientas MCP (Tools)

Aviso

Los elementos MCP deben crearse exclusivamente en el directorio src y sus subdirectorios. Cualquier código ubicado en otros directorios será ignorado.

Los Tools son acciones que un agente IA puede invocar para interactuar con tu tienda (ej. buscar productos, actualizar pedidos). Para crear herramientas MCP en tu módulo, utiliza los atributos PHP del módulo 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 es exclusivo de los Tools. Proporciona indicaciones al cliente IA sobre el comportamiento de la herramienta:

PropiedadTipoDescripción
titlestringTítulo legible de la herramienta
readOnlyHintboolLa herramienta no modifica el entorno
destructiveHintboolLa herramienta puede realizar modificaciones destructivas
idempotentHintboolLa herramienta puede llamarse repetidamente sin efectos secundarios
openWorldHintboolLa herramienta interactúa con sistemas externos

PsMcpSchema define los parámetros de entrada de la herramienta mediante JSON Schema. Se aplica únicamente a los Tools.

Consulta el proyecto ps_mcp_boilerplate para un ejemplo de implementación completa.

Nota de seguridad: Solo para desarrollo, puedes desactivar la autenticación agregando esta constante a tu configuración de PrestaShop:

define('_PS_MCP_SERVER_ALLOW_INSECURE_MODE_', true);

Aviso

Nunca habilites el modo inseguro en entornos de producción.

3. Implementar tus recursos MCP (Resources)

Los Resources exponen datos de solo lectura que un agente IA puede consultar (ej. configuración de la tienda, catálogo de productos). Cada recurso se identifica por un URI fijo.

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

?>

Consejos

Los Resources no utilizan PsMcpToolAnnotations ni PsMcpSchema. Estos atributos están reservados para los Tools.

4. Implementar tus plantillas de recursos MCP (Resource Templates)

Los Resource Templates definen patrones URI (RFC 6570) que permiten a un agente IA solicitar recursos dinámicamente rellenando variables (ej. products://{id}). Son útiles cuando el conjunto de recursos posibles es grande o desconocido de antemano.

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

?>

Consejos

Al igual que los Resources, los Resource Templates no utilizan PsMcpToolAnnotations ni PsMcpSchema.

5. Implementar tus prompts MCP (Prompts)

Los Prompts son plantillas de conversación reutilizables que ayudan a un agente IA a iniciar un intercambio con un contexto pre-rellenado. Se muestran en la interfaz del cliente para que los usuarios puedan activarlos con un solo clic.

Un prompt devuelve un array de mensajes (rol + contenido), representando un intercambio de conversación:

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

?>

Consejos

Los Prompts no utilizan PsMcpToolAnnotations, PsMcpSchema ni annotations. Solo name, title, description, icons y meta están disponibles.

Resumen de atributos por tipo de elemento

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

Manejo de errores

PrestaShop MCP Server proporciona clases de excepción dedicadas para manejar errores en herramientas, recursos y prompts. Cada excepción encapsula la excepción correspondiente del SDK MCP y garantiza que el error se comunique correctamente al agente IA a través del protocolo MCP.

Clase de excepciónEncapsula (SDK)Uso en
PsMcpToolCallExceptionToolCallExceptionTools
PsMcpResourceReadExceptionResourceReadExceptionResources / Resource Templates
PsMcpPromptGetExceptionPromptGetExceptionPrompts

Todos los constructores toman los mismos dos parámetros:

  • message (string): Una descripción legible del error que se enviará al agente IA.
  • exitCode (int): Un código de salida numérico que indica el tipo de error.

Manejo de errores en 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
            );
        }
    }
}

?>

Manejo de errores en 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
            );
        }
    }
}

?>

Manejo de errores en 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
            );
        }
    }
}

?>

Pautas para Tools efectivos

Estas pautas te ayudarán a diseñar herramientas que los agentes puedan entender y usar para realizar tareas complejas.

1. Describe tus herramientas de forma clara y concisa

Define claramente y de forma concisa el propósito y el comportamiento de cada herramienta. Esto ayuda a los modelos de IA a entender la funcionalidad de la herramienta y usarla correctamente.

Ejemplo:

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

En este ejemplo, el nombre y la descripción de la herramienta no dejan lugar a dudas sobre el uso de la herramienta. El campo searchTerms también muestra cómo un agente puede ser guiado para usar plenamente tus herramientas.

2. Usa vocabulario consistente

Usa vocabulario consistente en todo tu servidor MCP para ayudar a los agentes a conectar tus herramientas y planificar flujos de trabajo complejos usando múltiples herramientas juntas. Esto incluye parámetros, mensajes de error y otros términos técnicos.

3. Valida tus entradas

Valida las entradas de tus herramientas usando la anotación #[PsMcpSchema()] proporcionada, para asegurarte de que sean correctas y consistentes.

4. Realiza comprobaciones de coherencia

Después de validar los parámetros, asegúrate de que los agentes hagan solicitudes razonables a tus herramientas. Esto incluye:

  • Limitar el tamaño de los resultados y la complejidad de las solicitudes
  • Aplicar permisos
  • Verificar contenido inapropiado cuando la IA genera texto o imágenes
  • Detectar comportamientos erráticos, como un agente atascado en un bucle

Para más pautas sobre cómo escribir herramientas MCP efectivas, visita la Guía de desarrollo MCP.

Pautas para Resources efectivos

1. Elige URIs claras y predecibles

Usa un esquema de URI consistente que refleje la jerarquía de tus datos. El agente debería poder adivinar el URI de un recurso a partir de su nombre.

Ejemplos:

  • store://configuration para la configuración global
  • store://catalog/products para el catálogo de productos
  • store://orders/stats para las estadísticas de pedidos

2. Documenta el formato de retorno

Indica claramente el mimeType y describe la estructura de los datos devueltos en la description. El agente no puede adivinar el formato sin indicaciones.

3. Usa size cuando sea relevante

El parámetro size ayuda al agente a estimar el tamaño de la respuesta antes de solicitarla, lo cual es útil para recursos voluminosos.

4. Prefiere los Resource Templates para datos parametrizados

Si tu recurso acepta un identificador o filtro, usa un Resource Template (products://{id}) en lugar de un Tool. Los templates son más ligeros y explícitos para la lectura de datos.

Pautas para Prompts efectivos

1. Devuelve mensajes estructurados

Un prompt devuelve un array de mensajes role/content. Usa el rol assistant para dar instrucciones de contexto y el rol user para formular la solicitud inicial.

2. Haz tus prompts parametrizables

Acepta argumentos para personalizar el comportamiento del prompt. Esto permite al agente o al usuario adaptar el prompt sin crear uno nuevo.

3. Mantén los prompts enfocados

Cada prompt debe corresponder a una tarea o escenario específico. Evita los prompts demasiado genéricos que intentan cubrirlo todo.

4. Describe claramente el resultado esperado

La description del prompt debe indicar lo que el agente producirá como resultado. El usuario debe entender lo que obtendrá antes de activar el prompt.

Depuración

PrestaShop MCP Server almacena los registros, caché y archivos de configuración en la carpeta .mcp. Los archivos .logs se crean cuando el parámetro del módulo MCP Activar registros se establece en true.

Para forzar un nuevo escaneo de ubicaciones, elimina el directorio .mcp/cache.

Usa el inspector MCP para verificar que tu servidor funciona y validar que tus elementos MCP funcionan correctamente.

Dependencias

  • modelcontextprotocol/php-sdk - PHP MCP SDK

Documentación

  • Especificación del protocolo MCP: modelcontextprotocol.io
Actualizado el: 30/4/26, 9:18
Contributors: khanhmas, John.R, fox-john, cnavarro-prestashop, Cyril Navarro, Jonathan Renard, dependabot[bot], gericfo, Claude Opus 4.6
Prev
¿Qué es MCP? Glosario