Chaque serveur MCP auquel vous vous connectez envoie une réponse tools/list — un document JSON écrit par celui qui a construit le serveur — directement dans le contexte de votre modèle, sans relecture. Collez cette réponse dans le scanner de VeriSwarm et obtenez 11 vérifications déterministes en quelques secondes : empoisonnement d'outils, typosquatting, manipulation de schémas, schémas de rug-pull, injection de prompts, permissions excessives, mauvais rattachement de modèle, usurpation de contexte, canaux cachés, références mémoire non sécurisées et injection d'en-têtes. Aucun LLM ne juge vos outils — une analyse de motifs et de structure qui renvoie toujours le même verdict.
Les métadonnées d'un outil MCP sont structurantes. Le modèle décide quoi appeler et comment en se basant sur le texte de description — pas sur le code qui se cache derrière. Une description empoisonnée n'a besoin de compromettre rien du tout ; l'attaque se déroule entièrement dans le raisonnement du modèle. Le benchmark MCPTox a testé cela contre 45 serveurs MCP réels et 353 outils réels, et a mesuré des taux de réussite d'attaque supérieurs à 60 %, culminant à 72 %. Lire les descriptions d'outils à l'œil ne passe pas à l'échelle au-delà du premier serveur, et ne survit pas à un rug pull — un serveur qui se comporte proprement pendant votre revue et livre autre chose à la version suivante.
Elles couvrent les catégories de risque d'origine pour lesquelles le scanner a été construit — celles les plus susceptibles d'apparaître dans une définition d'outil empoisonnée ou négligée.
Des instructions cachées dans les descriptions et le texte des paramètres — « ignore les instructions précédentes », des directives de dissimulation, des détournements de persona. Le scanner parcourt tout l'arbre du schéma, y compris les propriétés imbriquées dans des branches oneOf/anyOf, si bien qu'une charge utile enfouie quatre niveaux plus bas remonte quand même à la surface.
Des noms d'outils suspicieusement proches d'outils connus — y compris des usurpations qui ne changent que la casse, comme READ_FILE se faisant passer pour read_file, ce qu'une comparaison exacte et naïve rate entièrement.
Des schémas d'objet vides qui acceptent n'importe quelle entrée, additionalProperties: true qui laisse passer des champs cachés, et des schémas imbriqués sur plus de 4 niveaux — un endroit courant pour cacher un paramètre malveillant.
Un langage qui demande des identifiants, des tokens ou l'accès à des fichiers sensibles et à des points de terminaison réseau internes que l'objectif déclaré de l'outil ne justifie pas — la mise en place d'une redéfinition ultérieure une fois que l'outil est devenu de confiance.
Des blocs en base64 qui se décodent en texte lisible — de la contrebande de charge utile — et des homoglyphes Unicode, comme un а cyrillique se substituant à votre a, utilisés pour glisser des instructions au-delà d'une relecture visuelle.
Un outil nommé ou décrit comme étant en lecture seule mais qui accepte les paramètres command, script ou sql revendique une capacité et en livre une autre.
Des risques propres au protocole que les six premières ne couvrent pas. Sur l'ensemble des onze vérifications, le scanner couvre 9 des 10 risques de l'OWASP MCP Top 10 v0.1-beta (2025). Le dixième — MCP08, Lack of Audit and Telemetry — est quelque chose qu'une définition d'outil statique ne peut pas montrer ; c'est un manque de journalisation à l'exécution, pas un manque de schéma.
Des outils codés en dur pour un modèle spécifique — « ne fonctionne qu'avec GPT-4 » ou une exigence de couplage avec un system prompt donné. Crée une dépendance de routage et une surface d'exploitation propre à ce modèle.
Un outil qui prétend pouvoir réécrire l'historique de la conversation, injecter de faux tours de parole ou usurper l'utilisateur ou l'assistant — des capacités qui peuvent mettre en échec à la fois les filtres de sécurité et les traces d'audit.
Des clés de premier niveau non standard, des champs de schéma d'extension propriétaire (x-) et de longs blocs en base64 intégrés dans les descriptions — des endroits qu'un relecteur cherchant du texte ne regardera pas.
Un langage qui revendique un accès à un état global, partagé ou inter-sessions, ou un paramètre session_id qui a un joker comme valeur par défaut — le schéma type d'une rupture d'isolation entre tenants.
Un paramètre qui a la forme d'un nom d'en-tête — dont authorization, cookie ou host — ou un autre câblé dans une requête sortante via l'extension x-mcp-header de la spécification MCP. Les deux peuvent écraser un en-tête de frontière de confiance que l'appelant ne voit jamais.
Les mêmes 11 vérifications, le même format de rapport, trois façons d'y arriver :
POST /v1/suite/guard/scan-mcp avec les définitions d'outils dans le corps. Renvoie un verdict (pass / warn / fail), un score de risque de 0–1 et un tableau de constats — chaque constat porte le nom de l'outil, la vérification déclenchée, la gravité, les preuves et une recommandation.scanMcpTools() dans le SDK Node, scan_mcp_tools() dans le SDK Python — les deux enveloppent le même endpoint avec des formes de requête/réponse typées.scan_mcp_tools sur le serveur MCP de VeriSwarm lui permet de scanner les outils d'un autre serveur avant même de les appeler — sans client HTTP séparé.Les constats de gravité critique ou élevée sont conservés comme constats de scan Guard sur votre tenant, si bien qu'un résultat de scan n'est pas une simple impression console ponctuelle — c'est un enregistrement que vous pouvez examiner, trier et clôturer au fil du temps.
Une définition d'outil scannée propre aujourd'hui peut livrer autre chose demain — la propriété qui définit un rug pull est justement que la version que vous avez auditée n'est pas la version que vous exécuterez la semaine prochaine. Lancez le scan à chaque montée de version du serveur MCP, ou selon un calendrier, pas seulement à la première connexion. Le scanner est la moitié pré-déploiement de l'histoire ; la moitié à l'exécution — qui filtre les appels d'outils en direct au fur et à mesure, après que le serveur a déjà passé un scan — c'est Guard Proxy. Aucun ne remplace l'autre : le scanner détecte ce qu'un outil déclare, Guard Proxy détecte ce qu'il fait.
L'empoisonnement d'outils est la vérification qui mérite le plus d'être comprise en profondeur — c'est celle où l'attaque se déroule entièrement dans le raisonnement du modèle, sans rien à intercepter au niveau réseau. Le mécanisme de l'attaque, les taux de réussite réels et la façon dont le scanner le détecte sont détaillés dans MCP Tool Poisoning : comment fonctionne l'attaque et comment la détecter.
Appelez sa méthode tools/list pour obtenir les définitions d'outils, puis envoyez ce tableau au scanner de VeriSwarm — POST /v1/suite/guard/scan-mcp, le scanMcpTools() du SDK Node, le scan_mcp_tools() du SDK Python, ou l'outil scan_mcp_tools du serveur MCP hébergé. Les quatre appellent le même moteur à 11 vérifications et renvoient le même rapport structuré : un verdict (pass/warn/fail), un score de risque de 0-1, et pour chaque constat une gravité, des preuves et une recommandation.
Onze vérifications déterministes : l'empoisonnement d'outils, le typosquatting, la manipulation de schémas, les schémas de rug-pull, l'injection de prompts et les permissions excessives couvrent les six catégories de risque d'origine ; le mauvais rattachement de modèle, l'usurpation de contexte, les canaux cachés, les références mémoire non sécurisées et l'injection d'en-têtes alignent le scanner sur 9 des 10 risques de l'OWASP MCP Top 10 v0.1-beta (2025) — tous les risques sauf MCP08 (Lack of Audit and Telemetry), quelque chose qu'une définition d'outil statique ne peut pas vous montrer ; cela nécessite de la journalisation à l'exécution, pas un scan de schéma. Chaque vérification est fondée sur des motifs et des structures — aucun LLM dans la boucle, donc une définition d'outil donnée produit les mêmes constats à chaque scan.
Non. C'est un analyseur statique — des motifs regex, des parcours de l'arbre du schéma et une normalisation Unicode, pas un appel de modèle. C'est un compromis délibéré : les juges probabilistes sont la raison pour laquelle au moins un audit indépendant d'un scanner MCP basé sur YARA a rapporté un taux de faux positifs d'environ 78 %. Les vérifications déterministes sacrifient un peu de rappel contre quelque chose sur lequel un pipeline CI peut réellement se baser comme porte de qualité — la même entrée produit deux fois le même verdict.
Les deux. En CI, enregistrez la réponse tools/list d'un serveur dans un fichier et scannez-la comme une étape du pipeline — un constat critique est un build qui échoue, pas un fil Slack après coup. En production, appelez le point de terminaison API selon un calendrier ou à chaque montée de version du serveur MCP, car un outil scanné propre une fois n'est connu comme bon qu'une seule fois. Rescanner est la façon dont un rug-pull — un serveur qui se comporte bien pendant la revue et devient malveillant ensuite — est repéré plutôt que manqué.
Le scanner est la moitié pré-déploiement : il lit les définitions d'outils déclarées avant que votre agent n'appelle jamais le serveur. Guard Proxy est la moitié à l'exécution : il se situe entre votre agent et ses outils, filtrant chaque appel en direct au fur et à mesure. Aucun ne remplace l'autre. Le scanner détecte ce qu'un outil dit faire ; Guard Proxy détecte ce qu'il fait réellement au moment de l'appel.
C'est mesuré, pas théorique. Le benchmark MCPTox a testé l'empoisonnement d'outils contre 45 serveurs MCP réels et 353 outils réels, et a trouvé des taux de réussite d'attaque supérieurs à 60 %, culminant à 72 % — les modèles les plus capables obéissant plus souvent, car mieux suivre les instructions signifie aussi mieux se conformer à une instruction malveillante. Une analyse complète de la mécanique de l'attaque et de la façon dont la vérification tool_poisoning du scanner la détecte se trouve dans l'explication dédiée.
Envoyez une réponse tools/list à Guard et découvrez ce que vos agents ont lu jusqu'ici. Le niveau gratuit de Gate vous donne d'abord le pipeline de scoring de confiance et d'événements ; le scanner de Guard s'appuie dessus.