Aller au contenu

Serveurs MCP

AKKO embarque deux serveurs Model Context Protocol (MCP) qui permettent aux agents LLM (Claude Desktop, Cursor, VS Code, Continue, LibreChat) de dialoguer nativement avec la plateforme — tout en gardant chaque octet et chaque modèle à l'intérieur du cluster.

Page de référence du service (image, variables, santé) : Services / Serveurs MCP. Cette page se concentre sur les capacités, la sécurité et l'intégration.

Pourquoi MCP sur AKKO

Model Context Protocol est le standard ouvert d'Anthropic pour connecter des LLM à des outils et ressources via une interface JSON-RPC. AKKO est l'une des rares plateformes open-source souveraines qui expose son moteur SQL et son catalogue via MCP, avec authentification Keycloak et autorisation OPA — sans gateway MCP SaaS.

  • Souverain — les deux serveurs tournent dans le namespace akko ; le trafic ne quitte jamais le cluster sauf si l'agent est externe (Ingress TLS).
  • Modèles souverains aussi — les outils comme akko_ai_sentiment appellent le plugin Trino AI local, qui route vers Ollama. Pas d'OpenAI.
  • Gouverné — chaque appel d'outil est authentifié (JWT Keycloak ou token de service) et autorisé (RBAC Trino/OpenMetadata + OPA).
  • Observable — chaque appel émet un span Tempo et une ligne de log structurée dans Loki.

Architecture

flowchart LR
    subgraph Agents[Agents IA]
        CLAUDE[Claude Desktop]
        CURSOR[Cursor / VS Code]
        LIB[LibreChat / Continue]
    end
    subgraph Edge[Edge]
        TR[Traefik<br/>TLS + OIDC]
    end
    subgraph Servers[Serveurs MCP AKKO]
        MCT[MCP Trino<br/>8 outils]
        MCO[MCP OpenMetadata<br/>catalogue + lignage]
    end
    subgraph Plane[Plan de données]
        TRI[Trino 480<br/>+ plugin ai_*]
        OM[OpenMetadata]
        AIS[AI Service<br/>FastAPI]
        OLL[Ollama]
    end
    CLAUDE & CURSOR & LIB --> TR
    TR --> MCT
    TR --> MCO
    MCT --> TRI
    MCT --> AIS
    AIS --> OLL
    MCO --> OM

Les deux serveurs sont déployés en Deployment Kubernetes standard avec 2 replicas, exposés via Traefik sur :

  • https://mcp-trino.<domain>/sse
  • https://mcp-openmetadata.<domain>/sse

TLS terminé par le secret partagé akko-tls. Seuls GET et POST sont autorisés au niveau de l'Ingress.

MCP Trino — 8 outils

Permet aux agents de découvrir les données, d'exécuter des SELECT en toute sécurité et d'appeler des fonctions IA souveraines.

Outil Signature Rôle
list_catalogs() Liste les catalogues Trino (iceberg, postgresql, tpch, …)
list_schemas(catalog) (catalog: str) Liste les schémas d'un catalogue
list_tables(catalog, schema) (catalog, schema) Liste les tables d'un schéma
describe_table(catalog, schema, table) (catalog, schema, table) Renvoie types, nullabilité, commentaires
execute_query(sql) (sql: str) SELECT lecture seule, 100 lignes max, timeout 30 s
akko_ai_sentiment(text) (text: str) Sentiment local via plugin Trino AI → Ollama
akko_ai_summarize(text) (text: str) Résumé local via plugin Trino AI
akko_ai_ask(question, context?) (question: str, context?: str) Question libre avec contexte optionnel

Modèle de sécurité

  • Lecture seule par défaut — le serveur parse le SQL avec sqlglot et rejette tout ce qui n'est pas un seul SELECT / WITH / UNION / EXCEPT / INTERSECT.
  • Denylist de mots-clésINSERT, UPDATE, DELETE, DROP, CREATE, ALTER, GRANT, REVOKE sont rejetés en seconde barrière.
  • Propagation d'identité — le JWT Keycloak de l'appelant (ou un token de service délégué) est propagé en X-Trino-User ; les politiques OPA s'appliquent de bout en bout.
  • Limites duresTRINO_MAX_ROWS=100, TRINO_TIMEOUT_S=30. Ajustables via les values, mais toute configuration > 1000 lignes exige akko-admin.
  • Sous-outils IAakko_ai_sentiment/akko_ai_summarize/akko_ai_ask exécutent SELECT akko_ai_sentiment(?) via Trino ; le plugin Trino AI applique ses propres rate limits par utilisateur.

MCP OpenMetadata — 5 outils

Permet aux agents de trouver des datasets, d'explorer le lignage et de consulter le glossaire métier.

Outil Signature Rôle
search_datasets(query) (query: str) Recherche plein texte dans le catalogue OpenMetadata
get_table_metadata(fqn) (fqn: str) Renvoie schéma, tags, propriétaires, description d'un FQN
get_lineage(fqn, hops=3) (fqn: str, hops: int) Lignage amont / aval (limité à hops)
list_glossary_terms() Énumère les entrées du glossaire métier
list_dashboards() Dashboards Superset référencés dans OpenMetadata

Modèle de sécurité

  • Lecture seule — le serveur utilise un JWT scope-limité qui ne possède que les permissions catalog:view et lineage:view dans OpenMetadata.
  • JWT de service stocké dans le Secret Kubernetes akko-mcp-om, injecté au démarrage. Rotation : kubectl delete secret akko-mcp-om && helm upgrade.
  • Pas d'impersonation — MCP OpenMetadata ne propage pas l'identité de l'appelant ; le lignage OpenMetadata est considéré comme métadonnée publique dans la plateforme. Les tags PII restent visibles ; les valeurs PII réelles ne sont servies que par Trino.

Configuration

Values Helm (helm/akko/values.yaml)

akko-mcp:
  trino:
    enabled: true
    image: akko-mcp-trino:2026.03
    ingress:
      host: mcp-federation.akko.local
    env:
      TRINO_HOST: akko-trino
      TRINO_PORT: "8080"
      TRINO_USER: mcp-trino
      TRINO_READ_ONLY: "true"
      TRINO_MAX_ROWS: "100"
      TRINO_TIMEOUT_S: "30"
  openmetadata:
    enabled: true
    image: akko-mcp-openmetadata:2026.03
    ingress:
      host: mcp-catalog.akko.local
    env:
      OPENMETADATA_HOST: openmetadata
      OPENMETADATA_PORT: "8585"
    envFromSecret: akko-mcp-om

Claude Desktop — ~/Library/Application Support/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "akko-trino": {
      "url": "https://mcp-federation.akko.local/sse"
    },
    "akko-openmetadata": {
      "url": "https://mcp-catalog.akko.local/sse"
    }
  }
}

Cursor / Continue / VS Code

Les trois utilisent le même champ url ; voir leur doc respective pour le fichier de config exact.

Développement local sans Ingress

kubectl port-forward -n akko svc/akko-akko-mcp-trino 3000:3000
kubectl port-forward -n akko svc/akko-akko-mcp-openmetadata 3001:3000
# Pointer ensuite l'agent sur http://localhost:3000/sse et :3001/sse

RBAC

Rôle MCP Trino execute_query MCP Trino ai_* MCP OpenMetadata tous outils
akko-admin oui (plafond ligne) oui oui
akko-engineer oui oui oui
akko-analyst oui (OPA masque PII) oui oui
akko-user oui (OPA masque PII) oui (sous-ensemble) oui
akko-viewer oui (row filters appliqués) non oui

La propagation de token ne fonctionne que si l'agent passe par Traefik avec OIDC. En kubectl port-forward direct, le serveur MCP retombe sur son identité de service (mcp-trino dans group.txt), mappée sur un profil analyste restreint.

Observabilité

  • Tempo — chaque appel d'outil est un span : service akko-mcp-trino ou akko-mcp-openmetadata, attributs tool.name, trino.sql.hash, user.id.
  • Loki — lignes JSON structurées app=akko-mcp-trino, champs tool, user, latency_ms, status.
  • Prometheus — compteurs et histogrammes :
akko_mcp_tool_calls_total{server, tool, status}
akko_mcp_tool_duration_seconds{server, tool}
akko_mcp_trino_rows_returned{user}

Un dashboard Grafana AKKO / Serveurs MCP est livré : latence p95, top des outils, taux d'erreur, activité par utilisateur.

Dépannage

Symptôme Cause probable Correctif
Claude Desktop dit « outil indisponible » L'agent a caché un ancien schéma Redémarrer complètement Claude Desktop
403 sur chaque appel Cookie OIDC expiré Se reconnecter via le redirect Traefik ; ou roter le token de service pour les agents headless
execute_query renvoie 0 ligne sur une table qui existe Row filter OPA pour le rôle Rejouer la requête en akko-admin via le CLI Trino ; consulter les logs OPA
Lignage vide pour un FQN connu OpenMetadata pas encore ingéré Déclencher openmetadata_ingest_dag dans Airflow
La connexion SSE saute toutes les 30 s Timeout Traefik trop court Définir spec.defaultTimeout=3600s sur l'IngressRoute

Voir aussi