Skip to main content
Un mod est un plugin qui exécute du code à l’intérieur de Claude Code avec les permissions de l’utilisateur qui l’a installé. Les mods ne sont pas isolés. Via les paramètres gérés, vous décidez si les mods s’exécutent sur les machines de vos utilisateurs, lesquels, et dans quel ordre. Vous pouvez également installer un mod de votre côté qui surveille ou refuse ce que font les autres mods. Cette page s’adresse à la personne qui déploie les paramètres gérés pour Claude Code, que ce soit sous forme de fichier, via MDM, ou depuis la console d’administration claude.ai. Les mods sont activés par défaut dans Claude Code v2.1.287 et versions ultérieures. Commencez par la section qui correspond à ce que vous souhaitez faire :
Ces cas sont couverts sur d’autres pages :

Arrêter le chargement des mods installés par les utilisateurs

Pour empêcher chaque mod que vos utilisateurs apportent de se charger, définissez l’option allowManagedModsOnly sur la garde intégrée, un mod de politique que Claude Code charge avant chaque mod qu’un utilisateur installe. L’option se trouve dans les paramètres gérés sous pluginConfigs, indexée par cc-plugin-sec-default@builtin :
managed-settings.json
Avec l’option définie dans les paramètres gérés :
  • Aucun mod qu’un utilisateur apporte ne se charge : cela couvre un mod dans un plugin que l’utilisateur a installé, un mod chargé avec --plugin-dir, et un mod que Claude a écrit pendant une session
  • Les mods de votre organisation se chargent toujours : un mod qui compte comme celui de votre organisation n’est pas vérifié. Tous les autres mods comptent comme ceux d’un utilisateur et ne se chargent pas. Cela inclut un mod dans un plugin que vous activez à partir d’une place de marché GitHub ou autre distante, et un que votre organisation active pour ses membres sur claude.ai. Si aucun ne compte comme le vôtre, aucun mod installé ne se charge.
  • Les utilisateurs ne peuvent pas l’annuler : la garde lit l’option uniquement à partir des paramètres gérés, donc la même entrée dans un fichier de paramètres utilisateur, projet ou local, ou dans un fichier passé avec --settings, ne change rien
  • Un fichier ou une politique MDM couvre chaque fournisseur : quand vous livrez l’option sous forme de fichier ou via MDM, elle fonctionne de la même manière sur Amazon Bedrock, la plateforme Agent de Google Cloud, et Microsoft Foundry. Pour la livraison depuis la console d’administration claude.ai, voir Disponibilité de la plateforme
  • Les autres personnalisations des utilisateurs continuent de fonctionner : leurs hooks dans les fichiers de paramètres, les lignes d’état, et /goal ne sont pas affectés
  • Les mods intégrés continuent de s’exécuter : les mods intégrés à Claude Code, comme le support AGENTS.md, ont chacun leur propre commutateur
Pour confirmer l’option sur la machine d’un utilisateur, démarrez Claude Code là-bas avec --plugin-dir et le chemin d’un répertoire qui contient un mod, comme claude --plugin-dir ./first-mod. Les hooks du mod ne s’exécutent pas, et la transcription et le journal de débogage contiennent le message de la garde, qui nomme le mod et allowManagedModsOnly. Si le mod se charge, voir Vérifier qu’une politique est en vigueur et les règles qui décident si une option prend effet. Si vous avez défini CLAUDE_CODE_ENABLE_FUNCTION_HOOKS à 0 lors de l’accès anticipé, remplacez-le par cette option. Claude Code v2.1.287 et versions ultérieures ignorent la variable à n’importe quelle valeur, donc un 0 là-bas laisse les mods activés.

Savoir ce qui se passe par défaut

Sans vos propres paramètres de mod, voici ce que vos utilisateurs obtiennent :
  • Les mods sont activés. Un utilisateur peut installer un plugin qui contient un mod à partir de n’importe quelle place de marché que vos paramètres de plugin autorisent, ou en charger un à partir d’un répertoire avec --plugin-dir.
  • Une garde intégrée s’exécute en premier. Claude Code charge un mod intégré nommé sec-default@builtin avant chaque mod qu’un utilisateur installe. Les utilisateurs ne peuvent pas l’éteindre. /plugin et le journal de débogage le listent comme cc-plugin-sec-default. La garde se charge quand l’une de ces conditions est vraie :
    • La machine a des paramètres gérés
    • L’utilisateur est connecté à Claude Code avec un plan Team ou Enterprise
    Un utilisateur qui s’authentifie avec une clé API, ou via Amazon Bedrock, la plateforme Agent de Google Cloud, ou Microsoft Foundry, n’obtient la garde que sur une machine qui a des paramètres gérés.
  • La garde protège ce que vous gérez. Le mod d’un utilisateur ne peut pas changer ce que vos hooks gérés reçoivent ou décident, l’invite système, votre CLAUDE.md géré et autres instructions gérées, ce que n’importe quel mod lit comme paramètres, ou les outils et descriptions de vos serveurs MCP gérés.
  • Tout le reste est autorisé. La garde n’ajoute aucune autre restriction. Le mod d’un utilisateur peut toujours lire et écrire des fichiers, démarrer des processus, faire des demandes réseau, réécrire les appels d’outils et les invites, refuser un appel d’outil, approuver un qui demanderait autrement, et dessiner dans l’interface, tout avec les permissions de cet utilisateur.
  • Les règles de refus et vos hooks gérés ont la priorité. Là où la garde se charge, le mod d’un utilisateur ne peut pas approuver un appel qu’une règle deny refuse, quel que soit le fichier de paramètres qui contient la règle. Un bloc d’un hook PreToolUse dans les paramètres gérés est aussi final. Les deux s’appliquent aux appels d’outils de Claude. Aucun ne s’applique aux appels $.fs et $.process propres à un mod : avec Read(.env) refusé, un mod peut toujours lire ce fichier avec $.fs.read ou démarrer un programme qui le fait. Pour limiter ces appels, empêchez le mod de se charger ou accrochez l’appel dans un mod de politique.
  • Les autres vérifications de permission peuvent être contournées. Le mod d’un utilisateur qui approuve les appels d’outils peut approuver un appel qu’une règle ask demanderait, ou qu’un hook PreToolUse en dehors des paramètres gérés a bloqué. En mode auto, un appel que le mod approuve s’exécute sans vérification de classificateur.
La source de la garde est publique dans le répertoire mods/sec-default du référentiel Claude Code.

Savoir quels contrôles s’appliquent toujours

Les mods ne remplacent pas les contrôles que vous avez déjà :
  • Les hooks de paramètres continuent de fonctionner. Les hooks de commande, HTTP, d’invite, et d’agent dans les fichiers de paramètres et dans le hooks/hooks.json des plugins s’exécutent comme avant, aux côtés des mods. Rien à leur sujet n’est déprécié.
  • Les règles de refus ont la priorité là où la garde se charge. Le mod d’un utilisateur ne peut pas approuver un appel qu’une règle deny refuse, sauf si vous définissez allowModsToOverrideDenyRules.
  • Les hooks gérés s’exécutent en premier. Un hook PreToolUse dans les paramètres gérés s’exécute avant que n’importe quel mod ne voie l’appel d’outil, et son bloc est final. Si un mod réécrit ensuite l’appel, vos hooks gérés s’exécutent à nouveau sur l’appel réécrit, donc un bloc s’applique toujours. Les hooks PreToolUse d’autres fichiers de paramètres et de plugins s’exécutent après le dernier mod, donc un mod qui retourne son propre résultat à la place d’exécuter l’outil les empêche de s’exécuter. Voir L’ordre dans lequel les mods s’exécutent.
  • La politique réseau couvre $.http.fetch. Si votre organisation désactive la récupération web, ou si le trafic réseau non essentiel est désactivé pour la session, Claude Code refuse une demande réseau qu’un mod fait avec $.http.fetch. La politique ne couvre pas un programme que le mod démarre avec $.process.run. Ce programme atteint le réseau avec l’accès propre de l’utilisateur.
  • Les contrôles de plugin couvrent les mods. Un mod est un plugin, donc les paramètres qui limitent ce que les utilisateurs peuvent installer, comme strictKnownMarketplaces, décident s’il peut être installé du tout.
  • Les mods ne peuvent pas changer l’invite de permission. Un mod peut redessiner une grande partie de l’interface de Claude Code, mais pas l’invite de permission, donc il ne peut pas changer ce qu’une invite affiche. Un mod peut toujours approuver ou refuser un appel d’outil avant que l’invite n’apparaisse, comme Savoir ce qui se passe par défaut le décrit.
  • Les invites de confiance viennent en premier. Dans une session interactive dans un répertoire que l’utilisateur n’a pas encore approuvé, aucun mod ne se charge jusqu’à ce qu’il réponde à l’invite de confiance.
  • --safe-mode désactive les mods installés, y compris les vôtres. Démarrez une session avec claude --safe-mode pour vérifier si un mod a causé un problème.
Aucun de ces contrôles n’isole un mod. Un mod que vous autorisez s’exécute en tant qu’utilisateur, avec l’accès de l’utilisateur aux fichiers, processus, et réseau.

Décider de laisser les mods activés

Un mod peut faire plus que les autres parties d’un plugin car il s’exécute à l’intérieur de Claude Code. Il voit chaque invite et appel d’outil, peut les changer, et peut autoriser ou refuser un appel d’outil avant qu’une invite de permission n’apparaisse. Ce qu’un utilisateur peut charger en tant que mod dépend des contrôles de plugin que vous avez déjà : Gérer les plugins pour votre organisation liste chaque façon dont un plugin se charge et le paramètre qui contrôle chacun. Pour vérifier les mods dans une place de marché avant que vos utilisateurs les installent, voir Examiner ce qu’un mod peut faire. Pour empêcher les mods des utilisateurs de se charger jusqu’à ce que vous ayez fait cela, voir Arrêter le chargement des mods installés par les utilisateurs.

Examiner ce qu’un mod peut faire

Vous pouvez voir ce qu’un mod est capable de faire sans l’exécuter. Dans votre shell, exécutez claude plugin validate sur le répertoire du plugin :
Deux lignes de la sortie décrivent le code du mod :
La ligne hooks: liste les événements que le mod reçoit. La ligne calls: liste les méthodes de l’API des mods que son code appelle. L’API des mods, écrite $ dans le code d’un mod, est comment un mod atteint les fichiers, processus, et réseau. Claude Code refuse de charger un mod qui utilise l’API des mods d’une manière que cette commande ne peut pas lire. Regardez la ligne calls: pour celles-ci : Dans la ligne hooks:, tool.call et prompt.submit signifient que le mod voit chaque appel d’outil et chaque invite, et peut les changer. session.append signifie que le mod peut réécrire chaque ligne de la conversation avant qu’elle ne soit stockée. ui.render{component=AskUserQuestion} signifie que le mod peut redessiner la boîte de dialogue que Claude utilise pour poser une question à l’utilisateur. tool.check signifie que le mod peut approuver ou refuser un appel d’outil avant qu’une invite de permission n’apparaisse. Savoir ce qui se passe par défaut liste lesquels de vos règles et hooks ont la priorité sur sa réponse.

Choisir le niveau d’autorisation

Les politiques de mod vont d’aucun mod installé du tout à n’importe quel mod qu’un utilisateur choisit, avec votre propre mod vérifiant les autres, et chacun est quelques paramètres gérés. Trouvez la politique que vous voulez dans la première colonne et définissez ce que la deuxième colonne nomme. Déployer les paramètres gérés couvre où vivent les paramètres gérés. Ce que chaque paramètre fait :
  • allowManagedModsOnly : une option sur la garde intégrée. Les mods des utilisateurs ne se chargent pas, et leurs hooks de paramètres, lignes d’état, et /goal continuent de fonctionner. Arrêter le chargement des mods installés par les utilisateurs liste ce qu’il couvre.
  • allowManagedHooksOnly : un paramètre plus large. Seuls les mods de votre organisation et les mods intégrés à Claude Code se chargent. Un mod qu’un utilisateur a installé lui-même ne se charge pas. Le paramètre bloque aussi les hooks dans les fichiers de paramètres propres des utilisateurs. Lisez Ce qui s’exécute sous allowManagedHooksOnly avant de le définir.
  • disableAllHooks : le paramètre le plus large. Dans les paramètres gérés, il arrête les mods dans chaque plugin installé, y compris les vôtres, et désactive chaque hook dans les fichiers de paramètres, donc un hook PreToolUse dans vos paramètres gérés ne bloque plus rien. Les lignes d’état personnalisées et /goal cessent aussi de fonctionner. Lisez disableAllHooks avant de le définir.
  • disableSideloadFlags : rejette --plugin-dir et --plugin-url au démarrage, donc personne ne charge un mod à partir d’un répertoire, et empêche les mods que Claude écrit pendant une session de se charger. Le paramètre rejette aussi --agents et --mcp-config. Lisez disableSideloadFlags avant de le définir.
Les mods intégrés à Claude Code, comme le support AGENTS.md, ne sont pas affectés par ces paramètres. Chacun a son propre commutateur. Un utilisateur dont le mod ne s’est pas chargé trouve la raison dans son journal de débogage. Messages de refus liste les lignes pour allowManagedHooksOnly et disableAllHooks, et Messages de la garde intégrée a la ligne pour allowManagedModsOnly.

Définir les options sur la garde intégrée

La garde intégrée prend deux options. Définissez-les dans les paramètres gérés sous pluginConfigs, indexées par cc-plugin-sec-default@builtin, comme l’exemple dans Arrêter le chargement des mods installés par les utilisateurs le fait. Le tableau donne ce que vos utilisateurs obtiennent avec chaque option non définie et avec elle définie à true : Ces règles décident si une option prend effet :
  • L’id a une seule orthographe ici : Claude Code lit les options uniquement sous cc-plugin-sec-default@builtin. prependPlugins accepte aussi sec-default@builtin, et pluginConfigs ne le fait pas.
  • Seuls les paramètres gérés comptent : la même entrée dans un fichier de paramètres utilisateur, projet ou local, ou dans un fichier passé avec --settings, ne définit ni ne desserre une option
  • La garde doit se charger : si vous définissez prependPlugins, nommez la garde dans la liste. Là où la garde ne se charge pas, aucune option ne s’applique.
  • La garde échoue fermée : si la garde ne peut pas lire les paramètres gérés, elle refuse tous les mods des utilisateurs au chargement. Si elle ne peut pas vérifier les règles de refus pour un appel qu’un mod d’utilisateur a approuvé, elle refuse l’appel.
Les messages de la garde intégrée sont ce que vos utilisateurs voient quand l’une ou l’autre option s’applique.

Exécuter les mods de votre organisation

Vous pouvez déployer des mods de votre côté à chaque utilisateur, choisir où ils s’exécutent par rapport aux mods des utilisateurs, et en utiliser un pour appliquer une politique.

Installer les mods de votre organisation et définir l’ordre

Les mods de votre organisation se chargent là où les mods des utilisateurs ne le font pas et peuvent s’exécuter avant eux, donc Claude Code doit pouvoir dire qu’un mod vient de vous. Il traite un mod comme celui de votre organisation uniquement quand tous ceux-ci sont vrais :
  • Les enabledPlugins gérés définissent le plugin du mod à true
  • Les paramètres gérés nomment la place de marché du plugin comme un répertoire sur la machine de l’utilisateur, par chemin absolu. Une entrée extraKnownMarketplaces le fait et enregistre aussi la place de marché pour l’utilisateur.
  • La place de marché liste le plugin par un chemin relatif, donc Claude Code le charge sur place à partir de ce répertoire
Pour les respecter, faites en sorte que votre gestion d’appareils copie le répertoire de la place de marché au même chemin sur chaque machine. Rendez le répertoire et chaque répertoire au-dessus de lui inscriptibles uniquement par un administrateur, comme le fichier de paramètres gérés l’est. Quiconque peut écrire là-bas peut réécrire votre mod. Les paramètres gérés que vous livrez à partir de la console d’administration claude.ai peuvent porter les clés, mais ils ne peuvent pas mettre le répertoire sur une machine. Le répertoire contient le manifeste de la place de marché et le plugin :
Le manifeste liste le plugin par son chemin relatif à ce répertoire :
/opt/acme/claude-plugins/.claude-plugin/marketplace.json
Un plugin que Claude Code copie dans son cache compte comme celui d’un utilisateur, même quand les enabledPlugins gérés l’activent. Cela couvre chaque plugin à partir d’une source GitHub, git, URL, ou npm. Son mod s’exécute parmi les mods des utilisateurs, prependPlugins et appendPlugins le sautent, et il ne se charge pas sous allowManagedModsOnly ou allowManagedHooksOnly. Le journal de débogage de l’utilisateur a une ligne qui commence par l’id du plugin et is enabled by managed settings, but. Claude Code lève un événement chaque fois qu’il est sur le point d’agir, comme exécuter un outil, et le passe à chaque mod à tour de rôle. Un mod qui compte comme le vôtre s’exécute avant les mods des utilisateurs même quand vous ne le listez nulle part. Pour définir sa place, listez son id dans l’un de deux paramètres. L’id est le nom du plugin, @, et le nom de la place de marché, comme acme-guard@acme-tools.
  • prependPlugins : votre mod voit chaque événement avant n’importe quel mod d’utilisateur et chaque résultat après. Il peut changer l’événement, le refuser, ou sauter les mods des utilisateurs.
  • appendPlugins : votre mod s’exécute après chaque mod d’utilisateur, donc il voit uniquement les événements que ces mods transmettent, sous la forme qu’ils les transmettent
Cet exemple déclare la place de marché acme-tools à /opt/acme/claude-plugins, active acme-guard à partir de celle-ci, et exécute ce mod en premier, avec la garde intégrée après :
managed-settings.json
Chaque clé fait un travail :
  • extraKnownMarketplaces : nomme le répertoire qui contient la place de marché acme-tools. path est le chemin absolu du répertoire qui contient .claude-plugin/marketplace.json.
  • enabledPlugins : active acme-guard pour chaque utilisateur qui reçoit ces paramètres gérés
  • prependPlugins : met acme-guard en premier et la garde intégrée en deuxième, tous deux avant n’importe quel mod qu’un utilisateur installe. Claude Code suit l’ordre que vous listez.
Pour confirmer qu’une machine d’utilisateur a reçu les paramètres, voir Vérifier qu’une politique est en vigueur. Pour confirmer où le mod s’exécute, démarrez une session sur cette machine avec claude --debug et recherchez dans le journal de débogage l’id du mod :
  • hooks module acme-guard@acme-tools loaded, avec tier prepend : le mod compte comme celui de votre organisation et s’exécute en premier
  • La même ligne avec tier user : Claude Code le traite comme un mod d’utilisateur. Une deuxième ligne, prependPlugins names acme-guard@acme-tools, which is not an enabled managed plugin with a hooks module; skipped, dit que la liste l’a sauté.
Ces règles décident quels ids dans les deux listes prennent effet :
  • La liste remplace la valeur par défaut : quand vous définissez prependPlugins dans les paramètres gérés, nommez sec-default@builtin dans celle-ci pour garder la garde intégrée. La garde est intégrée et n’a besoin d’aucune entrée enabledPlugins.
  • Vos propres ids doivent compter comme les vôtres : dans les paramètres gérés, Claude Code saute un id dont le plugin ne respecte pas les trois conditions pour un mod d’organisation
  • Les référentiels ne peuvent pas les définir : Claude Code lit les deux paramètres uniquement à partir des paramètres gérés et jamais à partir du fichier de paramètres d’un référentiel. Un utilisateur peut les définir dans ~/.claude/settings.json pour ordonner uniquement ses propres mods sur une machine sans paramètres gérés, et uniquement quand il n’est pas connecté avec un plan Team ou Enterprise. N’importe où ailleurs, Claude Code ignore les deux clés dans les paramètres utilisateur. Une liste là-bas n’ajoute ni ne supprime la garde intégrée.

Appliquer une politique avec un mod de votre côté

Pour empêcher tous les mods d’un utilisateur de se charger, vous n’avez pas besoin d’un mod de votre côté. Définissez allowManagedModsOnly. Écrivez un mod de politique quand vous voulez admettre certains mods d’utilisateurs et en refuser d’autres, ou pour enregistrer ce que les mods font. Chaque fois qu’un autre mod est sur le point de se charger, votre mod reçoit la liste que claude plugin validate imprime, dans un événement nommé plugin.register. Un mod dans prependPlugins peut lire cette liste et refuser le mod. Il peut aussi accrocher n’importe quel appel de l’API des mods par nom pour enregistrer ou refuser cet appel pour tous les autres mods. Le nom est la méthode sans le $., donc un crochet sur fs.write voit chaque appel $.fs.write. Ce mod de politique refuse n’importe quel mod d’utilisateur dont le propre code appelle $.process.run ou $.process.spawn. Il garde aussi un journal d’audit, écrivant chaque appel d’outil et chaque fichier qu’un mod écrit dans le journal de débogage. Parce qu’il s’exécute en premier, le journal enregistre ce qui a été demandé, avant que n’importe quel mod d’utilisateur ne le change. Enregistrez-le comme acme-guard/hooks/register.js :
acme-guard/hooks/register.js
Le fichier enregistre trois crochets :
  • plugin.register : décide si un autre mod se charge. Il refuse un mod d’utilisateur qui appelle une méthode bloquée et transmet tous les autres mods.
  • tool.call : écrit une ligne comme audit tool.call Bash dans le journal de débogage pour chaque appel d’outil, et ne change rien
  • fs.write : écrit une ligne comme audit fs.write by reader "/tmp/notes.md" pour chaque appel $.fs.write qu’un autre mod fait, et ne change rien. Le nom du mod vient en premier et le chemin est entre guillemets, donc un chemin qu’un mod choisit ne peut pas passer pour un autre champ de la ligne.
Le crochet plugin.register lit deux champs de l’événement :
  • e.tier : où le mod s’exécuterait, l’un de prepend, user, append, ou builtin. Chaque mod qu’une personne installe est user.
  • e.uses.calls : les méthodes de l’API des mods que le mod appelle, chacune orthographiée namespace.method comme process.run, sans le $. que claude plugin validate imprime
Quand un utilisateur installe un mod qui appelle $.process.run, le mod ne se charge pas, et son journal de débogage a une ligne qui se termine par refused by acme-guard: et votre raison. Le refus atteint aussi la transcription dans une session qui recharge à chaud un répertoire de plugin. Pour bloquer un appel sans refuser le mod entier, retournez { deny: 'your reason' } d’un crochet sur le nom de cet appel. Pour envoyer les lignes d’audit quelque part d’autre que le journal de débogage, appelez $.http.fetch à partir des mêmes crochets. Une session peut s’exécuter sans votre mod. Si le thread de travail qui exécute les mods installés plante trois fois, Claude Code décharge tous les mods qui ne sont pas intégrés, y compris le vôtre, jusqu’à ce que l’utilisateur exécute /reload-plugins ou démarre une nouvelle session. Et un utilisateur qui démarre Claude Code avec --safe-mode s’exécute sans mods installés, y compris les vôtres. Créer un mod couvre les fichiers qu’un mod a besoin. Tester un mod qui juge d’autres mods a un fichier de test pour ce mod de politique.

Refuser les mods quand votre vérification échoue

Si votre crochet plugin.register lève une exception ou dépasse sa limite de temps, Claude Code saute le crochet, donc la vérification échoue ouvertement et le mod qu’il vérifiait se charge. Pour échouer fermé et refuser les mods des utilisateurs, déplacez la vérification dans une fonction nommée et ajoutez un gestionnaire .catch qui retourne le refus. Cette version du fichier montre uniquement le crochet plugin.register, donc gardez les deux crochets d’audit de la première version dans register :
acme-guard/hooks/register.js
Avec le gestionnaire en place, un mod qui était en cours de vérification quand la vérification a levé une exception ou a dépassé le délai d’attente ne se charge pas, et la ligne de refus porte la deuxième raison, comme dans refused by acme-guard: Acme policy check failed, so this mod was not loaded. Le gestionnaire transmet chaque mod en dehors du tier user à next(e), donc une vérification échouée n’arrête pas les mods que votre organisation liste. Gérer un crochet qui échoue couvre .catch pour d’autres événements.

Étapes suivantes