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

Prompt che mettono la AI in discussione

Il problema raramente è “non avere informazioni”, ma averle giuste, coerenti e verificabili. Una fattura letta male, una…

DiByAndrea Tonin Apr 15, 2026

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