Aller au contenu

Trois services, trois rôles

L'ensemble des produits est installé par le même paquet PyPI, security-review, et livré dans la même image Docker. Le serveur MCP et le serveur Controller ne s'appellent jamais entre eux, ils partagent la même base de données, où sont stockés les rapports, les règles et les jetons.

Le client de pipeline security-review-ci n'a pas accès à la base : il appelle l'API REST du serveur Controller.

Deux installations possibles :

  • Une installation all-in-one dans le poste du développeur. Voir Mode local
  • Une installation modulaire sur des serveurs ou dans des containers; Voir Mode partagé

Les composants d'infrastructure

flowchart LR
    agents(["Agents IA<br/>VS Code, Claude, agent de CI"]) -- "/mcp<br/>jeton MCP" --> mcp["Serveur MCP<br/>security-review-mcp"]
    people(["Personnes (navigateur)<br/>équipe sécurité, développeurs, admins"]) -- "/ui, /api/v1<br/>compte utilisateur" --> ctl["Serveur Controller<br/>security-review-controller"]
    ci(["Pipeline CI/CD<br/>security-review-ci"]) -- "/api/v1/ci<br/>jeton ci" --> ctl
    mcp --> db[("Base de données<br/>SQLite ou PostgreSQL")]
    ctl --> db
Serveur MCP Serveur Controller Client de pipeline
Commande security-review-mcp security-review-controller security-review-ci
Utilisé par les agents IA (dans l'éditeur ou dans un pipeline) les personnes : équipe sécurité, développeurs, administrateurs les pipelines CI/CD
Ce qu'il fait fournit à l'agent les prompts de revue, les checklists, le scan par motifs, et enregistre ses rapports affiche et trie les rapports dans l'interface web (/ui/), sert l'API REST, crée le schéma, gère les jetons et les comptes utilisateurs envoie les fichiers du dépôt au serveur Controller, qui les scanne ; gate, export SARIF, tendances
Exposition aux agents (endpoint /mcp) aux personnes et aux pipelines (HTTPS) aucune : il tourne dans le pipeline

En résumé : l'agent parle au serveur MCP, les personnes et les pipelines utilisent le serveur Controller. Pour une équipe, on déploie les deux : sans serveur Controller, personne ne peut lire les rapports dans un navigateur, décider d'un finding, ni créer les jetons des agents.

Serveur MCP

En mode local, le serveur MCP crée sa propre base SQLite. En mode partagé, il utilise la base du serveur Controller.

Bien que vous puissiez installer le serveur MCP en mode local (stdio) sur un poste de développeur (voir Mode local (stdio)), nous recommandons le mode partagé (HTTP).

Ainsi vous n'avez aucune adhérence sur la technologie employée par le MCP : il suffit de paramétrer votre IDE pour utiliser le serveur MCP en mode Streamable-HTTP. Voir Transport HTTP.

Pour des raisons de sécurité, il est nécessaire de soumettre un jeton d'authentification pour échanger avec le serveur. En l'absence de jeton, le serveur MCP indique à votre agent IA la démarche à suivre pour en obtenir un (enrôlement).

Ses routes, ses transports, son démarrage et ses garanties : voir Serveur MCP.

Serveur Controller

Si vous exécutez la commande security-review-controller, celle-ci démarre un serveur d'application qui vous permet de vous connecter à la base de données via une interface web.

Grâce à cette application, vous pourrez :

Le serveur Controller est entièrement paramétrable via des variables d'environnement ou via son CLI

Ses routes, son démarrage, ses tâches de fond et son exposition : voir Serveur Controller.

CI/CD

Vous avez une chaîne CI/CD et souhaitez mettre en œuvre un gate d'acceptation ? C'est possible avec le client security-review-ci (un seul fichier Python, sans dépendance) : voir CI.

Ce même client peut être utilisé dans vos hooks de pre-commit (ou prek) afin d'effectuer vos revues de sécurité ou analyses de dépendances directement depuis votre IDE. Voir Hooks de pre-commit.

Design

Mode local : tout se passe sur le poste du développeur. L'assistant lance lui-même le serveur MCP, et les rapports restent dans une base locale.

flowchart LR
    dev(["Développeur"]) --> agent
    subgraph ws["Poste du développeur"]
        agent["Assistant IA<br/>VS Code, Claude"] -- "stdio" --> mcp["Serveur MCP<br/>security-review-mcp<br/>(processus lancé par l'assistant)"]
        mcp --> sqlite[("Base SQLite<br/>locale")]
    end

Mode partagé : les assistants de tous les postes appellent le serveur MCP déployé dans un conteneur ; l'analyste cyber travaille dans l'interface web du serveur Controller, que les pipelines appellent aussi. Les deux conteneurs partagent la même base PostgreSQL.

flowchart LR
    dev(["Développeur"]) --> agent
    subgraph ws["Poste du développeur"]
        agent["Assistant IA<br/>VS Code, Claude"]
    end
    analyst(["Analyste cyber<br/>(navigateur)"])
    ci(["Pipeline CI/CD<br/>security-review-ci"])
    subgraph srv["Serveur ou cluster (conteneurs)"]
        mcp["Conteneur serveur MCP<br/>security-review-mcp"]
        ctl["Conteneur du serveur Controller<br/>security-review-controller<br/>interface web, API REST"]
        pg[("Conteneur PostgreSQL<br/>rapports, règles, jetons")]
    end
    agent -- "HTTPS /mcp<br/>jeton MCP" --> mcp
    analyst -- "HTTPS /ui<br/>compte utilisateur" --> ctl
    ci -- "HTTPS /api/v1/ci<br/>jeton ci" --> ctl
    mcp --> pg
    ctl --> pg

Quel mode choisir ?

  • Mode partagé (HTTP), le cas recommandé : le serveur MCP et le serveur Controller tournent sur une machine ou dans des conteneurs, chaque développeur et chaque pipeline s'y connecte avec un jeton, et les rapports sont centralisés. Commencez par là.
  • Mode local (stdio), réservé à des cas précis : l'hôte (VS Code, Claude) lance lui-même security-review-mcp sur le poste du développeur, sans réseau, sans jeton ni serveur Controller. Pratique pour essayer les prompts seul ou hors ligne, mais les rapports restent dans une base locale que personne d'autre ne voit. Voir Mode local (stdio).