Python | MCP Server

Image

Python | MCP Server

Nel mondo dell’integrazione tra Intelligenza Artificiale (AI) e infrastrutture dati, la necessità di un nodo intermedio intelligente capace di orchestrare, tradurre e indirizzare le informazioni tra sistemi diversi è sempre più concreta. È qui che entra in gioco il concetto di MCP (Modular Computing Platform o Modular Control Point).

Questo articolo ti guiderà, passo dopo passo, nella comprensione del ruolo di un MCP come ponte tra AI e sistemi dati, mostrandoti come simularlo localmente con Laragon e come collegare un modello AI scritto in Python a un database MySQL attraverso API PHP.

Cos’è un Server MCP?

Un MCP (Modular Computing Platform) è un sistema software/hardware che funge da intermediario modulare e compatibile tra componenti differenti di un’infrastruttura IT. Non è un prodotto singolo, ma un concetto architetturale applicabile anche in ambienti locali, come nel nostro caso con Laragon.

Caratteristiche principali:

  • Modularità: può contenere componenti eterogenei (API, database, AI, file system, servizi REST)
  • Compatibilità: comunica con linguaggi e protocolli diversi (HTTP, MQTT, JSON, DBMS)
  • Controllo dati: filtra, indirizza e trasforma i dati tra un sistema AI e un’infrastruttura

Architettura Locale del MCP

Di seguito riporto: il codice per il DB MySQL, il codice per la API MCP, uno script python che invia i dati alla API.

SQL
CREATE DATABASE mcp_db;
USE mcp_db;
CREATE TABLE ai_dati (
  id INT AUTO_INCREMENT PRIMARY KEY,
  valore TEXT,
  timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
PHP
<?php
// api.php
header("Content-Type: application/json");

// Connessione al database
$conn = new mysqli("localhost", "root", "", "mcp_db");
if ($conn->connect_error) {
    die(json_encode(["error" => "Connessione fallita"]));
}

// Ricezione JSON
$input = json_decode(file_get_contents("php://input"), true);
$valore = $input["valore"] ?? null;

if ($valore !== null) {
    $stmt = $conn->prepare("INSERT INTO ai_dati (valore) VALUES (?)");
    $stmt->bind_param("s", $valore);
    $stmt->execute();
    echo json_encode(["status" => "OK", "inserito" => $valore]);
} else {
    echo json_encode(["error" => "Dati mancanti"]);
}
Python
import requests
import json

# Dato generato da un modello AI o da input locale
valore_ai = "22.7"  # esempio: previsione di una temperatura ambiente (output da regressione)

# URL del server MCP locale (via Laragon)
url = "http://localhost/mcp-server/api.php"

# Invio dati al MCP
response = requests.post(url, json={"valore": valore_ai})

# Risposta dal server
print("Risposta MCP:", response.json())

Vi sembra una normale REST API JSON? Sì è vero, ma è la sua funzione architetturale, il modo in cui viene integrata e organizzata, che la fa assomigliare (o diventare) un nodo MCP. Vediamo cosa distingue un MCP da una semplice API REST:

CaratteristicaREST API classicaMCP (Modular Control Platform)
FinalitàEsporre dati o funzioniOrchestrare e integrare moduli diversi
StrutturaEndpoint singoli o specificiAmbiente modulare: API, storage, logica, AI, IO, sicurezza
Ruolo architetturaleParte di un sistemaNodo centrale di comunicazione e controllo
Compatibilità e interoperabilitàLimitata al dominio in cui è progettataEstesa a più tecnologie, protocolli e ambienti (IT + OT)
Gestione del datoIngresso/uscita tramite HTTPControllo del flusso dati, storage, routing, validazione
EvoluzioneFocalizzata sullo specifico caso d’usoScalabile e modulare, può inglobare API, AI, DB, UI, ecc.

Una singola API non è un MCP. Ma una struttura modulare che include una o più API, un database, logica AI e flussi dati , se:

  1. Funge da punto di raccolta e smistamento dati tra sistemi diversi (es. AI → DB → Dashboard)
  2. Traduce protocolli o modelli dati (es. JSON → SQL, CSV → JSON, MQTT → REST)
  3. Controlla il flusso informativo con logiche condizionali, sicurezza, validazione
  4. È compatibile con più tecnologie (es. Python, PHP, MQTT, SQL, Docker…)
  5. È modulare: ogni parte può essere sostituita, estesa, separata (tipico di MCP)

Una REST API è un componente.
Un MCP è un’architettura modulare, dove la REST API è solo una delle “porte” di comunicazione.

Aggiungiamo delle features alla nostra api.php per trasformarla in mcp_server.php

PHP
<?php
// mcp_server.php
header("Content-Type: application/json");

// Configurazioni base
$LOG_FILE = __DIR__ . "/mcp_log.txt";
$CSV_FILE = __DIR__ . "/dati_ai.csv";
$NOTIFICA_EMAIL = false; // Imposta true se vuoi attivare l'invio email

// Funzione logging
function scriviLog($msg) {
    global $LOG_FILE;
    $riga = "[" . date("Y-m-d H:i:s") . "] $msg\n";
    file_put_contents($LOG_FILE, $riga, FILE_APPEND);
}

// Funzione scrittura su CSV
function scriviCSV($valore, $fonte) {
    global $CSV_FILE;
    $riga = [$valore, $fonte, date("Y-m-d H:i:s")];
    $file = fopen($CSV_FILE, 'a');
    fputcsv($file, $riga);
    fclose($file);
}

// Funzione invio email (opzionale)
function inviaNotifica($valore, $fonte) {
    $destinatario = "admin@localhost"; // Cambia con email valida
    $oggetto = "Nuovo dato MCP da $fonte";
    $messaggio = "Valore ricevuto: $valore\nFonte: $fonte\nOra: " . date("Y-m-d H:i:s");
    mail($destinatario, $oggetto, $messaggio);
}

// Connessione al DB
$conn = new mysqli("localhost", "root", "", "mcp_db");
if ($conn->connect_error) {
    scriviLog("Errore DB: " . $conn->connect_error);
    die(json_encode(["error" => "Errore connessione database"]));
}

// Ricezione e parsing input
$input_raw = file_get_contents("php://input");
$input = json_decode($input_raw, true);

// Validazione input
$valore = $input["valore"] ?? null;
$fonte = $input["fonte"] ?? "sconosciuta";

if ($valore === null || !is_numeric($valore)) {
    scriviLog("Input non valido da $fonte - Payload: $input_raw");
    echo json_encode(["error" => "Valore mancante o non numerico"]);
    exit;
}

// Inserimento nel database
$stmt = $conn->prepare("INSERT INTO ai_dati (valore, fonte) VALUES (?, ?)");
$stmt->bind_param("ss", $valore, $fonte);
$stmt->execute();

// Logging e CSV
scriviLog("Dato valido ricevuto da $fonte: $valore");
scriviCSV($valore, $fonte);

if ($NOTIFICA_EMAIL) {
    inviaNotifica($valore, $fonte);
}

// Risposta JSON
echo json_encode([
    "status" => "OK",
    "valore" => $valore,
    "fonte" => $fonte,
    "timestamp" => date("Y-m-d H:i:s")
]);
SQL
CREATE DATABASE IF NOT EXISTS mcp_db;
USE mcp_db;

CREATE TABLE ai_dati (
    id INT AUTO_INCREMENT PRIMARY KEY,
    valore VARCHAR(255),
    fonte VARCHAR(255),
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Python
import requests

data = {
    "valore": 37.5,
    "fonte": "python_model"
}

res = requests.post("http://localhost/mcp-server/mcp_server.php", json=data)
print(res.json())

Al momento non esiste uno standard universale per i sistemi denominati MCP (Modular Computing Platform o Modular Control Point). Tuttavia, esistono linee guida architetturali comuni e modelli industriali che ne rappresentano il concetto.

PrincipioDettaglio
Modularità funzionaleOgni componente (AI, API, storage, logica) è separabile e sostituibile
Comunicazione standardUso di protocolli aperti: REST, MQTT, OPC UA, WebSocket, JSON
Compatibilità orizzontaleDeve integrarsi con sistemi legacy e moderni (DB, cloud, sensori)
Gestione distribuitaSupporta il controllo, il monitoraggio e l’aggiornamento remoto
Scalabilità fisica o logicaPossibilità di aggiungere moduli senza rifare tutto l’impianto
Standard / TecnologiaFunzione principale
OPC UAInteroperabilità tra dispositivi industriali (OT ↔ IT)
MQTTProtocollo leggero per comunicazioni IoT ed edge computing
RESTful API / JSON-RPCComunicazione tramite HTTP tra moduli e sistemi
Docker / OCIPackaging e isolamento modulare delle funzioni (es. AI, API, DB)
Pub/SubComunicazione asincrona e scalabile tra componenti
IEC 61499 / PLCopenStandard per automazione modulare e controllo distribuito
ModuloFunzione
API RESTRiceve i dati, espone endpoint, dialoga con fonti esterne
Modulo AIContiene modelli ML/AI (es. regressione, classificazione, LLM…)
Modulo Logica/RulesApplica regole condizionali (es. soglie, trigger, routing decisionale)
Validazione InputVerifica struttura, tipo, sicurezza, API key, origine
Logging e AuditRegistra eventi, errori, input, transazioni
StorageSalva i dati in database SQL o time-series
Output/NotificheInvia dati o avvisi a sistemi esterni via email, MQTT o webhook
Interfaccia WebMostra dati, log, stato sistema (Grafana, Dash, admin panel)
Input EsterniQualunque client: Arduino, Python, API di altri sistemi, etc.
ModuloTecnologie consigliate
API RESTPHP (Laragon), Flask (Python), Express (Node)
AI/MLPython (scikit-learn, PyTorch, TensorFlow)
Logica / RulesPHP, Python, JSON-based routing config
ValidazioneJSON Schema, regex, middleware custom
LoggingMonolog (PHP), logging (Python), txt/CSV
StorageMySQL, PostgreSQL, InfluxDB
Notifiche / OutputPHPMailer, SMTP, MQTT, Discord Webhook, etc.
UI / DashboardGrafana, Vue.js, PHPAdmin, custom panel

Best practice integrate nello schema:

✅ Modularità logica e fisica
✅ Separazione dei ruoli (AI, dati, logica, sicurezza)
✅ Compatibilità con protocolli aperti
✅ Estendibilità orizzontale (puoi duplicare o ridistribuire moduli)
✅ Logging e tracciabilità per audit
✅ Supporto a diverse fonti di input
✅ Pronto per essere containerizzato (Docker-ready)

Sebbene MCP non sia uno standard formale, la sua forza risiede proprio nella capacità di integrare standard già esistenti, selezionandoli in base al contesto d’uso. In pratica, un MCP è efficace quanto lo sono i componenti che lo costituiscono e la loro capacità di dialogare tra loro. La sua vera potenza non è nel nome, ma nel metodo con cui orchestra API, AI, dati e dispositivi eterogenei in un sistema coerente, osservabile e controllabile. Se costruito bene, un MCP è meno uno strumento e più un linguaggio d’integrazione per l’intero ecosistema IT/OT.

Se l’articolo ti è piaciuto restiamo in contatto su linkedin a: https://www.linkedin.com/in/andreatonin/

Banner

Releated Posts

ComfyUI – Reference Conditioning

In ComfyUI (soprattutto con modelli come Flux) il Reference Conditioning è un nodo che permette di usare una…

DiByAndrea Tonin Apr 9, 2026

ComfyUI per generare anime: NewBie Image Exp0.1

NewBie Image (spesso indicato come NewBie-image-Exp0.1) è un modello text-to-image in stile anime/ACG pensato per generare illustrazioni con…

DiByAndrea Tonin Apr 9, 2026

Comfy UI: OpenPose

Quando si parla di “OpenPose” in giro per ComfyUI, spesso si intende una cosa molto concreta: prendere una…

DiByAndrea Tonin Apr 9, 2026

L’AI in Cooperativa come scelta organizzativa

Negli ultimi mesi sono stato molto impegnato con docenze in cooperative anche molto diverse tra loro. In aula…

DiByAndrea Tonin Apr 9, 2026