Skip to content

MCP (Model Context Protocol)

Melis integra il Model Context Protocol in modo che gli agenti IA possano richiamare strumenti — leggere/scrivere file, eseguire operazioni sul database, generare lo scheletro di moduli — durante un'esecuzione. Melis è anche un server MCP: gli stessi strumenti possono essere esposti via HTTP a client MCP esterni. Questa pagina spiega come funziona, come aggiungere il proprio strumento MCP e come esporlo.

Stesso motore, nuovo back-office

Melis v6 ha mantenuto invariati il motore IA e i suoi moduli; ha sostituito il back-office con una UI React su /melis-react. Tutto ciò che questa pagina spiega sul funzionamento di MCP — il client, la configurazione mcp.tools.php, l'avvio dei server tramite stdio, la sicurezza — è identico alla v5. Solo le parti che riguardano dove fai clic sono state spostate nei nuovi strumenti React (Melis AI → Admin → MCP Server, la lista di autorizzazione AI Tools dell'agente e l'MCP Inspector). Questi sono evidenziati di seguito.

Client e server

Melis agisce da client MCP: avvia server MCP locali (processi PHP, trasporto stdio) e ne richiama gli strumenti quando un modello lo chiede.

Melis può ora agire anche da server MCP: gli stessi strumenti sono esponibili via Streamable HTTP a client MCP esterni (Claude Desktop, l'MCP Inspector, le tue integrazioni). Nulla è raggiungibile finché non lo esponi esplicitamente: vedi Esporre gli strumenti a client esterni più sotto.

Server MCP integrati

Di serie la piattaforma include sei server MCP, distribuiti su tre moduli (dichiarati in melis-ai-engine/config/app.interface.php e nei mcp.tools.php dei moduli):

Server (chiave di configurazione)DirectoryModuloStrumenti
file_operationsmcp/filemcpmelis-aicreateFile, createDirectory, pathExists, readFile, updateFiles, deleteFile, deleteDirectory
database_operationsmcp/dbmcpmelis-aiget_table_structure, create_database_table, add_db_table_columns, update_db_table_columns, drop_db_table_columns, drop_database_table, selectData, insertData, updateData, deleteData, bulkInsertData
module_documentsmcp/documentationmcpmelis-aigetDocModuleList, getModuleDoc, getModuleDocImage
navigation_operationsmcp/navigationmcpmelis-ailistBackOfficeTools, openBackOfficeTool, listCmsPages, resolveHomepage, openCmsPage, navStep
tool_creatormcp/toolcreatormelis-ai-tool-creatorcreateModule, activateModule, deactivateModule, generateBundle
minitemplate_creatormcp/minitemplatecreatormelis-ai-community-extensionsreadSiteAssets, getSitePublicUrl, uploadMinitemplateImages, renderMinitemplatePreview

Ogni server offre due modalità di esecuzione a partire dalle stesse implementazioni:

  • stdiobin/server.php, ad esempio vendor/melisplatform/melis-ai/mcp/dbmcp/bin/server.php. È ciò che il motore avvia per le esecuzioni degli agenti nella piattaforma, e ciò a cui può collegarsi un client desktop locale. Non raggiungibile dalla rete.
  • HTTPpublic/index.php, servito da bin/serve.php (un wrapper di php -S). È la modalità esponibile in rete, e l'unica che applica la lista di autorizzazione qui sotto.

I server vivono in più moduli

Non sono tutti sotto melis-ai. Per censire ciò che una data installazione contiene davvero:

bash
ls -d vendor/melisplatform/melis-ai*/mcp/*/

navigationmcp è un caso particolare: non ha un vendor/ proprio e prende in prestito l'autoloader di dbmcp.

Come si svolge una chiamata a uno strumento

Quando un modello (Claude/Gemini) chiede di richiamare una funzione durante l'esecuzione di un agente:

  1. Il servizio del provider chiede al servizio MCP se si tratta di uno strumento MCP — MelisAIEngineMcpService::isMcpTool($name) (strumenti contrassegnati con 'mcp' => true, oppure noti a un server).
  2. In caso affermativo, invokeTool($name, $args) individua il server corretto, (ri)utilizza il suo processo e invia una richiesta JSON-RPC tools/call tramite stdio.
  3. Il server esegue lo strumento e restituisce il risultato, che viene rinviato al modello.

Il client MCP si trova in melis-ai-engine/src/Service/MelisAIEngineMcpService.php (composto da trait per la comunicazione, la gestione dei server, la gestione degli strumenti, la scoperta degli schemi, l'interruttore automatico e il logging).

La configurazione mcp.tools.php

Un modulo espone strumenti MCP fornendo un file config/mcp.tools.php che dichiara (a) gli schemi degli strumenti per il motore IA e (b) il server che li gestisce. Esempio (ridotto, da melis-ai-tool-creator/config/mcp.tools.php):

php
return [
    'plugins' => ['melisaiengine' => ['datas' => [
        'function_declarations' => [
            [
                'name' => 'createModule',
                'description' => 'Create a Laminas module with all components.',
                'mcp' => true,                  // routed to an MCP server
                'input_schema' => [
                    'type' => 'object',
                    'properties' => [
                        'moduleName'    => ['type' => 'string'],
                        'functionality' => ['type' => 'string'],
                        'needDBTable'   => ['type' => 'boolean'],
                    ],
                    'required' => ['moduleName', 'functionality', 'needDBTable'],
                ],
            ],
        ],
    ]]],
    'mcp' => ['servers' => [
        'tool_creator' => [
            'enabled'  => true,
            'module'   => 'melis-ai-tool-creator',
            'args'     => [__DIR__ . '/../mcp/toolcreator/bin/server.php'],
            'timeout'  => 600,
            'tools'    => ['createModule', 'activateModule', 'deactivateModule'],
        ],
    ]],
];

Aggiungere il proprio strumento MCP

1. Scrivere il server

vendor/.../your-module/mcp/yourserver/bin/server.php:

php
#!/usr/bin/env php
<?php
require_once __DIR__ . '/../vendor/autoload.php';

use Mcp\Server;
use Mcp\Server\Transport\StdioTransport;
use YourNs\YourOperations;

$server = Server::builder()
    ->setServerInfo('your-mcp', '1.0.0')
    ->addTool([YourOperations::class, 'doSomething'])
    ->build();

$server->run(new StdioTransport());

2. Implementare le operazioni

php
namespace YourNs;

use Mcp\Capability\Attribute\McpTool;

class YourOperations
{
    #[McpTool(name: 'doSomething', description: 'What this tool does')]
    public function doSomething(string $param1): array
    {
        return ['success' => true, 'result' => /* … */];
    }
}

3. Dichiararlo e caricare la configurazione

Aggiungi un file config/mcp.tools.php (come sopra) che dichiari le function_declarations e la voce mcp.servers, quindi includelo dal metodo Module::getConfig() del tuo modulo.

Il motore si occupa per te dell'avvio dei processi, di JSON-RPC su stdio, dei timeout, dei tentativi di ripetizione e dell'interruttore automatico. I modelli che supportano le chiamate agli strumenti possono quindi richiamare il tuo strumento durante l'esecuzione di un agente.

Autorizzare uno strumento su un agente (React)

Dichiarare uno strumento lo rende disponibile; un agente vede sempre e solo gli strumenti che spunti per esso. Nel back-office React, apri Melis AI → AI Agents, apri (o crea) un agente e vai alla scheda AI Tools — un elenco di controllo suddiviso in MCP tools (serviti dai server MCP) e Local tools (PHP integrati). Spunta quelli che questo agente può richiamare e il motore offrirà esattamente quelli al modello a ogni esecuzione. Anche gli strumenti MCP del database rispettano i diritti di lettura/scrittura/eliminazione per singola tabella definiti nella scheda DB Rights dell'agente.

Lista di autorizzazione AI Tools dell'agenteMelis AI → AI Agents → un agente → AI Tools: gli MCP tools (getTableStructure, createDatabaseTable, selectData, insertData…) e i Local tools che un agente può richiamare.

Puoi configurare quali funzioni il server MCP integrato espone in Melis AI → Admin → MCP Server (la sotto-scheda MCP Exposition); vengono resi disponibili solo gli strumenti spuntati. Consulta la guida IA per il modello completo agente/istanza e il riferimento melis-ai per gli strumenti e gli endpoint.

Esporre gli strumenti a client esterni (modalità server)

Eseguire un server in modalità HTTP rende i suoi strumenti richiamabili da qualsiasi client MCP in grado di raggiungerlo, quindi l'esposizione è deliberatamente protetta su più livelli. La guida operativa completa (prima Docker in locale, poi Kubernetes) è distribuita con il pacchetto in vendor/melisplatform/melis-ai/mcp/MCP-EXPOSURE-GUIDE.md; questo è il riepilogo.

La lista degli strumenti esposti

Il public/index.php di ogni server legge la tabella melis_ai_mcp_exposed_tools all'avvio e registra solo gli strumenti elencati:

php
$names        = $pdo->query('SELECT met_tool_name FROM melis_ai_mcp_exposed_tools')
                    ->fetchAll(PDO::FETCH_COLUMN);
$exposedNames = array_flip($names);

foreach ($allTools as $toolName => $callable) {
    if (isset($exposedNames[$toolName])) {
        $builder->addTool($callable);
    }
}

Una tabella vuota — o un database irraggiungibile — non espone nulla. È questa la principale misura di sicurezza: strumenti distruttivi come deleteData o drop_database_table restano semplicemente fuori dalla tabella. I valori devono corrispondere alle chiavi camelCase di $allTools nel public/index.php di ciascun server.

Gestisci la lista dal back-office React in Melis AI → Admin → MCP Server → MCP Exposition: un elenco di tutte le funzioni dichiarate; spuntare uno strumento inserisce la sua riga, togliere la spunta la elimina. È supportato da MelisReactApiAiMcpServerController (GET /melis/react-api/ai-mcp-server/data, POST …/save-tools) e dal modello MelisAIMcpExposedToolTable.

Verifica il punto di ingresso prima di esporre

Un public/index.php distribuito non è automaticamente sicuro. Alcuni server includono una semplice catena Server::builder()->addTool(…)->build() che registra tutti gli strumenti senza filtro sul database. Apri il file e verifica che il ciclo $allTools + PDO qui sopra sia presente prima di metterlo in rete.

Eseguire un server via HTTP

bin/serve.php avvia il web server integrato di PHP su public/, leggendo MCP_HOST e MCP_PORT:

bash
MCP_HOST=0.0.0.0 MCP_PORT=6276 php vendor/melisplatform/melis-ai/mcp/dbmcp/bin/serve.php

In uno stack Docker ogni server gira come programma supervisord di lunga durata. La distribuzione di porte di riferimento (solo interna: verso l'esterno è tutto sulla 443):

PortServer
6274UI MCP Inspector
6275filemcp
6276dbmcp
6277Proxy MCP Inspector
6278documentationmcp
6279navigationmcp
6280toolcreator
6281minitemplatecreator

Il punto di ingresso HTTP richiede nyholm/psr7, nyholm/psr7-server e laminas/laminas-httphandlerrunner. I server sotto melis-ai/mcp/* li includono già; quelli di altri moduli di solito devono aggiungerli.

Verificare

Ogni server risponde ok a GET /healthz, ma healthz da solo non dimostra nulla: risponde prima del bootstrap PSR-7, quindi un server con l'autoloader di Composer non aggiornato supera healthz e va in errore alla prima richiesta reale. Invia sempre anche un handshake vero:

bash
curl -s -X POST http://127.0.0.1:6276/ \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"1.0"}}}'

Un "result" JSON-RPC nella risposta significa che il server funziona davvero.

Pubblicare da remoto

In Kubernetes i server stanno dietro l'ingress nginx con TLS sulla 443 e una whitelist di IP (whitelist-source-range), così le porte 627x non sono mai raggiungibili direttamente. Sono disponibili due strategie di routing: un hostname per server (https://dbmcp.<dominio>/) oppure — consigliata quando se ne espongono diversi — un unico host con routing per percorso (https://mcp.<dominio>/dbmcp), dove use-regex + rewrite-target rimuovono il prefisso in modo che ogni backend continui a vedere / e /healthz. Passare in seguito dall'una all'altra tocca solo l'ingress.

composer update cancella le modifiche in vendor

Questi punti di ingresso vivono sotto vendor/. Un composer update melisplatform/melis-ai (o gli altri moduli che contengono MCP) riestrae il pacchetto e può riportare un public/index.php con filtro sul database a esporre tutto. Verifica di nuovo dopo ogni aggiornamento e porta le modifiche durature a monte, nei repository dei pacchetti, invece che in vendor/.

Ispezionare i server MCP (MCP Inspector)

Il back-office React include uno strumento MCP Inspector in Melis AI → MCP Inspector (rotta /melis-ai/mcp-inspector). Elenca i server MCP connessi e ti consente di avviarli / verificarne lo stato / leggerne i log, così puoi confermare che un server sia attivo e che gli strumenti che ti aspetti siano individuabili prima di autorizzarli su un agente. Come ogni strumento React, dispone di un interruttore New / Old (New = la pagina React; Old = lo strumento classico in un iframe), che avvia l'interfaccia ufficiale dell'MCP Inspector su un server scelto tramite vendor/melisplatform/melis-ai/src/Controller/McpInspectorController.php.

Gli endpoint React dell'Inspector (servers, launch, status, log) si trovano in MelisReactApiMcpInspectorController — consulta il riferimento melis-ai.

Sicurezza

Le operazioni MCP su file/DB sono isolate in una sandbox tramite allowed_paths / forbidden_paths, configurati in melis-ai-engine/config/app.interface.php (ad esempio module, public, config, /tmp consentiti; /etc, /bin, /root… vietati). Verifica queste impostazioni prima di abilitare gli strumenti di scrittura. Oltre alla sandbox, la portata di un agente è limitata dalla sua lista di autorizzazione AI Tools e dai DB Rights (sopra), così un modello può accedere solo a ciò che hai esplicitamente concesso.

In modalità server i livelli si sommano: uno strumento deve essere presente in melis_ai_mcp_exposed_tools anche solo per essere registrato, l'ingress limita i chiamanti per IP di origine su TLS, e la sandbox su file/DB continua ad applicarsi a ciò che viene eseguito. Esponi l'insieme utile più piccolo — prima gli strumenti di sola lettura — e tieni quelli distruttivi fuori dalla lista.

File principali

AmbitoPercorso
Servizio client MCPvendor/melisplatform/melis-ai-engine/src/Service/MelisAIEngineMcpService.php
Trait di gestione degli strumentivendor/melisplatform/melis-ai-engine/src/Service/Traits/Mcp/McpToolManagementTrait.php
Configurazione del servervendor/melisplatform/melis-ai-engine/config/app.interface.php
Esempio di mcp.tools.phpvendor/melisplatform/melis-ai-tool-creator/config/mcp.tools.php
Esempio di server (stdio)vendor/melisplatform/melis-ai/mcp/dbmcp/bin/server.php
Esempio di server (HTTP)vendor/melisplatform/melis-ai/mcp/dbmcp/public/index.php
Launcher HTTPvendor/melisplatform/melis-ai/mcp/dbmcp/bin/serve.php
Guida all'esposizionevendor/melisplatform/melis-ai/mcp/MCP-EXPOSURE-GUIDE.md
Modello degli strumenti espostivendor/melisplatform/melis-ai/src/Model/Tables/MelisAIMcpExposedToolTable.php
Scheda MCP Server (API React)vendor/melisplatform/melis-ai/src/Controller/React/MelisReactApiAiMcpServerController.php
Inspector (classico)vendor/melisplatform/melis-ai/src/Controller/McpInspectorController.php
Inspector (API React)vendor/melisplatform/melis-ai/src/Controller/React/MelisReactApiMcpInspectorController.php