plugin.json dans le répertoire .claude-plugin/ d’un plugin. Il contient les métadonnées du plugin et les valeurs userConfig que Claude Code demande à l’utilisateur. Il déclare également tout composant que vous définissez en ligne ou que vous conservez en dehors de son emplacement par défaut.
Cette référence est destinée aux créateurs de plugins et aux propriétaires de marketplace qui mettent des champs de composant dans une entrée de marketplace.
Ces cas sont couverts sur d’autres pages :
- Apprendre à créer un plugin : commencez par Créer un plugin
- Ce que chaque composant fait à l’exécution : voir Composants de plugin
- Un champ : le tableau Champs donne le type de chaque champ, s’il est obligatoire, sa valeur par défaut et ce qu’il accepte. Règles de chemin couvre le préfixe
./et le confinement pour chaque chemin de composant - Une option
userConfigou une entréechannels: les schémas Configuration utilisateur et Canaux ${CLAUDE_PLUGIN_ROOT}ou une autre variable qu’un plugin peut référencer : Variables d’environnement- Où vont les fichiers de chaque composant : Disposition standard
- Un message de
claude plugin validate: la page de dépannage liste chaque message avec sa correction et des liens vers les sections pertinentes de cette page
Fichier manifeste
Le manifeste est optionnel. Sans lui, Claude Code charge les composants qu’il trouve dans la disposition standard. Le nom du plugin provient alors de l’entrée de marketplace, ou du nom du répertoire lorsque vous chargez le plugin avec--plugin-dir.
Écrivez un manifeste lorsque vous voulez des métadonnées, un composant en dehors de son répertoire par défaut, userConfig, ou une définition de composant en ligne.
Enregistrez le manifeste à .claude-plugin/plugin.json sous la racine du plugin. Mettez tous les autres fichiers de plugin à la racine du plugin, pas à l’intérieur de .claude-plugin/. Cela inclut skills/, commands/, et hooks/.
L’exemple suivant définit la plupart des clés du tableau Champs. Il passe la validation dans un répertoire de plugin qui contient chaque chemin référencé.
Champs non reconnus
Une clé de niveau supérieur non reconnue est supprimée, et une clé non reconnue à l’intérieur d’une optionuserConfig, d’une entrée channels, d’une config lspServers, ou d’une entrée monitors est rejetée :
- Champs de niveau supérieur : le champ est supprimé et le plugin se charge.
claude plugin validatesignale chaque champ de niveau supérieur non reconnu comme un avertissement - Objets stricts : les options
userConfig, les entréeschannels, les configslspServers, et les entréesmonitorssont stricts. Une clé inconnue à l’intérieur de l’une d’elles est une erreur, et le plugin ne se charge pas
Valider le manifeste
claude plugin validate est la vérification faisant autorité pour un manifeste. Exécutez-le depuis votre shell par rapport au répertoire du plugin :
Validation passed: le manifeste se chargeValidation passed with warnings: le manifeste se charge, mais le validateur a trouvé quelque chose à corriger, comme un champ de niveau supérieur inconnu que Claude Code supprime, unnamequi n’est pas en kebab-case, ou unversion,description, ouauthormanquant. Passez--strictpour transformer les avertissements en échecs dans CIValidation failed: le manifeste a une incompatibilité de type, un chemin qui est manquant ou s’échappe de la racine du plugin, ou une clé inconnue à l’intérieur d’une optionuserConfig, d’une entréechannels, d’une configlspServers, ou d’une entréemonitors. Claude Code signale le même problème lorsqu’il charge le plugin
Champs
Le tableau liste les clés de niveau supérieur dansplugin.json. name est la seule clé obligatoire. Lorsqu’un nom de champ est un lien, la section liée a ses règles complètes.
Pour les clés de composant telles que commands et hooks, Formes de chemin de composant montre chaque forme acceptée avec un exemple, et chaque chemin suit les règles de chemin pour le préfixe ./, les extensions, et le confinement.
Dans la colonne Type, un chemin est une chaîne relative à la racine du plugin, comme
"./custom/commands".
name
L’identifiant du plugin. Il doit être non vide, sans espaces, @, :, séparateurs de chemin, caractères de contrôle, ou caractères de formatage bidirectionnel ; utilisez kebab-case.
Claude Code espace de noms chaque composant sous celui-ci, donc un agent reviewer dans le plugin deploy-tools apparaît comme deploy-tools:reviewer.
displayName
Le nom affiché dans l’interface utilisateur à la place de name. Il peut contenir des espaces et n’importe quelle casse, et il n’est pas utilisé pour l’espacement de noms ou la recherche.
Pour un plugin installé depuis le marketplace, un displayName sur l’entrée de marketplace prend précédence sur cette valeur.
version
Une chaîne de version, non vérifiée par rapport à semver. La définir épingle le plugin à cette version jusqu’à ce que vous la changiez ; voir Versions et mises à jour. Un plugin avec une command source, un plugin d’un marketplace hébergé sur claude.ai, et un plugin chargé sur place à partir d’un marketplace ajouté en tant que répertoire local ne sont pas épinglés par ce champ.
metadata
Un objet de forme libre pour vos propres données, comme des champs de catalogue ou de droit. Claude Code ne le lit pas. Nécessite Claude Code v2.1.222 ou ultérieur.
defaultEnabled
Si le plugin démarre activé lorsque l’utilisateur ne l’a pas défini dans enabledPlugins. Par défaut true. Un plugin qu’un plugin activé dépend démarre activé indépendamment. Le même champ dans l’entrée de marketplace remplace celui-ci.
Une fois qu’une entrée enabledPlugins d’un utilisateur est écrite, elle persiste à travers les mises à jour de plugin, donc changer defaultEnabled dans une version ultérieure ne change pas le paramètre pour un utilisateur existant.
dependencies
Plugins qui doivent être activés pour que celui-ci fonctionne. Chaque entrée est "name", "name@marketplace", ou { "name": "...", "marketplace": "...", "version": "..." }. Les noms nus se résolvent par rapport au propre marketplace de ce plugin. Voir contraintes de dépendance.
settings
Paramètres que Claude Code applique tandis que le plugin est activé. Seuls agent et subagentStatusLine prennent effet ; les autres clés sont supprimées au chargement. Un settings.json à la racine du plugin prend précédence sur cette clé. Voir Paramètres par défaut.
Formes de chemin de composant
Chaque clé de composant accepte un chemin relatif à la racine du plugin.hooks, mcpServers, lspServers, et experimental.monitors acceptent également une configuration en ligne, commands accepte également une carte d’objets, et mcpServers accepte également des chemins de bundle MCP et des URL. Les exemples qui suivent montrent chaque forme acceptée une fois. Pour ce que chaque composant fait à l’exécution, voir Composants de plugin.
Champs réservés au chemin
agents, skills, outputStyles, workflows, et experimental.themes prennent un chemin ou un tableau de chemins. Les entrées agents doivent être des fichiers .md, et les entrées skills doivent être des répertoires. Les trois autres acceptent un répertoire ou un fichier.
commands
commands prend un chemin, un tableau de chemins, ou une carte d’objets. Un chemin nomme un fichier de commande .md plat ou un répertoire. Dans la carte d’objets, chaque clé devient le nom de la commande après le préfixe du plugin. Par exemple, "about" dans le plugin deploy-tools s’exécute comme /deploy-tools:about.
Chaque valeur définit exactement l’une de source ou content, et une entrée qui définit les deux ou aucune échoue la validation. Les autres champs de ce tableau sont optionnels :
Cette carte déclare une commande à partir d’un fichier et une à partir du contenu en ligne :
hooks
hooks prend un chemin de fichier .json, un objet hooks en ligne dans la même forme que hooks dans settings.json, ou un tableau mélangeant les deux. Pour les événements hook et les champs de gestionnaire, voir la référence hooks.
Claude Code fusionne tout ce que vous déclarez avec hooks/hooks.json lorsque ce fichier existe.
mcpServers
mcpServers prend un chemin de fichier .json, un chemin de bundle MCP ou une URL, une carte en ligne, ou un tableau mélangeant les deux. Pour les champs de config de serveur, voir serveurs MCP fournis par plugin.
Claude Code charge .mcp.json à la racine du plugin en premier, puis chaque forme déclarée dans l’ordre. Un nom de serveur déclaré plus tard remplace un nom antérieur.
Une valeur mcpServers prend l’une de ces formes :
Un chemin de bundle ou une URL doit se terminer par
.mcpb ou .dxt. Toute autre extension échoue la validation.
lspServers
lspServers prend un chemin de fichier .json, une carte en ligne du nom de serveur à la config, ou un tableau de l’un ou l’autre.
Claude Code charge .lsp.json à la racine du plugin en premier, puis chaque config déclarée dans l’ordre. Un nom de serveur déclaré plus tard remplace un nom antérieur.
Chaque config de serveur est un objet strict avec ces champs. Une clé inconnue échoue la validation.
Cette config en ligne exécute
gopls pour les fichiers .go :
monitors
experimental.monitors prend un chemin de fichier .json ou le tableau en ligne. Lorsque vous omettez la clé, Claude Code charge monitors/monitors.json s’il existe.
Chaque entrée est un objet strict avec ces champs.
Ce tableau en ligne déclare un monitor qui démarre la première fois que la skill
deploy s’exécute :
command de monitor ne peut pas référencer ${user_config.*}. Voir Champs qui s’exécutent via un shell.
Règles de chemin
Chaque chemin de composant dans un manifeste est relatif à la racine du plugin et doit commencer par./. Un chemin comme commands/foo.md échoue la validation. skills et mcpServers acceptent chacun une forme en dehors de cette règle :
skills: accepte également".". À la fois"."et"./"désignent la racine du plugin. Avant v2.1.221,"."échouait la validation du manifeste, donc utilisez"./"lorsque le plugin doit se charger sur les versions antérieuresmcpServers: accepte également une URL de bundlehttps://
Confinement et existence
Chaque chemin de composant doit se résoudre à l’intérieur de la racine du plugin et doit exister.claude plugin validate ne vérifie pas les chemins outputStyles, lspServers, monitors, ou themes, donc un mauvais chemin dans ces champs échoue uniquement lorsque le plugin se charge :
- Confinement : un chemin qui se résout en dehors de la racine du plugin ne se charge pas, et l’onglet Errors
/pluginaffiche<component> path escapes plugin directory: <path>. Un chemin contenant..est le cas habituel, etclaude plugin validatele signale commePath contains ".." which could be a path traversal attempt - Existence : un chemin qui n’existe pas ne se charge pas, et l’onglet Errors
/pluginaffiche<component> path not found: <path>.claude plugin validatele signale commePath not found
Comment chaque clé se combine avec son emplacement par défaut
Chaque clé de composant remplace son emplacement par défaut, s’y ajoute, ou le fusionne :- Remplace la valeur par défaut :
commands,agents,outputStyles,workflows,experimental.themes,experimental.monitors. Lorsque vous définissezcommands, le répertoire par défautcommands/n’est pas analysé. Pour conserver la valeur par défaut et en ajouter d’autres, listez-la explicitement :"commands": ["./commands/", "./extras/"] - S’ajoute à la valeur par défaut :
skills. Le répertoireskills/est toujours analysé, et les répertoires listés se chargent à côté de celui-ci - Fusionne :
hooks,mcpServers,lspServers. Le fichier par défaut se charge en premier, et ce que le manifeste déclare fusionne avec celui-ci, comme décrit sous Formes de chemin de composant
commands/ et définit également la clé de manifeste qui le remplace, Claude Code charge les chemins du manifeste et non le dossier. claude plugin list et l’interface /plugin affichent alors l’avertissement Default <folder>/ folder is ignored because the manifest sets "<key>".
Pour éviter l’avertissement, définissez la clé sur un chemin à l’intérieur de ce dossier : "commands": ["./commands/deploy.md"] nomme un fichier dans le dossier par défaut et ne produit aucun avertissement.
Configuration utilisateur
userConfig déclare les valeurs que Claude Code demande à l’utilisateur lorsque le plugin est activé, afin que les utilisateurs ne modifient pas settings.json eux-mêmes.
Les clés sont des identifiants composés de lettres, de chiffres et de traits de soulignement, et ne peuvent pas commencer par un chiffre.
Chaque valeur est un objet strict avec ces champs. Une clé inconnue échoue la validation.
Chaque option de chaque plugin activé apparaît également comme une ligne dans le panneau
/config, sauf les options sensitive et les listes multiple. Les lignes /config nécessitent Claude Code v2.1.269 ou ultérieur.
Cette userConfig déclare un point de terminaison et un jeton masqué :
Limiter un champ à des options fixes
Définissezoptions sur un champ userConfig pour que les utilisateurs choisissent sa valeur dans une liste fixe.
Pour limiter un champ tone à trois options, listez-les dans options et définissez default sur l’une d’elles :
options sur n’importe quel champ, les utilisateurs sur les versions de Claude Code antérieures à v2.1.271 ne peuvent pas charger le plugin.
options s’applique à un champ string qui n’est pas multiple ou sensitive. Définissez default sur l’une des valeurs listées, ou définissez required: true afin que l’utilisateur en choisisse une. Chaque option est une étiquette simple de 1 à 64 caractères, et claude plugin validate, que vous exécutez dans votre shell, signale tout ce qu’il rejette. Un plugin dont options cassent ces règles ne se charge pas.
Où les valeurs sont stockées
Les valeurs non sensibles sont enregistrées souspluginConfigs dans le settings.json de l’utilisateur. Les valeurs sensibles vont au stockage de credentials sécurisé de la plateforme à la place. La page des paramètres liste les fichiers de paramètres à partir desquels pluginConfigs est lu.
Référencer une valeur enregistrée
Référencez une valeur enregistrée où le plugin en a besoin, dans l’une de ces deux formes :${user_config.KEY}: substitué dans la config du serveur MCP, la config du serveur LSP, lesargsdu hook exec-form, et le contenu de skill et d’agent. Dans le contenu de skill et d’agent, seules les valeurs non sensibles sont substituées, et une valeur sensible là devient un placeholderCLAUDE_PLUGIN_OPTION_<KEY>: exporté aux processus hook pour chaque option, avec<KEY>en majuscules. Un hook de forme shell lit$CLAUDE_PLUGIN_OPTION_API_TOKENpourapi_token
Champs qui s’exécutent via un shell
Les commandes hook de forme shell, les commandes monitor, et le MCPheadersHelper rejettent ${user_config.*}. Un composant qui le référence dans l’un de ces champs échoue avec une erreur au lieu de s’exécuter, car la valeur du champ est passée à un shell qui ré-analyserait la valeur substituée.
Le tableau montre comment la valeur peut atteindre chacun de ces champs à la place.
Canaux
channels déclare les canaux de message qu’un plugin fournit, comme un pont vers une application de chat. Lorsque vous en déclarez un, Claude Code peut demander la configuration du canal lorsque le plugin est activé. Pour comment le serveur injecte les messages, voir la référence des canaux.
Chaque entrée est un objet strict lié à l’un des serveurs MCP du plugin, avec ces champs :
Ce manifeste lie un canal au serveur MCP
telegram du plugin et demande un jeton de bot qui se substitue dans le env du serveur :
Variables d’environnement
Claude Code fournit trois variables de chemin aux composants de plugin. Référencez-les comme${NAME} dans les champs listés sous Où chaque variable se résout, et lisez-les comme variables d’environnement dans les processus qui les reçoivent.
${CLAUDE_PLUGIN_ROOT} change lorsque le plugin se met à jour, donc n’écrivez pas d’état là. Pour où la racine se déplace et quand l’ancien répertoire est nettoyé, voir la page de chargement.
Lorsque vous désinstallez le plugin du dernier endroit où il est installé, le répertoire ${CLAUDE_PLUGIN_DATA} est supprimé sauf si vous passez --keep-data.
Où chaque variable se résout
Dans chaque composant de plugin, les références${...} se résolvent en ligne dans des champs spécifiques, et certains composants reçoivent également les variables dans leur environnement de processus :
Les variables ne sont pas présentes dans l’environnement des commandes que Claude exécute via l’outil Bash, dans la session principale ou dans un sous-agent. Dans le contenu de skill, de commande, et d’agent, écrivez la référence
${...} dans le corps Markdown à la place, et Claude Code substitue le chemin en ligne lorsqu’il charge le contenu.
Guillemets et séparateurs de chemin
Gardez chaque chemin substitué comme un seul argument :- Commandes hook : utilisez exec form avec
argsafin que chaque chemin soit un argument sans guillemets - Hooks de forme shell et commandes monitor : enveloppez la variable entre guillemets doubles afin qu’un chemin avec des espaces reste un mot
Disposition standard
Chaque type de composant a un emplacement par défaut sous la racine du plugin, utilisé lorsque le manifeste ne pointe pas ailleurs.
Un plugin qui utilise chaque emplacement par défaut, plus un dossier
scripts/ que ses hooks appellent, est disposé comme ceci :
CLAUDE.md à la racine du plugin n’est pas chargé comme contexte, et claude plugin validate avertit lorsqu’il en trouve un. Pour inclure des instructions qui se chargent dans le contexte de Claude, mettez-les dans une skill.
Entrées de marketplace et le manifeste
Une entrée de marketplace accepte chaque champ de cette page à côté de ses propres champs, y comprisstrict.
Le champ strict décide si l’entrée peut ajouter des composants à un plugin qui a son propre plugin.json. Il est par défaut true.
Comment les champs d’entrée se combinent avec plugin.json
L’entrée sert soit de manifeste, ajoute des composants à celui-ci, soit entre en conflit avec celui-ci :
- Pas de
plugin.json: l’entrée est le manifeste, indépendamment destrict. Leshooksd’entrée se chargent uniquement dans la forme d’objet en ligne. Pour un chemin de fichier ou un tableau là, l’onglet Errors/pluginaffiche une erreurnot yet supported in a marketplace entry plugin.jsonprésent,strictnon défini outrue: Claude Code charge le manifeste et ajoute lescommands,agents,skills,outputStyles, etthemesde l’entrée à celui-ci. Pourhooks, les matchers de l’entrée pour un événement remplacent les matchers du manifeste pour ce même événement, et les événements que seul le manifeste déclare gardent les leursplugin.jsonprésent,strict: false: une entrée qui déclare l’un decommands,agents,skills,hooks,outputStyles, outhemesest un conflit, et le plugin ne se charge pas avecPlugin <name> has conflicting manifests
source est la racine du marketplace liste des sous-répertoires skills spécifiques, seuls ces sous-répertoires se chargent, et le répertoire par défaut skills/ du plugin n’est pas analysé. Une clé skills dans le manifeste s’ajoute à la valeur par défaut.
Précédence des métadonnées
Certains champs de métadonnées ont une précédence fixe indépendamment destrict :
defaultEnabledet champs d’affichage : ledefaultEnabledde l’entrée et ses champs d’affichage commedisplayNameremplacent ceux du manifesteversion: leversiondu manifeste remplace celui de l’entréename: lorsque l’entrée liste le plugin sous unnamedifférent de celui du manifeste,enabledPluginsutilise le nom de l’entrée, et les composants sont espacés de noms sous le nom du manifeste
Étapes suivantes
- Ajouter des composants à un plugin : ce que chaque composant fait à l’exécution, avec un exemple qui valide
- Référence de marketplace : les champs d’entrée qu’un marketplace peut définir pour votre plugin
- Référence des commandes de plugin : les drapeaux et la sortie de
claude plugin validate - Dépanner les plugins : chaque message de validation avec sa correction