Plugin Manifest
The manifest is the file .claude-plugin/plugin.json inside a plugin.
It names the plugin and can point to its parts.
The file is optional, and 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 turns the plugin as a whole on or off. A manifest can set defaultEnabled for users who set nothing.
Rules
- An unknown top-level key is stripped.
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
./, stays inside the plugin folder, and 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 | Gives an editor schema URL. | Ignored when the plugin loads. | Manifest |
name | Documented | 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 | Sets the name shown in the UI. | The entry value wins. | Both |
version | Documented | Sets the version text. | Not checked as semver. Users stay on this version until you change it. The manifest value wins over the entry. | Both |
description, homepage, repository, license, keywords | Documented | Listing data. | homepage must be a URL. | Both |
author | Documented | Names the maker. | An object: name (required), email, url. | Both |
metadata | Documented | A free map for your own data. | A value that is not an object is dropped. | Both |
icon, documentation, support, privacy, terms | Documented | Directory listing data. | The program also ignores these names without error: screenshots, classification, privacy_, privacy, support, bugs, terms_, docs. | Manifest only |
default | Documented | Sets the start state when the user chose nothing. | Default true. The entry value wins. enabled always wins. | Both |
dependencies | Documented | Lists plugins that must be enabled too. | Each item is "name", "name@marketplace", or an object. The program also accepts a trailing @^range and strips it. | Both |
settings | Documented | Applies settings while the plugin is enabled. | Only agent and subagent take effect. A settings. in the plugin root wins. | Manifest |
user | Documented | Asks the user for values when the plugin is enabled. | See user Option Keys. | Manifest |
channels | Documented | Declares message channels. | Items have server, display, and user. Strict. | Manifest |
types | Documented | Points to a . file for a mod. | Must end in . and may not contain ... | Manifest |
skills | Documented | Adds skill folders. | Adds to skills/. The value ". means the plugin root. | Manifest |
commands | Documented | 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 | Lists agent . files. | Replaces agents/. Folders are not allowed. | Manifest |
hooks | Documented | Gives hook files or inline hooks. | Merges with hooks/. A file needs the "hooks" wrapper. | Manifest |
mcp | Documented | 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 | Gives language server config. | Fields: command, extension, args, transport, env, initialization, settings, workspace, startup, shutdown, request, restart, max, diagnostics. | Manifest |
output | Documented | Lists style files or folders. | Replaces output-. | Manifest |
workflows | Documented | Lists workflow . files or folders. | Replaces workflows/. | Manifest |
🧪 experimental. | Documented | Lists theme files or folders. | Replaces themes/. A top-level themes key still loads and gives a warning. | Manifest |
🧪 experimental. | Documented | Declares background watchers. | Items: name, command, description, when (always or on-). Interactive sessions only. | Manifest |
🧪 experimental. | Documented | Names the eval folder. | Default evals/. Used by claude plugin eval. | Manifest |
🧪 experimental. | Undocumented | 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 | 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 | Sets the value type. | string, number, boolean, directory, or file. |
title, description | Documented | Label and help text in the dialog. | Both are required. |
required, default | Documented | 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 | Allow a list, or mark a secret. | A sensitive value goes to secure storage, not to settings. |
min, max | Documented | Bound a number. | number type only. |
options | Documented | 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 | Default places for components. | A manifest key adds to or replaces the folder, as the table above says. |
hooks/ | Documented | 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 | Config files at fixed places. | Claude Code loads these before it reads manifest entries. |
bin/ | Documented | 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 | Makes a single-skill plugin. | Used only when there is no skills/ folder and no skills key. |
Root CLAUDE. | Documented | Not loaded. | 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.