Aller au contenu principal

ADR-041 : Architecture Plugin — Core Communautaire vs Extensions Entreprise

Metadata

ChampValeur
Statut✅ Accepté
Date2026-02-12
DécideursChristophe ABOULICAM, Platform Team
LinearCAB-1136

Décisions Associées

  • ADR-024 : Modes Unifiés du Gateway — 4 modes de déploiement (edge-mcp, sidecar, proxy, shadow)
  • ADR-037 : Modes de Déploiement Souveraineté d'Abord — niveaux Souverain, Hybride, SaaS
  • ADR-039 : Authentification Mutuelle mTLS — authentification par certificat de niveau entreprise
  • ADR-040 : Born GitOps — Architecture de promotion multi-environnement

Contexte

Le Problème

STOA dispose de 559 tests de gateway, mTLS, circuit breakers, RBAC multi-tenant, fédération OIDC et métriques Kafka. Tout cela est invisible pour un freelance qui veut simplement exposer son API REST aux agents IA via MCP.

Aujourd'hui, il n'existe pas de stoa init. Pas de chemin de 30 secondes de zéro au premier appel MCP. La plateforme est prête pour l'entreprise mais hostile à la communauté.

Pendant ce temps, le paysage concurrentiel a évolué de façon spectaculaire :

PlateformeSupport MCPOpen SourceNiveau Communautaire« MCP vers Tout »
KongEnterprise MCP Gateway + Context Mesh (fév. 2026)Community Edition (BSL pour les fonctionnalités enterprise)Limité — pas de MCP dans OSSAPIs gérées par Kong uniquement
Gravitee4.10 MCP Proxy + AI Agent Management (jan. 2026)OSS (fonctionnalités enterprise limitées)Limité — MCP est enterpriseAPIs gérées par Gravitee uniquement
STOAMCP Gateway (Rust, production)Apache 2.0 (pas de BSL, pas de limitation de fonctionnalités)ManquantN'importe quelle API, n'importe quel protocole

L'Insight : MCP vers Tout, Pas MCP vers MCP

Kong transforme les APIs déjà gérées par Kong en outils MCP. Gravitee proxyfie le trafic MCP entre des composants compatibles MCP. Aucun ne fait le pont entre les backends non-MCP et MCP.

Le différenciateur de STOA est MCP vers Tout :

REST API      ──→ UAC ──→ MCP Tools
SOAP Service ──→ UAC ──→ MCP Tools
GraphQL API ──→ UAC ──→ MCP Tools
gRPC Service ──→ UAC ──→ MCP Tools
Legacy HTTP ──→ UAC ──→ MCP Tools

L'UAC (Universal API Contract) est la couche de traduction. « Define Once, Expose Everywhere » — y compris aux agents IA.

La Question Stratégique

Comment rendre STOA accessible aux freelances en 30 secondes tout en gardant les fonctionnalités enterprise disponibles pour les grandes organisations ?

Décision

Principe #1 : La Sécurité n'est pas un Niveau

Les fonctionnalités de sécurité sont toujours incluses, même dans le Core Communautaire gratuit. Le stockage des identifiants utilise le keychain du système d'exploitation par défaut — jamais des fichiers en clair. C'est un principe de conception fondamental, pas une fonctionnalité premium.

Cela positionne STOA contre chaque concurrent :

  • Kong : tokens admin dans les en-têtes, pas de keychain natif
  • kubectl : tokens en clair dans ~/.kube/config
  • AWS CLI : identifiants en clair dans ~/.aws/credentials
  • Docker : tokens en base64 (pas chiffrés) dans ~/.docker/config.json

Principe #2 : Core Communautaire = Produit Complet

Le Core Communautaire n'est pas un essai bridé. C'est un gateway API-vers-MCP entièrement fonctionnel qu'un freelance peut utiliser en production, pour toujours, gratuitement.

Principe #3 : Extensions Entreprise = Activation Opt-In

Les fonctionnalités enterprise sont déjà implémentées dans la codebase. Elles sont activées via des feature flags Cargo, de la configuration, ou la configuration Keycloak — pas via des clés de licence ou des paywalls.

Architecture à Deux Niveaux

Niveau 1 — Core Communautaire (Apache 2.0, gratuit pour toujours)

CatégorieFonctionnalitéStatut
GatewayProxy + routage✅ Implémenté
GatewayRate limiting✅ Implémenté
GatewayAuthentification API key✅ Implémenté
GatewayProtection SSRF✅ Implémenté
GatewayEn-têtes de sécurité✅ Implémenté
GatewayMétriques Prometheus✅ Implémenté
BridgeAuto-bridge OpenAPI → MCPÀ construire
BridgeBridge SOAP (WSDL) → MCPPlanifié (T3)
BridgeBridge GraphQL → MCPPlanifié (T3)
CLIstoactl init (scaffold de projet)À construire
CLIstoactl bridge (import + exposition)À construire
CLIstoactl doctor (diagnostic)À construire
SécuritéStockage d'identifiants OS KeychainÀ construire
SécuritéRotation de clé (stoactl auth rotate-key)À construire
SécuritéJournal d'audit d'accès aux identifiantsÀ construire
PackagingImage Docker stoa:communityÀ construire
DocsGuide « Démarrer en 5 Minutes »À construire

Niveau 2 — Extensions Entreprise (opt-in, même licence Apache 2.0)

CatégorieFonctionnalitéActivationStatut
AuthAuthentification mutuelle mTLSConfig + --features mtls✅ Implémenté (PR #224)
AuthFédération OIDC (multi-realm)Config Keycloak✅ Implémenté
AuthRBAC multi-tenantConfig Keycloak✅ Implémenté
RésilienceCircuit breakerConfig gateway✅ Implémenté (PR #218)
ObservabilitéMétriques Kafka--features kafka✅ Implémenté
ObservabilitéTraçage OpenTelemetry--features otelPlanifié
DéploiementMode sidecar (Kong/Envoy/NGINX)STOA_MODE=sidecarStub (T2)
DéploiementMode shadow (trafic → auto-gen UAC)STOA_MODE=shadowPartiel
DéploiementWatcher CRD K8s + fédération--features k8sPlanifié
DéploiementPromotion multi-environnementGitOps (ADR-040)✅ Implémenté
PackagingImage Docker stoa:enterpriseToutes les fonctionnalités compiléesÀ construire
SupportSLA + consultingContrat commercial

Architecture de Stockage des Identifiants

Les clés API et tokens DOIVENT être stockés dans le keychain du système d'exploitation. Jamais dans des fichiers en clair.

Hiérarchie de Résolution (ordre de priorité)

1. flag --api-key          (usage unique, jamais persisté)
2. variable d'env STOA_API_KEY (CI/CD et conteneurs uniquement)
3. OS Keychain (macOS Keychain / Linux secret-service / Windows Credential Manager)
4. ❌ JAMAIS un fichier en clair

Implémentation

OSBackendBibliothèque
macOSSecurity.framework (Keychain)Go : go-keyring, Rust : crate keyring
LinuxD-Bus Secret Service (GNOME Keyring / KWallet)Go : go-keyring, Rust : crate keyring
WindowsCredential Manager (WinCred)Go : go-keyring, Rust : crate keyring
CI/headlessFallback variable d'env (STOA_API_KEY)Natif
ConteneurFichier monté (/run/secrets/stoa)Natif

Exigences de Sécurité

  • Auto-rotation : stoactl auth rotate-key --auto --interval 90d planifie la rotation des clés
  • Journal d'audit : chaque lecture/écriture dans le keychain est journalisée dans ~/.stoa/audit.log (local, non envoyé)
  • stoactl auth status : affiche « Clé stockée dans : macOS Keychain » (n'affiche jamais la clé elle-même)
  • Pas de ~/.stoa/credentials : le fichier ne doit pas exister. Si détecté, stoactl doctor avertit et propose une migration

Le Chemin en 30 Secondes : stoactl initstoactl bridge

# Freelance : de zéro à MCP en 30 secondes
$ stoactl init my-project
✓ Created docker-compose.yml (gateway + echo backend)
✓ Created stoa.yaml (minimal config)
✓ Run: cd my-project && docker compose up -d

$ stoactl bridge ./openapi.yaml
✓ Parsed OpenAPI 3.x spec
✓ Generated 8 MCP tools from 8 endpoints
✓ Registered tools on gateway
✓ MCP endpoint: http://localhost:8080/mcp/sse

# Terminé. N'importe quel client MCP (Claude, GPT, etc.) peut appeler votre API.

stoactl doctor

Commande de diagnostic qui vérifie la pile complète :

$ stoactl doctor
✓ Docker: running (v27.5.1)
✓ Gateway: healthy (http://localhost:8080/health)
✓ Keychain: accessible (macOS Keychain)
✓ API key: valid (expires in 87 days)
✓ Port 8080: available
✓ MCP endpoint: responding (3 tools registered)
✗ OpenAPI spec: 2 warnings (circular ref in #/components/schemas/Node)

Chemin de Croissance

Le même utilisateur, la même codebase, évolue du freelance à l'entreprise :

ÉtapeCe qu'ils utilisentCoût
Jour 1 — Freelancestoactl init + bridge → REST vers MCP0€
Jour 30 — En croissance+ API keys pour clients + rate limiting + monitoring0€
Jour 90 — Scale-up+ domaines personnalisés + catalogue multi-API0€
Jour 180 — Entreprise+ mTLS + RBAC + fédération + mode sidecar + SLAContrat de support

Packaging Docker

Deux images, même Dockerfile avec des build args :

ImageFonctionnalités CompiléesTaille CibleCas d'Usage
ghcr.io/stoa-platform/gateway:communityPar défaut (sans fonctionnalités optionnelles)< 30 MoFreelance, indie, petites équipes
ghcr.io/stoa-platform/gateway:enterprise--all-features (kafka, k8s, otel, mtls)< 50 MoGrandes organisations
ghcr.io/stoa-platform/gateway:latestAlias pour community< 30 MoPull par défaut

Les deux images sont Apache 2.0. L'image enterprise n'est pas « payante » — elle inclut simplement des dépendances plus lourdes (rdkafka, client k8s, etc.) dont la plupart des freelances n'ont pas besoin.

Conséquences

Positives

  • Adoption communautaire : L'onboarding en 30 secondes supprime la friction n°1
  • Positionnement MCP-vers-tout : unique vs Kong (MCP-pour-Kong) et Gravitee (proxy MCP-vers-MCP)
  • Sécurité par défaut : keychain-first est un vrai différenciateur contre chaque concurrent
  • Pas de piège BSL : Apache 2.0 pour tout, y compris les fonctionnalités enterprise — signal de confiance pour la communauté OSS
  • Upsell enterprise naturel : même plateforme, même code, il suffit d'activer plus de fonctionnalités + acheter le support

Négatives

  • Complexité du bridge OpenAPI : références circulaires, allOf/oneOf/anyOf, discriminateurs, schémas polymorphiques nécessitent un parser robuste — pas un simple mapping
  • Tests keychain multi-OS : macOS Keychain, GNOME Keyring, KWallet, Windows Credential Manager se comportent tous différemment
  • Deux images Docker = deux pipelines CI : build matrix, testing matrix, coordination des releases
  • Pas de gate de revenus : les fonctionnalités enterprise sont gratuites — les revenus viennent uniquement du support/consulting

Atténuations

  • Bridge OpenAPI : utiliser un parser éprouvé (utoipa pour Rust, libopenapi pour Go) — ne pas le construire à la main
  • Keychain : le crate/bibliothèque keyring abstrait tous les backends OS derrière une API unique
  • Docker : Dockerfile unique avec ARG FEATURES="", cargo build conditionnel
  • Revenus : le mode shadow est l'argument décisif — « nous analysons gratuitement votre patrimoine de trafic, vous payez pour le consulting de migration »

Alternatives Considérées

Alternative A : Licence BSL/SSPL pour les Fonctionnalités Enterprise

Kong et Elastic utilisent BSL (Business Source License) pour limiter les fonctionnalités. Protecteur des revenus mais hostile à la communauté.

Rejeté : Le positionnement de STOA est explicitement anti-BSL. Apache 2.0 est un signal de confiance. Changer de licence détruirait la crédibilité avant de la construire.

Alternative B : Feature Flags via Clé de Licence

Modèle SaaS traditionnel — les fonctionnalités enterprise nécessitent un fichier de clé de licence.

Rejeté : ajoute de la complexité, crée une charge de support, ne s'aligne pas avec le principe « la sécurité n'est pas un niveau ». Les feature flags Cargo au moment de la compilation sont plus simples et plus transparents.

Alternative C : Codebase Enterprise Séparée (Fork)

Maintenir un fork privé avec du code enterprise uniquement.

Rejeté : cauchemar de maintenance, conflits de merge, les contributions de la communauté ne peuvent pas bénéficier du durcissement enterprise. Une seule codebase avec des feature flags est strictement meilleure.

Plan d'Implémentation

Phase 1 — CLI Communautaire (stoactl) — CAB-1136-P1

ÉtapeLivrable
1stoactl init — scaffold de projet (docker-compose + config)
2stoactl doctor — commande de diagnostic
3Intégration Keychain (go-keyring) — stocker/récupérer/rotation des clés API
4stoactl auth — login, status, rotate-key avec backend keychain
5Journal d'audit pour l'accès aux identifiants

Phase 2 — Bridge OpenAPI-vers-MCP — CAB-1136-P2

ÉtapeLivrable
1Parser OpenAPI 3.x (gérer les refs, allOf/oneOf/anyOf, refs circulaires)
2Générateur d'outils MCP (endpoint → mapping d'outil, extraction de paramètres)
3Commande stoactl bridge (parser + générer + enregistrer sur gateway)
4Hot-reload : file watcher sur le fichier spec, mise à jour automatique des outils lors de changements

Phase 3 — Packaging Docker + Documentation — CAB-1136-P3

ÉtapeLivrable
1Dockerfile avec ARG FEATURES pour les builds community/enterprise
2Pipeline CI pour build + push de double image
3Guide « Démarrer en 5 Minutes » sur docs.gostoa.dev
4Documentation de référence sur les toggles de fonctionnalités

Phase 4 — Bridges de Protocoles Étendus — CAB-1136-P4

ÉtapeLivrable
1Bridge SOAP (WSDL) → UAC → MCP
2Bridge GraphQL (introspection) → UAC → MCP
3Bridge gRPC (proto) → UAC → MCP

Résumé du Positionnement Concurrentiel

Kong:      "MCP pour les APIs gérées par Kong"     → Lock-in vendeur
Gravitee: "Proxy MCP pour le trafic MCP" → MCP-vers-MCP uniquement
STOA: "MCP pour tout" → N'importe quelle API, n'importe quel protocole, gratuit pour toujours

Kong: Enterprise MCP Gateway → $$$$
Gravitee: Enterprise AI Agent Management → $$$
STOA: Community Core + stoactl bridge → 0€, Apache 2.0

Kong: Identifiants dans les en-têtes → Pas sécurisé par défaut
Gravitee: Fichiers de config standard → Pas sécurisé par défaut
STOA: OS Keychain par défaut → Sécurisé par conception, même niveau gratuit

« Kong fait MCP pour Kong. Gravitee fait MCP pour Gravitee. STOA fait MCP pour tout le monde. »

Références