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_sentimentappellent 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>/ssehttps://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
sqlglotet rejette tout ce qui n'est pas un seulSELECT / WITH / UNION / EXCEPT / INTERSECT. - Denylist de mots-clés —
INSERT,UPDATE,DELETE,DROP,CREATE,ALTER,GRANT,REVOKEsont 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 dures —
TRINO_MAX_ROWS=100,TRINO_TIMEOUT_S=30. Ajustables via les values, mais toute configuration > 1000 lignes exigeakko-admin. - Sous-outils IA —
akko_ai_sentiment/akko_ai_summarize/akko_ai_askexécutentSELECT 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:viewetlineage:viewdans 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-trinoouakko-mcp-openmetadata, attributstool.name,trino.sql.hash,user.id. - Loki — lignes JSON structurées
app=akko-mcp-trino, champstool,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¶
- Services / Serveurs MCP — image, values helm, tests
- IA / ADEN — philosophie similaire, côté navigateur
- IA / Fonctions Trino — les outils
ai_*appelés par MCP Trino - Architecture / AI Stack
- Admin / RBAC