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.

Superset AI integration

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:

  1. dobbiamo essere certi che chi sta usando i dati sia autorizzato a farlo;
  2. 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.

Superset AI authentication flow

Architettura e dettagli implementativi

L’architettura di riferimento coinvolge diversi componenti, ciascuno per il suo specifico ruolo.

  1. Claude AI agent: client AI scelto per l’integrazione, che si connette al server Superset MCP e si autentica tramite Microsoft Entra ID;
  2. Microsoft Entra ID: authorization server per l’autenticazione centralizzata;
  3. MCP Proxy: facilitatore di discovery, espone gli endpoint .well-known che Superset MCP non implementa nativamente;
  4. Superset MCP Server: server MCP che valida il token JWT di autenticazione ed espone i tools necessari all’esplorazione dei dati;
  5. Superset Server: server Superset nativo per la gestione database, dataset, utenti, permessi e ruoli RBAC;
  6. 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:

  1. Risponde lui stesso ai due path .well-known, dichiarando la risorsa protetta (resource) e puntando a Entra ID come authorization server;
  2. 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.

Superset AI Custom Connector

Claude Desktop al lavoro sui dati tramite Superset MCP

OK, mettiamo a lavoro Claude Desktop, iniziamo chiedendo semplicemente quali tools sono disponibili sul connettore.

Superset AI query tools


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.

Superset AI query calls


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.

Superset AI query billing data


Superset AI query billing details


Superset AI query billing values