Plugin Manifest
The manifest is the file .claude-plugin/plugin.json inside a plugin.
It names the plugin. It can also point to its parts.
The file is optional. Only name is required.
For example, { "name": "my-plugin", "version": "1.0.0" } is a valid manifest.
You write it by hand or start from claude plugin init. Run claude plugin validate after you edit it. enabledPlugins enables or disables the plugin as a whole. A manifest can set defaultEnabled for users who set nothing.
Rules
- Claude Code strips an unknown top-level key.
claude plugin validatewarns about it. - An unknown key inside
userConfig,channels,lspServers, ormonitorsis an error. The plugin does not load. - A component path starts with
./. It stays inside the plugin folder. It must exist.
Source: Plugin Manifest Reference and the program (the bundled manifest schema). A marketplace entry can repeat many of these keys. See Marketplaces.
Top-Level Keys
The last column says where the key may appear: the manifest, a marketplace entry, or both.
| Key | Status | What It Does | How It Works | Where |
|---|---|---|---|---|
$schema | Documented: An official docs page names this item. | Gives an editor schema URL. | The loader ignores it. | Manifest |
name | Documented: An official docs page names this item. | Sets the plugin id and namespace. | Not empty, no spaces, no control or bidirectional characters. Reserved: names that start with claude-, anthropic-, anthropics-, or cc-, and the names claude, anthropic, claude-, claude-. | Both |
display | Documented: An official docs page names this item. | Sets the name shown in the UI. | The entry value wins. | Both |
version | Documented: An official docs page names this item. | Sets the version text. | Must be a string (a number is an error). Any text works. Nothing checks it as semver. The validator only warns when it is missing or empty. Users stay on this version until you change it. The manifest value wins over the entry. claude plugin validate warns when they differ. | Both |
description, homepage, repository, license, keywords | Documented: An official docs page names this item. | Listing data. | homepage must be a URL. | Both |
author | Documented: An official docs page names this item. | Names the maker. | An object: name (required), email, url. | Both |
metadata | Documented: An official docs page names this item. | A free map for your own data. | The program drops a value that is not an object. | Both |
icon, documentation, support, privacy, terms | Documented: An official docs page names this item. | Directory listing data. | The program also ignores these names without error: screenshots, classification, privacy_, privacy, support, bugs, terms_, docs. | Manifest only |
default | Documented: An official docs page names this item. | Sets the start state when the user chose nothing. | Default true. The entry value wins. enabled always wins. | Both |
dependencies | Documented: An official docs page names this item. | Lists plugins that must be enabled too. | Each item is "name", "name@marketplace", or an object. The program also accepts a trailing @^range. It strips the range. | Both |
settings | Documented: An official docs page names this item. | Applies settings while the plugin is enabled. | Only agent and subagent take effect. A settings. in the plugin root wins. | Manifest |
user | Documented: An official docs page names this item. | Asks the user for values when the plugin is enabled. | See user Option Keys. | Manifest |
channels | Documented: An official docs page names this item. | Declares message channels. | Items have server, display, and user. Strict. | Manifest |
types | Documented: An official docs page names this item. | Points to a . file for a mod. | Must end in . and must not contain ... | Manifest |
skills | Documented: An official docs page names this item. | Adds skill folders. | Adds to skills/. The value ". means the plugin root. | Manifest |
commands | Documented: An official docs page names this item. | Lists command files or a map. | Replaces commands/. A map entry has source or content (exactly one), description, argument, model, and allowed. | Manifest |
agents | Documented: An official docs page names this item. | Lists agent . files. | Replaces agents/. Folders are not allowed. | Manifest |
hooks | Documented: An official docs page names this item. | Gives hook files or inline hooks. | Merges with hooks/. A file needs the "hooks" wrapper. | Manifest |
mcp | Documented: An official docs page names this item. | Gives MCP server config. | A path, a . or . bundle path or URL, an inline map, or an array. A later name replaces an earlier one. | Manifest |
lsp | Documented: An official docs page names this item. | Gives language server config. | Fields: command, extension, args, transport, env, initialization, settings, workspace, startup, shutdown, request, restart, max, diagnostics. | Manifest |
output | Documented: An official docs page names this item. | Lists style files or folders. | Replaces output-. | Manifest |
workflows | Documented: An official docs page names this item. | Lists workflow . files or folders. | Replaces workflows/. | Manifest |
experimental. | Documented: An official docs page names this item. Experimental: The program or the official docs call this experimental or beta. | Lists theme files or folders. | Replaces themes/. A top-level themes key still loads. It gives a warning. | Manifest |
experimental. | Documented: An official docs page names this item. Experimental: The program or the official docs call this experimental or beta. | Declares background watchers. | Items: name, command, description, when (always or on-). Interactive sessions only. Since 2., they also run on Bedrock, Vertex, and Foundry, and with telemetry or nonessential traffic off (v2.1.310 release). | Manifest |
experimental. | Documented: An official docs page names this item. Experimental: The program or the official docs call this experimental or beta. | Names the eval folder. | Default evals/. claude plugin eval uses it. | Manifest |
experimental. | Undocumented: Only the program shows this item. It can change without notice. Experimental: The program or the official docs call this experimental or beta. | Adds highlight.js languages. | Up to 16 items. id matches ^[a- (64 characters at most). remote is npm: or github:. integrity is an SRI hash with sha256-, sha384-, or sha512-. Strict. | Manifest |
binaries | Undocumented: Only the program shows this item. It can change without notice. | Lists files fetched into bin/ at install. | A map of base name to { "sha256":. At most 64 entries. Names match ^[a-. The env var CLAUDE_ also exists. | Manifest |
userConfig Option Keys
Each key under userConfig is the name of one option. The name must match ^[A-Za-z_]\w*$.
Claude Code passes the value to hooks as the env var CLAUDE_PLUGIN_OPTION_<KEY>.
The same option shape works inside channels.
| Option | Status | What It Does | How It Works |
|---|---|---|---|
type | Documented: An official docs page names this item. | Sets the value type. | string, number, boolean, directory, or file. |
title, description | Documented: An official docs page names this item. | Label and help text in the dialog. | Both are required. |
required, default | Documented: An official docs page names this item. | Say whether an empty value is allowed, and what the start value is. | A default is a string, number, boolean, or array of strings. |
multiple, sensitive | Documented: An official docs page names this item. | Allow a list, or mark a secret. | A sensitive value goes to secure storage, not to settings. |
min, max | Documented: An official docs page names this item. | Bound a number. | number type only. |
options | Documented: An official docs page names this item. | Gives fixed choices. | string type only, not multiple, not sensitive. Each choice is 1 to 64 characters. Needs Claude Code 2. or later. |
Components and Layout
my-plugin/.claude-plugin/plugin.json
skills/one folder per skill, each withSKILL.mdcommands/command filesagents/agent.mdfileshooks/hooks.jsonhooks, inside ahookswrapper
output-styles/workflows/themes/bin/programs added to the Bash toolPATH.mcp.jsonMCP servers.lsp.jsonlanguage serversmonitors/monitors.json
settings.jsonplugin settings
| Item | Status | What It Does | How It Works |
|---|---|---|---|
skills/, commands/, agents/, output-, workflows/, themes/ | Documented: An official docs page names this item. | Default places for components. | A manifest key adds to or replaces the folder, as the table above says. |
hooks/ | Documented: An official docs page names this item. | Holds the plugin hooks. | Keys: hooks, and also modules (one path to a hooks module) and description. The old surface key is gone. |
., ., monitors/, settings. | Documented: An official docs page names this item. | Config files at fixed places. | Claude Code loads these before it reads manifest entries. |
bin/ | Documented: An official docs page names this item. | Puts programs on the PATH of the Bash tool. | claude.ai and Cowork do not install a plugin that has a bin/ folder. |
Root SKILL. | Documented: An official docs page names this item. | Makes a single-skill plugin. | The loader uses it only when there is no skills/ folder and no skills key. |
Root CLAUDE. | Documented: An official docs page names this item. | The loader does not load it. | claude plugin validate warns about it. |
Example
{
"name": "deploy-tools",
"displayName": "Deploy Tools",
"version": "1.2.0",
"description": "Skills and a hook for our deploy flow.",
"author": { "name": "Platform Team", "email": "platform@example.com" },
"defaultEnabled": true,
"userConfig": {
"REGION": {
"type": "string",
"title": "Region",
"description": "Region to deploy to.",
"options": ["eu-west-1", "us-east-1"],
"default": "eu-west-1"
},
"API_TOKEN": {
"type": "string",
"title": "API Token",
"description": "Token for the deploy API.",
"sensitive": true
}
},
"hooks": "./hooks/hooks.json",
"mcpServers": "./.mcp.json"
}
Hooks of this plugin see CLAUDE_PLUGIN_OPTION_REGION and CLAUDE_PLUGIN_OPTION_API_TOKEN in their env.
How It Works
Related Pages
- Plugins for the overview.
- Marketplaces for
marketplace.jsonand plugin sources. - Plugin Loading for variables such as
${CLAUDE_PLUGIN_ROOT}. - Hooks, Plugins, and Skills Settings for
pluginConfigsandenabledPlugins.