Aller au contenu

Architecture

En mode partagé, le serveur se compose de deux processus indépendants qui partagent la même base de données. Ils peuvent tourner dans deux conteneurs, deux pods ou sur deux machines. Le client de pipeline security-review-ci n'est pas un troisième processus : il tourne dans le pipeline et appelle l'API REST du contrôleur.

flowchart LR
    agents(["Agents IA"]) -- "jeton mcp" --> mcp
    people(["Personnes (navigateur)"]) -- "session web" --> ctl
    ci(["Pipeline<br/>security-review-ci"]) -- "jeton ci" --> ctl
    subgraph mcp["Serveur MCP : security-review-mcp serve"]
        mcpr["/mcp<br/>POST /api/v1/enroll<br/>/healthz"]
    end
    subgraph ctl["Contrôleur : security-review-controller serve"]
        ctlr["/ui, /api/v1<br/>/api/v1/ci, /metrics<br/>/healthz"]
    end
    mcp --> db[("PostgreSQL")]
    ctl --> db
Serveur MCP Contrôleur
Commande security-review-mcp serve --transport streamable-http security-review-controller serve
Sert /mcp, enrôlement public POST /api/v1/enroll, /healthz API REST /api/v1, interface /ui, /healthz
Identifiants acceptés jetons mcp (personnels ou non) et admin sessions web (utilisateurs), jetons admin et api ; jetons ci et jetons mcp personnels sur les seules routes de pipeline /api/v1/ci/ (gate, SARIF, tendance, scans) ; jetons metrics sur /metrics seulement
Routes sans jeton enrôlement, /healthz fichiers de /ui, connexion (/api/v1/auth/), /healthz, et la documentation de l'API quand SECREVIEW_SWAGGER_ENABLED=true
Schéma de la base vérifie seulement migre (sauf SECREVIEW_DB_AUTO_UPGRADE=false)
Exposition conseillée aux agents, avec TLS aux personnes et aux pipelines, avec TLS

Les deux processus ne s'appellent jamais : tout passe par la base. Un jeton créé ou révoqué sur le contrôleur s'applique à la requête suivante du serveur MCP. Une règle modifiée est rechargée en quelques secondes. Un projet demandé sur le serveur MCP attend sa validation dans l'écran Projets du contrôleur.

L'enrôlement est servi par le serveur MCP parce que le client ne connaît que son URL. Le contrôleur n'expose ainsi aucune route d'écriture sans authentification, hormis la connexion.

Routes, démarrage, migrations du schéma, tâches de fond et exposition de chaque processus : voir Serveur MCP et Contrôleur.

Base partagée

Avec SQLite, les deux processus doivent tourner sur la même machine et partager le fichier. Dès qu'ils sont dans des pods ou sur des machines différents, utilisez PostgreSQL (extra postgres du paquet PyPI, inclus dans l'image), déployé avec Docker Compose ou Kubernetes.

En mode local (stdio), seul security-review-mcp local est nécessaire : il crée et migre lui-même sa base SQLite locale.