plugin.json im Verzeichnis .claude-plugin/ eines Plugins. Sie enthält die Metadaten des Plugins und die userConfig-Werte, die Claude Code den Benutzer auffordert einzugeben. Sie deklariert auch alle Komponenten, die Sie inline definieren oder außerhalb ihres Standardorts speichern.
Diese Referenz ist für Plugin-Ersteller und für Marketplace-Besitzer, die Komponentenfelder in einen Marketplace-Eintrag einfügen.
Diese Fälle werden auf anderen Seiten behandelt:
- Erlernen des Plugin-Aufbaus: Beginnen Sie mit Plugin erstellen
- Was jede Komponente zur Laufzeit tut: siehe Plugin-Komponenten
- Ein Feld: die Feldtabelle gibt den Typ jedes Feldes, ob es erforderlich ist, seinen Standard und was es akzeptiert. Pfadregeln behandelt das
./-Präfix und die Eindämmung für jeden Komponentenpfad - Eine
userConfig-Option oder einenchannels-Eintrag: die Benutzerkonfiguration und Kanäle-Schemas ${CLAUDE_PLUGIN_ROOT}oder eine andere Variable, auf die ein Plugin verweisen kann: Umgebungsvariablen- Wo die Dateien jeder Komponente hingehen: Standardlayout
- Eine Nachricht von
claude plugin validate: die Seite zur Fehlerbehebung listet jede Nachricht mit ihrer Lösung und Links zu den relevanten Abschnitten auf dieser Seite auf
Manifest-Datei
Das Manifest ist optional. Ohne es lädt Claude Code die Komponenten, die es im Standardlayout findet. Der Plugin-Name kommt dann aus dem Marketplace-Eintrag oder aus dem Verzeichnisnamen, wenn Sie das Plugin mit--plugin-dir laden.
Schreiben Sie ein Manifest, wenn Sie Metadaten, eine Komponente außerhalb ihres Standardverzeichnisses, userConfig oder eine inline Komponentendefinition möchten.
Speichern Sie das Manifest unter .claude-plugin/plugin.json im Plugin-Root. Legen Sie jede andere Plugin-Datei im Plugin-Root ab, nicht im .claude-plugin/-Verzeichnis. Das umfasst skills/, commands/ und hooks/.
Das folgende Beispiel setzt die meisten Schlüssel in der Feldtabelle. Es besteht die Validierung in einem Plugin-Verzeichnis, das jeden referenzierten Pfad enthält.
Nicht erkannte Felder
Ein nicht erkannter Top-Level-Schlüssel wird entfernt, und ein nicht erkannter Schlüssel in eineruserConfig-Option, einem channels-Eintrag, einer lspServers-Konfiguration oder einem monitors-Eintrag wird abgelehnt:
- Top-Level-Felder: Das Feld wird entfernt und das Plugin wird geladen.
claude plugin validatemeldet jedes nicht erkannte Top-Level-Feld als Warnung - Strikte Objekte:
userConfig-Optionen,channels-Einträge,lspServers-Konfigurationen undmonitors-Einträge sind streng. Ein unbekannter Schlüssel in einem ist ein Fehler, und das Plugin wird nicht geladen
Manifest validieren
claude plugin validate ist die maßgebliche Überprüfung für ein Manifest. Führen Sie es von Ihrer Shell aus gegen das Plugin-Verzeichnis aus:
Validation passed: Das Manifest wird geladenValidation passed with warnings: Das Manifest wird geladen, aber der Validator hat etwas gefunden, das zu beheben ist, z. B. ein unbekanntes Top-Level-Feld, das Claude Code entfernt, einname, der nicht in Kebab-Case ist, oder ein fehlenderversion,descriptionoderauthor. Übergeben Sie--strict, um Warnungen in CI in Fehler umzuwandelnValidation failed: Das Manifest hat einen Typ-Mismatch, einen Pfad, der fehlt oder den Plugin-Root verlässt, oder einen unbekannten Schlüssel in eineruserConfig-Option, einemchannels-Eintrag, einerlspServers-Konfiguration oder einemmonitors-Eintrag. Claude Code meldet das gleiche Problem, wenn es das Plugin lädt
Felder
Die Tabelle listet die Top-Level-Schlüssel inplugin.json auf. name ist der einzige erforderliche Schlüssel. Wenn ein Feldname ein Link ist, hat der verlinkte Abschnitt seine vollständigen Regeln.
Für Komponentenschlüssel wie commands und hooks zeigt Komponentenpfadformen jede akzeptierte Form mit einem Beispiel, und jeder Pfad folgt den Pfadregeln für das ./-Präfix, Erweiterungen und Eindämmung.
In der Spalte Typ ist ein Pfad ein String relativ zum Plugin-Root, z. B.
"./custom/commands".
name
Der Plugin-Identifier. Er muss nicht leer sein, ohne Leerzeichen, @, :, Pfadtrennzeichen, Steuerzeichen oder bidirektionale Formatierungszeichen; verwenden Sie Kebab-Case.
Claude Code namespaced jede Komponente darunter, daher erscheint ein Agent reviewer im Plugin deploy-tools als deploy-tools:reviewer.
displayName
Der Name, der in der Benutzeroberfläche anstelle von name angezeigt wird. Er kann Leerzeichen und beliebige Groß-/Kleinschreibung enthalten und wird nicht für Namespacing oder Lookup verwendet.
Für ein Marketplace-installiertes Plugin hat ein displayName im Marketplace-Eintrag Vorrang vor diesem Wert.
version
Eine Versionszeichenfolge, nicht gegen Semver überprüft. Das Setzen fixiert das Plugin auf diese Version, bis Sie es ändern; siehe Versionen und Updates. Ein Plugin mit einer command-Quelle, ein Plugin aus einem Marketplace, das auf claude.ai gehostet wird, und ein Plugin, das an Ort und Stelle geladen wird aus einem Marketplace, der als lokales Verzeichnis hinzugefügt wurde, werden nicht durch dieses Feld fixiert.
metadata
Ein Freiformobjekt für Ihre eigenen Daten, z. B. Katalog- oder Berechtigungsfelder. Claude Code liest es nicht. Erfordert Claude Code v2.1.222 oder später.
defaultEnabled
Ob das Plugin aktiviert startet, wenn der Benutzer es nicht in enabledPlugins gesetzt hat. Standard ist true. Ein Plugin, von dem ein aktiviertes Plugin abhängt, startet unabhängig aktiviert. Das gleiche Feld im Marketplace-Eintrag überschreibt dieses.
Sobald der enabledPlugins-Eintrag eines Benutzers geschrieben wird, bleibt er über Plugin-Updates hinweg bestehen, daher ändert das Ändern von defaultEnabled in einer späteren Version die Einstellung für einen bestehenden Benutzer nicht.
dependencies
Plugins, die aktiviert sein müssen, damit dieses funktioniert. Jeder Eintrag ist "name", "name@marketplace" oder { "name": "...", "marketplace": "...", "version": "..." }. Bare Namen werden gegen diesen Plugin-eigenen Marketplace aufgelöst. Siehe Abhängigkeitsbeschränkungen.
settings
Einstellungen, die Claude Code anwendet, während das Plugin aktiviert ist. Nur agent und subagentStatusLine wirken sich aus; andere Schlüssel werden beim Laden gelöscht. Eine settings.json im Plugin-Root hat Vorrang vor diesem Schlüssel. Siehe Standardeinstellungen.
Komponentenpfadformen
Jeder Komponentenschlüssel akzeptiert einen Pfad relativ zum Plugin-Root.hooks, mcpServers, lspServers und experimental.monitors akzeptieren auch inline Konfiguration, commands akzeptiert auch eine Objektzuordnung, und mcpServers akzeptiert auch MCP-Bundle-Pfade und URLs. Die folgenden Beispiele zeigen jede akzeptierte Form einmal. Für das, was jede Komponente zur Laufzeit tut, siehe Plugin-Komponenten.
Nur-Pfad-Felder
agents, skills, outputStyles, workflows und experimental.themes nehmen einen Pfad oder ein Array von Pfaden. agents-Einträge müssen .md-Dateien sein, und skills-Einträge müssen Verzeichnisse sein. Die anderen drei akzeptieren ein Verzeichnis oder eine Datei.
commands
commands nimmt einen Pfad, ein Array von Pfaden oder eine Objektzuordnung. Ein Pfad benennt eine flache .md-Befehlsdatei oder ein Verzeichnis. In der Objektzuordnung wird jeder Schlüssel zum Befehlsnamen nach dem Plugin-Präfix. Zum Beispiel wird "about" im Plugin deploy-tools als /deploy-tools:about ausgeführt.
Jeder Wert setzt genau einen von source oder content, und ein Eintrag, der beide oder keinen setzt, schlägt die Validierung fehl. Die anderen Felder in dieser Tabelle sind optional:
Diese Zuordnung deklariert einen Befehl aus einer Datei und einen aus inline Inhalt:
hooks
hooks nimmt einen .json-Dateipfad, ein inline Hooks-Objekt in der gleichen Form wie hooks in settings.json, oder ein Array, das beide mischt. Für Hook-Ereignisse und Handler-Felder siehe die Hooks-Referenz.
Claude Code führt zusammen, was Sie mit hooks/hooks.json deklarieren, wenn diese Datei existiert.
mcpServers
mcpServers nimmt einen .json-Dateipfad, einen MCP-Bundle-Pfad oder eine URL, eine inline Zuordnung oder ein Array, das diese mischt. Für Server-Konfigurationsfelder siehe Plugin-bereitgestellte MCP-Server.
Claude Code lädt zuerst .mcp.json im Plugin-Root, dann jede deklarierte Form in Reihenfolge. Ein später deklarierter Server-Name ersetzt einen früheren.
Ein mcpServers-Wert nimmt eine dieser Formen:
Ein Bundle-Pfad oder eine URL muss mit
.mcpb oder .dxt enden. Jede andere Erweiterung schlägt die Validierung fehl.
lspServers
lspServers nimmt einen .json-Dateipfad, eine inline Zuordnung von Server-Name zu Konfiguration oder ein Array von beiden.
Claude Code lädt zuerst .lsp.json im Plugin-Root, dann jede deklarierte Konfiguration in Reihenfolge. Ein später deklarierter Server-Name ersetzt einen früheren.
Jede Server-Konfiguration ist ein striktes Objekt mit diesen Feldern. Ein unbekannter Schlüssel schlägt die Validierung fehl.
Diese inline Konfiguration führt
gopls für .go-Dateien aus:
monitors
experimental.monitors nimmt einen .json-Dateipfad oder das inline Array. Wenn Sie den Schlüssel weglassen, lädt Claude Code monitors/monitors.json, falls vorhanden.
Jeder Eintrag ist ein striktes Objekt mit diesen Feldern.
Dieses inline Array deklariert einen Monitor, der das erste Mal startet, wenn der
deploy-Skill ausgeführt wird:
command kann nicht auf ${user_config.*} verweisen. Siehe Felder, die durch eine Shell laufen.
Pfadregeln
Jeder Komponentenpfad in einem Manifest ist relativ zum Plugin-Root und muss mit./ beginnen. Ein Pfad wie commands/foo.md schlägt die Validierung fehl. skills und mcpServers akzeptieren jeweils eine Form außerhalb dieser Regel:
skills: akzeptiert auch".". Sowohl"."als auch"./"bezeichnen den Plugin-Root. Vor v2.1.221 schlugen"."die Manifest-Validierung fehl, daher verwenden Sie"./", wenn das Plugin auf früheren Versionen geladen werden mussmcpServers: akzeptiert auch einehttps://-Bundle-URL
Eindämmung und Existenz
Jeder Komponentenpfad muss sich im Plugin-Root auflösen und muss existieren.claude plugin validate überprüft nicht die outputStyles-, lspServers-, monitors- oder themes-Pfade, daher schlägt ein schlechter Pfad in diesen Feldern nur fehl, wenn das Plugin geladen wird:
- Eindämmung: Ein Pfad, der sich außerhalb des Plugin-Root auflöst, wird nicht geladen, und die
/plugin-Registerkarte Errors zeigt<component> path escapes plugin directory: <path>. Ein Pfad mit..ist der übliche Fall, undclaude plugin validatemeldet ihn alsPath contains ".." which could be a path traversal attempt - Existenz: Ein Pfad, der nicht existiert, wird nicht geladen, und die
/plugin-Registerkarte Errors zeigt<component> path not found: <path>.claude plugin validatemeldet ihn alsPath not found
Wie jeder Schlüssel mit seinem Standardort kombiniert wird
Jeder Komponentenschlüssel ersetzt seinen Standardort, fügt zu ihm hinzu oder führt ihn zusammen:- Ersetzt den Standard:
commands,agents,outputStyles,workflows,experimental.themes,experimental.monitors. Wenn Siecommandssetzen, wird das Standard-commands/-Verzeichnis nicht gescannt. Um den Standard zu behalten und mehr hinzuzufügen, listen Sie ihn explizit auf:"commands": ["./commands/", "./extras/"] - Fügt zum Standard hinzu:
skills. Dasskills/-Verzeichnis wird immer noch gescannt, und die aufgelisteten Verzeichnisse werden zusammen mit ihm geladen - Führt zusammen:
hooks,mcpServers,lspServers. Die Standarddatei wird zuerst geladen, und was das Manifest deklariert, wird zusammengeführt, wie unter Komponentenpfadformen beschrieben
commands/ hat und auch den Manifest-Schlüssel setzt, der ihn ersetzt, lädt Claude Code die Manifest-Pfade und nicht den Ordner. claude plugin list und die /plugin-Schnittstelle zeigen dann die Warnung Default <folder>/ folder is ignored because the manifest sets "<key>".
Um die Warnung zu vermeiden, setzen Sie den Schlüssel auf einen Pfad in diesem Ordner: "commands": ["./commands/deploy.md"] benennt eine Datei im Standardordner und erzeugt keine Warnung.
Benutzerkonfiguration
userConfig deklariert Werte, die Claude Code den Benutzer auffordert einzugeben, wenn das Plugin aktiviert ist, damit Benutzer settings.json nicht selbst bearbeiten.
Schlüssel sind Identifier aus Buchstaben, Ziffern und Unterstrichen und können nicht mit einer Ziffer beginnen.
Jeder Wert ist ein striktes Objekt mit diesen Feldern. Ein unbekannter Schlüssel schlägt die Validierung fehl.
Jede Option jedes aktivierten Plugins erscheint auch als Zeile im
/config-Panel, außer sensitive-Optionen und multiple-Listen. Die /config-Zeilen erfordern Claude Code v2.1.269 oder später.
Diese userConfig deklariert einen Endpunkt und ein maskiertes Token:
Feld auf feste Optionen beschränken
Setzen Sieoptions auf ein userConfig-Feld, um Benutzer seinen Wert aus einer festen Liste auszuwählen.
Um ein tone-Feld auf drei Optionen zu beschränken, listen Sie sie in options auf und setzen Sie default auf eine davon:
options auf einem beliebigen Feld deklarieren, können Benutzer auf Claude Code-Versionen vor v2.1.271 das Plugin nicht laden.
options gilt für ein string-Feld, das nicht multiple oder sensitive ist. Setzen Sie default auf einen der aufgelisteten Werte, oder setzen Sie required: true, damit der Benutzer einen auswählen muss. Jede Option ist ein einfaches Label von 1 bis 64 Zeichen, und claude plugin validate, das Sie in Ihrer Shell ausführen, meldet alles andere, das es ablehnt. Ein Plugin, dessen options diese Regeln brechen, wird nicht geladen.
Wo Werte gespeichert werden
Nicht-sensitive Werte werden unterpluginConfigs in der settings.json des Benutzers gespeichert. Sensitive Werte gehen stattdessen in den sicheren Credential-Store der Plattform. Die Einstellungsseite listet auf, welche Einstellungsdateien pluginConfigs gelesen werden.
Einen gespeicherten Wert referenzieren
Referenzieren Sie einen gespeicherten Wert, wo das Plugin ihn benötigt, in einer von zwei Formen:${user_config.KEY}: ersetzt in MCP-Server-Konfiguration, LSP-Server-Konfiguration, Exec-Form-Hook-argsund Skill- und Agent-Inhalt. In Skill- und Agent-Inhalt werden nur nicht-sensitive Werte ersetzt, und ein sensitive Wert dort wird zu einem PlatzhalterCLAUDE_PLUGIN_OPTION_<KEY>: exportiert zu Hook-Prozessen für jede Option, mit<KEY>in Großbuchstaben. Ein Shell-Form-Hook liest$CLAUDE_PLUGIN_OPTION_API_TOKENfürapi_token
Felder, die durch eine Shell laufen
Shell-Form-Hook-Befehle, Monitor-Befehle und MCP-headersHelper lehnen ${user_config.*} ab. Eine Komponente, die darauf in einem dieser Felder verweist, schlägt mit einem Fehler fehl, anstatt zu laufen, weil der Feldwert an eine Shell übergeben wird, die den ersetzten Wert neu analysieren würde.
Die Tabelle zeigt, wie der Wert stattdessen jedes dieser Felder erreichen kann.
Kanäle
channels deklariert die Nachrichtenkanäle, die ein Plugin bereitstellt, z. B. eine Brücke zu einer Chat-App. Wenn Sie einen deklarieren, kann Claude Code auffordern, die Kanalkonfiguration zu konfigurieren, wenn das Plugin aktiviert ist. Für wie der Server Nachrichten injiziert, siehe die Kanäle-Referenz.
Jeder Eintrag ist ein striktes Objekt, das an einen der MCP-Server des Plugins gebunden ist, mit diesen Feldern:
Dieses Manifest bindet einen Kanal an den
telegram-MCP-Server des Plugins und fordert ein Bot-Token auf, das sich in die Server-env ersetzt:
Umgebungsvariablen
Claude Code stellt drei Pfadvariablen für Plugin-Komponenten bereit. Referenzieren Sie sie als${NAME} in den Feldern, die unter Wo jede Variable sich auflöst aufgelistet sind, und lesen Sie sie als Umgebungsvariablen in den Prozessen, die sie erhalten.
${CLAUDE_PLUGIN_ROOT} ändert sich, wenn das Plugin aktualisiert wird, daher schreiben Sie keinen Zustand dort. Für wo sich der Root bewegt und wann das alte Verzeichnis bereinigt wird, siehe die Ladenseite.
Wenn Sie das Plugin von der letzten Stelle, an der es installiert ist, deinstallieren, wird das ${CLAUDE_PLUGIN_DATA}-Verzeichnis gelöscht, es sei denn, Sie übergeben --keep-data.
Wo jede Variable sich auflöst
In jeder Plugin-Komponente lösen sich${...}-Referenzen inline in spezifischen Feldern auf, und einige Komponenten erhalten die Variablen auch in ihrer Prozessumgebung:
Die Variablen sind nicht in der Umgebung von Befehlen vorhanden, die Claude durch das Bash-Tool ausführt, in der Hauptsitzung oder in einem Subagent. In Skill-, Befehls- und Agent-Inhalt schreiben Sie die
${...}-Referenz stattdessen im Markdown-Text, und Claude Code ersetzt den Pfad inline, wenn es den Inhalt lädt.
Anführungszeichen und Pfadtrennzeichen
Halten Sie jeden ersetzten Pfad ein einzelnes Argument:- Hook-Befehle: Verwenden Sie Exec-Form mit
args, damit jeder Pfad ein Argument ohne Anführungszeichen ist - Shell-Form-Hooks und Monitor-Befehle: Wickeln Sie die Variable in doppelte Anführungszeichen ein, damit ein Pfad mit Leerzeichen ein Wort bleibt
Standardlayout
Jeder Komponententyp hat einen Standardort unter dem Plugin-Root, der verwendet wird, wenn das Manifest nicht anderswo verweist.
Ein Plugin, das jeden Standardort verwendet, plus einen
scripts/-Ordner, den seine Hooks aufrufen, ist wie folgt angeordnet:
CLAUDE.md im Plugin-Root wird nicht als Kontext geladen, und claude plugin validate warnt, wenn es eine findet. Um Anweisungen einzuschließen, die in Claude’s Kontext geladen werden, legen Sie sie in einen Skill.
Marketplace-Einträge und das Manifest
Ein Marketplace-Eintrag akzeptiert jedes Feld auf dieser Seite neben seinen eigenen Feldern, einschließlichstrict.
Das strict-Feld entscheidet, ob der Eintrag Komponenten zu einem Plugin hinzufügen darf, das sein eigenes plugin.json hat. Es ist standardmäßig true.
Wie Eintragsfelder mit plugin.json kombiniert werden
Der Eintrag dient entweder als Manifest, fügt Komponenten hinzu oder steht in Konflikt damit:
- Kein
plugin.json: Der Eintrag ist das Manifest, unabhängig vonstrict. Eintraghookswird nur in der inline Objektform geladen. Für einen Dateipfad oder ein Array dort zeigt die/plugin-Registerkarte Errors einennot yet supported in a marketplace entry-Fehler plugin.jsonvorhanden,strictnicht gesetzt odertrue: Claude Code lädt das Manifest und hängt diecommands,agents,skills,outputStylesundthemesdes Eintrags daran an. Fürhooksersetzen die Matcher des Eintrags für ein Ereignis die des Manifests für das gleiche Ereignis, und Ereignisse, die nur das Manifest deklariert, behalten ihreplugin.jsonvorhanden,strict: false: Ein Eintrag, dercommands,agents,skills,hooks,outputStylesoderthemesdeklariert, ist ein Konflikt, und das Plugin wird nicht geladen mitPlugin <name> has conflicting manifests
source das Marketplace-Root ist, spezifische skills-Unterverzeichnisse auflistet, werden nur diese Unterverzeichnisse geladen, und das Standard-skills/-Verzeichnis des Plugins wird nicht gescannt. Ein skills-Schlüssel im Manifest fügt stattdessen zum Standard hinzu.
Metadaten-Vorrang
Einige Metadatenfelder haben einen festen Vorrang unabhängig vonstrict:
defaultEnabledund Anzeigefelder: DiedefaultEnableddes Eintrags und seine Anzeigefelder wiedisplayNameüberschreiben die des Manifestsversion: Dieversiondes Manifests überschreibt die des Eintragsname: Wenn der Eintrag das Plugin unter einem anderennameals das Manifest auflistet, verwendetenabledPluginsden Eintragnamen, und Komponenten werden unter dem Manifest-Namen namespaced
Nächste Schritte
- Komponenten zu einem Plugin hinzufügen: Was jede Komponente zur Laufzeit tut, mit einem Beispiel, das validiert
- Marketplace-Referenz: Die Eintragsfelder, die ein Marketplace für Ihr Plugin setzen kann
- Plugin-Befehls-Referenz:
claude plugin validate-Flags und Ausgabe - Plugins fehlerbeheben: Jede Validierungsnachricht mit ihrer Lösung