Plugin manifest reference changedplugins/manifest-reference
Nearest release: v2.1.287, published 10 hours before upstream edited the page. Shown because the two are within 24 hours of each other. Nothing here says the release caused the edit.
Upstream edited this page at 2 Oct 2026 03:05 UTC, give or take a minute or two: the time comes from Anthropic’s own sitemap rather than from a commit. This site recorded the change at 2 Oct 2026 03:07 UTC.
Upstream edited
Recorded here
Lines+22added
Lines−1removed
From line
255
where the diff opens
First seen
25 Sep 2026
this site's first read of the page
Recorded edits9to this page, all time
The whole hunk
from line 255, old and new numbered
/
from line 255
255255
256256`hooks` takes a `.json` file path, an inline hooks object in the same shape as [`hooks` in `settings.json`](/docs/en/hooks#configuration), or an array mixing both. For hook events and handler fields, see the [hooks reference](/docs/en/hooks#hook-events).
257257
258Claude Code merges whatever you declare with `hooks/hooks.json` when that file exists.
258A hooks file wraps the event map in a top-level `"hooks"` key, the shape [`hooks/hooks.json`](/docs/en/plugins/components#hooks) uses. A file that contains only the event map, without that wrapper, fails to load. An inline object is the event map itself, with no wrapper.
259259
260Claude Code merges whatever you declare with `hooks/hooks.json` when that file exists. This array loads one hooks file and declares one inline `PostToolUse` hook:
261
260262```json theme={null}
261263{
262264 "hooks": [
from line 277
275277}
276278```
277279
280The file that array names carries the `"hooks"` wrapper around its own event map:
281
282```json config/extra-hooks.json theme={null}
283{
284 "hooks": {
285 "PreToolUse": [
286 {
287 "matcher": "Bash",
288 "hooks": [
289 { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/check-command.sh" }
290 ]
291 }
292 ]
293 }
294}
295```
296
278297### `mcpServers`
279298
280299`mcpServers` takes a `.json` file path, an MCP bundle path or URL, an inline map, or an array mixing them. For server config fields, see [plugin-provided MCP servers](/docs/en/mcp#plugin-provided-mcp-servers).
from line 389
370389
371390* **`skills`**: also accepts `"."`. Both `"."` and `"./"` denote the plugin root. Before v2.1.221, `"."` failed manifest validation, so use `"./"` when the plugin must load on earlier versions
372391* **`mcpServers`**: also accepts an `https://` bundle URL
392
393`experimental.evals` isn't a component path, so the rules in this section don't cover it, and `claude plugin eval` checks the value when it runs instead. It names a directory below the plugin root, such as `"quality/evals"`, with or without the `./` prefix. With an array, only the first entry is used. For what the value accepts and what happens with an unusable one, see [Use a different eval directory](/docs/en/plugin-evals#use-a-different-eval-directory).
373394
374395### Containment and existence
375396
No line in this hunk matches that.