Integrare Claude AI assistant con Apache Superset
Apache Superset mette a disposizione dell’utente un’interfaccia semplice e soprattutto no-code per generare molteplici tipologie di grafici e dashboard a partire da dati presenti in un datastore. In poco tempo possiamo rendere disponibili dashboard accattivanti che fanno la loro bella figura senza troppe difficoltà. In tutto questo però c’è una criticità che nessun grafico o dashboard predefiniti possono risolvere: nel momento in cui qualcuno chiede un dato particolare non previsto in fase di progettazione della dashboard, siamo costretti ed apportare modifiche per rispondere al requisito.
Integrare un Agent AI con Apache Superset ci permette di sfruttare le potenzialità dell’Intelligenza Artificiale per avere a disposizione i dati di interesse semplicemente chiedendolo all’agente, senza la necessità di aspettare che il data analyst o dashboard designer di turno effettui le modifiche richieste.
Lo scopo di questo articolo è proprio quello di mostrare come integrare Claude AI con Superset, in modo da avere un nostro agente AI specializzato in business intelligence e data analysis, pronto a rispondere alle nostre domande. L’integrazione sfrutta il protocollo MCP (Model Context Protocol) ed è applicabile a qualunque vendor di soluzioni AI che lo supporti. La scelta di Claude è dovuta essenzialmente alla possibilità di utilizzo dell’account free per collegare un server MCP a scopo di test, cosa non permessa da altri vendor. Ma procediamo per passi.
Che cos’è Apache Superset
Apache Superset è una piattaforma di Business Intelligence e data visualization open source, moderna e cloud-native. Sviluppata in Python e TypeScript è in grado di connettersi alla maggior parte dei data store basati su SQL e nasce per sostituire o affiancare strumenti di BI tradizionali con una soluzione più leggera ed estensibile, facilmente integrabile all’interno di ecosistemi cloud via Docker e Kubernetes. Mette a disposizione un’interfaccia no-code semplice da usare per generare grafici e dashboard accattivanti a partire dai dati presenti nel sistema di storage. Permette di visualizzare dati e creare diverse tipologie di grafici sulla base di metriche e dimensioni, assemblare grafici in dashboard interattive ed attivare filtri e cross-filter interattivi. Supporta autenticazione e gestione granulare delle autorizzazioni basata su RBAC e supporta la possibilità di embedding per integrare le dashboard all’interno di pagine web o applicazioni host.
Le funzionalità MCP previste su Superset
L’ultima versione di Superset (versione 6.1.0) include un server MCP (Model Context Protocol) integrato che consente agli assistenti AI, come Claude, ChatGPT e altri client compatibili con MCP, di interagire con l’istanza di Superset. Tramite il protocollo MCP, i client possono visualizzare dashboard, interrogare set di dati, eseguire query SQL, creare grafici e molto altro.

Da non trascurare il fatto che il server MCP deve essere esposto su Internet affinché sia raggiungibile dai vari Agent; pertanto la gestione dell’autenticazione è un aspetto fondamentale per avere un accesso sicuro e protetto.
Il server MCP espone nativamente le seguenti categorie di tools.
| Categoria | Tools |
|---|---|
| Exploration & Discovery | health_check, get_instance_info, get_schema |
| Datasets | list_datasets, get_dataset_info, create_virtual_dataset |
| Charts | list_charts, get_chart_info, get_chart_data, get_chart_preview, get_chart_type_schema, generate_chart, update_chart, update_chart_preview, generate_explore_link |
| Dashboards | list_dashboards, get_dashboard_info, generate_dashboard, add_chart_to_existing_dashboard |
| SQL | execute_sql, save_sql_query, open_sql_lab_with_context |
| Databases | list_databases, get_database_info |
I tools possono essere chiamati dall’agente AI tramite MCP in base alla necessita di esplorare i dati, creare o visualizzare grafici e dashboard. Inoltre, è possibile anche aggiungere altri tools in base alle nostre necessità.
Sicurezza e meccanismi di autenticazione
La sicurezza è un aspetto fondamentale in un’integrazione di questo tipo perché stiamo permettendo ad un agente AI, e cioè un’entità esterna, pieno accesso ai nostri dati. Per questo motivo dobbiamo prevedere un doppio livello di protezione:
- dobbiamo essere certi che chi sta usando i dati sia autorizzato a farlo;
- dobbiamo anche essere certi che l’agente AI non effettui operazioni distruttive sui dati.
Per il primo livello usiamo il meccanismo di autenticazione basato su token JWT supportato da Superset MCP, con l’utilizzo di Microsoft Entra ID come OAuth 2 Authorization Server. Superset MCP sa validare un JWT ma non implementa gli endpoint di discovery OAuth richiesti dalla specifica MCP, pertanto è necessario usare un proxy davanti a Superset MCP puntando a Entra ID come authorization server. Microsoft Entra ID riceve la richiesta di token da Claude AI e genera un token JWT firmato RS256. Claude AI si connette quindi al server MCP usando il token ottenuto da Entra ID che viene validato dal server MCP.
Per il secondo livello di difesa sfruttiamo i meccanismi RBAC di Superset, assegnando all’utente che si connette un ruolo che abbia privilegi limitati alle operazioni che vogliamo permettere, ad esempio evitando di concedere privilegi come can edit oppure can delete. Inoltre, per evitare query distruttive sui dati, configuriamo Superset per accedere alla sorgente dati con un utente che abbia grant limitati su schemi e tabelle.
Anthropic Claude AI
Claude AI e Claude Desktop permettono, anche nella versione free, di aggiungere un connettore MCP personalizzato e supportano autenticazione OAuth 2 con PKCE. Su interfaccia di configurazione si può aggiungere URL https del server MCP ed i valori OAuth Client ID e Client Secret per l’autenticazione con un authorization server. Affinché il processo di autenticazione vada a buon fine è necessario che il server MCP (o un proxy) fornisca a Claude AI gli endpoint di discovery OAuth richiesti dalla specifica MCP.
GET /.well-known/oauth-protected-resource
GET /.well-known/oauth-authorization-server
Senza questi endpoint, Claude non ha modo di sapere che l’authorization server è Microsoft Entra ID.
Flusso di integrazione
Lo schema end-to-end di autenticazione ed integrazione generale si può riassumere in questo modo.

Architettura e dettagli implementativi
L’architettura di riferimento coinvolge diversi componenti, ciascuno per il suo specifico ruolo.
- Claude AI agent: client AI scelto per l’integrazione, che si connette al server Superset MCP e si autentica tramite Microsoft Entra ID;
- Microsoft Entra ID: authorization server per l’autenticazione centralizzata;
- MCP Proxy: facilitatore di discovery, espone gli endpoint
.well-knownche Superset MCP non implementa nativamente; - Superset MCP Server: server MCP che valida il token JWT di autenticazione ed espone i tools necessari all’esplorazione dei dati;
- Superset Server: server Superset nativo per la gestione database, dataset, utenti, permessi e ruoli RBAC;
- Datastore: database dei dati acceduti da Superset con un utente DB a permessi limitati (es. solo
SELECT).
Operazioni preliminari
Per la mia sperimentazione ho deciso di eseguire il proxy MCP ed i server Superset MCP e Superset come Docker container su un’istanza AWS EC2. Il server MCP deve esporre interfaccia https per essere integrato con Claude AI, e per fare questo ho attivato un ALB su AWS con un listener sulla porta https 443, che ha come target group il proxy MCP.
Configurazione MCP Proxy
Il proxy MCP è una semplice applicazione python in ascolto sulla porta 8000 in http che esegue essenzialmente queste operazioni:
- Risponde lui stesso ai due path
.well-known, dichiarando la risorsa protetta (resource) e puntando a Entra ID come authorization server; - Inoltra tutto il resto (in particolare
/mcp) al server Superset MCP, che gira su porta interna 5008 non esposta.
Quello che segue è il codice python del Proxy, dove:
| Variabile | Descrizione |
|---|---|
| TENANT_ID | Tenant configurato su Entra ID |
| RESOURCE_URI | URL https esposta del server MCP (es. https://mymcpsuperset.com), rappresenta la risorsa protetta |
| SCOPE_URI | scope OAuth che Claude dovrà richiedere a Entra (es. https://mymcpsuperset.com/access_as_user), rappresenta lo scope dell’API che deve essere registrata su Entra ID |
| SUPERSET_MCP_UPSTREAM | URL interna del server MCP |
import os
from fastapi import FastAPI, Request, Response
from fastapi.responses import JSONResponse
import httpx
app = FastAPI()
TENANT_ID = os.getenv("TENANT_ID", "")
RESOURCE_URI = os.getenv("RESOURCE_URI", "")
SCOPE_URI = os.getenv("SCOPE_URI", "")
SUPERSET_MCP_UPSTREAM = os.getenv("SUPERSET_MCP_UPSTREAM", "")
@app.get("/health")
async def health():
return {"status": "ok"}
@app.get("/.well-known/oauth-protected-resource")
async def protected_resource_metadata():
return {
"resource": RESOURCE_URI,
"authorization_servers": [
f"https://login.microsoftonline.com/{TENANT_ID}/v2.0"
],
"bearer_methods_supported": ["header"],
"scopes_supported": [f"{SCOPE_URI}"]
}
@app.get("/.well-known/oauth-authorization-server")
async def authorization_server_metadata():
async with httpx.AsyncClient(timeout=10) as client:
r = await client.get(
f"https://login.microsoftonline.com/{TENANT_ID}/v2.0/.well-known/openid-configuration"
)
return r.json()
@app.api_route("/mcp", methods=["GET", "POST", "DELETE"])
async def proxy_mcp(request: Request):
body = await request.body()
headers = {k: v for k, v in request.headers.items() if k.lower() != "host"}
async with httpx.AsyncClient(timeout=30) as client:
resp = await client.request(
request.method,
f"{SUPERSET_MCP_UPSTREAM}/mcp",
content=body,
headers=headers,
)
return Response(
content=resp.content,
status_code=resp.status_code,
headers={"content-type": resp.headers.get("content-type", "application/json")},
)
@app.middleware("http")
async def log_unmatched(request: Request, call_next):
response = await call_next(request)
if response.status_code == 404:
print(f"[UNMATCHED] {request.method} {request.url.path}")
return response
Configurazione Superset MCP
Il server MCP è un endpoint aggiuntivo di Superset che espone i tools per esplorare i dati. Si avvia tramite il comando specifico:
CMD ["superset", "mcp", "run", "--host", "0.0.0.0", "--port", "5008"]
Qui di seguito riporto il Dockerfile per generare l’immagine del server MCP.
FROM apache/superset:latest
# Switch to root for package installation
USER root
RUN apt-get update && \
apt-get install -y \
pkg-config \
python3-dev \
gcc \
g++ \
default-libmysqlclient-dev \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
RUN . /app/.venv/bin/activate && \
uv pip install \
pip \
fastmcp \
Authlib \
pyjwt \
"mysqlclient<2.2" \
pymysql \
thrift
# Apply config
COPY config/superset_config.py /app/pythonpath/superset_config.py
COPY config/superset_config_mcp.py /app/pythonpath/superset_config_docker.py
COPY jwt_verifier.py /app/superset/mcp_service/jwt_verifier.py
# Switch to original user
USER superset
EXPOSE 5008
CMD ["superset", "mcp", "run", "--host", "0.0.0.0", "--port", "5008"]
Per problemi di compatibilità è stato necessario apportare una modifica al file /app/superset/mcp_service/jwt_verifier.py. L’errore ritornato dal sistema era il seguente:
DEBUG:superset.mcp_service.jwt_verifier:Token validation failed: 'DetailedJWTVerifier' object has no attribute 'jwt'
WARNING:superset.mcp_service.jwt_verifier:JWT authentication failed: Token validation failed
Per risolvere nello Step3: Decode and verify signature ho modificato la riga seguente:
claims = self.jwt.decode(token, verification_key)
con questa parte:
access_token = await super().load_access_token(token)
if access_token is None:
return None
claims = access_token.claims
Variabili Superset MCP (superset_config_mcp.py)
MCP_AUTH_ENABLED=true
MCP_DEV_USERNAME=mcpserver
MCP_SERVICE_HOST=0.0.0.0
MCP_SERVICE_PORT=5008
MCP_SERVICE_URL=https://mymcpsuperset.com
MCP_JWT_ALGORITHM=RS256
MCP_JWKS_URI=https://login.microsoftonline.com/{TENANT_ID}/discovery/v2.0/keys
MCP_JWT_ISSUER=https://login.microsoftonline.com/{TENANT_ID}/v2.0
MCP_JWT_AUDIENCE={CLIENT_ID}
MCP_DEBUG=true
MCP_JWT_DEBUG_ERRORS=true
| Variabile | Descrizione |
|---|---|
| MCP_AUTH_ENABLED | Abilita autenticazione JWT |
| MCP_DEV_USERNAME | Superset username |
| MCP_SERVICE_HOST | MCP Server binding host |
| MCP_SERVICE_PORT | MCP Server listenign port |
| MCP_SERVICE_URL | MCP Server public base URL |
| MCP_JWT_ALGORITHM | JWT signing algorithm |
| MCP_JWKS_URI | JWKS endpoint URL |
| MCP_JWT_ISSUER | claim iss del token |
| MCP_JWT_AUDIENCE | claim aud del token |
| MCP_DEBUG | Attiva il debug |
| MCP_JWT_DEBUG_ERRORS | Attiva il debug per l’autenticazione JWT |
Configurazione Microsoft Entra ID
Microsoft Entra ID è l’authorization server che deve generare il token da passare poi al server MCP per essere validato e permettere l’accesso. Le configurazioni di applicare su Entra ID possono essere riassunte così.
1. App Registration
Registrare un’applicazione in Microsoft Entra ID → App registrations → New registration; questa app rappresenta il tuo server MCP come risorsa protetta.
2. Expose an API
In App registration → Expose an API impostare l’Application ID URI in modo che corrisponda esattamente all’URL del server MCP (es. https://mymcpsuperset.com), poi aggiungere lo scope access_as_user in modo che l’URI completo generato sia del tipo https://mymcpsuperset.com/access_as_user.
3. API permissions
In API permissions → Add a permission → My APIs → selezionare l’app stessa → selezionare lo scope per collegare client e scope.
4. Authentication — redirect URI
In Authentication → Redirect URI → Add Redirect URI aggiungere le URI di callback di Claude
https://claude.com/api/mcp/auth_callback
https://claude.ai/api/mcp/auth_callback
5. Certificates & secrets — credenziali client
Creare il Client Secret.
6. Manifest — versione del token
Editare il Manifest e configurare il parametro accessTokenAcceptedVersion = 2
Configurazione Claude AI Desktop
Su Claude Desktop in Impostazioni → Connettori, aggiungere un Connettore Personalizzato e configurare i parametri
| Parametro | Valore |
|---|---|
| URL server MCP | https://mymcpsuperset.com/mcp |
| OAuth Client ID | Client ID Entra |
| OAuth Client Secret | Value del secret Entra |
A questo punto se tutte le configurazioni sono corrette, possiamo collegare il Connettore di Claude AI con il server MCP tramite autenticazione OAuth su Microsoft Entra ID. Dopo la validazione del token JWT il connettore risulterà nello stato connesso.

Claude Desktop al lavoro sui dati tramite Superset MCP
OK, mettiamo a lavoro Claude Desktop, iniziamo chiedendo semplicemente quali tools sono disponibili sul connettore.

Il mio database contiene dati di traffico relativi a servizi vocali erogati da un media server automatico; proviamo a chiedere a Claude di mostraci le chiamate giornaliere arrivate nel mese di giugno 2026.

Possiamo proseguire con altre richieste di dati o analisi dei dati, il sistema recupera le informazioni, le elabora e le presenta secondo le nostre richieste.


